diff --git a/dashboard/.gitignore b/dashboard/.gitignore
new file mode 100644
index 0000000..997ca2f
--- /dev/null
+++ b/dashboard/.gitignore
@@ -0,0 +1 @@
+.vagrant
\ No newline at end of file
diff --git a/dashboard/Gruntfile.js b/dashboard/Gruntfile.js
deleted file mode 100644
index a7d92a3..0000000
--- a/dashboard/Gruntfile.js
+++ /dev/null
@@ -1,127 +0,0 @@
-'use strict';
-
-module.exports = function(grunt) {
-
-  // Project configuration.
-  grunt.initConfig({
-    // Metadata.
-    pkg: grunt.file.readJSON('package.json'),
-    banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
-      '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
-      '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
-      '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
-      ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n',
-
-    // Task configuration.
-    concat: {
-      options: {
-        banner: '<%= banner %>',
-        stripBanners: true
-      },
-      src: {
-        src: [
-        'lib/app/app.js',
-        'lib/app/services.js',
-        'lib/app/**/*.js',
-        'lib/app/controllers/*.js',
-        'lib/app/models/*.js',
-        'lib/app/views/*.js'
-        ],
-        dest: 'dist/js/src.js'
-      },
-      assets: {
-        src: [
-        'lib/assets/jquery.min.js',
-        'lib/assets/angular/angular.min.js',
-        'lib/assets/angular/*.js',
-        'lib/assets/angular/extensions/*.js',
-        'lib/assets/bootstrap.js',
-        'lib/assets/*.js'
-        ],
-        dest: 'dist/js/assets.js'
-      }
-    },
-    copy: {
-      main: {
-        files: [
-          {expand: false, src: ['lib/index.html'], dest: 'server/views/index.html', filter: 'isFile'},
-          {expand: true, cwd: 'lib/fonts/', src: ['*'], dest: 'dist/fonts/'},
-          {expand: true, cwd: 'lib/static/', src: ['**/*'], dest: 'dist/static/'},
-          {expand: true, cwd: 'lib/templates/', src: ['**/*'], dest: 'dist/templates/'},
-          {expand: true, cwd: 'lib/assets/packages', src: ['**/*'], dest: 'dist/assets/'}
-        ]
-      }
-    },
-    less: {
-      bootstrap: {
-        options: {
-          // modifyVars: {
-          //   // 'icon-font-path': '../fonts/'
-          // },
-        },
-        files: {
-          'dist/css/bootstrap.css': 'lib/less/bootstrap/bootstrap.less',
-        }
-      },
-      style: {
-        files: {
-          'dist/css/style.css': 'lib/less/*.less'
-        }
-      }
-    },
-    jshint: {
-      options: {
-        // jshintrc: '.jshintrc'
-      },
-      gruntfile: {
-        src: 'Gruntfile.js'
-      },
-      // lib: {
-      //   options: {
-      //     jshintrc: 'lib/.jshintrc'
-      //   },
-      //   src: ['lib/**/*.js']
-      // }
-    },
-    watch: {
-      gruntfile: {
-        files: '<%= jshint.gruntfile.src %>',
-        tasks: ['jshint:gruntfile']
-      },
-      copy: {
-        files: ['lib/index.html', 'lib/fonts/*', 'lib/templates/**/*.html', 'lib/static/**/*.html', 'lib/static/**/*.js'],
-        tasks: ['copy']
-      },
-      concatAssets: {
-        files: ['<%= concat.assets.src %>'],
-        tasks: ['concat:assets']
-      },
-      concatSrc: {
-        files: ['<%= concat.src.src %>'],
-        tasks: ['concat:src']
-      },
-      less: {
-        files: ['lib/less/bootstrap/*.less'],
-        tasks: ['less:bootstrap']
-      },
-      myLess: {
-        files: ['lib/less/*.less'],
-        tasks: ['less:style']
-      }
-    },
-  });
-
-  // These plugins provide necessary tasks.
-  grunt.loadNpmTasks('grunt-contrib-concat');
-  grunt.loadNpmTasks('grunt-contrib-uglify');
-  grunt.loadNpmTasks('grunt-contrib-jshint');
-  grunt.loadNpmTasks('grunt-contrib-watch');
-  grunt.loadNpmTasks('grunt-ember-templates');
-  grunt.loadNpmTasks('grunt-contrib-copy');
-  grunt.loadNpmTasks('grunt-usemin');
-  grunt.loadNpmTasks('grunt-contrib-less');
-
-  // Default task.
-  grunt.registerTask('default', ['copy', 'concat:assets', 'concat:src', 'less']);
-
-};
diff --git a/dashboard/README.md b/dashboard/README.md
index df184c1..dc39a8e 100644
--- a/dashboard/README.md
+++ b/dashboard/README.md
@@ -1,28 +1,36 @@
-# xdata-dashboard
+# User-ALE Dashboard
 
-Dashboard for XDATA logs.
+Fully running User-ALE
 
 ## Getting Started
-### On the server
-Install the module with: `npm install`
-Start the server with: `node server/app.js`
 
-## Documentation
-_(Coming soon)_
+## Install Dependencies
 
-## Examples
-_(Coming soon)_
+- Install Vagrant
+- Install VirtualBox
 
-## Contributing
-In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
+## Start Vagrant
 
-_Also, please don't edit files in the "dist" subdirectory as they are generated via Grunt. You'll find source code in the "lib" subdirectory!_
+This will provision the base box which is an Ubuntu 14.04 machine.
 
-## Release History
-_(Nothing yet)_
+    vagrant up
 
-## License
-Copyright (c) 2014 David Reed  
-Licensed under the MIT license.
+## SSH into Vagrant
 
-This package was created using the dvreedjs scaffold.  Find it at: https://github.com/dvreed77/dvreedjs
\ No newline at end of file
+    vagrant ssh
+
+## Install necessary packages
+
+    bash /vagrant/scripts/install.sh
+
+## Set indices in ElasticSearch
+
+    bash /vagrant/scripts/restart.sh
+
+## Start Twisted Server
+
+    sudo twistd -y /vagrant/twisted_app.py
+
+## Go to Kibana at http://localhost:9000/kibana
+
+## Send logs by going here: http://localhost:9000/test/
\ No newline at end of file
diff --git a/dashboard/Vagrantfile b/dashboard/Vagrantfile
new file mode 100644
index 0000000..c49d31b
--- /dev/null
+++ b/dashboard/Vagrantfile
@@ -0,0 +1,15 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+Vagrant.configure(2) do |config|
+  
+  config.vm.box = "ubuntu/trusty64"
+  
+  config.vm.network "forwarded_port", guest: 8000, host: 8000
+  config.vm.network "forwarded_port", guest: 9200, host: 9200
+  config.vm.network "forwarded_port", guest: 9000, host: 9000
+
+  config.vm.provider :virtualbox do |vb|
+    vb.customize ["modifyvm", :id, "--cpus", "2", "--memory", "2048"]
+  end
+end
diff --git a/dashboard/client/draper.activity_logger-2.0.js b/dashboard/client/draper.activity_logger-2.0.js
deleted file mode 100644
index 2e58667..0000000
--- a/dashboard/client/draper.activity_logger-2.0.js
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
-* Draper activityLogger
-*
-* The purpose of this module is allow XDATA Developers to easily add a logging
-* mechanism into their own modules for the purposes of recording the behaviors
-* of the analysists using their tools.
-*
-* @author Draper Laboratory
-* @date 2014
-*/
-
-/*jshint unused:false*/
-function activityLogger() {
-	'use strict';
-
-  var draperLog = {version: "0.2.0"}; // semver
-
-  var muteUserActivityLogging = false,
-  muteSystemActivityLogging = false,
-  logToConsole = false,
-  testing = false,
-  workflowCodingVersion = '2.0';
-
-  /**
-  * Workflow Codes
-  */
-  draperLog.WF_OTHER       = 0;
-  draperLog.WF_DEFINE      = 1;
-  draperLog.WF_GETDATA     = 2;
-  draperLog.WF_EXPLORE     = 3;
-  draperLog.WF_CREATE      = 4;
-  draperLog.WF_ENRICH      = 5;
-  draperLog.WF_TRANSFORM   = 6;
-
-	/**
-	* Registers this component with Draper's logging server.  The server creates
-	* a unique session_id, that is then used in subsequent logging messages.  This
-	* is a blocking ajax call to ensure logged messages are tagged correctly.
-	* @todo investigate the use of promises, instead of the blocking call.
-	*
-	* @method registerActivityLogger
-	* @param {String} url the url of Draper's Logging Server
-	* @param {String} componentName the name of this component
-	* @param {String} componentVersion the version of this component
-	*/
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/register',
-				async: false,
-				dataType: 'json',
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: Session successfully registered', a);
-					}
-					draperLog.sessionID = a.session_id;
-					draperLog.clientHostname = a.client_ip;
-				},
-				error: function(){
-					console.error('DRAPER LOG: Could not register session with Drapers server!');
-				}
-			});
-		} else {
-
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) Session successfully registered');
-			}
-			draperLog.sessionID = 'test_session';
-			draperLog.clientHostname = 'test_client';
-		}
-
-		classListener();
-
-		return draperLog;
-	};
-
-	/**
-	* Create USER activity message.
-	*
-	* @method logUserActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {String} userActivity a more generalized one word description of the current activity.
-	* @param {Integer} userWorkflowState an integer representing one of the enumerated states above.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {
-		if(!muteUserActivityLogging) {
-			var msg = {
-				type: 'USERACTION',
-				parms: {
-					desc: actionDescription,
-					activity: userActivity,
-					wf_state: userWorkflowState,
-					wf_version: workflowCodingVersion
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Create SYSTEM activity message.
-	*
-	* @method logSystemActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {
-
-		if(!muteSystemActivityLogging) {
-			var msg = {
-				type: 'SYSACTION',
-				parms: {
-					desc: actionDescription,
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Set Session Cookie on Client. NOT YET IMPLEMENTED.
-	*/
-	function setCookie(cname,cvalue,exdays)	{
-		var d = new Date();
-		d.setTime(d.getTime()+(exdays*24*60*60*1000));
-		var expires = "expires="+d.toGMTString();
-		document.cookie = cname + "=" + cvalue + "; " + expires;
-	}
-
-	/**
-	* Send activity message to Draper's logging server.  This function uses Jquery's ajax
-	* function to send the created message to draper's server.
-	*
-	* @method sendMessage
-	* @param {JSON} msg the JSON message.
-	*/
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		if (logToConsole) {
-			console.log('DRAPER LOG: Sending message to Draper server', msg);
-		}
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/send_log',
-				type: 'POST',
-				dataType: 'json',
-				data: msg,
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: message received!');
-					}
-				},
-				error: function(){
-					console.error('DRAPER LOG: could not send activity log to Draper server!');
-				}
-			});
-		} else {
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) message received!');
-			}
-		}
-	}
-
-	/**
-	* When set to true, logs messages to browser console.
-	*
-	* @method echo
-	* @param {Boolean} set to true to log to console
-	*/
-	draperLog.echo = function(d) {
-		if (!arguments.length) { return logToConsole; }
-		logToConsole = d;
-		return draperLog;
-	};
-
-  /**
-	* Accepts an array of Strings telling logger to mute those type of messages.
-	* Possible values are 'SYS' and 'USER'.  These messages will not be sent to
-	* server.
-	*
-	* @method mute
-	* @param {Array} array of strings of messages to mute.
-	*/
-	draperLog.mute = function(d) {
-		d.forEach(function(d) {
-			if(d === 'USER') { muteUserActivityLogging = true; }
-			if(d === 'SYS') { muteSystemActivityLogging = true; }
-		});
-		return draperLog;
-	};
-
-  /**
-	* When set to true, no connection will be made against logging server.
-	*
-	* @method testing
-	* @param {Boolean} set to true to disable all connection to logging server
-	*/
-	draperLog.testing = function(d) {
-		if (!arguments.length) { return testing; }
-		testing = d;
-		return draperLog;
-	};
-
-  /**
-	* DOM Listener for specific events.
-	*
-	*/
-	function classListener() {
-
-		$( document ).ready(function() {
-			$(".draper").each(function(i,d){
-				$(d).on("click", function(a){
-					draperLog.logUserActivity('User clicked element', $(this).data('activity'), $(this).data('wf'));
-				});
-			});
-
-			$(window).scroll(function() {
-				clearTimeout($.data(this, 'scrollTimer'));
-				$.data(this, 'scrollTimer', setTimeout(function() {
-					draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-				}, 500));
-			});
-		});
-	}
-
-  /**
-	* Tag specific elements
-	*
-	*/
-	draperLog.tag = function(elem, msg) {
-		$.each(msg.events, function(i, d) {
-			if (d === 'scroll') {
-				console.log('found scroll');
-				$(elem).scroll(function() {
-					clearTimeout($.data(this, 'scrollTimer'));
-					$.data(this, 'scrollTimer', setTimeout(function() {
-						draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-					}, 500));
-				});
-			}else{
-				$(elem).on(d, function() {
-					draperLog.logUserActivity(msg.desc, msg.activity, msg.wf_state);
-				});
-			}
-		});
-	};
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/client/draper.activity_logger-2.1.0.js b/dashboard/client/draper.activity_logger-2.1.0.js
deleted file mode 100644
index 615b3f2..0000000
--- a/dashboard/client/draper.activity_logger-2.1.0.js
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
-* Draper activityLogger
-*
-* The purpose of this module is allow XDATA Developers to easily add a logging
-* mechanism into their own modules for the purposes of recording the behaviors
-* of the analysists using their tools.
-*
-* @author Draper Laboratory
-* @date 2014
-*/
-
-/*jshint unused:false*/
-function activityLogger() {
-	'use strict';
-
-  var draperLog = {version: "2.1.0"}; // semver
-
-  var muteUserActivityLogging = false,
-  muteSystemActivityLogging = false,
-  logToConsole = false,
-  testing = false,
-  workflowCodingVersion = '2.0';
-
-  /**
-  * Workflow Codes
-  */
-  draperLog.WF_OTHER       = 0;
-  draperLog.WF_DEFINE      = 1;
-  draperLog.WF_GETDATA     = 2;
-  draperLog.WF_EXPLORE     = 3;
-  draperLog.WF_CREATE      = 4;
-  draperLog.WF_ENRICH      = 5;
-  draperLog.WF_TRANSFORM   = 6;
-
-	/**
-	* Registers this component with Draper's logging server.  The server creates
-	* a unique session_id, that is then used in subsequent logging messages.  This
-	* is a blocking ajax call to ensure logged messages are tagged correctly.
-	* @todo investigate the use of promises, instead of the blocking call.
-	*
-	* @method registerActivityLogger
-	* @param {String} url the url of Draper's Logging Server
-	* @param {String} componentName the name of this component
-	* @param {String} componentVersion the version of this component
-	*/
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		// get session id from url
-		function getParameterByName(name) {
-			name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-			var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
-			results = regex.exec(location.search);
-			return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-		}
-
-		draperLog.sessionID = getParameterByName('USID');
-
-		classListener();
-
-		return draperLog;
-	};
-
-	/**
-	* Create USER activity message.
-	*
-	* @method logUserActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {String} userActivity a more generalized one word description of the current activity.
-	* @param {Integer} userWorkflowState an integer representing one of the enumerated states above.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {
-		if(!muteUserActivityLogging) {
-			var msg = {
-				type: 'USERACTION',
-				parms: {
-					desc: actionDescription,
-					activity: userActivity,
-					wf_state: userWorkflowState,
-					wf_version: workflowCodingVersion
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Create SYSTEM activity message.
-	*
-	* @method logSystemActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {
-
-		if(!muteSystemActivityLogging) {
-			var msg = {
-				type: 'SYSACTION',
-				parms: {
-					desc: actionDescription,
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Send activity message to Draper's logging server.  This function uses Jquery's ajax
-	* function to send the created message to draper's server.
-	*
-	* @method sendMessage
-	* @param {JSON} msg the JSON message.
-	*/
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		if (logToConsole) {
-			console.log('DRAPER LOG: Sending message to Draper server', msg);
-		}
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/send_log',
-				type: 'POST',
-				dataType: 'json',
-				data: msg,
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: message received!');
-					}
-				},
-				error: function(){
-					console.error('DRAPER LOG: could not send activity log to Draper server!');
-				}
-			});
-		} else {
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) message received!');
-			}
-		}
-	}
-
-	/**
-	* When set to true, logs messages to browser console.
-	*
-	* @method echo
-	* @param {Boolean} set to true to log to console
-	*/
-	draperLog.echo = function(d) {
-		if (!arguments.length) { return logToConsole; }
-		logToConsole = d;
-		return draperLog;
-	};
-
-  /**
-	* Accepts an array of Strings telling logger to mute those type of messages.
-	* Possible values are 'SYS' and 'USER'.  These messages will not be sent to
-	* server.
-	*
-	* @method mute
-	* @param {Array} array of strings of messages to mute.
-	*/
-	draperLog.mute = function(d) {
-		d.forEach(function(d) {
-			if(d === 'USER') { muteUserActivityLogging = true; }
-			if(d === 'SYS') { muteSystemActivityLogging = true; }
-		});
-		return draperLog;
-	};
-
-  /**
-	* When set to true, no connection will be made against logging server.
-	*
-	* @method testing
-	* @param {Boolean} set to true to disable all connection to logging server
-	*/
-	draperLog.testing = function(d) {
-		if (!arguments.length) { return testing; }
-		testing = d;
-		return draperLog;
-	};
-
-  /**
-	* DOM Listener for specific events.
-	*
-	*/
-	function classListener() {
-
-		$( document ).ready(function() {
-			$(".draper").each(function(i,d){
-				$(d).on("click", function(a){
-					draperLog.logUserActivity('User clicked element', $(this).data('activity'), $(this).data('wf'));
-				});
-			});
-
-			$(window).scroll(function() {
-				clearTimeout($.data(this, 'scrollTimer'));
-				$.data(this, 'scrollTimer', setTimeout(function() {
-					draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-				}, 500));
-			});
-		});
-	}
-
-  /**
-	* Tag specific elements
-	*
-	*/
-	draperLog.tag = function(elem, msg) {
-		$.each(msg.events, function(i, d) {
-			if (d === 'scroll') {
-				console.log('found scroll');
-				$(elem).scroll(function() {
-					clearTimeout($.data(this, 'scrollTimer'));
-					$.data(this, 'scrollTimer', setTimeout(function() {
-						draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-					}, 500));
-				});
-			}else{
-				$(elem).on(d, function() {
-					draperLog.logUserActivity(msg.desc, msg.activity, msg.wf_state);
-				});
-			}
-		});
-	};
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/dependencies/css/bootstrap-datetimepicker.min.css b/dashboard/dependencies/css/bootstrap-datetimepicker.min.css
deleted file mode 100644
index 36394e2..0000000
--- a/dashboard/dependencies/css/bootstrap-datetimepicker.min.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- * Datepicker for Bootstrap
- *
- * Copyright 2012 Stefan Petre
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:3000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.bootstrap-datetimepicker-widget:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-weight:bold;font-size:1.2em}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{color:#fff;background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td.active:hover,.bootstrap-datetimepicker-widget td.active:hover:hover,.bootstrap-datetimepicker-widget td.active:active,.bootstrap-datetimepicker-widget td.active:hover:active,.bootstrap-datetimepicker-widget td.active.active,.bootstrap-datetimepicker-widget td.active:hover.active,.bootstrap-datetimepicker-widget td.active.disabled,.bootstrap-datetimepicker-widget td.active:hover.disabled,.bootstrap-datetimepicker-widget td.active[disabled],.bootstrap-datetimepicker-widget td.active:hover[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.bootstrap-datetimepicker-widget td.active:active,.bootstrap-datetimepicker-widget td.active:hover:active,.bootstrap-datetimepicker-widget td.active.active,.bootstrap-datetimepicker-widget td.active:hover.active{background-color:#039 \9}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:block;width:47px;height:54px;line-height:54px;float:left;margin:2px;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{color:#fff;background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td span.active:hover,.bootstrap-datetimepicker-widget td span.active:active,.bootstrap-datetimepicker-widget td span.active.active,.bootstrap-datetimepicker-widget td span.active.disabled,.bootstrap-datetimepicker-widget td span.active[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.bootstrap-datetimepicker-widget td span.active:active,.bootstrap-datetimepicker-widget td span.active.active{background-color:#039 \9}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}
\ No newline at end of file
diff --git a/dashboard/dependencies/js/bootstrap-datetimepicker.js b/dashboard/dependencies/js/bootstrap-datetimepicker.js
deleted file mode 100644
index 3248796..0000000
--- a/dashboard/dependencies/js/bootstrap-datetimepicker.js
+++ /dev/null
@@ -1,1089 +0,0 @@
-/**
- * version 2.1.30
- * @license
- * =========================================================
- * bootstrap-datetimepicker.js
- * http://www.eyecon.ro/bootstrap-datepicker
- * =========================================================
- * Copyright 2012 Stefan Petre
- *
- * Contributions:
- * - updated for Bootstrap v3 by Jonathan Peterson (@Eonasdan) and (almost)
- *    completely rewritten to use Momentjs
- * - based on tarruda's bootstrap-datepicker
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================
- */
-; (function (factory) {
-    if (typeof define === 'function' && define.amd) {
-    // AMD is used - Register as an anonymous module.
-        define(['jquery', 'moment'], factory);
-    } else {
-        // AMD is not used - Attempt to fetch dependencies from scope.
-        if(!jQuery){
-            throw 'bootstrap-datetimepicker requires jQuery to be loaded first';
-        }else if(!moment) {
-            throw 'bootstrap-datetimepicker requires moment.js to be loaded first';
-        }else{
-            factory(jQuery, moment);
-        }
-    }
-}
-
-(function ($, moment) {
-    if (typeof moment === 'undefined') {
-        alert("momentjs is requried");
-        throw new Error('momentjs is required');
-    };
-
-    var dpgId = 0,
-
-    pMoment = moment,
-
-// ReSharper disable once InconsistentNaming
-    DateTimePicker = function (element, options) {
-        var defaults = {
-            pickDate: true,
-            pickTime: true,
-            useMinutes: true,
-            useSeconds: false,
-            minuteStepping: 1,
-            startDate: new pMoment({ y: 1970 }),
-            endDate: new pMoment().add(50, "y"),
-            collapse: true,
-            language: "en",
-            defaultDate: "",
-            disabledDates: [],
-            enabledDates: false,
-            icons: {},
-            useStrict: false,
-            direction: "auto"
-        },
-
-		icons = {
-		    time: 'glyphicon glyphicon-time',
-		    date: 'glyphicon glyphicon-calendar',
-		    up: 'glyphicon glyphicon-chevron-up',
-		    down: 'glyphicon glyphicon-chevron-down'
-		},
-
-        picker = this,
-
-        init = function () {
-
-            var icon = false, i, dDate, longDateFormat;
-            picker.options = $.extend({}, defaults, options);
-            picker.options.icons = $.extend({}, icons, picker.options.icons);
-
-            picker.element = $(element);
-
-            dataToOptions();
-
-            if (!(picker.options.pickTime || picker.options.pickDate))
-                throw new Error('Must choose at least one picker');
-
-            picker.id = dpgId++;
-            pMoment.lang(picker.options.language);
-            picker.date = pMoment();
-            picker.unset = false;
-            picker.isInput = picker.element.is('input');
-            picker.component = false;
-
-            if (picker.element.hasClass('input-group')) {
-                if (picker.element.find('.datepickerbutton').size() == 0) {//in case there is more then one 'input-group-addon` #48
-                    picker.component = picker.element.find("[class^='input-group-']");
-                }
-                else {
-                    picker.component = picker.element.find('.datepickerbutton');
-                }
-            }
-            picker.format = picker.options.format;
-
-            longDateFormat = pMoment()._lang._longDateFormat;
-
-            if (!picker.format) {
-                if (picker.isInput) picker.format = picker.element.data('format');
-                else picker.format = picker.element.find('input').data('format');
-                if (!picker.format) {
-                    picker.format = (picker.options.pickDate ? longDateFormat.L : '');
-                    if (picker.options.pickDate && picker.options.pickTime) picker.format += ' ';
-                    picker.format += (picker.options.pickTime ? longDateFormat.LT : '');
-                    if (picker.options.useSeconds) {
-                        if (~longDateFormat.LT.indexOf(' A')) {
-                            picker.format = picker.format.split(" A")[0] + ":ss A";
-                        }
-                        else {
-                            picker.format += ':ss';
-                        }
-                    }
-                }
-            }
-
-            picker.options.use24hours = picker.format.toLowerCase().indexOf("a") < 1;
-
-            if (picker.component) icon = picker.component.find('span');
-
-            if (picker.options.pickTime) {
-                if (icon) icon.addClass(picker.options.icons.time);
-            }
-            if (picker.options.pickDate) {
-                if (icon) {
-                    icon.removeClass(picker.options.icons.time);
-                    icon.addClass(picker.options.icons.date);
-                }
-            }
-
-            picker.widget = $(getTemplate(picker.options.pickDate, picker.options.pickTime, picker.options.collapse)).appendTo('body');
-            picker.minViewMode = picker.options.minViewMode || picker.element.data('date-minviewmode') || 0;
-            if (typeof picker.minViewMode === 'string') {
-                switch (picker.minViewMode) {
-                    case 'months':
-                        picker.minViewMode = 1;
-                        break;
-                    case 'years':
-                        picker.minViewMode = 2;
-                        break;
-                    default:
-                        picker.minViewMode = 0;
-                        break;
-                }
-            }
-            picker.viewMode = picker.options.viewMode || picker.element.data('date-viewmode') || 0;
-            if (typeof picker.viewMode === 'string') {
-                switch (picker.viewMode) {
-                    case 'months':
-                        picker.viewMode = 1;
-                        break;
-                    case 'years':
-                        picker.viewMode = 2;
-                        break;
-                    default:
-                        picker.viewMode = 0;
-                        break;
-                }
-            }
-
-            for (i = 0; i < picker.options.disabledDates.length; i++) {
-                dDate = picker.options.disabledDates[i];
-                dDate = pMoment(dDate);
-                //if this is not a valid date then set it to the startdate -1 day so it's disabled.
-                if (!dDate.isValid()) dDate = pMoment(picker.options.startDate).subtract(1, "day");
-                picker.options.disabledDates[i] = dDate.format("L");
-            }
-
-            for (i = 0; i < picker.options.enabledDates.length; i++) {
-                dDate = picker.options.enabledDates[i];
-                dDate = pMoment(dDate);
-                //if this is not a valid date then set it to the startdate -1 day so it's disabled.
-                if (!dDate.isValid()) dDate = pMoment(picker.options.startDate).subtract(1, "day");
-                picker.options.enabledDates[i] = dDate.format("L");
-            }
-            picker.startViewMode = picker.viewMode;
-            picker.setStartDate(picker.options.startDate || picker.element.data('date-startdate'));
-            picker.setEndDate(picker.options.endDate || picker.element.data('date-enddate'));
-            fillDow();
-            fillMonths();
-            fillHours();
-            fillMinutes();
-			fillSeconds();
-            update();
-            showMode();
-            attachDatePickerEvents();
-            if (picker.options.defaultDate !== "") picker.setValue(picker.options.defaultDate);
-        },
-
-        dataToOptions = function () {
-            var eData = picker.element.data();
-            if (eData.pickdate !== undefined) picker.options.pickDate = eData.pickdate;
-            if (eData.picktime !== undefined) picker.options.pickTime = eData.picktime;
-            if (eData.useminutes !== undefined) picker.options.useMinutes = eData.useminutes;
-            if (eData.useseconds !== undefined) picker.options.useSeconds = eData.useseconds;
-            if (eData.minutestepping !== undefined) picker.options.minuteStepping = eData.minutestepping;
-            if (eData.startdate !== undefined) picker.options.startDate = eData.startdate;
-            if (eData.enddate !== undefined) picker.options.endDate = eData.enddate;
-            if (eData.collapse !== undefined) picker.options.collapse = eData.collapse;
-            if (eData.language !== undefined) picker.options.language = eData.language;
-            if (eData.defaultdate !== undefined) picker.options.defaultDate = eData.defaultdate;
-            if (eData.disableddates !== undefined) picker.options.disabledDates = eData.disableddates;
-            if (eData.enableddates !== undefined) picker.options.enabledDates = eData.enableddates;
-            if (eData.icons !== undefined) picker.options.icons = eData.icons;
-            if (eData.usestrict !== undefined) picker.options.useStrict = eData.usestrict;
-        },
-
-        place = function () {
-            var position = 'absolute',
-            offset = picker.component ? picker.component.offset() : picker.element.offset(), $window = $(window);
-            picker.width = picker.component ? picker.component.outerWidth() : picker.element.outerWidth();
-            offset.top = offset.top + picker.element.outerHeight();
-            
-            // if (picker.options.direction === 'up' || picker.options.direction === 'auto' && offset.top + picker.widget.height() > $window.height()) {
-        		// offset.top -= picker.widget.height() + picker.element.outerHeight();
-            	// picker.widget.addClass('up');
-            // } else if (picker.options.direction === 'down' || picker.options.direction === 'auto' && offset.top + picker.widget.height() <= $window.height()) {
-            	// offset.top += picker.element.outerHeight();
-            	// picker.widget.addClass('down');
-            // }
-
-            if (picker.options.width !== undefined) {
-                picker.widget.width(picker.options.width);
-            }
-
-            if (picker.options.orientation === 'left') {
-                picker.widget.addClass('left-oriented');
-                offset.left = offset.left - picker.widget.width() + 20;
-            }
-
-            if (isInFixed()) {
-                position = 'fixed';
-                offset.top -= $window.scrollTop();
-                offset.left -= $window.scrollLeft();
-            }
-
-            if ($window.width() < offset.left + picker.widget.outerWidth()) {
-                offset.right = $window.width() - offset.left - picker.width;
-                offset.left = 'auto';
-                picker.widget.addClass('pull-right');
-            } else {
-                offset.right = 'auto';
-                picker.widget.removeClass('pull-right');
-            }
-
-            picker.widget.css({
-                position: position,
-                top: offset.top,
-                left: offset.left,
-                right: offset.right
-            });
-        },
-
-        notifyChange = function (oldDate, eventType) {
-            picker.element.trigger({
-                type: 'change.dp',
-                date: pMoment(picker.date),
-                oldDate: pMoment(oldDate)
-            });
-
-            if (eventType !== 'change')
-                picker.element.change();
-        },
-
-		notifyError = function (date) {
-		    picker.element.trigger({
-		        type: 'error.dp',
-		        date: pMoment(date)
-		    });
-		},
-
-        update = function (newDate) {
-            pMoment.lang(picker.options.language);
-            var dateStr = newDate;
-            if (!dateStr) {
-                if (picker.isInput) {
-                    dateStr = picker.element.val();
-                } else {
-                    dateStr = picker.element.find('input').val();
-                }
-                if (dateStr) picker.date = pMoment(dateStr, picker.format, picker.options.useStrict);
-                if (!picker.date) picker.date = pMoment();
-            }
-            picker.viewDate = pMoment(picker.date).startOf("month");
-            fillDate();
-            fillTime();
-        },
-
-		fillDow = function () {
-		    pMoment.lang(picker.options.language);
-		    var html = $('<tr>'), weekdaysMin = pMoment.weekdaysMin(), i;
-		    if (pMoment()._lang._week.dow == 0) { // starts on Sunday
-		        for(i = 0; i < 7; i++) {
-		            html.append('<th class="dow">' + weekdaysMin[i] + '</th>');
-		        }
-		    } else {
-		        for (i = 1; i < 8; i++) {
-		            if (i == 7) {
-		                html.append('<th class="dow">' + weekdaysMin[0] + '</th>');
-		            } else {
-		                html.append('<th class="dow">' + weekdaysMin[i] + '</th>');
-		            }
-		        }
-		    }
-		    picker.widget.find('.datepicker-days thead').append(html);
-		},
-
-        fillMonths = function () {
-            pMoment.lang(picker.options.language);
-            var html = '', i = 0, monthsShort = pMoment.monthsShort();
-            while (i < 12) {
-                html += '<span class="month">' + monthsShort[i++] + '</span>';
-            }
-            picker.widget.find('.datepicker-months td').append(html);
-        },
-
-        fillDate = function () {
-            pMoment.lang(picker.options.language);
-            var year = picker.viewDate.year(),
-                month = picker.viewDate.month(),
-                startYear = picker.options.startDate.year(),
-                startMonth = picker.options.startDate.month(),
-                endYear = picker.options.endDate.year(),
-                endMonth = picker.options.endDate.month(),
-                prevMonth, nextMonth, html = [], row, clsName, i, days, yearCont, currentYear, months = pMoment.months();
-
-            picker.widget.find('.datepicker-days').find('.disabled').removeClass('disabled');
-            picker.widget.find('.datepicker-months').find('.disabled').removeClass('disabled');
-            picker.widget.find('.datepicker-years').find('.disabled').removeClass('disabled');
-
-            picker.widget.find('.datepicker-days th:eq(1)').text(
-                months[month] + ' ' + year);
-
-            prevMonth = pMoment(picker.viewDate).subtract("months", 1);
-            days = prevMonth.daysInMonth();
-            prevMonth.date(days).startOf('week');
-            if ((year == startYear && month <= startMonth) || year < startYear) {
-                picker.widget.find('.datepicker-days th:eq(0)').addClass('disabled');
-            }
-            if ((year == endYear && month >= endMonth) || year > endYear) {
-                picker.widget.find('.datepicker-days th:eq(2)').addClass('disabled');
-            }
-
-            nextMonth = pMoment(prevMonth).add(42, "d");
-            while (prevMonth.isBefore(nextMonth)) {
-                if (prevMonth.weekday() === pMoment().startOf('week').weekday()) {
-                    row = $('<tr>');
-                    html.push(row);
-                }
-                clsName = '';
-                if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) {
-                    clsName += ' old';
-                } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) {
-                    clsName += ' new';
-                }
-                if (prevMonth.isSame(pMoment({ y: picker.date.year(), M: picker.date.month(), d: picker.date.date() }))) {
-                    clsName += ' active';
-                }
-                if (isInDisableDates(prevMonth) || !isInEnableDates(prevMonth)) {
-                    clsName += ' disabled';
-                }
-                row.append('<td class="day' + clsName + '">' + prevMonth.date() + '</td>');
-                prevMonth.add(1, "d");
-            }
-            picker.widget.find('.datepicker-days tbody').empty().append(html);
-            currentYear = pMoment().year(), months = picker.widget.find('.datepicker-months')
-				.find('th:eq(1)').text(year).end().find('span').removeClass('active');
-            if (currentYear === year) {
-                months.eq(pMoment().month()).addClass('active');
-            }
-            if (currentYear - 1 < startYear) {
-                picker.widget.find('.datepicker-months th:eq(0)').addClass('disabled');
-            }
-            if (currentYear + 1 > endYear) {
-                picker.widget.find('.datepicker-months th:eq(2)').addClass('disabled');
-            }
-            for (i = 0; i < 12; i++) {
-                if ((year == startYear && startMonth > i) || (year < startYear)) {
-                    $(months[i]).addClass('disabled');
-                } else if ((year == endYear && endMonth < i) || (year > endYear)) {
-                    $(months[i]).addClass('disabled');
-                }
-            }
-
-            html = '';
-            year = parseInt(year / 10, 10) * 10;
-            yearCont = picker.widget.find('.datepicker-years').find(
-                'th:eq(1)').text(year + '-' + (year + 9)).end().find('td');
-            picker.widget.find('.datepicker-years').find('th').removeClass('disabled');
-            if (startYear > year) {
-                picker.widget.find('.datepicker-years').find('th:eq(0)').addClass('disabled');
-            }
-            if (endYear < year + 9) {
-                picker.widget.find('.datepicker-years').find('th:eq(2)').addClass('disabled');
-            }
-            year -= 1;
-            for (i = -1; i < 11; i++) {
-                html += '<span class="year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + ((year < startYear || year > endYear) ? ' disabled' : '') + '">' + year + '</span>';
-                year += 1;
-            }
-            yearCont.html(html);
-        },
-
-        fillHours = function () {
-            pMoment.lang(picker.options.language);
-            var table = picker.widget.find('.timepicker .timepicker-hours table'), html = '', current, i, j;
-            table.parent().hide();
-            if (picker.options.use24hours) {
-                current = 0;
-                for (i = 0; i < 6; i += 1) {
-                    html += '<tr>';
-                    for (j = 0; j < 4; j += 1) {
-                        html += '<td class="hour">' + padLeft(current.toString()) + '</td>';
-                        current++;
-                    }
-                    html += '</tr>';
-                }
-            }
-            else {
-                current = 1;
-                for (i = 0; i < 3; i += 1) {
-                    html += '<tr>';
-                    for (j = 0; j < 4; j += 1) {
-                        html += '<td class="hour">' + padLeft(current.toString()) + '</td>';
-                        current++;
-                    }
-                    html += '</tr>';
-                }
-            }
-            table.html(html);
-        },
-
-        fillMinutes = function () {
-            var table = picker.widget.find('.timepicker .timepicker-minutes table'), html = '', current = 0, i, j;
-            table.parent().hide();
-            for (i = 0; i < 5; i++) {
-                html += '<tr>';
-                for (j = 0; j < 4; j += 1) {
-                    html += '<td class="minute">' + padLeft(current.toString()) + '</td>';
-                    current += 3;
-                }
-                html += '</tr>';
-            }
-            table.html(html);
-        },
-
-        fillSeconds = function () {
-            var table = picker.widget.find('.timepicker .timepicker-seconds table'), html = '', current = 0, i, j;
-            table.parent().hide();
-            for (i = 0; i < 5; i++) {
-                html += '<tr>';
-                for (j = 0; j < 4; j += 1) {
-                  html += '<td class="second">' + padLeft(current.toString()) + '</td>';
-                  current += 3;
-                }
-                html += '</tr>';
-            }
-            table.html(html);
-        },
-
-        fillTime = function () {
-            if (!picker.date) return;
-            var timeComponents = picker.widget.find('.timepicker span[data-time-component]'),
-            hour = picker.date.hours(),
-            period = 'AM';
-            if (!picker.options.use24hours) {
-                if (hour >= 12) period = 'PM';
-                if (hour === 0) hour = 12;
-                else if (hour != 12) hour = hour % 12;
-                picker.widget.find('.timepicker [data-action=togglePeriod]').text(period);
-            }
-            timeComponents.filter('[data-time-component=hours]').text(padLeft(hour));
-            timeComponents.filter('[data-time-component=minutes]').text(padLeft(picker.date.minutes()));
-            timeComponents.filter('[data-time-component=seconds]').text(padLeft(picker.date.second()));
-        },
-
-        click = function (e) {
-            e.stopPropagation();
-            e.preventDefault();
-            picker.unset = false;
-            var target = $(e.target).closest('span, td, th'), month, year, step, day, oldDate = pMoment(picker.date);
-            if (target.length === 1) {
-                if (!target.is('.disabled')) {
-                    switch (target[0].nodeName.toLowerCase()) {
-                        case 'th':
-                            switch (target[0].className) {
-                                case 'switch':
-                                    showMode(1);
-                                    break;
-                                case 'prev':
-                                case 'next':
-                                    step = dpGlobal.modes[picker.viewMode].navStep;
-                                    if (target[0].className === 'prev') step = step * -1;
-                                    picker.viewDate.add(step, dpGlobal.modes[picker.viewMode].navFnc);
-                                    fillDate();
-                                    break;
-                            }
-                            break;
-                        case 'span':
-                            if (target.is('.month')) {
-                                month = target.parent().find('span').index(target);
-                                picker.viewDate.month(month);
-                            } else {
-                                year = parseInt(target.text(), 10) || 0;
-                                picker.viewDate.year(year);
-                            }
-                            if (picker.viewMode !== 0) {
-                                picker.date = pMoment({
-                                    y: picker.viewDate.year(),
-                                    M: picker.viewDate.month(),
-                                    d: picker.viewDate.date(),
-                                    h: picker.date.hours(),
-                                    m: picker.date.minutes()
-                                });
-                                notifyChange(oldDate, e.type);
-                            }
-                            showMode(-1);
-                            fillDate();
-                            break;
-                        case 'td':
-                            if (target.is('.day')) {
-                                day = parseInt(target.text(), 10) || 1;
-                                month = picker.viewDate.month();
-                                year = picker.viewDate.year();
-                                if (target.is('.old')) {
-                                    if (month === 0) {
-                                        month = 11;
-                                        year -= 1;
-                                    } else {
-                                        month -= 1;
-                                    }
-                                } else if (target.is('.new')) {
-                                    if (month == 11) {
-                                        month = 0;
-                                        year += 1;
-                                    } else {
-                                        month += 1;
-                                    }
-                                }
-                                picker.date = pMoment({
-                                    y: year,
-                                    M: month,
-                                    d: day,
-                                    h: picker.date.hours(),
-                                    m: picker.date.minutes()
-                                }
-                                );
-                                picker.viewDate = pMoment({
-                                    y: year, M: month, d: Math.min(28, day)
-                                });
-                                fillDate();
-                                set();
-                                notifyChange(oldDate, e.type);
-                            }
-                            break;
-                    }
-                }
-            }
-        },
-
-		actions = {
-		    incrementHours: function () {
-		        checkDate("add", "hours", 1);
-		    },
-
-		    incrementMinutes: function () {
-		        checkDate("add", "minutes", picker.options.minuteStepping);
-		    },
-
-		    incrementSeconds: function () {
-		        checkDate("add", "seconds", 1);
-		    },
-
-		    decrementHours: function () {
-		        checkDate("subtract", "hours", 1);
-		    },
-
-		    decrementMinutes: function () {
-		        checkDate("subtract", "minutes", picker.options.minuteStepping);
-		    },
-
-		    decrementSeconds: function () {
-		        checkDate("subtract", "seconds", 1);
-		    },
-
-		    togglePeriod: function () {
-		        var hour = picker.date.hours();
-		        if (hour >= 12) hour -= 12;
-		        else hour += 12;
-		        picker.date.hours(hour);
-		    },
-
-		    showPicker: function () {
-		        picker.widget.find('.timepicker > div:not(.timepicker-picker)').hide();
-		        picker.widget.find('.timepicker .timepicker-picker').show();
-		    },
-
-		    showHours: function () {
-		        picker.widget.find('.timepicker .timepicker-picker').hide();
-		        picker.widget.find('.timepicker .timepicker-hours').show();
-		    },
-
-		    showMinutes: function () {
-		        picker.widget.find('.timepicker .timepicker-picker').hide();
-		        picker.widget.find('.timepicker .timepicker-minutes').show();
-		    },
-
-		    showSeconds: function () {
-		        picker.widget.find('.timepicker .timepicker-picker').hide();
-		        picker.widget.find('.timepicker .timepicker-seconds').show();
-		    },
-
-		    selectHour: function (e) {
-		        picker.date.hours(parseInt($(e.target).text(), 10));
-		        actions.showPicker.call(picker);
-		    },
-
-		    selectMinute: function (e) {
-		        picker.date.minutes(parseInt($(e.target).text(), 10));
-		        actions.showPicker.call(picker);
-		    },
-
-		    selectSecond: function (e) {
-		        picker.date.seconds(parseInt($(e.target).text(), 10));
-		        actions.showPicker.call(picker);
-		    }
-		},
-
-	    doAction = function (e) {
-	        var oldDate = pMoment(picker.date), action = $(e.currentTarget).data('action'), rv = actions[action].apply(picker, arguments);
-	        stopEvent(e);
-	        if (!picker.date) picker.date = pMoment({ y: 1970 });
-	        set();
-	        fillTime();
-	        notifyChange(oldDate, e.type);
-	        return rv;
-	    },
-
-        stopEvent = function (e) {
-            e.stopPropagation();
-            e.preventDefault();
-        },
-
-        change = function (e) {
-            pMoment.lang(picker.options.language);
-            var input = $(e.target), oldDate = pMoment(picker.date), newDate = pMoment(input.val(), picker.format, picker.options.useStrict);
-            if (newDate.isValid() && !isInDisableDates(newDate) && isInEnableDates(newDate)) {
-                update();
-                picker.setValue(newDate);
-                notifyChange(oldDate, e.type);
-                set();
-            }
-            else {
-                picker.viewDate = oldDate;
-                input.val(pMoment(oldDate).format(picker.format));
-                //picker.setValue(""); // unset the date when the input is erased
-                notifyChange(oldDate, e.type);
-                notifyError(newDate);
-                picker.unset = true;
-            }
-        },
-
-        showMode = function (dir) {
-            if (dir) {
-                picker.viewMode = Math.max(picker.minViewMode, Math.min(2, picker.viewMode + dir));
-            }
-
-            picker.widget.find('.datepicker > div').hide().filter('.datepicker-' + dpGlobal.modes[picker.viewMode].clsName).show();
-        },
-
-        attachDatePickerEvents = function () {
-            var $this, $parent, expanded, closed, collapseData;
-            picker.widget.on('click', '.datepicker *', $.proxy(click, this)); // this handles date picker clicks
-            picker.widget.on('click', '[data-action]', $.proxy(doAction, this)); // this handles time picker clicks
-            picker.widget.on('mousedown', $.proxy(stopEvent, this));
-            if (picker.options.pickDate && picker.options.pickTime) {
-                picker.widget.on('click.togglePicker', '.accordion-toggle', function (e) {
-                    e.stopPropagation();
-                    $this = $(this);
-                    $parent = $this.closest('ul');
-                    expanded = $parent.find('.in');
-                    closed = $parent.find('.collapse:not(.in)');
-
-                    if (expanded && expanded.length) {
-                        collapseData = expanded.data('collapse');
-                        if (collapseData && collapseData.transitioning) return;
-                        expanded.collapse('hide');
-                        closed.collapse('show');
-                        $this.find('span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
-                        picker.element.find('.input-group-addon span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
-                    }
-                });
-            }
-            if (picker.isInput) {
-                picker.element.on({
-                    'focus': $.proxy(picker.show, this),
-                    'change': $.proxy(change, this),
-                    'blur': $.proxy(picker.hide, this)
-                });
-            } else {
-                picker.element.on({
-                    'change': $.proxy(change, this)
-                }, 'input');
-                if (picker.component) {
-                    picker.component.on('click', $.proxy(picker.show, this));
-                } else {
-                    picker.element.on('click', $.proxy(picker.show, this));
-                }
-            }
-        },
-
-        attachDatePickerGlobalEvents = function () {
-            $(window).on(
-                'resize.datetimepicker' + picker.id, $.proxy(place, this));
-            if (!picker.isInput) {
-                $(document).on(
-                    'mousedown.datetimepicker' + picker.id, $.proxy(picker.hide, this));
-            }
-        },
-
-        detachDatePickerEvents = function () {
-            picker.widget.off('click', '.datepicker *', picker.click);
-            picker.widget.off('click', '[data-action]');
-            picker.widget.off('mousedown', picker.stopEvent);
-            if (picker.options.pickDate && picker.options.pickTime) {
-                picker.widget.off('click.togglePicker');
-            }
-            if (picker.isInput) {
-                picker.element.off({
-                    'focus': picker.show,
-                    'change': picker.change
-                });
-            } else {
-                picker.element.off({
-                    'change': picker.change
-                }, 'input');
-                if (picker.component) {
-                    picker.component.off('click', picker.show);
-                } else {
-                    picker.element.off('click', picker.show);
-                }
-            }
-        },
-
-        detachDatePickerGlobalEvents = function () {
-            $(window).off('resize.datetimepicker' + picker.id);
-            if (!picker.isInput) {
-                $(document).off('mousedown.datetimepicker' + picker.id);
-            }
-        },
-
-        isInFixed = function () {
-            if (picker.element) {
-                var parents = picker.element.parents(), inFixed = false, i;
-                for (i = 0; i < parents.length; i++) {
-                    if ($(parents[i]).css('position') == 'fixed') {
-                        inFixed = true;
-                        break;
-                    }
-                }
-                ;
-                return inFixed;
-            } else {
-                return false;
-            }
-        },
-
-        set = function () {
-            pMoment.lang(picker.options.language);
-            var formatted = '', input;
-            if (!picker.unset) formatted = pMoment(picker.date).format(picker.format);
-            if (!picker.isInput) {
-                if (picker.component) {
-                    input = picker.element.find('input');
-                    input.val(formatted);
-                }
-                picker.element.data('date', formatted);
-            } else {
-                picker.element.val(formatted);
-            }
-            if (!picker.options.pickTime) picker.hide();
-        },
-
-		checkDate = function (direction, unit, amount) {
-		    pMoment.lang(picker.options.language);
-		    var newDate;
-		    if (direction == "add") {
-		        newDate = pMoment(picker.date);
-		        if (newDate.hours() == 23) newDate.add(amount, unit);
-		        newDate.add(amount, unit);
-		    }
-		    else {
-		        newDate = pMoment(picker.date).subtract(amount, unit);
-		    }
-		    if (isInDisableDates(pMoment(newDate.subtract(amount, unit))) || isInDisableDates(newDate)) {
-		        notifyError(newDate.format(picker.format));
-		        return;
-		    }
-
-		    if (direction == "add") {
-		        picker.date.add(amount, unit);
-		    }
-		    else {
-		        picker.date.subtract(amount, unit);
-		    }
-            picker.unset = false;
-		},
-
-		isInDisableDates = function (date) {
-		    pMoment.lang(picker.options.language);
-            if (date.isAfter(picker.options.endDate) || date.isBefore(picker.options.startDate)) return true;
-		    var disabled = picker.options.disabledDates, i;
-		    for (i in disabled) {
-		        if (disabled[i] == pMoment(date).format("L")) {
-		            return true;
-		        }
-		    }
-		    return false;
-		},
-
-        isInEnableDates = function (date) {
-            pMoment.lang(picker.options.language);
-            var enabled = picker.options.enabledDates, i;
-            if (enabled.length) {
-                for (i in enabled) {
-                    if (enabled[i] == pMoment(date).format("L")) {
-                        return true;
-                    }
-                }
-                return false;
-            }
-            return enabled === false ? true : false;
-        },
-        padLeft = function (string) {
-            string = string.toString();
-            if (string.length >= 2) return string;
-            else return '0' + string;
-        },
-
-        getTemplate = function (pickDate, pickTime, collapse) {
-            if (pickDate && pickTime) {
-                return (
-                    '<div class="bootstrap-datetimepicker-widget dropdown-menu" style="z-index:9999 !important;">' +
-                        '<ul class="list-unstyled">' +
-							'<li' + (collapse ? ' class="collapse in"' : '') + '>' +
-								'<div class="datepicker">' + dpGlobal.template + '</div>' +
-							'</li>' +
-							'<li class="picker-switch accordion-toggle"><a class="btn" style="width:100%"><span class="' + picker.options.icons.time + '"></span></a></li>' +
-							'<li' + (collapse ? ' class="collapse"' : '') + '>' +
-								'<div class="timepicker">' + tpGlobal.getTemplate() + '</div>' +
-							'</li>' +
-                        '</ul>' +
-                    '</div>'
-                );
-            } else if (pickTime) {
-                return (
-                    '<div class="bootstrap-datetimepicker-widget dropdown-menu">' +
-                        '<div class="timepicker">' + tpGlobal.getTemplate() + '</div>' +
-                    '</div>'
-                );
-            } else {
-                return (
-                    '<div class="bootstrap-datetimepicker-widget dropdown-menu">' +
-                        '<div class="datepicker">' + dpGlobal.template + '</div>' +
-                    '</div>'
-                );
-            }
-        },
-
-		dpGlobal = {
-		    modes: [
-                {
-                    clsName: 'days',
-                    navFnc: 'month',
-                    navStep: 1
-                },
-                {
-                    clsName: 'months',
-                    navFnc: 'year',
-                    navStep: 1
-                },
-                {
-                    clsName: 'years',
-                    navFnc: 'year',
-                    navStep: 10
-                }],
-		    headTemplate:
-                    '<thead>' +
-						'<tr>' +
-							'<th class="prev">&lsaquo;</th><th colspan="5" class="switch"></th><th class="next">&rsaquo;</th>' +
-						'</tr>' +
-                    '</thead>',
-		    contTemplate:
-        '<tbody><tr><td colspan="7"></td></tr></tbody>'
-		},
-
-        tpGlobal = {
-            hourTemplate:   '<span data-action="showHours"   data-time-component="hours"   class="timepicker-hour"></span>',
-            minuteTemplate: '<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>',
-			secondTemplate: '<span data-action="showSeconds"  data-time-component="seconds" class="timepicker-second"></span>'
-        };
-
-        dpGlobal.template =
-            '<div class="datepicker-days">' +
-                '<table class="table-condensed">' + dpGlobal.headTemplate + '<tbody></tbody></table>' +
-            '</div>' +
-            '<div class="datepicker-months">' +
-                '<table class="table-condensed">' + dpGlobal.headTemplate + dpGlobal.contTemplate + '</table>' +
-            '</div>' +
-            '<div class="datepicker-years">' +
-				'<table class="table-condensed">' + dpGlobal.headTemplate + dpGlobal.contTemplate + '</table>' +
-            '</div>';
-
-        tpGlobal.getTemplate = function () {
-            return (
-                '<div class="timepicker-picker">' +
-                    '<table class="table-condensed">' +
-						'<tr>' +
-							'<td><a href="#" class="btn" data-action="incrementHours"><span class="' + picker.options.icons.up + '"></span></a></td>' +
-							'<td class="separator"></td>' +
-							'<td>' + (picker.options.useMinutes ? '<a href="#" class="btn" data-action="incrementMinutes"><span class="' + picker.options.icons.up + '"></span></a>' : '') + '</td>' +
-                            (picker.options.useSeconds ?
-                                '<td class="separator"></td><td><a href="#" class="btn" data-action="incrementSeconds"><span class="' + picker.options.icons.up + '"></span></a></td>' : '') +
-							(picker.options.use24hours ? '' : '<td class="separator"></td>') +
-						'</tr>' +
-						'<tr>' +
-							'<td>' + tpGlobal.hourTemplate + '</td> ' +
-							'<td class="separator">:</td>' +
-							'<td>' + (picker.options.useMinutes ? tpGlobal.minuteTemplate : '<span class="timepicker-minute">00</span>') + '</td> ' +
-                            (picker.options.useSeconds ?
-                                '<td class="separator">:</td><td>' + tpGlobal.secondTemplate + '</td>' : '') +
-							(picker.options.use24hours ? '' : '<td class="separator"></td>' +
-							'<td><button type="button" class="btn btn-primary" data-action="togglePeriod"></button></td>') +
-						'</tr>' +
-						'<tr>' +
-							'<td><a href="#" class="btn" data-action="decrementHours"><span class="' + picker.options.icons.down + '"></span></a></td>' +
-							'<td class="separator"></td>' +
-							'<td>' + (picker.options.useMinutes ? '<a href="#" class="btn" data-action="decrementMinutes"><span class="' + picker.options.icons.down + '"></span></a>' : '') + '</td>' +
-                            (picker.options.useSeconds ?
-                                '<td class="separator"></td><td><a href="#" class="btn" data-action="decrementSeconds"><span class="' + picker.options.icons.down + '"></span></a></td>' : '') +
-							(picker.options.use24hours ? '' : '<td class="separator"></td>') +
-						'</tr>' +
-                    '</table>' +
-                '</div>' +
-                '<div class="timepicker-hours" data-action="selectHour">' +
-                    '<table class="table-condensed"></table>' +
-                '</div>' +
-                '<div class="timepicker-minutes" data-action="selectMinute">' +
-                    '<table class="table-condensed"></table>' +
-                '</div>' +
-                (picker.options.useSeconds ?
-                    '<div class="timepicker-seconds" data-action="selectSecond"><table class="table-condensed"></table></div>' : '')
-            );
-        };
-
-        picker.destroy = function () {
-            detachDatePickerEvents();
-            detachDatePickerGlobalEvents();
-            picker.widget.remove();
-            picker.element.removeData('DateTimePicker');
-            if (picker.component)
-                picker.component.removeData('DateTimePicker');
-        };
-
-        picker.show = function (e) {
-            picker.widget.show();
-            picker.height = picker.component ? picker.component.outerHeight() : picker.element.outerHeight();
-            place();
-            picker.element.trigger({
-                type: 'show.dp',
-                date: pMoment(picker.date)
-            });
-            attachDatePickerGlobalEvents();
-            if (e) {
-                stopEvent(e);
-            }
-        },
-
-        picker.disable = function () {
-            var input = picker.element.find('input');
-            if(input.prop('disabled')) return;
-
-            input.prop('disabled', true);
-            detachDatePickerEvents();
-        },
-
-        picker.enable = function () {
-            var input = picker.element.find('input');
-            if(!input.prop('disabled')) return;
-
-            input.prop('disabled', false);
-            attachDatePickerEvents();
-        },
-
-        picker.hide = function (event) {
-            if (event && $(event.target).is(picker.element.attr("id")))
-                return;
-            // Ignore event if in the middle of a picker transition
-            var collapse = picker.widget.find('.collapse'), i, collapseData;
-            for (i = 0; i < collapse.length; i++) {
-                collapseData = collapse.eq(i).data('collapse');
-                if (collapseData && collapseData.transitioning)
-                    return;
-            }
-            picker.widget.hide();
-            picker.viewMode = picker.startViewMode;
-            showMode();
-            picker.element.trigger({
-                type: 'hide.dp',
-                date: pMoment(picker.date)
-            });
-            detachDatePickerGlobalEvents();
-        },
-
-        picker.setValue = function (newDate) {
-            pMoment.lang(picker.options.language);
-            if (!newDate) {
-                picker.unset = true;
-            } else {
-                picker.unset = false;
-            }
-            if (!pMoment.isMoment(newDate)) newDate = pMoment(newDate);
-            if (newDate.isValid()) {
-                picker.date = newDate;
-                set();
-                picker.viewDate = pMoment({ y: picker.date.year(), M: picker.date.month() });
-                fillDate();
-                fillTime();
-            }
-            else {
-                notifyError(newDate);
-            }
-        },
-
-        picker.getDate = function () {
-            if (picker.unset) return null;
-            return picker.date;
-        },
-
-        picker.setDate = function (date) {
-            date = pMoment(date);
-            if (!date) picker.setValue(null);
-            else picker.setValue(date);
-        },
-
-        picker.setEnabledDates = function (dates) {
-            if (!dates) picker.options.enabledDates = false;
-            else picker.options.enabledDates = dates;
-            if (picker.viewDate) update();
-        },
-
-        picker.setEndDate = function (date) {
-            if (date == undefined) return;
-            picker.options.endDate = pMoment(date);
-            if (picker.viewDate) update();
-        },
-
-        picker.setStartDate = function (date) {
-            if (date == undefined) return;
-            picker.options.startDate = pMoment(date);
-            if (picker.viewDate) update();
-        };
-
-        init();
-    };
-
-    $.fn.datetimepicker = function (options) {
-        return this.each(function () {
-            var $this = $(this), data = $this.data('DateTimePicker');
-            if (!data) $this.data('DateTimePicker', new DateTimePicker(this, options));
-        });
-    };
-}));
diff --git a/dashboard/dependencies/js/bootstrap.min.js b/dashboard/dependencies/js/bootstrap.min.js
deleted file mode 100644
index 1a6258e..0000000
--- a/dashboard/dependencies/js/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
diff --git a/dashboard/dependencies/js/crossfilter.min.js b/dashboard/dependencies/js/crossfilter.min.js
deleted file mode 100644
index e70d279..0000000
--- a/dashboard/dependencies/js/crossfilter.min.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(r){function n(r){return r}function t(r,n){for(var t=0,e=n.length,u=Array(e);e>t;++t)u[t]=r[n[t]];return u}function e(r){function n(n,t,e,u){for(;u>e;){var f=e+u>>>1;r(n[f])<t?e=f+1:u=f}return e}function t(n,t,e,u){for(;u>e;){var f=e+u>>>1;t<r(n[f])?u=f:e=f+1}return e}return t.right=t,t.left=n,t}function u(r){function n(r,n,t){for(var u=t-n,f=(u>>>1)+1;--f>0;)e(r,f,u,n);return r}function t(r,n,t){for(var u,f=t-n;--f>0;)u=r[n],r[n]=r[n+f],r[n+f]=u,e(r,1,f,n);return r}function e(n,t,e,u){for(var f,o=n[--u+t],i=r(o);(f=t<<1)<=e&&(e>f&&r(n[u+f])>r(n[u+f+1])&&f++,!(i<=r(n[u+f])));)n[u+t]=n[u+f],t=f;n[u+t]=o}return n.sort=t,n}function f(r){function n(n,e,u,f){var o,i,a,c,l=Array(f=Math.min(u-e,f));for(i=0;f>i;++i)l[i]=n[e++];if(t(l,0,f),u>e){o=r(l[0]);do(a=r(c=n[e])>o)&&(l[0]=c,o=r(t(l,0,f)[0]));while(++e<u)}return l}var t=u(r);return n}function o(r){function n(n,t,e){for(var u=t+1;e>u;++u){for(var f=u,o=n[u],i=r(o);f>t&&r(n[f-1])>i;--f)n[f]=n[f-1];n[f]=o}return n}return n}function i(r){function n(r,n,u){return(U>u-n?e:t)(r,n,u)}function t(t,e,u){var f,o=0|(u-e)/6,i=e+o,a=u-1-o,c=e+u-1>>1,l=c-o,v=c+o,s=t[i],h=r(s),d=t[l],p=r(d),g=t[c],y=r(g),m=t[v],b=r(m),A=t[a],k=r(A);h>p&&(f=s,s=d,d=f,f=h,h=p,p=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f),h>y&&(f=s,s=g,g=f,f=h,h=y,y=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),h>b&&(f=s,s=m,m=f,f=h,h=b,b=f),y>b&&(f=g,g=m,m=f,f=y,y=b,b=f),p>k&&(f=d,d=A,A=f,f=p,p=k,k=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f);var x=d,w=p,E=m,O=b;t[i]=s,t[l]=t[e],t[c]=g,t[v]=t[u-1],t[a]=A;var M=e+1,U=u-2,z=O>=w&&w>=O;if(z)for(var N=M;U>=N;++N){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>w)for(;;){var q=r(t[U]);{if(!(q>w)){if(w>q){t[N]=t[M],t[M++]=t[U],t[U--]=C;break}t[N]=t[U],t[U--]=C;break}U--}}}else for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>O)for(;;){var q=r(t[U]);{if(!(q>O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}if(t[e]=t[M-1],t[M-1]=x,t[u-1]=t[U+1],t[U+1]=E,n(t,e,M-1),n(t,U+2,u),z)return t;if(i>M&&U>a){for(var F,q;(F=r(t[M]))<=w&&F>=w;)++M;for(;(q=r(t[U]))<=O&&q>=O;)--U;for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>=S&&S>=w)N!==M&&(t[N]=t[M],t[M]=C),M++;else if(O>=S&&S>=O)for(;;){var q=r(t[U]);{if(!(O>=q&&q>=O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}}return n(t,M,U+1)}var e=o(r);return n}function a(r){return Array(r)}function c(r,n){return function(t){var e=t.length;return[r.left(t,n,0,e),r.right(t,n,0,e)]}}function l(r,n){var t=n[0],e=n[1];return function(n){var u=n.length;return[r.left(n,t,0,u),r.left(n,e,0,u)]}}function v(r){return[0,r.length]}function s(){return null}function h(){return 0}function d(r){return r+1}function p(r){return r-1}function g(r){return function(n,t){return n+ +r(t)}}function y(r){return function(n,t){return n-r(t)}}function m(){function r(r){var n=E,t=r.length;return t&&(w=w.concat(r),U=S(U,E+=t),C.forEach(function(e){e(r,n,t)})),m}function e(r){function e(n,e,u){P=n.map(r),Q=Y(A(u),0,u),P=t(P,Q);var f,o,i=Z(P),a=i[0],c=i[1];if(T)for(f=0;u>f;++f)T(P[f],o=Q[f]+e)||(U[o]|=W);else{for(f=0;a>f;++f)U[Q[f]+e]|=W;for(f=c;u>f;++f)U[Q[f]+e]|=W}if(!e)return K=P,L=Q,rn=a,nn=c,void 0;var l=K,v=L,s=0,h=0;for(K=Array(E),L=b(E,E),f=0;e>s&&u>h;++f)l[s]<P[h]?(K[f]=l[s],L[f]=v[s++]):(K[f]=P[h],L[f]=Q[h++]+e);for(;e>s;++s,++f)K[f]=l[s],L[f]=v[s];for(;u>h;++h,++f)K[f]=P[h],L[f]=Q[h]+e;i=Z(K),rn=i[0],nn=i[1]}function o(r,n,t){$.forEach(function(r){r(P,Q,n,t)}),P=Q=null}function a(r){var n=r[0],t=r[1];if(T)return T=null,B(function(r,e){return e>=n&&t>e}),rn=n,nn=t,V;var e,u,f,o=[],i=[];if(rn>n)for(e=n,u=Math.min(rn,t);u>e;++e)U[f=L[e]]^=W,o.push(f);else if(n>rn)for(e=rn,u=Math.min(n,nn);u>e;++e)U[f=L[e]]^=W,i.push(f);if(t>nn)for(e=Math.max(n,nn),u=t;u>e;++e)U[f=L[e]]^=W,o.push(f);else if(nn>t)for(e=Math.max(rn,t),u=nn;u>e;++e)U[f=L[e]]^=W,i.push(f);return rn=n,nn=t,N.forEach(function(r){r(W,o,i)}),V}function m(r){return null==r?R():Array.isArray(r)?F(r):"function"==typeof r?j(r):z(r)}function z(r){return a((Z=c(x,r))(K))}function F(r){return a((Z=l(x,r))(K))}function R(){return a((Z=v)(K))}function j(r){return Z=v,B(T=r),rn=0,nn=E,V}function B(r){var n,t,e,u=[],f=[];for(n=0;E>n;++n)!(U[t=L[n]]&W)^(e=r(K[n],t))&&(e?(U[t]&=X,u.push(t)):(U[t]|=W,f.push(t)));N.forEach(function(r){r(W,u,f)})}function D(r){for(var n,t=[],e=nn;--e>=rn&&r>0;)U[n=L[e]]||(t.push(w[n]),--r);return t}function G(r){for(var n,t=[],e=rn;nn>e&&r>0;)U[n=L[e]]||(t.push(w[n]),--r),e++;return t}function H(r){function t(n,t,u,f){function c(){++P===J&&(m=q(m,I<<=1),R=q(R,I),J=k(I))}var l,v,h,d,p,g,y=F,m=b(P,J),A=D,x=H,O=P,M=0,z=0;for(V&&(A=x=s),F=Array(P),P=0,R=O>1?S(R,E):b(E,J),O&&(h=(v=y[0]).key);f>z&&!((d=r(n[z]))>=d);)++z;for(;f>z;){for(v&&d>=h?(p=v,g=h,m[M]=P,(v=y[++M])&&(h=v.key)):(p={key:d,value:x()},g=d),F[P]=p;!(d>g||(R[l=t[z]+u]=P,U[l]&X||(p.value=A(p.value,w[l])),++z>=f));)d=r(n[z]);c()}for(;O>M;)F[m[M]=P]=y[M++],c();if(P>M)for(M=0;u>M;++M)R[M]=m[R[M]];l=N.indexOf(Q),P>1?(Q=e,T=i):(1===P?(Q=o,T=a):(Q=s,T=s),R=null),N[l]=Q}function e(r,n,t){if(r!==W&&!V){var e,u,f,o;for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o=F[R[u]],o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o=F[R[u]],o.value=G(o.value,w[u]))}}function o(r,n,t){if(r!==W&&!V){var e,u,f,o=F[0];for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o.value=G(o.value,w[u]))}}function i(){var r,n;for(r=0;P>r;++r)F[r].value=H();for(r=0;E>r;++r)U[r]&X||(n=F[R[r]],n.value=D(n.value,w[r]))}function a(){var r,n=F[0];for(n.value=H(),r=0;E>r;++r)U[r]&X||(n.value=D(n.value,w[r]))}function c(){return V&&(T(),V=!1),F}function l(r){var n=j(c(),0,F.length,r);return B.sort(n,0,n.length)}function v(r,n,t){return D=r,G=n,H=t,V=!0,C}function m(){return v(d,p,h)}function A(r){return v(g(r),y(r),h)}function x(r){function n(n){return r(n.value)}return j=f(n),B=u(n),C}function O(){return x(n)}function M(){return P}function z(){var r=N.indexOf(Q);return r>=0&&N.splice(r,1),r=$.indexOf(t),r>=0&&$.splice(r,1),C}var C={top:l,all:c,reduce:v,reduceCount:m,reduceSum:A,order:x,orderNatural:O,size:M,remove:z};_.push(C);var F,R,j,B,D,G,H,I=8,J=k(I),P=0,Q=s,T=s,V=!0;return arguments.length<1&&(r=n),N.push(Q),$.push(t),t(K,L,0,E),m().orderNatural()}function I(){var r=H(s),n=r.all;return delete r.all,delete r.top,delete r.order,delete r.orderNatural,delete r.size,r.value=function(){return n()[0].value},r}function J(){_.forEach(function(r){r.remove()});var r=C.indexOf(e);for(r>=0&&C.splice(r,1),r=C.indexOf(o),r>=0&&C.splice(r,1),r=0;E>r;++r)U[r]&=X;return O&=X,V}var K,L,P,Q,T,V={filter:m,filterExact:z,filterRange:F,filterFunction:j,filterAll:R,top:D,bottom:G,group:H,groupAll:I,remove:J},W=~O&-~O,X=~W,Y=i(function(r){return P[r]}),Z=v,$=[],_=[],rn=0,nn=0;return C.unshift(e),C.push(o),O|=W,(M>=32?!W:O&(1<<M)-1)&&(U=q(U,M<<=1)),e(w,0,E),o(w,0,E),V}function o(){function r(r,n){var t;if(!m)for(t=n;E>t;++t)U[t]||(a=c(a,w[t]))}function n(r,n,t){var e,u,f;if(!m){for(e=0,f=n.length;f>e;++e)U[u=n[e]]||(a=c(a,w[u]));for(e=0,f=t.length;f>e;++e)U[u=t[e]]===r&&(a=l(a,w[u]))}}function t(){var r;for(a=v(),r=0;E>r;++r)U[r]||(a=c(a,w[r]))}function e(r,n,t){return c=r,l=n,v=t,m=!0,s}function u(){return e(d,p,h)}function f(r){return e(g(r),y(r),h)}function o(){return m&&(t(),m=!1),a}function i(){var t=N.indexOf(n);return t>=0&&N.splice(t),t=C.indexOf(r),t>=0&&C.splice(t),s}var a,c,l,v,s={reduce:e,reduceCount:u,reduceSum:f,value:o,remove:i},m=!0;return N.push(n),C.push(r),r(w,0,E),u()}function a(){return E}var m={add:r,dimension:e,groupAll:o,size:a},w=[],E=0,O=0,M=8,U=z(0),N=[],C=[];return arguments.length?r(arguments[0]):m}function b(r,n){return(257>n?z:65537>n?N:C)(r)}function A(r){for(var n=b(r,r),t=-1;++t<r;)n[t]=t;return n}function k(r){return 8===r?256:16===r?65536:4294967296}m.version="1.2.0",m.permute=t;var x=m.bisect=e(n);x.by=e;var w=m.heap=u(n);w.by=u;var E=m.heapselect=f(n);E.by=f;var O=m.insertionsort=o(n);O.by=o;var M=m.quicksort=i(n);M.by=i;var U=32,z=a,N=a,C=a,S=n,q=n;"undefined"!=typeof Uint8Array&&(z=function(r){return new Uint8Array(r)},N=function(r){return new Uint16Array(r)},C=function(r){return new Uint32Array(r)},S=function(r,n){var t=new r.constructor(n);return t.set(r),t},q=function(r,n){var t;switch(n){case 16:t=N(r.length);break;case 32:t=C(r.length);break;default:throw Error("invalid array width!")}return t.set(r),t}),r.crossfilter=m})(this);
\ No newline at end of file
diff --git a/dashboard/dependencies/js/d3.min.js b/dashboard/dependencies/js/d3.min.js
deleted file mode 100644
index 91fa2eb..0000000
--- a/dashboard/dependencies/js/d3.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function i(){}function u(){}function a(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function o(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=Ca.length;r>e;++e){var i=Ca[e]+t;if(i in n)return i}}function c(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}function l(n){return Array.prototype.slice.call(n)}function s(){}function f(){}function h(n){function t(){for(var t,r=e,i=-1,u=r.length;++i<u;)(t=r[i].on)&&t.apply(this,arguments);return n}var e=[],r=new i;return t.on=function(t,i){var u,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,u=e.indexOf(a)).concat(e.slice(u+1)),r.remove(t)),i&&e.push(r.set(t,{on:i})),n)},t}function g(){ya.event.preventDefault()}function p(){for(var n,t=ya.event;n=t.sourceEvent;)t=n;return t}function m(n){for(var t=new f,e=0,r=arguments.length;++e<r;)t[arguments[e]]=h(t);return t.of=function(e,r){return function(i){try{var u=i.sourceEvent=ya.event;i.target=n,ya.event=i,t[i.type].apply(e,r)}finally{ya.event=u}}},t}function d(n){return La(n,Ya),n}function v(n){return"function"==typeof n?n:function(){return Ha(n,this)}}function y(n){return"function"==typeof n?n:function(){return Fa(n,this)}}function M(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function i(){this.setAttribute(n,t)}function u(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ya.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?o:a:n.local?u:i}function x(n){return n.trim().replace(/\s+/g," ")}function b(n){return new RegExp("(?:^|\\s+)"+ya.requote(n)+"(?:\\s+|$)","g")}function _(n,t){function e(){for(var e=-1;++e<i;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<i;)n[e](this,r)}n=n.trim().split(/\s+/).map(w);var i=n.length;return"function"==typeof t?r:e}function w(n){var t=b(n);return function(e,r){if(i=e.classList)return r?i.add(n):i.remove(n);var i=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(i)||e.setAttribute("class",x(i+" "+n))):e.setAttribute("class",x(i.replace(t," ")))}}function S(n,t,e){function r(){this.style.removeProperty(n)}function i(){this.style.setProperty(n,t,e)}function u(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?u:i}function E(n,t){function e(){delete this[n]}function r(){this[n]=t}function i(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?i:r}function k(n){return"function"==typeof n?n:(n=ya.ns.qualify(n)).local?function(){return Ma.createElementNS(n.space,n.local)}:function(){return Ma.createElementNS(this.namespaceURI,n)}}function A(n){return{__data__:n}}function N(n){return function(){return Oa(this,n)}}function q(n){return arguments.length||(n=ya.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function T(n,t){for(var e=0,r=n.length;r>e;e++)for(var i,u=n[e],a=0,o=u.length;o>a;a++)(i=u[a])&&t(i,a,e);return n}function C(n){return La(n,Ua),n}function z(n){var t,e;return function(r,i,u){var a,o=n[u].update,c=o.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(a=o[t])&&++t<c;);return a}}function D(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function i(){var i=c(t,za(arguments));r.call(this),this.addEventListener(n,this[a]=i,i.$=e),i._=t}function u(){var t,e=new RegExp("^__on([^.]+)"+ya.requote(n)+"$");for(var r in this)if(t=r.match(e)){var i=this[r];this.removeEventListener(t[1],i,i.$),delete this[r]}}var a="__on"+n,o=n.indexOf("."),c=j;o>0&&(n=n.substring(0,o));var l=Va.get(n);return l&&(n=l,c=L),o?t?i:r:t?s:u}function j(n,t){return function(e){var r=ya.event;ya.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ya.event=r}}}function L(n,t){var e=j(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function H(){var n=".dragsuppress-"+ ++Za,t="touchmove"+n,e="selectstart"+n,r="dragstart"+n,i="click"+n,u=ya.select(ba).on(t,g).on(e,g).on(r,g),a=xa.style,o=a[Xa];return a[Xa]="none",function(t){function e(){u.on(i,null)}u.on(n,null),a[Xa]=o,t&&(u.on(i,function(){g(),e()},!0),setTimeout(e,0))}}function F(n,t){var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Ba&&(ba.scrollX||ba.scrollY)){e=ya.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var i=e[0][0].getScreenCTM();Ba=!(i.f||i.e),e.remove()}return Ba?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var u=n.getBoundingClientRect();return[t.clientX-u.left-n.clientLeft,t.clientY-u.top-n.clientTop]}function P(){}function O(n,t,e){return new Y(n,t,e)}function Y(n,t,e){this.h=n,this.s=t,this.l=e}function R(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(a-u)*n/60:180>n?a:240>n?u+(a-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,u=2*e-a,at(i(n+120),i(n),i(n-120))}function U(n){return n>0?1:0>n?-1:0}function I(n){return n>1?0:-1>n?Ka:Math.acos(n)}function V(n){return n>1?Ka/2:-1>n?-Ka/2:Math.asin(n)}function X(n){return(Math.exp(n)-Math.exp(-n))/2}function Z(n){return(Math.exp(n)+Math.exp(-n))/2}function B(n){return(n=Math.sin(n/2))*n}function $(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=to)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=tt(i)*uo,r=tt(r)*ao,u=tt(u)*oo,at(rt(3.2404542*i-1.5371385*r-.4985314*u),rt(-.969266*i+1.8760108*r+.041556*u),rt(.0556434*i-.2040259*r+1.0572252*u))}function nt(n,t,e){return n>0?$(Math.atan2(e,t)*eo,Math.sqrt(t*t+e*e),n):$(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function it(n){return at(n>>16,255&n>>8,255&n)}function ut(n){return it(n)+""}function at(n,t,e){return new ot(n,t,e)}function ot(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function lt(n,t,e){var r,i,u,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(gt(i[0]),gt(i[1]),gt(i[2]))}return(u=so.get(n))?t(u.r,u.g,u.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(a=n.charAt(1),a+=a,o=n.charAt(2),o+=o,c=n.charAt(3),c+=c):7===n.length&&(a=n.substring(1,3),o=n.substring(3,5),c=n.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),t(a,o,c))}function st(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-u,c=(a+u)/2;return o?(i=.5>c?o/(a+u):o/(2-a-u),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=0/0,i=c>0&&1>c?0:r),O(r,i,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/uo),i=et((.2126729*n+.7151522*t+.072175*e)/ao),u=et((.0193339*n+.119192*t+.9503041*e)/oo);return G(116*i-16,500*(r-i),200*(i-u))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function mt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),vt(t,e,n,r)}}function vt(n,t,e,r){function i(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(u,c)}catch(r){return a.error.call(u,r),void 0}a.load.call(u,n)}else a.error.call(u,c)}var u={},a=ya.dispatch("progress","load","error"),o={},c=new XMLHttpRequest,l=null;return!ba.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=i:c.onreadystatechange=function(){c.readyState>3&&i()},c.onprogress=function(n){var t=ya.event;ya.event=n;try{a.progress.call(u,c)}finally{ya.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(l=n,u):l},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(za(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),c.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),c.setRequestHeader)for(var a in o)c.setRequestHeader(a,o[a]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),c.send(null==r?null:r),u},u.abort=function(){return c.abort(),u},ya.rebind(u,a,"on"),null==r?u:u.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Mt(){var n=bt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(po),po=setTimeout(Mt,t)),go=0):(go=1,vo(Mt))}function xt(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now()),mo.callback=n,mo.time=e+t}function bt(){var n=Date.now();for(mo=fo;mo;)n>=mo.time&&(mo.flush=mo.callback(n-mo.time)),mo=mo.next;return n}function _t(){for(var n,t=fo,e=1/0;t;)t.flush?t=n?n.next=t.next:fo=t.next:(t.time<e&&(e=t.time),t=(n=t).next);return ho=n,e}function wt(n,t){var e=Math.pow(10,3*Math.abs(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function St(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Et(n){return n+""}function kt(){}function At(n,t,e){var r=e.s=n+t,i=r-n,u=r-i;e.t=n-u+(t-i)}function Nt(n,t){n&&qo.hasOwnProperty(n.type)&&qo[n.type](n,t)}function qt(n,t,e){var r,i=-1,u=n.length-e;for(t.lineStart();++i<u;)r=n[i],t.point(r[0],r[1]);t.lineEnd()}function Tt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)qt(n[e],t,1);t.polygonEnd()}function Ct(){function n(n,t){n*=to,t=t*to/2+Ka/4;var e=n-r,a=Math.cos(t),o=Math.sin(t),c=u*o,l=i*a+c*Math.cos(e),s=c*Math.sin(e);Co.add(Math.atan2(s,l)),r=n,i=a,u=o}var t,e,r,i,u;zo.point=function(a,o){zo.point=n,r=(t=a)*to,i=Math.cos(o=(e=o)*to/2+Ka/4),u=Math.sin(o)},zo.lineEnd=function(){n(t,e)}}function zt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function Dt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function jt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Lt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Ht(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Ft(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Pt(n){return[Math.atan2(n[1],n[0]),V(n[2])]}function Ot(n,t){return Math.abs(n[0]-t[0])<Qa&&Math.abs(n[1]-t[1])<Qa}function Yt(n,t){n*=to;var e=Math.cos(t*=to);Rt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Rt(n,t,e){++Do,Lo+=(n-Lo)/Do,Ho+=(t-Ho)/Do,Fo+=(e-Fo)/Do}function Ut(){function n(n,i){n*=to;var u=Math.cos(i*=to),a=u*Math.cos(n),o=u*Math.sin(n),c=Math.sin(i),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-t*c)*l+(l=t*o-e*a)*l),t*a+e*o+r*c);jo+=l,Po+=l*(t+(t=a)),Oo+=l*(e+(e=o)),Yo+=l*(r+(r=c)),Rt(t,e,r)}var t,e,r;Vo.point=function(i,u){i*=to;var a=Math.cos(u*=to);t=a*Math.cos(i),e=a*Math.sin(i),r=Math.sin(u),Vo.point=n,Rt(t,e,r)}}function It(){Vo.point=Yt}function Vt(){function n(n,t){n*=to;var e=Math.cos(t*=to),a=e*Math.cos(n),o=e*Math.sin(n),c=Math.sin(t),l=i*c-u*o,s=u*a-r*c,f=r*o-i*a,h=Math.sqrt(l*l+s*s+f*f),g=r*a+i*o+u*c,p=h&&-I(g)/h,m=Math.atan2(h,g);Ro+=p*l,Uo+=p*s,Io+=p*f,jo+=m,Po+=m*(r+(r=a)),Oo+=m*(i+(i=o)),Yo+=m*(u+(u=c)),Rt(r,i,u)}var t,e,r,i,u;Vo.point=function(a,o){t=a,e=o,Vo.point=n,a*=to;var c=Math.cos(o*=to);r=c*Math.cos(a),i=c*Math.sin(a),u=Math.sin(o),Rt(r,i,u)},Vo.lineEnd=function(){n(t,e),Vo.lineEnd=It,Vo.point=Yt}}function Xt(){return!0}function Zt(n,t,e,r,i){var u=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(Ot(e,r)){i.lineStart();for(var o=0;t>o;++o)i.point((e=n[o])[0],e[1]);return i.lineEnd(),void 0}var c={point:e,points:n,other:null,visited:!1,entry:!0,subject:!0},l={point:e,points:[e],other:c,visited:!1,entry:!1,subject:!1};c.other=l,u.push(c),a.push(l),c={point:r,points:[r],other:null,visited:!1,entry:!1,subject:!0},l={point:r,points:[r],other:c,visited:!1,entry:!0,subject:!1},c.other=l,u.push(c),a.push(l)}}),a.sort(t),Bt(u),Bt(a),u.length){if(e)for(var o=1,c=!e(a[0].point),l=a.length;l>o;++o)a[o].entry=c=!c;for(var s,f,h,g=u[0];;){for(s=g;s.visited;)if((s=s.next)===g)return;f=s.points,i.lineStart();do{if(s.visited=s.other.visited=!0,s.entry){if(s.subject)for(var o=0;o<f.length;o++)i.point((h=f[o])[0],h[1]);else r(s.point,s.next.point,1,i);s=s.next}else{if(s.subject){f=s.prev.points;for(var o=f.length;--o>=0;)i.point((h=f[o])[0],h[1])}else r(s.point,s.prev.point,-1,i);s=s.prev}s=s.other,f=s.points}while(!s.visited);i.lineEnd()}}}function Bt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r<t;)i.next=e=n[r],e.prev=i,i=e;i.next=e=n[0],e.prev=i}}function $t(n,t,e,r){return function(i){function u(t,e){n(t,e)&&i.point(t,e)}function a(n,t){m.point(n,t)}function o(){d.point=a,m.lineStart()}function c(){d.point=u,m.lineEnd()}function l(n,t){y.point(n,t),p.push([n,t])}function s(){y.lineStart(),p=[]}function f(){l(p[0][0],p[0][1]),y.lineEnd();var n,t=y.clean(),e=v.buffer(),r=e.length;if(p.pop(),g.push(p),p=null,r){if(1&t){n=e[0];var u,r=n.length-1,a=-1;for(i.lineStart();++a<r;)i.point((u=n[a])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),h.push(e.filter(Wt))}}var h,g,p,m=t(i),d={point:u,lineStart:o,lineEnd:c,polygonStart:function(){d.point=l,d.lineStart=s,d.lineEnd=f,h=[],g=[],i.polygonStart()},polygonEnd:function(){d.point=u,d.lineStart=o,d.lineEnd=c,h=ya.merge(h),h.length?Zt(h,Gt,null,e,i):r(g)&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),h=g=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},v=Jt(),y=t(v);return d}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:s,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.point)[0]<0?n[1]-Ka/2-Qa:Ka/2-n[1])-((t=t.point)[0]<0?t[1]-Ka/2-Qa:Ka/2-t[1])}function Kt(n,t){var e=n[0],r=n[1],i=[Math.sin(e),-Math.cos(e),0],u=0,a=!1,o=!1,c=0;Co.reset();for(var l=0,s=t.length;s>l;++l){var f=t[l],h=f.length;if(h){for(var g=f[0],p=g[0],m=g[1]/2+Ka/4,d=Math.sin(m),v=Math.cos(m),y=1;;){y===h&&(y=0),n=f[y];var M=n[0],x=n[1]/2+Ka/4,b=Math.sin(x),_=Math.cos(x),w=M-p,S=Math.abs(w)>Ka,E=d*b;if(Co.add(Math.atan2(E*Math.sin(w),v*_+E*Math.cos(w))),Math.abs(x)<Qa&&(o=!0),u+=S?w+(w>=0?2:-2)*Ka:w,S^p>=e^M>=e){var k=jt(zt(g),zt(n));Ft(k);var A=jt(i,k);Ft(A);var N=(S^w>=0?-1:1)*V(A[2]);r>N&&(c+=S^w>=0?1:-1)}if(!y++)break;p=M,d=b,v=_,g=n}Math.abs(u)>Qa&&(a=!0)}}return(!o&&!a&&0>Co||-Qa>u)^1&c}function Qt(n){var t,e=0/0,r=0/0,i=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(u,a){var o=u>0?Ka:-Ka,c=Math.abs(u-e);Math.abs(c-Ka)<Qa?(n.point(e,r=(r+a)/2>0?Ka/2:-Ka/2),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(u,r),t=0):i!==o&&c>=Ka&&(Math.abs(e-i)<Qa&&(e-=i*Qa),Math.abs(u-o)<Qa&&(u-=o*Qa),r=ne(e,r,u,a),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=u,r=a),i=o},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var i,u,a=Math.sin(n-e);return Math.abs(a)>Qa?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*a)):(t+r)/2}function te(n,t,e,r){var i;if(null==n)i=e*Ka/2,r.point(-Ka,i),r.point(0,i),r.point(Ka,i),r.point(Ka,0),r.point(Ka,-i),r.point(0,-i),r.point(-Ka,-i),r.point(-Ka,0),r.point(-Ka,i);else if(Math.abs(n[0]-t[0])>Qa){var u=(n[0]<t[0]?1:-1)*Ka;i=e*u/2,r.point(-u,i),r.point(0,i),r.point(u,i)}else r.point(t[0],t[1])}function ee(n){return Kt(Zo,n)}function re(n){function t(n,t){return Math.cos(n)*Math.cos(t)>a}function e(n){var e,u,a,c,s;return{lineStart:function(){c=a=!1,s=1},point:function(f,h){var g,p=[f,h],m=t(f,h),d=o?m?0:i(f,h):m?i(f+(0>f?Ka:-Ka),h):0;if(!e&&(c=a=m)&&n.lineStart(),m!==a&&(g=r(e,p),(Ot(e,g)||Ot(p,g))&&(p[0]+=Qa,p[1]+=Qa,m=t(p[0],p[1]))),m!==a)s=0,m?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(l&&e&&o^m){var v;d&u||!(v=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(v[0][0],v[0][1]),n.point(v[1][0],v[1][1]),n.lineEnd()):(n.point(v[1][0],v[1][1]),n.lineEnd(),n.lineStart(),n.point(v[0][0],v[0][1])))}!m||e&&Ot(e,p)||n.point(p[0],p[1]),e=p,a=m,u=d},lineEnd:function(){a&&n.lineEnd(),e=null},clean:function(){return s|(c&&a)<<1}}}function r(n,t,e){var r=zt(n),i=zt(t),u=[1,0,0],o=jt(r,i),c=Dt(o,o),l=o[0],s=c-l*l;if(!s)return!e&&n;var f=a*c/s,h=-a*l/s,g=jt(u,o),p=Ht(u,f),m=Ht(o,h);Lt(p,m);var d=g,v=Dt(p,d),y=Dt(d,d),M=v*v-y*(Dt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Ht(d,(-v-x)/y);if(Lt(b,p),b=Pt(b),!e)return b;var _,w=n[0],S=t[0],E=n[1],k=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=Math.abs(A-Ka)<Qa,q=N||Qa>A;if(!N&&E>k&&(_=E,E=k,k=_),q?N?E+k>0^b[1]<(Math.abs(b[0]-w)<Qa?E:k):E<=b[1]&&b[1]<=k:A>Ka^(w<=b[0]&&b[0]<=S)){var T=Ht(d,(-v+x)/y);return Lt(T,p),[b,Pt(T)]}}}function i(t,e){var r=o?n:Ka-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}function u(n){return Kt(c,n)}var a=Math.cos(n),o=a>0,c=[n,0],l=Math.abs(a)>Qa,s=Ne(n,6*to);return $t(t,e,s,u)}function ie(n,t,e,r){function i(r,i){return Math.abs(r[0]-n)<Qa?i>0?0:3:Math.abs(r[0]-e)<Qa?i>0?2:1:Math.abs(r[1]-t)<Qa?i>0?1:0:i>0?3:2}function u(n,t){return a(n.point,t.point)}function a(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}function o(i,u){var a=u[0]-i[0],o=u[1]-i[1],c=[0,1];return Math.abs(a)<Qa&&Math.abs(o)<Qa?n<=i[0]&&i[0]<=e&&t<=i[1]&&i[1]<=r:ue(n-i[0],a,c)&&ue(i[0]-e,-a,c)&&ue(t-i[1],o,c)&&ue(i[1]-r,-o,c)?(c[1]<1&&(u[0]=i[0]+c[1]*a,u[1]=i[1]+c[1]*o),c[0]>0&&(i[0]+=c[0]*a,i[1]+=c[0]*o),!0):!1}return function(c){function l(u){var a=i(u,-1),o=s([0===a||3===a?n:e,a>1?r:t]);return o}function s(n){for(var t=0,e=M.length,r=n[1],i=0;e>i;++i)for(var u,a=1,o=M[i],c=o.length,l=o[0];c>a;++a)u=o[a],l[1]<=r?u[1]>r&&f(l,u,n)>0&&++t:u[1]<=r&&f(l,u,n)<0&&--t,l=u;return 0!==t}function f(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function h(u,o,c,l){var s=0,f=0;if(null==u||(s=i(u,c))!==(f=i(o,c))||a(u,o)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(o[0],o[1])}function g(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function p(n,t){g(n,t)&&c.point(n,t)}function m(){T.point=v,M&&M.push(x=[]),A=!0,k=!1,S=E=0/0}function d(){y&&(v(b,_),w&&k&&q.rejoin(),y.push(q.buffer())),T.point=p,k&&c.lineEnd()}function v(n,t){n=Math.max(-Bo,Math.min(Bo,n)),t=Math.max(-Bo,Math.min(Bo,t));var e=g(n,t);if(M&&x.push([n,t]),A)b=n,_=t,w=e,A=!1,e&&(c.lineStart(),c.point(n,t));else if(e&&k)c.point(n,t);else{var r=[S,E],i=[n,t];o(r,i)?(k||(c.lineStart(),c.point(r[0],r[1])),c.point(i[0],i[1]),e||c.lineEnd()):e&&(c.lineStart(),c.point(n,t))}S=n,E=t,k=e}var y,M,x,b,_,w,S,E,k,A,N=c,q=Jt(),T={point:p,lineStart:m,lineEnd:d,polygonStart:function(){c=q,y=[],M=[]},polygonEnd:function(){c=N,(y=ya.merge(y)).length?(c.polygonStart(),Zt(y,u,l,h,c),c.polygonEnd()):s([n,t])&&(c.polygonStart(),c.lineStart(),h(null,null,1,c),c.lineEnd(),c.polygonEnd()),y=M=x=null}};return T}}function ue(n,t,e){if(Math.abs(t)<Qa)return 0>=n;var r=n/t;if(t>0){if(r>e[1])return!1;r>e[0]&&(e[0]=r)}else{if(r<e[0])return!1;r<e[1]&&(e[1]=r)}return!0}function ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=Ka/3,r=be(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Ka/180,e=n[1]*Ka/180):[180*(t/Ka),180*(e/Ka)]},i}function ce(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),a-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),a=Math.sqrt(u)/i;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/i,V((u-(n*n+e*e)*i*i)/(2*i))]},e}function le(){function n(n,t){Wo+=i*n-r*t,r=n,i=t}var t,e,r,i;nc.point=function(u,a){nc.point=n,t=r=u,e=i=a},nc.lineEnd=function(){n(t,e)}}function se(n,t){Jo>n&&(Jo=n),n>Ko&&(Ko=n),Go>t&&(Go=t),t>Qo&&(Qo=t)}function fe(){function n(n,t){a.push("M",n,",",t,u)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function i(){a.push("Z")}var u=he(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return u=he(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function he(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function ge(n,t){Lo+=n,Ho+=t,++Fo}function pe(){function n(n,r){var i=n-t,u=r-e,a=Math.sqrt(i*i+u*u);Po+=a*(t+n)/2,Oo+=a*(e+r)/2,Yo+=a,ge(t=n,e=r)}var t,e;ec.point=function(r,i){ec.point=n,ge(t=r,e=i)}}function me(){ec.point=ge}function de(){function n(n,t){var e=n-r,u=t-i,a=Math.sqrt(e*e+u*u);Po+=a*(r+n)/2,Oo+=a*(i+t)/2,Yo+=a,a=i*n-r*t,Ro+=a*(r+n),Uo+=a*(i+t),Io+=3*a,ge(r=n,i=t)}var t,e,r,i;ec.point=function(u,a){ec.point=n,ge(t=r=u,e=i=a)},ec.lineEnd=function(){n(t,e)}}function ve(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,a,0,2*Ka)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function i(){o.point=t}function u(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:i,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=i,o.point=t},pointRadius:function(n){return a=n,o},result:s};return o}function ye(n){function t(t){function r(e,r){e=n(e,r),t.point(e[0],e[1])}function i(){M=0/0,S.point=a,t.lineStart()}function a(r,i){var a=zt([r,i]),o=n(r,i);e(M,x,y,b,_,w,M=o[0],x=o[1],y=r,b=a[0],_=a[1],w=a[2],u,t),t.point(M,x)}function o(){S.point=r,t.lineEnd()}function c(){i(),S.point=l,S.lineEnd=s}function l(n,t){a(f=n,h=t),g=M,p=x,m=b,d=_,v=w,S.point=a}function s(){e(M,x,y,b,_,w,g,p,f,m,d,v,u,t),S.lineEnd=o,o()}var f,h,g,p,m,d,v,y,M,x,b,_,w,S={point:r,lineStart:i,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=i}};return S}function e(t,u,a,o,c,l,s,f,h,g,p,m,d,v){var y=s-t,M=f-u,x=y*y+M*M;if(x>4*r&&d--){var b=o+g,_=c+p,w=l+m,S=Math.sqrt(b*b+_*_+w*w),E=Math.asin(w/=S),k=Math.abs(Math.abs(w)-1)<Qa?(a+h)/2:Math.atan2(_,b),A=n(k,E),N=A[0],q=A[1],T=N-t,C=q-u,z=M*T-y*C;(z*z/x>r||Math.abs((y*T+M*C)/x-.5)>.3||i>o*g+c*p+l*m)&&(e(t,u,a,o,c,l,N,q,k,b/=S,_/=S,w,d,v),v.point(N,q),e(N,q,k,b,_,w,s,f,h,g,p,m,d,v))}}var r=.5,i=Math.cos(30*to),u=16;return t.precision=function(n){return arguments.length?(u=(r=n*n)>0&&16,t):Math.sqrt(r)},t}function Me(n){var t=ye(function(t,e){return n([t*eo,e*eo])});return function(n){return n=t(n),{point:function(t,e){n.point(t*to,e*to)},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}}function xe(n){return be(function(){return n})()}function be(n){function t(n){return n=o(n[0]*to,n[1]*to),[n[0]*h+c,l-n[1]*h]}function e(n){return n=o.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*eo,n[1]*eo]}function r(){o=ae(a=Se(v,y,M),u);var n=u(m,d);return c=g-n[0]*h,l=p+n[1]*h,i()}function i(){return s&&(s.valid=!1,s=null),t}var u,a,o,c,l,s,f=ye(function(n,t){return n=u(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,m=0,d=0,v=0,y=0,M=0,x=Xo,b=mt,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=_e(a,x(f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Xo):re((_=+n)*to),i()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=null==n?mt:ie(n[0][0],n[0][1],n[1][0],n[1][1]),i()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(m=n[0]%360*to,d=n[1]%360*to,r()):[m*eo,d*eo]},t.rotate=function(n){return arguments.length?(v=n[0]%360*to,y=n[1]%360*to,M=n.length>2?n[2]%360*to:0,r()):[v*eo,y*eo,M*eo]},ya.rebind(t,f,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function _e(n,t){return{point:function(e,r){r=n(e*to,r*to),e=r[0],t.point(e>Ka?e-2*Ka:-Ka>e?e+2*Ka:e,r[1])},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function we(n,t){return[n,t]}function Se(n,t,e){return n?t||e?ae(ke(n),Ae(t,e)):ke(n):t||e?Ae(t,e):we}function Ee(n){return function(t,e){return t+=n,[t>Ka?t-2*Ka:-Ka>t?t+2*Ka:t,e]}}function ke(n){var t=Ee(n);return t.invert=Ee(-n),t}function Ae(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+o*i;return[Math.atan2(c*u-s*a,o*r-l*i),V(s*u+c*a)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*u-c*a;return[Math.atan2(c*u+l*a,o*r+s*i),V(s*r-o*i)]},e}function Ne(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,a,o){null!=i?(i=qe(e,i),u=qe(e,u),(a>0?u>i:i>u)&&(i+=2*a*Ka)):(i=n+2*a*Ka,u=n);for(var c,l=a*t,s=i;a>0?s>u:u>s;s-=l)o.point((c=Pt([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function qe(n,t){var e=zt(t);e[0]-=n,Ft(e);var r=I(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Qa)%(2*Math.PI)}function Te(n,t,e){var r=ya.range(n,t-Qa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function Ce(n,t,e){var r=ya.range(n,t-Qa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function ze(n){return n.source}function De(n){return n.target}function je(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),a=Math.cos(r),o=Math.sin(r),c=i*Math.cos(n),l=i*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(B(r-t)+i*a*B(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,i=e*l+t*f,a=e*u+t*o;return[Math.atan2(i,r)*eo,Math.atan2(a,Math.sqrt(r*r+i*i))*eo]}:function(){return[n*eo,t*eo]};return p.distance=h,p}function Le(){function n(n,i){var u=Math.sin(i*=to),a=Math.cos(i),o=Math.abs((n*=to)-t),c=Math.cos(o);rc+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*u-e*a*c)*o),e*u+r*a*c),t=n,e=u,r=a}var t,e,r;ic.point=function(i,u){t=i*to,e=Math.sin(u*=to),r=Math.cos(u),ic.point=n},ic.lineEnd=function(){ic.point=ic.lineEnd=s}}function He(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),a=Math.cos(i);return[Math.atan2(n*u,r*a),Math.asin(r&&e*u/r)]},e}function Fe(n,t){function e(n,t){var e=Math.abs(Math.abs(t)-Ka/2)<Qa?0:a/Math.pow(i(t),u);return[e*Math.sin(u*n),a-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Ka/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),a=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=a-t,r=U(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(a/r,1/u))-Ka/2]},e):Oe}function Pe(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return Math.abs(i)<Qa?we:(e.invert=function(n,t){var e=u-t;return[Math.atan2(n,e)/i,u-U(i)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(Ka/4+t/2))]}function Ye(n){var t,e=xe(n),r=e.scale,i=e.translate,u=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=i.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=u.apply(e,arguments);if(a===e){if(t=null==n){var o=Ka*r(),c=i();u([[c[0]-o,c[1]-o],[c[0]+o,c[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Re(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ue(n){function t(t){function a(){l.push("M",u(n(s),o))}for(var c,l=[],s=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)i.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(a(),s=[]);return s.length&&a(),l.length?l.join(""):null}var e=Ie,r=Ve,i=Xt,u=Xe,a=u.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(i=n,t):i},t.interpolate=function(n){return arguments.length?(a="function"==typeof n?u=n:(u=sc.get(n)||Xe).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function Ie(n){return n[0]}function Ve(n){return n[1]}function Xe(n){return n.join("L")}function Ze(n){return Xe(n)+"Z"}function Be(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function $e(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("V",(r=n[t])[1],"H",r[0]);return i.join("")}function We(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r=n[t])[0],"V",r[1]);return i.join("")}function Je(n,t){return n.length<4?Xe(n):n[1]+Qe(n.slice(1,n.length-1),nr(n,t))}function Ge(n,t){return n.length<3?Xe(n):n[0]+Qe((n.push(n[0]),n),nr([n[n.length-2]].concat(n,[n[1]]),t))}function Ke(n,t){return n.length<3?Xe(n):n[0]+Qe(n,nr(n,t))}function Qe(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Xe(n);var e=n.length!=t.length,r="",i=n[0],u=n[1],a=t[0],o=a,c=1;if(e&&(r+="Q"+(u[0]-2*a[0]/3)+","+(u[1]-2*a[1]/3)+","+u[0]+","+u[1],i=n[1],c=2),t.length>1){o=t[1],u=n[c],c++,r+="C"+(i[0]+a[0])+","+(i[1]+a[1])+","+(u[0]-o[0])+","+(u[1]-o[1])+","+u[0]+","+u[1];for(var l=2;l<t.length;l++,c++)u=n[c],o=t[l],r+="S"+(u[0]-o[0])+","+(u[1]-o[1])+","+u[0]+","+u[1]}if(e){var s=n[c];r+="Q"+(u[0]+2*o[0]/3)+","+(u[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function nr(n,t){for(var e,r=[],i=(1-t)/2,u=n[0],a=n[1],o=1,c=n.length;++o<c;)e=u,u=a,a=n[o],r.push([i*(a[0]-e[0]),i*(a[1]-e[1])]);return r}function tr(n){if(n.length<3)return Xe(n);var t=1,e=n.length,r=n[0],i=r[0],u=r[1],a=[i,i,i,(r=n[1])[0]],o=[u,u,u,r[1]],c=[i,",",u,"L",ur(gc,a),",",ur(gc,o)];for(n.push(n[e-1]);++t<=e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),ar(c,a,o);return n.pop(),c.push("L",r),c.join("")}function er(n){if(n.length<4)return Xe(n);for(var t,e=[],r=-1,i=n.length,u=[0],a=[0];++r<3;)t=n[r],u.push(t[0]),a.push(t[1]);for(e.push(ur(gc,u)+","+ur(gc,a)),--r;++r<i;)t=n[r],u.shift(),u.push(t[0]),a.shift(),a.push(t[1]),ar(e,u,a);return e.join("")}function rr(n){for(var t,e,r=-1,i=n.length,u=i+4,a=[],o=[];++r<4;)e=n[r%i],a.push(e[0]),o.push(e[1]);for(t=[ur(gc,a),",",ur(gc,o)],--r;++r<u;)e=n[r%i],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),ar(t,a,o);return t.join("")}function ir(n,t){var e=n.length-1;if(e)for(var r,i,u=n[0][0],a=n[0][1],o=n[e][0]-u,c=n[e][1]-a,l=-1;++l<=e;)r=n[l],i=l/e,r[0]=t*r[0]+(1-t)*(u+i*o),r[1]=t*r[1]+(1-t)*(a+i*c);return tr(n)}function ur(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]
-}function ar(n,t,e){n.push("C",ur(fc,t),",",ur(fc,e),",",ur(hc,t),",",ur(hc,e),",",ur(gc,t),",",ur(gc,e))}function or(n,t){return(t[1]-n[1])/(t[0]-n[0])}function cr(n){for(var t=0,e=n.length-1,r=[],i=n[0],u=n[1],a=r[0]=or(i,u);++t<e;)r[t]=(a+(a=or(i=u,u=n[t+1])))/2;return r[t]=a,r}function lr(n){for(var t,e,r,i,u=[],a=cr(n),o=-1,c=n.length-1;++o<c;)t=or(n[o],n[o+1]),Math.abs(t)<1e-6?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,i=e*e+r*r,i>9&&(i=3*t/Math.sqrt(i),a[o]=i*e,a[o+1]=i*r));for(o=-1;++o<=c;)i=(n[Math.min(c,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),u.push([i||0,a[o]*i||0]);return u}function sr(n){return n.length<3?Xe(n):n[0]+Qe(n,lr(n))}function fr(n,t,e,r){var i,u,a,o,c,l,s;return i=r[n],u=i[0],a=i[1],i=r[t],o=i[0],c=i[1],i=r[e],l=i[0],s=i[1],(s-a)*(o-u)-(c-a)*(l-u)>0}function hr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function gr(n,t,e,r){var i=n[0],u=e[0],a=t[0]-i,o=r[0]-u,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(o*(c-l)-f*(i-u))/(f*a-o*s);return[i+h*a,c+h*s]}function pr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function mr(n,t){var e={list:n.map(function(n,t){return{index:t,x:n[0],y:n[1]}}).sort(function(n,t){return n.y<t.y?-1:n.y>t.y?1:n.x<t.x?-1:n.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(n,t){return{edge:n,side:t,vertex:null,l:null,r:null}},insert:function(n,t){t.l=n,t.r=n.r,n.r.l=t,n.r=t},leftBound:function(n){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,n));return t=t.l},del:function(n){n.l.r=n.r,n.r.l=n.l,n.edge=null},right:function(n){return n.r},left:function(n){return n.l},leftRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[n.side]},rightRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[mc[n.side]]}},i={bisect:function(n,t){var e={region:{l:n,r:t},ep:{l:null,r:null}},r=t.x-n.x,i=t.y-n.y,u=r>0?r:-r,a=i>0?i:-i;return e.c=n.x*r+n.y*i+.5*(r*r+i*i),u>a?(e.a=1,e.b=i/r,e.c/=r):(e.b=1,e.a=r/i,e.c/=i),e},intersect:function(n,t){var e=n.edge,r=t.edge;if(!e||!r||e.region.r==r.region.r)return null;var i=e.a*r.b-e.b*r.a;if(Math.abs(i)<1e-10)return null;var u,a,o=(e.c*r.b-r.c*e.b)/i,c=(r.c*e.a-e.c*r.a)/i,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(u=n,a=e):(u=t,a=r);var f=o>=a.region.r.x;return f&&"l"===u.side||!f&&"r"===u.side?null:{x:o,y:c}},rightOf:function(n,t){var e=n.edge,r=e.region.r,i=t.x>r.x;if(i&&"l"===n.side)return 1;if(!i&&"r"===n.side)return 0;if(1===e.a){var u=t.y-r.y,a=t.x-r.x,o=0,c=0;if(!i&&e.b<0||i&&e.b>=0?c=o=u>=e.b*a:(c=t.x+t.y*e.b>e.c,e.b<0&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-u*u)<l*u*(1+2*a/l+e.b*e.b),e.b<0&&(c=!c)}}else{var s=e.c-e.a*t.x,f=t.y-s,h=t.x-r.x,g=s-r.y;c=f*f>h*h+g*g}return"l"===n.side?c:!c},endPoint:function(n,e,r){n.ep[e]=r,n.ep[mc[e]]&&t(n)},distance:function(n,t){var e=n.x-t.x,r=n.y-t.y;return Math.sqrt(e*e+r*r)}},u={list:[],insert:function(n,t,e){n.vertex=t,n.ystar=t.y+e;for(var r=0,i=u.list,a=i.length;a>r;r++){var o=i[r];if(!(n.ystar>o.ystar||n.ystar==o.ystar&&t.x>o.vertex.x))break}i.splice(r,0,n)},del:function(n){for(var t=0,e=u.list,r=e.length;r>t&&e[t]!=n;++t);e.splice(t,1)},empty:function(){return 0===u.list.length},nextEvent:function(n){for(var t=0,e=u.list,r=e.length;r>t;++t)if(e[t]==n)return e[t+1];return null},min:function(){var n=u.list[0];return{x:n.vertex.x,y:n.ystar}},extractMin:function(){return u.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,s,f,h,g,p,m,d,v,y,M=e.list.shift();;)if(u.empty()||(a=u.min()),M&&(u.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=i.bisect(h,M),f=r.createHalfEdge(v,"l"),r.insert(o,f),m=i.intersect(o,f),m&&(u.del(o),u.insert(o,m,i.distance(m,M))),o=f,f=r.createHalfEdge(v,"r"),r.insert(o,f),m=i.intersect(f,c),m&&u.insert(f,m,i.distance(m,M)),M=e.list.shift();else{if(u.empty())break;o=u.extractMin(),l=r.left(o),c=r.right(o),s=r.right(c),h=r.leftRegion(o),g=r.rightRegion(c),d=o.vertex,i.endPoint(o.edge,o.side,d),i.endPoint(c.edge,c.side,d),r.del(o),u.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),v=i.bisect(h,g),f=r.createHalfEdge(v,y),r.insert(l,f),i.endPoint(v,mc[y],d),m=i.intersect(l,f),m&&(u.del(l),u.insert(l,m,i.distance(m,h))),m=i.intersect(f,s),m&&u.insert(f,m,i.distance(m,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))t(o.edge)}function dr(n){return n.x}function vr(n){return n.y}function yr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Mr(n,t,e,r,i,u){if(!n(t,e,r,i,u)){var a=.5*(e+i),o=.5*(r+u),c=t.nodes;c[0]&&Mr(n,c[0],e,r,a,o),c[1]&&Mr(n,c[1],a,r,i,o),c[2]&&Mr(n,c[2],e,o,a,u),c[3]&&Mr(n,c[3],a,o,i,u)}}function xr(n,t){n=ya.rgb(n),t=ya.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,a=t.g-r,o=t.b-i;return function(n){return"#"+ct(Math.round(e+u*n))+ct(Math.round(r+a*n))+ct(Math.round(i+o*n))}}function br(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Sr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function _r(n,t){return t-=n=+n,function(e){return n+t*e}}function wr(n,t){var e,r,i,u,a,o=0,c=0,l=[],s=[];for(n+="",t+="",dc.lastIndex=0,r=0;e=dc.exec(t);++r)e.index&&l.push(t.substring(o,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),o=dc.lastIndex;for(o<t.length&&l.push(t.substring(o)),r=0,u=s.length;(e=dc.exec(n))&&u>r;++r)if(a=s[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),i=r+1;u>i;++i)s[i].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),i=r+1;u>i;++i)s[i].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),i=r+1;u>i;++i)s[i].i--;s.splice(r,1),u--,r--}else a.x=_r(parseFloat(e[0]),parseFloat(a.x));for(;u>r;)a=s.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),u--;return 1===l.length?null==l[0]?(a=s[0].x,function(n){return a(n)+""}):function(){return t}:function(n){for(r=0;u>r;++r)l[(a=s[r]).i]=a.x(n);return l.join("")}}function Sr(n,t){for(var e,r=ya.interpolators.length;--r>=0&&!(e=ya.interpolators[r](n,t)););return e}function Er(n,t){var e,r=[],i=[],u=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Sr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;a>e;++e)i[e]=t[e];return function(n){for(e=0;o>e;++e)i[e]=r[e](n);return i}}function kr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Ar(n){return function(t){return 1-n(1-t)}}function Nr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function qr(n){return n*n}function Tr(n){return n*n*n}function Cr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function zr(n){return function(t){return Math.pow(t,n)}}function Dr(n){return 1-Math.cos(n*Ka/2)}function jr(n){return Math.pow(2,10*(n-1))}function Lr(n){return 1-Math.sqrt(1-n*n)}function Hr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/(2*Ka)*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ka/t)}}function Fr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Pr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Or(n,t){n=ya.hcl(n),t=ya.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,a=t.c-r,o=t.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return J(e+u*n,r+a*n,i+o*n)+""}}function Yr(n,t){n=ya.hsl(n),t=ya.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,a=t.s-r,o=t.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return R(e+u*n,r+a*n,i+o*n)+""}}function Rr(n,t){n=ya.lab(n),t=ya.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,a=t.a-r,o=t.b-i;return function(n){return Q(e+u*n,r+a*n,i+o*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ir(n){var t=[n.a,n.b],e=[n.c,n.d],r=Xr(t),i=Vr(t,e),u=Xr(Zr(e,t,-i))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*eo,this.translate=[n.e,n.f],this.scale=[r,u],this.skew=u?Math.atan2(i,u)*eo:0}function Vr(n,t){return n[0]*t[0]+n[1]*t[1]}function Xr(n){var t=Math.sqrt(Vr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Zr(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Br(n,t){var e,r=[],i=[],u=ya.transform(n),a=ya.transform(t),o=u.translate,c=a.translate,l=u.rotate,s=a.rotate,f=u.skew,h=a.skew,g=u.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),i.push({i:1,x:_r(o[0],c[0])},{i:3,x:_r(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),i.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:_r(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?i.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:_r(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),i.push({i:e-4,x:_r(g[0],p[0])},{i:e-2,x:_r(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=i.length,function(n){for(var t,u=-1;++u<e;)r[(t=i[u]).i]=t.x(n);return r.join("")}}function $r(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Wr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),i=[t];t!==r;)t=t.parent,i.push(t);for(var u=i.length;e!==r;)i.splice(u,0,e),e=e.parent;return i}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),i=e.pop(),u=r.pop(),a=null;i===u;)a=i,i=e.pop(),u=r.pop();return a}function Qr(n){n.fixed|=2}function ni(n){n.fixed&=-7}function ti(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ei(n){n.fixed&=-5}function ri(n,t,e){var r=0,i=0;if(n.charge=0,!n.leaf)for(var u,a=n.nodes,o=a.length,c=-1;++c<o;)u=a[c],null!=u&&(ri(u,t,e),n.charge+=u.charge,r+=u.charge*u.cx,i+=u.charge*u.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,i+=l*n.point.y}n.cx=r/n.charge,n.cy=i/n.charge}function ii(n,t){return ya.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ci,n}function ui(n){return n.children}function ai(n){return n.value}function oi(n,t){return t.value-n.value}function ci(n){return ya.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function li(n){return n.x}function si(n){return n.y}function fi(n,t,e){n.y0=t,n.y=e}function hi(n){return ya.range(n.length)}function gi(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function pi(n){for(var t,e=1,r=0,i=n[0][1],u=n.length;u>e;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function mi(n){return n.reduce(di,0)}function di(n,t){return n+t[1]}function vi(n,t){return yi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function yi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function Mi(n){return[ya.min(n),ya.max(n)]}function xi(n,t){return n.parent==t.parent?1:2}function bi(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function _i(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function wi(n,t){var e=n.children;if(e&&(i=e.length))for(var r,i,u=-1;++u<i;)t(r=wi(e[u],t),n)>0&&(n=r);return n}function Si(n,t){return n.x-t.x}function Ei(n,t){return t.x-n.x}function ki(n,t){return n.depth-t.depth}function Ai(n,t){function e(n,r){var i=n.children;if(i&&(a=i.length))for(var u,a,o=null,c=-1;++c<a;)u=i[c],e(u,o),o=u;t(n,r)}e(n,null)}function Ni(n){for(var t,e=0,r=0,i=n.children,u=i.length;--u>=0;)t=i[u]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function qi(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function Ti(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Ci(n,t){return n.value-t.value}function zi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Di(n,t){n._pack_next=t,t._pack_prev=n}function ji(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Li(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,i,u,a,o,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Hi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(i=e[1],i.x=i.r,i.y=0,t(i),l>2))for(u=e[2],Oi(r,i,u),t(u),zi(r,u),r._pack_prev=u,zi(u,i),i=r._pack_next,a=3;l>a;a++){Oi(r,i,u=e[a]);var p=0,m=1,d=1;for(o=i._pack_next;o!==i;o=o._pack_next,m++)if(ji(o,u)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!ji(c,u);c=c._pack_prev,d++);p?(d>m||m==d&&i.r<r.r?Di(r,i=o):Di(r=c,i),a--):(zi(r,u),i=u,t(u))}var v=(s+f)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)u=e[a],u.x-=v,u.y-=y,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Fi)}}function Hi(n){n._pack_next=n._pack_prev=n}function Fi(n){delete n._pack_next,delete n._pack_prev}function Pi(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,a=i.length;++u<a;)Pi(i[u],t,e,r)}function Oi(n,t,e){var r=n.r+e.r,i=t.x-n.x,u=t.y-n.y;if(r&&(i||u)){var a=t.r+e.r,o=i*i+u*u;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+c*i+l*u,e.y=n.y+c*u-l*i}else e.x=n.x+r,e.y=n.y}function Yi(n){return 1+ya.max(n,function(n){return n.y})}function Ri(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ui(n){var t=n.children;return t&&t.length?Ui(t[0]):n}function Ii(n){var t,e=n.children;return e&&(t=e.length)?Ii(e[t-1]):n}function Vi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Xi(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Zi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Bi(n){return n.rangeExtent?n.rangeExtent():Zi(n.range())}function $i(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Wi(n,t){var e,r=0,i=n.length-1,u=n[r],a=n[i];return u>a&&(e=r,r=i,i=e,e=u,u=a,a=e),n[r]=t.floor(u),n[i]=t.ceil(a),n}function Ji(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:kc}function Gi(n,t,e,r){var i=[],u=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)i.push(e(n[a-1],n[a])),u.push(r(t[a-1],t[a]));return function(t){var e=ya.bisect(n,t,1,o)-1;return u[e](i[e](t))}}function Ki(n,t,e,r){function i(){var i=Math.min(n.length,t.length)>2?Gi:$i,c=r?Wr:$r;return a=i(n,t,c,e),o=i(t,n,c,Sr),u}function u(n){return a(n)}var a,o;return u.invert=function(n){return o(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return ru(n,t)},u.tickFormat=function(t,e){return iu(n,t,e)},u.nice=function(t){return nu(n,t),i()},u.copy=function(){return Ki(n,t,e,r)},i()}function Qi(n,t){return ya.rebind(n,t,"range","rangeRound","interpolate","clamp")}function nu(n,t){return Wi(n,Ji(t?eu(n,t)[2]:tu(n)))}function tu(n){var t=Zi(n),e=t[1]-t[0];return Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1)}function eu(n,t){var e=Zi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function ru(n,t){return ya.range.apply(ya,eu(n,t))}function iu(n,t,e){var r=-Math.floor(Math.log(eu(n,t)[2])/Math.LN10+.01);return ya.format(e?e.replace(wo,function(n,t,e,i,u,a,o,c,l,s){return[t,e,i,u,a,o,c,l||"."+(r-2*("%"===s)),s].join("")}):",."+r+"f")}function uu(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(i(t))}return a.invert=function(t){return u(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),a):t},a.nice=function(){var t=Wi(r.map(i),e?Math:Nc);return n.domain(t),r=t.map(u),a},a.ticks=function(){var n=Zi(r),a=[],o=n[0],c=n[1],l=Math.floor(i(o)),s=Math.ceil(i(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)a.push(u(l)*h);a.push(u(l))}else for(a.push(u(l));l++<s;)for(var h=f-1;h>0;h--)a.push(u(l)*h);for(l=0;a[l]<o;l++);for(s=a.length;a[s-1]>c;s--);a=a.slice(l,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return Ac;arguments.length<2?t=Ac:"function"!=typeof t&&(t=ya.format(t));var r,o=Math.max(.1,n/a.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/u(c(i(n)+r))<=o?t(n):""}},a.copy=function(){return uu(n.copy(),t,e,r)},Qi(a,n)}function au(n,t,e){function r(t){return n(i(t))}var i=ou(t),u=ou(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return ru(e,n)},r.tickFormat=function(n,t){return iu(e,n,t)},r.nice=function(n){return r.domain(nu(e,n))},r.exponent=function(a){return arguments.length?(i=ou(t=a),u=ou(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return au(n.copy(),t,e)},Qi(r,n)}function ou(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function cu(n,t){function e(t){return a[((u.get(t)||u.set(t,n.push(t)))-1)%a.length]}function r(t,e){return ya.range(n.length).map(function(n){return t+e*n})}var u,a,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new i;for(var a,o=-1,c=r.length;++o<c;)u.has(a=r[o])||u.set(a,n.push(a));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(a=n,o=0,t={t:"range",a:arguments},e):a},e.rangePoints=function(i,u){arguments.length<2&&(u=0);var c=i[0],l=i[1],s=(l-c)/(Math.max(1,n.length-1)+u);return a=r(n.length<2?(c+l)/2:c+s*u/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(i,u,c){arguments.length<2&&(u=0),arguments.length<3&&(c=u);var l=i[1]<i[0],s=i[l-0],f=i[1-l],h=(f-s)/(n.length-u+2*c);return a=r(s+h*c,h),l&&a.reverse(),o=h*(1-u),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,u,c){arguments.length<2&&(u=0),arguments.length<3&&(c=u);var l=i[1]<i[0],s=i[l-0],f=i[1-l],h=Math.floor((f-s)/(n.length-u+2*c)),g=f-s-(n.length-u)*h;return a=r(s+Math.round(g/2),h),l&&a.reverse(),o=Math.round(h*(1-u)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Zi(t.a[0])},e.copy=function(){return cu(n,t)},e.domain(n)}function lu(n,t){function e(){var e=0,u=t.length;for(i=[];++e<u;)i[e-1]=ya.quantile(n,e/u);return r}function r(n){return isNaN(n=+n)?void 0:t[ya.bisect(i,n)]}var i;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(ya.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return i},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?i[e-1]:n[0],e<i.length?i[e]:n[n.length-1]]},r.copy=function(){return lu(n,t)},e()}function su(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(u*(t-n))))]}function i(){return u=e.length/(t-n),a=e.length-1,r}var u,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],i()):[n,t]},r.range=function(n){return arguments.length?(e=n,i()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/u+n,[t,t+1/u]},r.copy=function(){return su(n,t,e)},i()}function fu(n,t){function e(e){return e>=e?t[ya.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return fu(n,t)},e}function hu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return ru(n,t)},t.tickFormat=function(t,e){return iu(n,t,e)},t.copy=function(){return hu(n)},t}function gu(n){return n.innerRadius}function pu(n){return n.outerRadius}function mu(n){return n.startAngle}function du(n){return n.endAngle}function vu(n){for(var t,e,r,i=-1,u=n.length;++i<u;)t=n[i],e=t[0],r=t[1]+Dc,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function yu(n){function t(t){function c(){m.push("M",o(n(v),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,m=[],d=[],v=[],y=-1,M=t.length,x=pt(e),b=pt(i),_=e===r?function(){return g}:pt(r),w=i===u?function(){return p}:pt(u);++y<M;)a.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),v.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],v=[]);return d.length&&c(),m.length?m.join(""):null}var e=Ie,r=Ie,i=0,u=Ve,a=Xt,o=Xe,c=o.key,l=o,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(i=u=n,t):u},t.y0=function(n){return arguments.length?(i=n,t):i},t.y1=function(n){return arguments.length?(u=n,t):u},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?o=n:(o=sc.get(n)||Xe).key,l=o.reverse||o,s=o.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Mu(n){return n.radius}function xu(n){return[n.x,n.y]}function bu(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+Dc;return[e*Math.cos(r),e*Math.sin(r)]}}function _u(){return 64}function wu(){return"circle"}function Su(n){var t=Math.sqrt(n/Ka);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Eu(n,t){return La(n,Yc),n.id=t,n}function ku(n,t,e,r){var i=n.id;return T(n,"function"==typeof e?function(n,u,a){n.__transition__[i].tween.set(t,r(e.call(n,n.__data__,u,a)))}:(e=r(e),function(n){n.__transition__[i].tween.set(t,e)}))}function Au(n){return null==n&&(n=""),function(){this.textContent=n}}function Nu(n,t,e,r){var u=n.__transition__||(n.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;a=u[e]={tween:new i,time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,ya.timer(function(r){function i(r){return u.active>e?l():(u.active=e,a.event&&a.event.start.call(n,s,t),a.tween.forEach(function(e,r){(r=r.call(n,s,t))&&p.push(r)}),c(r)?1:(xt(c,0,o),void 0))}function c(r){if(u.active!==e)return l();for(var i=(r-h)/g,o=f(i),c=p.length;c>0;)p[--c].call(n,o);return i>=1?(l(),a.event&&a.event.end.call(n,s,t),1):void 0}function l(){return--u.count?delete u[e]:delete n.__transition__,1}var s=n.__data__,f=a.ease,h=a.delay,g=a.duration,p=[];return r>=h?i(r):(xt(i,h,o),void 0)},0,o)}}function qu(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Tu(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Cu(n,t,e){if(r=[],e&&t.length>1){for(var r,i,u,a=Zi(n.domain()),o=-1,c=t.length,l=(t[1]-t[0])/++e;++o<c;)for(i=e;--i>0;)(u=+t[o]-i*l)>=a[0]&&r.push(u);for(--o,i=0;++i<e&&(u=+t[o]+i*l)<a[1];)r.push(u)}return r}function zu(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Du(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new Zc(e-1)),1),e}function u(n,e){return t(n=new Zc(+n),e),n}function a(n,r,u){var a=i(n),o=[];if(u>1)for(;r>a;)e(a)%u||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{Zc=zu;var r=new zu;return r._=n,a(r,t,e)}finally{Zc=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=a;var c=n.utc=ju(n);return c.floor=c,c.round=ju(r),c.ceil=ju(i),c.offset=ju(u),c.range=o,n}function ju(n){return function(t,e){try{Zc=zu;var r=new zu;return r._=t,n(r,e)._}finally{Zc=Date}}}function Lu(n,t,e,r){for(var i,u,a=0,o=t.length,c=e.length;o>a;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(u=gl[t.charAt(a++)],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function Hu(n){return new RegExp("^(?:"+n.map(ya.requote).join("|")+")","i")}function Fu(n){for(var t=new i,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Pu(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Ou(n,t,e){il.lastIndex=0;var r=il.exec(t.substring(e));return r?(n.w=ul.get(r[0].toLowerCase()),e+r[0].length):-1}function Yu(n,t,e){el.lastIndex=0;var r=el.exec(t.substring(e));return r?(n.w=rl.get(r[0].toLowerCase()),e+r[0].length):-1}function Ru(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Uu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Iu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Vu(n,t,e){cl.lastIndex=0;var r=cl.exec(t.substring(e));return r?(n.m=ll.get(r[0].toLowerCase()),e+r[0].length):-1}function Xu(n,t,e){al.lastIndex=0;var r=al.exec(t.substring(e));return r?(n.m=ol.get(r[0].toLowerCase()),e+r[0].length):-1}function Zu(n,t,e){return Lu(n,hl.c.toString(),t,e)}function Bu(n,t,e){return Lu(n,hl.x.toString(),t,e)}function $u(n,t,e){return Lu(n,hl.X.toString(),t,e)}function Wu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ju(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.y=Gu(+r[0]),e+r[0].length):-1}function Gu(n){return n+(n>68?1900:2e3)}function Ku(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function na(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function ta(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ea(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ra(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ia(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ua(n,t,e){var r=ml.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function aa(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return e+Pu(r,"0",2)+Pu(i,"0",2)}function oa(n,t,e){sl.lastIndex=0;var r=sl.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ca(n){return n.toISOString()}function la(n,t,e){function r(t){return n(t)}return r.invert=function(t){return sa(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(sa)},r.nice=function(n){return r.domain(Wi(r.domain(),n))},r.ticks=function(e,i){var u=Zi(r.domain());if("function"!=typeof e){var a=u[1]-u[0],o=a/e,c=ya.bisect(vl,o);if(c==vl.length)return t.year(u,e);if(!c)return n.ticks(e).map(sa);o/vl[c-1]<vl[c]/o&&--c,e=t[c],i=e[1],e=e[0].range}return e(u[0],new Date(+u[1]+1),i)},r.tickFormat=function(){return e},r.copy=function(){return la(n.copy(),t,e)},Qi(r,n)}function sa(n){return new Date(n)}function fa(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function ha(n){var t=new Date(n,0,1);return t.setFullYear(n),t}function ga(n){var t=n.getFullYear(),e=ha(t),r=ha(t+1);return t+(n-e)/(r-e)}function pa(n){var t=new Date(Date.UTC(n,0,1));return t.setUTCFullYear(n),t}function ma(n){var t=n.getUTCFullYear(),e=pa(t),r=pa(t+1);return t+(n-e)/(r-e)}function da(n){return JSON.parse(n.responseText)}function va(n){var t=Ma.createRange();return t.selectNode(Ma.body),t.createContextualFragment(n.responseText)}var ya={version:"3.2.8"};Date.now||(Date.now=function(){return+new Date});var Ma=document,xa=Ma.documentElement,ba=window;try{Ma.createElement("div").style.setProperty("opacity",0,"")}catch(_a){var wa=ba.Element.prototype,Sa=wa.setAttribute,Ea=wa.setAttributeNS,ka=ba.CSSStyleDeclaration.prototype,Aa=ka.setProperty;wa.setAttribute=function(n,t){Sa.call(this,n,t+"")},wa.setAttributeNS=function(n,t,e){Ea.call(this,n,t,e+"")},ka.setProperty=function(n,t,e){Aa.call(this,n,t+"",e)}}ya.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},ya.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ya.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u&&!(null!=(e=n[i])&&e>=e);)e=void 0;for(;++i<u;)null!=(r=n[i])&&e>r&&(e=r)}else{for(;++i<u&&!(null!=(e=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<u;)null!=(r=t.call(n,n[i],i))&&e>r&&(e=r)}return e},ya.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u&&!(null!=(e=n[i])&&e>=e);)e=void 0;for(;++i<u;)null!=(r=n[i])&&r>e&&(e=r)}else{for(;++i<u&&!(null!=(e=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<u;)null!=(r=t.call(n,n[i],i))&&r>e&&(e=r)}return e},ya.extent=function(n,t){var e,r,i,u=-1,a=n.length;if(1===arguments.length){for(;++u<a&&!(null!=(e=i=n[u])&&e>=e);)e=i=void 0;for(;++u<a;)null!=(r=n[u])&&(e>r&&(e=r),r>i&&(i=r))}else{for(;++u<a&&!(null!=(e=i=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<a;)null!=(r=t.call(n,n[u],u))&&(e>r&&(e=r),r>i&&(i=r))}return[e,i]},ya.sum=function(n,t){var e,r=0,i=n.length,u=-1;if(1===arguments.length)for(;++u<i;)isNaN(e=+n[u])||(r+=e);else for(;++u<i;)isNaN(e=+t.call(n,n[u],u))||(r+=e);return r},ya.mean=function(t,e){var r,i=t.length,u=0,a=-1,o=0;if(1===arguments.length)for(;++a<i;)n(r=t[a])&&(u+=(r-u)/++o);else for(;++a<i;)n(r=e.call(t,t[a],a))&&(u+=(r-u)/++o);return o?u:void 0},ya.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),i=+n[r-1],u=e-r;return u?i+u*(n[r]-i):i},ya.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?ya.quantile(t.sort(ya.ascending),.5):void 0},ya.bisector=function(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n.call(t,t[u],u)<e?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;e<n.call(t,t[u],u)?i=u:r=u+1}return r}}};var Na=ya.bisector(function(n){return n});ya.bisectLeft=Na.left,ya.bisect=ya.bisectRight=Na.right,ya.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},ya.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ya.zip=function(){if(!(i=arguments.length))return[];for(var n=-1,e=ya.min(arguments,t),r=new Array(e);++n<e;)for(var i,u=-1,a=r[n]=new Array(i);++u<i;)a[u]=arguments[u][n];return r},ya.transpose=function(n){return ya.zip.apply(ya,n)},ya.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ya.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ya.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ya.merge=function(n){return Array.prototype.concat.apply([],n)},ya.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var i,u=[],a=e(Math.abs(r)),o=-1;if(n*=a,t*=a,r*=a,0>r)for(;(i=n+r*++o)>t;)u.push(i/a);else for(;(i=n+r*++o)<t;)u.push(i/a);return u},ya.map=function(n){var t=new i;if(n instanceof i)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(i,{has:function(n){return qa+n in this},get:function(n){return this[qa+n]},set:function(n,t){return this[qa+n]=t},remove:function(n){return n=qa+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];
-return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Ta&&n.call(this,t.substring(1),this[t])}});var qa="\0",Ta=qa.charCodeAt(0);ya.nest=function(){function n(t,o,c){if(c>=a.length)return r?r.call(u,o):e?o.sort(e):o;for(var l,s,f,h,g=-1,p=o.length,m=a[c++],d=new i;++g<p;)(h=d.get(l=m(s=o[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),d.forEach(f),s}function t(n,e){if(e>=a.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,u={},a=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ya.map,e,0),0)},u.key=function(n){return a.push(n),u},u.sortKeys=function(n){return o[a.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ya.set=function(n){var t=new u;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(u,{has:function(n){return qa+n in this},add:function(n){return this[qa+n]=!0,n},remove:function(n){return n=qa+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Ta&&n.call(this,t.substring(1))}}),ya.behavior={},ya.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r<i;)n[e=arguments[r]]=a(n,t,t[e]);return n};var Ca=["webkit","ms","moz","Moz","o","O"],za=l;try{za(xa.childNodes)[0].nodeType}catch(Da){za=c}ya.dispatch=function(){for(var n=new f,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=h(n);return n},f.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ya.event=null,ya.requote=function(n){return n.replace(ja,"\\$&")};var ja=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,La={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ha=function(n,t){return t.querySelector(n)},Fa=function(n,t){return t.querySelectorAll(n)},Pa=xa[o(xa,"matchesSelector")],Oa=function(n,t){return Pa.call(n,t)};"function"==typeof Sizzle&&(Ha=function(n,t){return Sizzle(n,t)[0]||null},Fa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},Oa=Sizzle.matchesSelector),ya.selection=function(){return Ia};var Ya=ya.selection.prototype=[];Ya.select=function(n){var t,e,r,i,u=[];n=v(n);for(var a=-1,o=this.length;++a<o;){u.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;++c<l;)(i=r[c])?(t.push(e=n.call(i,i.__data__,c,a)),e&&"__data__"in i&&(e.__data__=i.__data__)):t.push(null)}return d(u)},Ya.selectAll=function(n){var t,e,r=[];n=y(n);for(var i=-1,u=this.length;++i<u;)for(var a=this[i],o=-1,c=a.length;++o<c;)(e=a[o])&&(r.push(t=za(n.call(e,e.__data__,o,i))),t.parentNode=e);return d(r)};var Ra={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ya.ns={prefix:Ra,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),Ra.hasOwnProperty(e)?{space:Ra[e],local:n}:n}},Ya.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ya.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},Ya.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,i=-1;if(t=e.classList){for(;++i<r;)if(!t.contains(n[i]))return!1}else for(t=e.getAttribute("class");++i<r;)if(!b(n[i]).test(t))return!1;return!0}for(t in n)this.each(_(t,n[t]));return this}return this.each(_(n,t))},Ya.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(S(e,n[e],t));return this}if(2>r)return ba.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(S(n,t,e))},Ya.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(E(t,n[t]));return this}return this.each(E(n,t))},Ya.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Ya.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Ya.append=function(n){return n=k(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Ya.insert=function(n,t){return n=k(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments))})},Ya.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},Ya.data=function(n,t){function e(n,e){var r,u,a,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),m=new Array(o);if(t){var d,v=new i,y=new i,M=[];for(r=-1;++r<o;)d=t.call(u=n[r],u.__data__,r),v.has(d)?m[r]=u:v.set(d,u),M.push(d);for(r=-1;++r<f;)d=t.call(e,a=e[r],r),(u=v.get(d))?(g[r]=u,u.__data__=a):y.has(d)||(p[r]=A(a)),y.set(d,a),v.remove(d);for(r=-1;++r<o;)v.has(M[r])&&(m[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],a=e[r],u?(u.__data__=a,g[r]=u):p[r]=A(a);for(;f>r;++r)p[r]=A(e[r]);for(;o>r;++r)m[r]=n[r]}p.update=g,p.parentNode=g.parentNode=m.parentNode=n.parentNode,c.push(p),l.push(g),s.push(m)}var r,u,a=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++a<o;)(u=r[a])&&(n[a]=u.__data__);return n}var c=C([]),l=d([]),s=d([]);if("function"==typeof n)for(;++a<o;)e(r=this[a],n.call(r,r.parentNode.__data__,a));else for(;++a<o;)e(r=this[a],n);return l.enter=function(){return c},l.exit=function(){return s},l},Ya.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Ya.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=N(n));for(var u=0,a=this.length;a>u;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return d(i)},Ya.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],i=r.length-1,u=r[i];--i>=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Ya.sort=function(n){n=q.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Ya.each=function(n){return T(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Ya.call=function(n){var t=za(arguments);return n.apply(t[0]=this,t),this},Ya.empty=function(){return!this.node()},Ya.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Ya.size=function(){var n=0;return this.each(function(){++n}),n};var Ua=[];ya.selection.enter=C,ya.selection.enter.prototype=Ua,Ua.append=Ya.append,Ua.empty=Ya.empty,Ua.node=Ya.node,Ua.call=Ya.call,Ua.size=Ya.size,Ua.select=function(n){for(var t,e,r,i,u,a=[],o=-1,c=this.length;++o<c;){r=(i=this[o]).update,a.push(t=[]),t.parentNode=i.parentNode;for(var l=-1,s=i.length;++l<s;)(u=i[l])?(t.push(r[l]=e=n.call(i.parentNode,u.__data__,l,o)),e.__data__=u.__data__):t.push(null)}return d(a)},Ua.insert=function(n,t){return arguments.length<2&&(t=z(this)),Ya.insert.call(this,n,t)},Ya.transition=function(){for(var n,t,e=Hc||++Rc,r=[],i=Fc||{time:Date.now(),ease:Cr,delay:0,duration:250},u=-1,a=this.length;++u<a;){r.push(n=[]);for(var o=this[u],c=-1,l=o.length;++c<l;)(t=o[c])&&Nu(t,c,e,i),n.push(t)}return Eu(r,e)},ya.select=function(n){var t=["string"==typeof n?Ha(n,Ma):n];return t.parentNode=xa,d([t])},ya.selectAll=function(n){var t=za("string"==typeof n?Fa(n,Ma):n);return t.parentNode=xa,d([t])};var Ia=ya.select(xa);Ya.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(D(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(D(n,t,e))};var Va=ya.map({mouseenter:"mouseover",mouseleave:"mouseout"});Va.forEach(function(n){"on"+n in Ma&&Va.remove(n)});var Xa=o(xa.style,"userSelect"),Za=0;ya.mouse=function(n){return F(n,p())};var Ba=/WebKit/.test(ba.navigator.userAgent)?-1:0;ya.touches=function(n,t){return arguments.length<2&&(t=p().touches),t?za(t).map(function(t){var e=F(n,t);return e.identifier=t.identifier,e}):[]},ya.behavior.drag=function(){function n(){this.on("mousedown.drag",a).on("touchstart.drag",o)}function t(){return ya.event.changedTouches[0].identifier}function e(n,t){return ya.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function a(){if(!s)return o();var n=t(s,g),e=n[0]-m[0],r=n[1]-m[1];d|=e|r,m=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function o(){v.on(e+"."+p,null).on(r+"."+p,null),y(d&&ya.event.target===h),f({type:"dragend"})}var c,l=this,s=l.parentNode,f=i.of(l,arguments),h=ya.event.target,g=n(),p=null==g?"drag":"drag-"+g,m=t(s,g),d=0,v=ya.select(ba).on(e+"."+p,a).on(r+"."+p,o),y=H();u?(c=u.apply(l,arguments),c=[c.x-m[0],c.y-m[1]]):c=[0,0],f({type:"dragstart"})}}var i=m(n,"drag","dragstart","dragend"),u=null,a=r(s,ya.mouse,"mousemove","mouseup"),o=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ya.rebind(n,i,"on")},ya.behavior.zoom=function(){function n(){this.on(w,o).on(Ja+".zoom",l).on(S,s).on("dblclick.zoom",f).on(k,c)}function t(n){return[(n[0]-x[0])/b,(n[1]-x[1])/b]}function e(n){return[n[0]*b+x[0],n[1]*b+x[1]]}function r(n){b=Math.max(_[0],Math.min(_[1],n))}function i(n,t){t=e(t),x[0]+=n[0]-t[0],x[1]+=n[1]-t[1]}function u(){v&&v.domain(d.range().map(function(n){return(n-x[0])/b}).map(d.invert)),M&&M.domain(y.range().map(function(n){return(n-x[1])/b}).map(y.invert))}function a(n){u(),n({type:"zoom",scale:b,translate:x})}function o(){function n(){c=1,i(ya.mouse(r),f),a(u)}function e(){l.on(S,ba===r?s:null).on(E,null),h(c&&ya.event.target===o)}var r=this,u=q.of(r,arguments),o=ya.event.target,c=0,l=ya.select(ba).on(S,n).on(E,e),f=t(ya.mouse(r)),h=H()}function c(){function n(){var n=ya.touches(h);return f=b,s={},n.forEach(function(n){s[n.identifier]=t(n)}),n}function e(){var t=Date.now(),e=n();if(1===e.length){if(500>t-p){var u=e[0],o=s[u.identifier];r(2*b),i(u,o),g(),a(m)}p=t}else if(e.length>1){var u=e[0],c=e[1],l=u[0]-c[0],f=u[1]-c[1];d=l*l+f*f}}function u(){var n=ya.touches(h),t=n[0],e=s[t.identifier];if(u=n[1]){var u,o=s[u.identifier],c=ya.event.scale;if(null==c){var l=(l=u[0]-t[0])*l+(l=u[1]-t[1])*l;c=d&&Math.sqrt(l/d)}t=[(t[0]+u[0])/2,(t[1]+u[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(c*f)}p=null,i(t,e),a(m)}function l(){ya.event.touches.length?n():(v.on(A,null).on(N,null),y.on(w,o).on(k,c),M())}var s,f,h=this,m=q.of(h,arguments),d=0,v=ya.select(ba).on(A,u).on(N,l),y=ya.select(h).on(w,null).on(k,e),M=H();e()}function l(){g(),h||(h=t(ya.mouse(this))),r(Math.pow(2,.002*$a())*b),i(ya.mouse(this),h),a(q.of(this,arguments))}function s(){h=null}function f(){var n=ya.mouse(this),e=t(n),u=Math.log(b)/Math.LN2;r(Math.pow(2,ya.event.shiftKey?Math.ceil(u)-1:Math.floor(u)+1)),i(n,e),a(q.of(this,arguments))}var h,p,d,v,y,M,x=[0,0],b=1,_=Wa,w="mousedown.zoom",S="mousemove.zoom",E="mouseup.zoom",k="touchstart.zoom",A="touchmove.zoom",N="touchend.zoom",q=m(n,"zoom");return n.translate=function(t){return arguments.length?(x=t.map(Number),u(),n):x},n.scale=function(t){return arguments.length?(b=+t,u(),n):b},n.scaleExtent=function(t){return arguments.length?(_=null==t?Wa:t.map(Number),n):_},n.x=function(t){return arguments.length?(v=t,d=t.copy(),x=[0,0],b=1,n):v},n.y=function(t){return arguments.length?(M=t,y=t.copy(),x=[0,0],b=1,n):M},ya.rebind(n,q,"on")};var $a,Wa=[0,1/0],Ja="onwheel"in Ma?($a=function(){return-ya.event.deltaY*(ya.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Ma?($a=function(){return ya.event.wheelDelta},"mousewheel"):($a=function(){return-ya.event.detail},"MozMousePixelScroll");P.prototype.toString=function(){return this.rgb()+""},ya.hsl=function(n,t,e){return 1===arguments.length?n instanceof Y?O(n.h,n.s,n.l):lt(""+n,st,O):O(+n,+t,+e)};var Ga=Y.prototype=new P;Ga.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),O(this.h,this.s,this.l/n)},Ga.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),O(this.h,this.s,n*this.l)},Ga.rgb=function(){return R(this.h,this.s,this.l)};var Ka=Math.PI,Qa=1e-6,no=Qa*Qa,to=Ka/180,eo=180/Ka;ya.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?$(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=ya.rgb(n)).r,n.g,n.b)).l,n.a,n.b):$(+n,+t,+e)};var ro=W.prototype=new P;ro.brighter=function(n){return $(this.h,this.c,Math.min(100,this.l+io*(arguments.length?n:1)))},ro.darker=function(n){return $(this.h,this.c,Math.max(0,this.l-io*(arguments.length?n:1)))},ro.rgb=function(){return J(this.h,this.c,this.l).rgb()},ya.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=ya.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var io=18,uo=.95047,ao=1,oo=1.08883,co=K.prototype=new P;co.brighter=function(n){return G(Math.min(100,this.l+io*(arguments.length?n:1)),this.a,this.b)},co.darker=function(n){return G(Math.max(0,this.l-io*(arguments.length?n:1)),this.a,this.b)},co.rgb=function(){return Q(this.l,this.a,this.b)},ya.rgb=function(n,t,e){return 1===arguments.length?n instanceof ot?at(n.r,n.g,n.b):lt(""+n,at,R):at(~~n,~~t,~~e)};var lo=ot.prototype=new P;lo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),at(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):at(i,i,i)},lo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),at(~~(n*this.r),~~(n*this.g),~~(n*this.b))},lo.hsl=function(){return st(this.r,this.g,this.b)},lo.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var so=ya.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});so.forEach(function(n,t){so.set(n,it(t))}),ya.functor=pt,ya.xhr=dt(mt),ya.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var a=ya.xhr(n,t,u);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:i(n)):e},a.row(e)}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function a(t){return t.map(o).join(n)}function o(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(i)return i=!1,u;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(i=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(i=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>s;){var r=n.charCodeAt(s++),o=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.substring(t,s-o)}return n.substring(t)}for(var r,i,u={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==u&&r!==a;)h.push(r),r=e();(!t||(h=t(h,f++)))&&o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new u,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(a).join("\n")},e},ya.csv=ya.dsv(",","text/csv"),ya.tsv=ya.dsv("	","text/tab-separated-values");var fo,ho,go,po,mo,vo=ba[o(ba,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ya.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={callback:n,time:i,next:null};ho?ho.next=u:fo=u,ho=u,go||(po=clearTimeout(po),go=1,vo(Mt))},ya.timer.flush=function(){bt(),_t()};var yo=".",Mo=",",xo=[3,3],bo="$",_o=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(wt);ya.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ya.round(n,St(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),_o[8+e/3]},ya.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},ya.format=function(n){var t=wo.exec(n),e=t[1]||" ",r=t[2]||">",i=t[3]||"",u=t[4]||"",a=t[5],o=+t[6],c=t[7],l=t[8],s=t[9],f=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":"#"===u&&(u="0"+s.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":f=-1,s="r"}"#"===u?u="":"$"===u&&(u=bo),"r"!=s||l||(s="g"),null!=l&&("g"==s?l=Math.max(1,Math.min(21,l)):("e"==s||"f"==s)&&(l=Math.max(0,Math.min(20,l)))),s=So.get(s)||Et;var p=a&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):i;if(0>f){var m=ya.formatPrefix(n,l);n=m.scale(n),h=m.symbol}else n*=f;n=s(n,l);var d=n.lastIndexOf("."),v=0>d?n:n.substring(0,d),y=0>d?"":yo+n.substring(d+1);!a&&c&&(v=Eo(v));var M=u.length+v.length+y.length+(p?0:t.length),x=o>M?new Array(M=o-M+1).join(e):"";return p&&(v=Eo(x+v)),t+=u,n=v+y,("<"===r?t+n+x:">"===r?x+t+n:"^"===r?x.substring(0,M>>=1)+t+n+x.substring(M):t+(p?n:x+n))+h}};var wo=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,So=ya.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ya.round(n,St(n,t))).toFixed(Math.max(0,Math.min(20,St(n*(1+1e-15),t))))}}),Eo=mt;if(xo){var ko=xo.length;Eo=function(n){for(var t=n.length,e=[],r=0,i=xo[0];t>0&&i>0;)e.push(n.substring(t-=i,t+i)),i=xo[r=(r+1)%ko];return e.reverse().join(Mo)}}ya.geo={},kt.prototype={s:0,t:0,add:function(n){At(n,this.t,Ao),At(Ao.s,this.s,this),this.s?this.t+=Ao.t:this.s=Ao.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var Ao=new kt;ya.geo.stream=function(n,t){n&&No.hasOwnProperty(n.type)?No[n.type](n,t):Nt(n,t)};var No={Feature:function(n,t){Nt(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++r<i;)Nt(e[r].geometry,t)}},qo={Sphere:function(n,t){t.sphere()},Point:function(n,t){var e=n.coordinates;t.point(e[0],e[1])},MultiPoint:function(n,t){for(var e,r=n.coordinates,i=-1,u=r.length;++i<u;)e=r[i],t.point(e[0],e[1])},LineString:function(n,t){qt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)qt(e[r],t,0)},Polygon:function(n,t){Tt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)Tt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,i=e.length;++r<i;)Nt(e[r],t)}};ya.geo.area=function(n){return To=0,ya.geo.stream(n,zo),To};var To,Co=new kt,zo={sphere:function(){To+=4*Ka},point:s,lineStart:s,lineEnd:s,polygonStart:function(){Co.reset(),zo.lineStart=Ct},polygonEnd:function(){var n=2*Co;To+=0>n?4*Ka+n:n,zo.lineStart=zo.lineEnd=zo.point=s}};ya.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=zt([t*to,e*to]);if(v){var i=jt(v,r),u=[i[1],-i[0],0],a=jt(u,i);Ft(a),a=Pt(a);var c=t-p,l=c>0?1:-1,m=a[0]*eo*l,d=Math.abs(c)>180;if(d^(m>l*p&&l*t>m)){var y=a[1]*eo;y>g&&(g=y)}else if(m=(m+360)%360-180,d^(m>l*p&&l*t>m)){var y=-a[1]*eo;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);v=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,v=null}function i(n,e){if(v){var r=n-p;y+=Math.abs(r)>180?r+(r>0?360:-360):r}else m=n,d=e;zo.point(n,e),t(n,e)}function u(){zo.lineStart()}function a(){i(m,d),zo.lineEnd(),Math.abs(y)>Qa&&(s=-(h=180)),x[0]=s,x[1]=h,v=null}function o(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,m,d,v,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=i,b.lineStart=u,b.lineEnd=a,y=0,zo.polygonStart()},polygonEnd:function(){zo.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>Co?(s=-(h=180),f=-(g=90)):y>Qa?g=90:-Qa>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ya.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],l(e[0],i)||l(e[1],i)?(o(i[0],e[1])>o(i[0],i[1])&&(i[1]=e[1]),o(e[0],i[1])>o(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var a,e,p=-1/0,t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(a=o(i[1],e[0]))>p&&(p=a,s=e[0],h=i[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ya.geo.centroid=function(n){Do=jo=Lo=Ho=Fo=Po=Oo=Yo=Ro=Uo=Io=0,ya.geo.stream(n,Vo);var t=Ro,e=Uo,r=Io,i=t*t+e*e+r*r;return no>i&&(t=Po,e=Oo,r=Yo,Qa>jo&&(t=Lo,e=Ho,r=Fo),i=t*t+e*e+r*r,no>i)?[0/0,0/0]:[Math.atan2(e,t)*eo,V(r/Math.sqrt(i))*eo]};var Do,jo,Lo,Ho,Fo,Po,Oo,Yo,Ro,Uo,Io,Vo={sphere:s,point:Yt,lineStart:Ut,lineEnd:It,polygonStart:function(){Vo.lineStart=Vt},polygonEnd:function(){Vo.lineStart=Ut}},Xo=$t(Xt,Qt,te,ee),Zo=[-Ka,0],Bo=1e9;(ya.geo.conicEqualArea=function(){return oe(ce)}).raw=ce,ya.geo.albers=function(){return ya.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ya.geo.albersUsa=function(){function n(n){var u=n[0],a=n[1];return t=null,e(u,a),t||(r(u,a),t)||i(u,a),t}var t,e,r,i,u=ya.geo.albers(),a=ya.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=ya.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?a:i>=.166&&.234>i&&r>=-.214&&-.115>r?o:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),a.precision(t),o.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),a.scale(.35*t),o.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var l=u.scale(),s=+t[0],f=+t[1];return e=u.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=a.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Qa,f+.12*l+Qa],[s-.214*l-Qa,f+.234*l-Qa]]).stream(c).point,i=o.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Qa,f+.166*l+Qa],[s-.115*l-Qa,f+.234*l-Qa]]).stream(c).point,n},n.scale(1070)};var $o,Wo,Jo,Go,Ko,Qo,nc={point:s,lineStart:s,lineEnd:s,polygonStart:function(){Wo=0,nc.lineStart=le},polygonEnd:function(){nc.lineStart=nc.lineEnd=nc.point=s,$o+=Math.abs(Wo/2)}},tc={point:se,lineStart:s,lineEnd:s,polygonStart:s,polygonEnd:s},ec={point:ge,lineStart:pe,lineEnd:me,polygonStart:function(){ec.lineStart=de},polygonEnd:function(){ec.point=ge,ec.lineStart=pe,ec.lineEnd=me}};ya.geo.path=function(){function n(n){return n&&("function"==typeof o&&u.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=i(u)),ya.geo.stream(n,a)),u.result()}function t(){return a=null,n}var e,r,i,u,a,o=4.5;return n.area=function(n){return $o=0,ya.geo.stream(n,i(nc)),$o},n.centroid=function(n){return Lo=Ho=Fo=Po=Oo=Yo=Ro=Uo=Io=0,ya.geo.stream(n,i(ec)),Io?[Ro/Io,Uo/Io]:Yo?[Po/Yo,Oo/Yo]:Fo?[Lo/Fo,Ho/Fo]:[0/0,0/0]},n.bounds=function(n){return Ko=Qo=-(Jo=Go=1/0),ya.geo.stream(n,i(tc)),[[Jo,Go],[Ko,Qo]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||Me(n):mt,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new fe:new ve(n),"function"!=typeof o&&u.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(u.pointRadius(+t),+t),n):o},n.projection(ya.geo.albersUsa()).context(null)},ya.geo.projection=xe,ya.geo.projectionMutator=be,(ya.geo.equirectangular=function(){return xe(we)}).raw=we.invert=we,ya.geo.rotation=function(n){function t(t){return t=n(t[0]*to,t[1]*to),t[0]*=eo,t[1]*=eo,t}return n=Se(n[0]%360*to,n[1]*to,n.length>2?n[2]*to:0),t.invert=function(t){return t=n.invert(t[0]*to,t[1]*to),t[0]*=eo,t[1]*=eo,t},t},ya.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Se(-n[0]*to,-n[1]*to,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=eo,n[1]*=eo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Ne((t=+r)*to,i*to),n):t},n.precision=function(r){return arguments.length?(e=Ne(t*to,(i=+r)*to),n):i},n.angle(90)},ya.geo.distance=function(n,t){var e,r=(t[0]-n[0])*to,i=n[1]*to,u=t[1]*to,a=Math.sin(r),o=Math.cos(r),c=Math.sin(i),l=Math.cos(i),s=Math.sin(u),f=Math.cos(u);return Math.atan2(Math.sqrt((e=f*a)*e+(e=l*s-c*f*o)*e),c*s+l*f*o)},ya.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ya.range(Math.ceil(u/d)*d,i,d).map(h).concat(ya.range(Math.ceil(l/v)*v,c,v).map(g)).concat(ya.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Math.abs(n%d)>Qa}).map(s)).concat(ya.range(Math.ceil(o/m)*m,a,m).filter(function(n){return Math.abs(n%v)>Qa}).map(f))}var e,r,i,u,a,o,c,l,s,f,h,g,p=10,m=p,d=90,v=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(g(c).slice(1),h(i).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],l=+t[0][1],c=+t[1][1],u>i&&(t=u,u=i,i=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[u,l],[i,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],v=+t[1],n):[d,v]},n.minorStep=function(t){return arguments.length?(p=+t[0],m=+t[1],n):[p,m]},n.precision=function(t){return arguments.length?(y=+t,s=Te(o,a,90),f=Ce(r,e,y),h=Te(l,c,90),g=Ce(u,i,y),n):y},n.majorExtent([[-180,-90+Qa],[180,90-Qa]]).minorExtent([[-180,-80-Qa],[180,80+Qa]])},ya.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=ze,i=De;return n.distance=function(){return ya.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ya.geo.interpolate=function(n,t){return je(n[0]*to,n[1]*to,t[0]*to,t[1]*to)},ya.geo.length=function(n){return rc=0,ya.geo.stream(n,ic),rc};var rc,ic={sphere:s,point:s,lineStart:Le,lineEnd:s,polygonStart:s,polygonEnd:s},uc=He(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ya.geo.azimuthalEqualArea=function(){return xe(uc)}).raw=uc;var ac=He(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},mt);(ya.geo.azimuthalEquidistant=function(){return xe(ac)}).raw=ac,(ya.geo.conicConformal=function(){return oe(Fe)}).raw=Fe,(ya.geo.conicEquidistant=function(){return oe(Pe)}).raw=Pe;var oc=He(function(n){return 1/n},Math.atan);(ya.geo.gnomonic=function(){return xe(oc)}).raw=oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ka/2]},(ya.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var cc=He(function(){return 1},Math.asin);(ya.geo.orthographic=function(){return xe(cc)}).raw=cc;var lc=He(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ya.geo.stereographic=function(){return xe(lc)}).raw=lc,Re.invert=function(n,t){return[Math.atan2(X(n),Math.cos(t)),V(Math.sin(t)/Z(n))]},(ya.geo.transverseMercator=function(){return Ye(Re)}).raw=Re,ya.geom={},ya.svg={},ya.svg.line=function(){return Ue(mt)};var sc=ya.map({linear:Xe,"linear-closed":Ze,step:Be,"step-before":$e,"step-after":We,basis:tr,"basis-open":er,"basis-closed":rr,bundle:ir,cardinal:Ke,"cardinal-open":Je,"cardinal-closed":Ge,monotone:sr});
-sc.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var fc=[0,2/3,1/3,0],hc=[0,1/3,2/3,0],gc=[0,1/6,2/3,1/6];ya.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i,u,a,o,c,l,s,f,h,g,p,m=pt(e),d=pt(r),v=n.length,y=v-1,M=[],x=[],b=0;if(m===Ie&&r===Ve)t=n;else for(u=0,t=[];v>u;++u)t.push([+m.call(this,i=n[u],u),+d.call(this,i,u)]);for(u=1;v>u;++u)(t[u][1]<t[b][1]||t[u][1]==t[b][1]&&t[u][0]<t[b][0])&&(b=u);for(u=0;v>u;++u)u!==b&&(c=t[u][1]-t[b][1],o=t[u][0]-t[b][0],M.push({angle:Math.atan2(c,o),index:u}));for(M.sort(function(n,t){return n.angle-t.angle}),g=M[0].angle,h=M[0].index,f=0,u=1;y>u;++u){if(a=M[u].index,g==M[u].angle){if(o=t[h][0]-t[b][0],c=t[h][1]-t[b][1],l=t[a][0]-t[b][0],s=t[a][1]-t[b][1],o*o+c*c>=l*l+s*s){M[u].index=-1;continue}M[f].index=-1}g=M[u].angle,f=u,h=a}for(x.push(b),u=0,a=0;2>u;++a)M[a].index>-1&&(x.push(M[a].index),u++);for(p=x.length;y>a;++a)if(!(M[a].index<0)){for(;!fr(x[p-2],x[p-1],M[a].index,t);)--p;x[p++]=M[a].index}var _=[];for(u=p-1;u>=0;--u)_.push(n[x[u]]);return _}var e=Ie,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ya.geom.polygon=function(n){return La(n,pc),n};var pc=ya.geom.polygon.prototype=[];pc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],i=0;++t<e;)n=r,r=this[t],i+=n[1]*r[0]-n[0]*r[1];return.5*i},pc.centroid=function(n){var t,e,r=-1,i=this.length,u=0,a=0,o=this[i-1];for(arguments.length||(n=-1/(6*this.area()));++r<i;)t=o,o=this[r],e=t[0]*o[1]-o[0]*t[1],u+=(t[0]+o[0])*e,a+=(t[1]+o[1])*e;return[u*n,a*n]},pc.clip=function(n){for(var t,e,r,i,u,a,o=pr(n),c=-1,l=this.length-pr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,i=this[c],u=t[(r=t.length-o)-1],e=-1;++e<r;)a=t[e],hr(a,s,i)?(hr(u,s,i)||n.push(gr(u,a,s,i)),n.push(a)):hr(u,s,i)&&n.push(gr(u,a,s,i)),u=a;o&&n.push(n[0]),s=i}return n},ya.geom.delaunay=function(n){var t=n.map(function(){return[]}),e=[];return mr(n,function(e){t[e.region.l.index].push(n[e.region.r.index])}),t.forEach(function(t,r){var i=n[r],u=i[0],a=i[1];t.forEach(function(n){n.angle=Math.atan2(n[0]-u,n[1]-a)}),t.sort(function(n,t){return n.angle-t.angle});for(var o=0,c=t.length-1;c>o;o++)e.push([i,t[o],t[o+1]])}),e},ya.geom.voronoi=function(n){function t(n){var t,u,a,o=n.map(function(){return[]}),c=pt(e),l=pt(r),s=n.length,f=1e6;if(c===Ie&&l===Ve)t=n;else for(t=new Array(s),a=0;s>a;++a)t[a]=[+c.call(this,u=n[a],a),+l.call(this,u,a)];if(mr(t,function(n){var t,e,r,i,u,a;1===n.a&&n.b>=0?(t=n.ep.r,e=n.ep.l):(t=n.ep.l,e=n.ep.r),1===n.a?(u=t?t.y:-f,r=n.c-n.b*u,a=e?e.y:f,i=n.c-n.b*a):(r=t?t.x:-f,u=n.c-n.a*r,i=e?e.x:f,a=n.c-n.a*i);var c=[r,u],l=[i,a];o[n.region.l.index].push(c,l),o[n.region.r.index].push(c,l)}),o=o.map(function(n,e){var r=t[e][0],i=t[e][1],u=n.map(function(n){return Math.atan2(n[0]-r,n[1]-i)}),a=ya.range(n.length).sort(function(n,t){return u[n]-u[t]});return a.filter(function(n,t){return!t||u[n]-u[a[t-1]]>Qa}).map(function(t){return n[t]})}),o.forEach(function(n,e){var r=n.length;if(!r)return n.push([-f,-f],[-f,f],[f,f],[f,-f]);if(!(r>2)){var i=t[e],u=n[0],a=n[1],o=i[0],c=i[1],l=u[0],s=u[1],h=a[0],g=a[1],p=Math.abs(h-l),m=g-s;if(Math.abs(m)<Qa){var d=s>c?-f:f;n.push([-f,d],[f,d])}else if(Qa>p){var v=l>o?-f:f;n.push([v,-f],[v,f])}else{var d=(l-o)*(g-s)>(h-l)*(s-c)?f:-f,y=Math.abs(m)-p;Math.abs(y)<Qa?n.push([0>m?d:-d,d]):(y>0&&(d*=-1),n.push([-f,d],[f,d]))}}}),i)for(a=0;s>a;++a)i.clip(o[a]);for(a=0;s>a;++a)o[a].point=n[a];return o}var e=Ie,r=Ve,i=null;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.clipExtent=function(n){if(!arguments.length)return i&&[i[0],i[2]];if(null==n)i=null;else{var e=+n[0][0],r=+n[0][1],u=+n[1][0],a=+n[1][1];i=ya.geom.polygon([[e,r],[e,a],[u,a],[u,r]])}return t},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):i&&i[2]},t.links=function(n){var t,i,u,a=n.map(function(){return[]}),o=[],c=pt(e),l=pt(r),s=n.length;if(c===Ie&&l===Ve)t=n;else for(t=new Array(s),u=0;s>u;++u)t[u]=[+c.call(this,i=n[u],u),+l.call(this,i,u)];return mr(t,function(t){var e=t.region.l.index,r=t.region.r.index;a[e][r]||(a[e][r]=a[r][e]=!0,o.push({source:n[e],target:n[r]}))}),o},t.triangles=function(n){if(e===Ie&&r===Ve)return ya.geom.delaunay(n);for(var t,i=new Array(c),u=pt(e),a=pt(r),o=-1,c=n.length;++o<c;)(i[o]=[+u.call(this,t=n[o],o),+a.call(this,t,o)]).data=t;return ya.geom.delaunay(i).map(function(n){return n.map(function(n){return n.data})})},t)};var mc={l:"r",r:"l"};ya.geom.quadtree=function(n,t,e,r,i){function u(n){function u(n,t,e,r,i,u,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(Math.abs(c-e)+Math.abs(s-r)<.01)l(n,t,e,r,i,u,a,o);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,i,u,a,o),l(n,t,e,r,i,u,a,o)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,i,u,a,o)}function l(n,t,e,r,i,a,o,c){var l=.5*(i+o),s=.5*(a+c),f=e>=l,h=r>=s,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=yr()),f?i=l:o=l,h?a=s:c=s,u(n,t,e,r,i,a,o,c)}var s,f,h,g,p,m,d,v,y,M=pt(o),x=pt(c);if(null!=t)m=t,d=e,v=r,y=i;else if(v=y=-(m=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.x<m&&(m=s.x),s.y<d&&(d=s.y),s.x>v&&(v=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);m>b&&(m=b),d>_&&(d=_),b>v&&(v=b),_>y&&(y=_),f.push(b),h.push(_)}var w=v-m,S=y-d;w>S?y=d+w:v=m+S;var E=yr();if(E.add=function(n){u(E,n,+M(n,++g),+x(n,g),m,d,v,y)},E.visit=function(n){Mr(n,E,m,d,v,y)},g=-1,null==t){for(;++g<p;)u(E,n[g],f[g],h[g],m,d,v,y);--g}else n.forEach(E.add);return f=h=n=s=null,E}var a,o=Ie,c=Ve;return(a=arguments.length)?(o=dr,c=vr,3===a&&(i=e,r=t,e=t=0),u(n)):(u.x=function(n){return arguments.length?(o=n,u):o},u.y=function(n){return arguments.length?(c=n,u):c},u.extent=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],i=+n[1][1]),u):null==t?null:[[t,e],[r,i]]},u.size=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=e=0,r=+n[0],i=+n[1]),u):null==t?null:[r-t,i-e]},u)},ya.interpolateRgb=xr,ya.interpolateObject=br,ya.interpolateNumber=_r,ya.interpolateString=wr;var dc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;ya.interpolate=Sr,ya.interpolators=[function(n,t){var e=typeof t;return("string"===e?so.has(t)||/^(#|rgb\(|hsl\()/.test(t)?xr:wr:t instanceof P?xr:"object"===e?Array.isArray(t)?Er:br:_r)(n,t)}],ya.interpolateArray=Er;var vc=function(){return mt},yc=ya.map({linear:vc,poly:zr,quad:function(){return qr},cubic:function(){return Tr},sin:function(){return Dr},exp:function(){return jr},circle:function(){return Lr},elastic:Hr,back:Fr,bounce:function(){return Pr}}),Mc=ya.map({"in":mt,out:Ar,"in-out":Nr,"out-in":function(n){return Nr(Ar(n))}});ya.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=yc.get(e)||vc,r=Mc.get(r)||mt,kr(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},ya.interpolateHcl=Or,ya.interpolateHsl=Yr,ya.interpolateLab=Rr,ya.interpolateRound=Ur,ya.transform=function(n){var t=Ma.createElementNS(ya.ns.prefix.svg,"g");return(ya.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ir(e?e.matrix:xc)})(n)},Ir.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var xc={a:1,b:0,c:0,d:1,e:0,f:0};ya.interpolateTransform=Br,ya.layout={},ya.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},ya.layout.chord=function(){function n(){var n,l,f,h,g,p={},m=[],d=ya.range(u),v=[];for(e=[],r=[],n=0,h=-1;++h<u;){for(l=0,g=-1;++g<u;)l+=i[h][g];m.push(l),v.push(ya.range(u)),n+=l}for(a&&d.sort(function(n,t){return a(m[n],m[t])}),o&&v.forEach(function(n,t){n.sort(function(n,e){return o(i[t][n],i[t][e])})}),n=(2*Ka-s*u)/n,l=0,h=-1;++h<u;){for(f=l,g=-1;++g<u;){var y=d[h],M=v[y][g],x=i[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<u;)for(g=h-1;++g<u;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,i,u,a,o,c,l={},s=0;return l.matrix=function(n){return arguments.length?(u=(i=n)&&i.length,e=r=null,l):i},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(a=n,e=r=null,l):a},l.sortSubgroups=function(n){return arguments.length?(o=n,e=null,l):o},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ya.layout.force=function(){function n(n){return function(t,e,r,i){if(t.point!==n){var u=t.cx-n.x,a=t.cy-n.y,o=1/Math.sqrt(u*u+a*a);if(m>(i-e)*o){var c=t.charge*o*o;return n.px-=u*c,n.py-=a*c,!0}if(t.point&&isFinite(o)){var c=t.pointCharge*o*o;n.px-=u*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=ya.event.x,n.py=ya.event.y,o.resume()}var e,r,i,u,a,o={},c=ya.dispatch("start","tick","end"),l=[1,1],s=.9,f=bc,h=_c,g=-30,p=.1,m=.8,d=[],v=[];return o.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,o,f,h,m,y,M,x,b=d.length,_=v.length;for(e=0;_>e;++e)o=v[e],f=o.source,h=o.target,M=h.x-f.x,x=h.y-f.y,(m=M*M+x*x)&&(m=r*u[e]*((m=Math.sqrt(m))-i[e])/m,M*=m,x*=m,h.x-=M*(y=f.weight/(h.weight+f.weight)),h.y-=x*y,f.x+=M*(y=1-y),f.y+=x*y);if((y=r*p)&&(M=l[0]/2,x=l[1]/2,e=-1,y))for(;++e<b;)o=d[e],o.x+=(M-o.x)*y,o.y+=(x-o.y)*y;if(g)for(ri(t=ya.geom.quadtree(d),r,a),e=-1;++e<b;)(o=d[e]).fixed||t.visit(n(o));for(e=-1;++e<b;)o=d[e],o.fixed?(o.x=o.px,o.y=o.py):(o.x-=(o.px-(o.px=o.x))*s,o.y-=(o.py-(o.py=o.y))*s);c.tick({type:"tick",alpha:r})},o.nodes=function(n){return arguments.length?(d=n,o):d},o.links=function(n){return arguments.length?(v=n,o):v},o.size=function(n){return arguments.length?(l=n,o):l},o.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,o):f},o.distance=o.linkDistance,o.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,o):h},o.friction=function(n){return arguments.length?(s=+n,o):s},o.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,o):g},o.gravity=function(n){return arguments.length?(p=+n,o):p},o.theta=function(n){return arguments.length?(m=+n,o):m},o.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ya.timer(o.tick)),o):r},o.start=function(){function n(n,r){for(var i,u=t(e),a=-1,o=u.length;++a<o;)if(!isNaN(i=u[a][n]))return i;return Math.random()*r}function t(){if(!c){for(c=[],r=0;p>r;++r)c[r]=[];for(r=0;m>r;++r){var n=v[r];c[n.source.index].push(n.target),c[n.target.index].push(n.source)}}return c[e]}var e,r,c,s,p=d.length,m=v.length,y=l[0],M=l[1];for(e=0;p>e;++e)(s=d[e]).index=e,s.weight=0;for(e=0;m>e;++e)s=v[e],"number"==typeof s.source&&(s.source=d[s.source]),"number"==typeof s.target&&(s.target=d[s.target]),++s.source.weight,++s.target.weight;for(e=0;p>e;++e)s=d[e],isNaN(s.x)&&(s.x=n("x",y)),isNaN(s.y)&&(s.y=n("y",M)),isNaN(s.px)&&(s.px=s.x),isNaN(s.py)&&(s.py=s.y);if(i=[],"function"==typeof f)for(e=0;m>e;++e)i[e]=+f.call(this,v[e],e);else for(e=0;m>e;++e)i[e]=f;if(u=[],"function"==typeof h)for(e=0;m>e;++e)u[e]=+h.call(this,v[e],e);else for(e=0;m>e;++e)u[e]=h;if(a=[],"function"==typeof g)for(e=0;p>e;++e)a[e]=+g.call(this,d[e],e);else for(e=0;p>e;++e)a[e]=g;return o.resume()},o.resume=function(){return o.alpha(.1)},o.stop=function(){return o.alpha(0)},o.drag=function(){return e||(e=ya.behavior.drag().origin(mt).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?(this.on("mouseover.force",ti).on("mouseout.force",ei).call(e),void 0):e},ya.rebind(o,c,"on")};var bc=20,_c=1;ya.layout.hierarchy=function(){function n(t,a,o){var c=i.call(e,t,a);if(t.depth=a,o.push(t),c&&(l=c.length)){for(var l,s,f=-1,h=t.children=[],g=0,p=a+1;++f<l;)s=n(c[f],p,o),s.parent=t,h.push(s),g+=s.value;r&&h.sort(r),u&&(t.value=g)}else u&&(t.value=+u.call(e,t,a)||0);return t}function t(n,r){var i=n.children,a=0;if(i&&(o=i.length))for(var o,c=-1,l=r+1;++c<o;)a+=t(i[c],l);else u&&(a=+u.call(e,n,r)||0);return u&&(n.value=a),a}function e(t){var e=[];return n(t,0,e),e}var r=oi,i=ui,u=ai;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(i=n,e):i},e.value=function(n){return arguments.length?(u=n,e):u},e.revalue=function(n){return t(n,0),n},e},ya.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(a=u.length)){var a,o,c,l=-1;for(r=t.value?r/t.value:0;++l<a;)n(o=u[l],e,c=o.value*r,i),e+=c}}function t(n){var e=n.children,r=0;if(e&&(i=e.length))for(var i,u=-1;++u<i;)r=Math.max(r,t(e[u]));return 1+r}function e(e,u){var a=r.call(this,e,u);return n(a[0],0,i[0],i[1]/t(a[0])),a}var r=ya.layout.hierarchy(),i=[1,1];return e.size=function(n){return arguments.length?(i=n,e):i},ii(e,r)},ya.layout.pie=function(){function n(u){var a=u.map(function(e,r){return+t.call(n,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof i?i.apply(this,arguments):i)-o)/ya.sum(a),l=ya.range(u.length);null!=e&&l.sort(e===wc?function(n,t){return a[t]-a[n]}:function(n,t){return e(u[n],u[t])});var s=[];return l.forEach(function(n){var t;s[n]={data:u[n],value:t=a[n],startAngle:o,endAngle:o+=t*c}}),s}var t=Number,e=wc,r=0,i=2*Ka;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n};var wc={};ya.layout.stack=function(){function n(o,c){var l=o.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,c);l=ya.permute(l,f),s=ya.permute(s,f);var h,g,p,m=r.call(n,s,c),d=l.length,v=l[0].length;for(g=0;v>g;++g)for(i.call(n,l[0][g],p=m[g],s[0][g][1]),h=1;d>h;++h)i.call(n,l[h][g],p+=s[h-1][g][1],s[h][g][1]);return o}var t=mt,e=hi,r=gi,i=fi,u=li,a=si;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Sc.get(t)||hi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:Ec.get(t)||gi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(i=t,n):i},n};var Sc=ya.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(pi),u=n.map(mi),a=ya.range(r).sort(function(n,t){return i[n]-i[t]}),o=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=a[t],c>o?(o+=u[e],l.push(e)):(c+=u[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ya.range(n.length).reverse()},"default":hi}),Ec=ya.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,a=[],o=0,c=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;u>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(n){var t,e,r,i,u,a,o,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,i=0;s>t;++t)i+=n[t][e][1];for(t=0,u=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;u+=a*n[t][e][1]}g[e]=c-=i?u/i*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,i=n.length,u=n[0].length,a=1/i,o=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=a}for(e=0;u>e;++e)o[e]=0;return o},zero:gi});ya.layout.histogram=function(){function n(n,u){for(var a,o,c=[],l=n.map(e,this),s=r.call(this,l,u),f=i.call(this,s,l,u),u=-1,h=l.length,g=f.length-1,p=t?1:1/h;++u<g;)a=c[u]=[],a.dx=f[u+1]-(a.x=f[u]),a.y=0;if(g>0)for(u=-1;++u<h;)o=l[u],o>=s[0]&&o<=s[1]&&(a=c[ya.bisect(f,o,1,g)-1],a.y+=p,a.push(n[u]));return c}var t=!0,e=Number,r=Mi,i=vi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return yi(n,t)}:pt(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ya.layout.tree=function(){function n(n,u){function a(n,t){var r=n.children,i=n._tree;if(r&&(u=r.length)){for(var u,o,l,s=r[0],f=s,h=-1;++h<u;)l=r[h],a(l,o),f=c(l,o,f),o=l;Ni(n);var g=.5*(s._tree.prelim+l._tree.prelim);t?(i.prelim=t._tree.prelim+e(n,t),i.mod=i.prelim-g):i.prelim=g}else t&&(i.prelim=t._tree.prelim+e(n,t))}function o(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,i=-1;for(t+=n._tree.mod;++i<r;)o(e[i],t)}}function c(n,t,r){if(t){for(var i,u=n,a=n,o=t,c=n.parent.children[0],l=u._tree.mod,s=a._tree.mod,f=o._tree.mod,h=c._tree.mod;o=_i(o),u=bi(u),o&&u;)c=bi(c),a=_i(a),a._tree.ancestor=n,i=o._tree.prelim+f-u._tree.prelim-l+e(o,u),i>0&&(qi(Ti(o,n,r),n,i),l+=i,s+=i),f+=o._tree.mod,l+=u._tree.mod,h+=c._tree.mod,s+=a._tree.mod;o&&!_i(a)&&(a._tree.thread=o,a._tree.mod+=f-s),u&&!bi(c)&&(c._tree.thread=u,c._tree.mod+=l-h,r=n)}return r}var l=t.call(this,n,u),s=l[0];Ai(s,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),a(s),o(s,-s._tree.prelim);var f=wi(s,Ei),h=wi(s,Si),g=wi(s,ki),p=f.x-e(f,h)/2,m=h.x+e(h,f)/2,d=g.depth||1;return Ai(s,i?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(m-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),l}var t=ya.layout.hierarchy().sort(null).value(null),e=xi,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ya.layout.pack=function(){function n(n,u){var a=e.call(this,n,u),o=a[0],c=i[0],l=i[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,Ai(o,function(n){n.r=+s(n.value)}),Ai(o,Li),r){var f=r*(t?1:Math.max(2*o.r/c,2*o.r/l))/2;Ai(o,function(n){n.r+=f}),Ai(o,Li),Ai(o,function(n){n.r-=f})}return Pi(o,c/2,l/2,t?1:1/Math.max(2*o.r/c,2*o.r/l)),a}var t,e=ya.layout.hierarchy().sort(Ci),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ya.layout.cluster=function(){function n(n,u){var a,o=t.call(this,n,u),c=o[0],l=0;Ai(c,function(n){var t=n.children;t&&t.length?(n.x=Ri(t),n.y=Yi(t)):(n.x=a?l+=e(n,a):0,n.y=0,a=n)});var s=Ui(c),f=Ii(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Ai(c,i?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),o}var t=ya.layout.hierarchy().sort(null).value(null),e=xi,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ya.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++i<u;)r=(e=n[i]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var a,o,c,l=f(e),s=[],h=u.slice(),p=1/0,m="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,"squarify"!==g||(o=r(s,m))<=p?(h.pop(),p=o):(s.area-=s.pop().area,i(s,m,l,!1),m=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(i(s,m,l,!0),s.length=s.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,a=f(t),o=r.slice(),c=[];for(n(o,a.dx*a.dy/t.value),c.area=0;u=o.pop();)c.push(u),c.area+=u.area,null!=u.z&&(i(c,u.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(u>e&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*p/r,r/(t*u*p)):1/0}function i(n,t,e,r){var i,u=-1,a=n.length,o=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++u<a;)i=n[u],i.x=o,i.y=l,i.dy=s,o+=i.dx=Math.min(e.x+e.dx-o,s?c(i.area/s):0);i.z=!0,i.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++u<a;)i=n[u],i.x=o,i.y=l,i.dx=s,l+=i.dy=Math.min(e.y+e.dy-l,s?c(i.area/s):0);i.z=!1,i.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function u(r){var i=a||o(r),u=i[0];return u.x=0,u.y=0,u.dx=l[0],u.dy=l[1],a&&o.revalue(u),n([u],u.dx*u.dy/u.value),(a?e:t)(u),h&&(a=i),i}var a,o=ya.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Vi,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return u.size=function(n){return arguments.length?(l=n,u):l},u.padding=function(n){function t(t){var e=n.call(u,t,t.depth);return null==e?Vi(t):Xi(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Xi(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Vi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,u},u.round=function(n){return arguments.length?(c=n?Math.round:Number,u):c!=Number},u.sticky=function(n){return arguments.length?(h=n,a=null,u):h},u.ratio=function(n){return arguments.length?(p=n,u):p},u.mode=function(n){return arguments.length?(g=n+"",u):g},ii(u,o)},ya.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ya.random.normal.apply(ya,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},ya.scale={};var kc={floor:mt,ceil:mt};ya.scale.linear=function(){return Ki([0,1],[0,1],Sr,!1)},ya.scale.log=function(){return uu(ya.scale.linear().domain([0,1]),10,!0,[1,10])};var Ac=ya.format(".0e"),Nc={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ya.scale.pow=function(){return au(ya.scale.linear(),1,[0,1])},ya.scale.sqrt=function(){return ya.scale.pow().exponent(.5)},ya.scale.ordinal=function(){return cu([],{t:"range",a:[[]]})},ya.scale.category10=function(){return ya.scale.ordinal().range(qc)},ya.scale.category20=function(){return ya.scale.ordinal().range(Tc)},ya.scale.category20b=function(){return ya.scale.ordinal().range(Cc)},ya.scale.category20c=function(){return ya.scale.ordinal().range(zc)};var qc=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ut),Tc=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ut),Cc=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ut),zc=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ut);ya.scale.quantile=function(){return lu([],[])},ya.scale.quantize=function(){return su(0,1,[0,1])},ya.scale.threshold=function(){return fu([.5],[0,1])},ya.scale.identity=function(){return hu([0,1])},ya.svg.arc=function(){function n(){var n=t.apply(this,arguments),u=e.apply(this,arguments),a=r.apply(this,arguments)+Dc,o=i.apply(this,arguments)+Dc,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ka>c?"0":"1",s=Math.cos(a),f=Math.sin(a),h=Math.cos(o),g=Math.sin(o);return c>=jc?n?"M0,"+u+"A"+u+","+u+" 0 1,1 0,"+-u+"A"+u+","+u+" 0 1,1 0,"+u+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+u+"A"+u+","+u+" 0 1,1 0,"+-u+"A"+u+","+u+" 0 1,1 0,"+u+"Z":n?"M"+u*s+","+u*f+"A"+u+","+u+" 0 "+l+",1 "+u*h+","+u*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+l+",0 "+n*s+","+n*f+"Z":"M"+u*s+","+u*f+"A"+u+","+u+" 0 "+l+",1 "+u*h+","+u*g+"L0,0"+"Z"}var t=gu,e=pu,r=mu,i=du;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(i=pt(t),n):i},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,u=(r.apply(this,arguments)+i.apply(this,arguments))/2+Dc;return[Math.cos(u)*n,Math.sin(u)*n]},n};var Dc=-Ka/2,jc=2*Ka-1e-6;ya.svg.line.radial=function(){var n=Ue(vu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},$e.reverse=We,We.reverse=$e,ya.svg.area=function(){return yu(mt)},ya.svg.area.radial=function(){var n=yu(vu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ya.svg.chord=function(){function n(n,o){var c=t(this,u,n,o),l=t(this,a,n,o);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?i(c.r,c.p1,c.r,c.p0):i(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+i(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=o.call(n,i,r),a=c.call(n,i,r)+Dc,s=l.call(n,i,r)+Dc;return{r:u,a0:a,a1:s,p0:[u*Math.cos(a),u*Math.sin(a)],p1:[u*Math.cos(s),u*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Ka)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=ze,a=De,o=Mu,c=mu,l=du;return n.radius=function(t){return arguments.length?(o=pt(t),n):o},n.source=function(t){return arguments.length?(u=pt(t),n):u},n.target=function(t){return arguments.length?(a=pt(t),n):a},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(l=pt(t),n):l},n},ya.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),a=e.call(this,n,i),o=(u.y+a.y)/2,c=[u,{x:u.x,y:o},{x:a.x,y:o},a];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=ze,e=De,r=xu;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ya.svg.diagonal.radial=function(){var n=ya.svg.diagonal(),t=xu,e=n.projection;return n.projection=function(n){return arguments.length?e(bu(t=n)):t},n},ya.svg.symbol=function(){function n(n,r){return(Lc.get(t.call(this,n,r))||Su)(e.call(this,n,r))}var t=wu,e=_u;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var Lc=ya.map({circle:Su,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Oc)),e=t*Oc;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Pc),e=t*Pc/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Pc),e=t*Pc/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ya.svg.symbolTypes=Lc.keys();var Hc,Fc,Pc=Math.sqrt(3),Oc=Math.tan(30*to),Yc=[],Rc=0;Yc.call=Ya.call,Yc.empty=Ya.empty,Yc.node=Ya.node,Yc.size=Ya.size,ya.transition=function(n){return arguments.length?Hc?n.transition():n:Ia.transition()},ya.transition.prototype=Yc,Yc.select=function(n){var t,e,r,i=this.id,u=[];n=v(n);for(var a=-1,o=this.length;++a<o;){u.push(t=[]);for(var c=this[a],l=-1,s=c.length;++l<s;)(r=c[l])&&(e=n.call(r,r.__data__,l,a))?("__data__"in r&&(e.__data__=r.__data__),Nu(e,l,i,r.__transition__[i]),t.push(e)):t.push(null)}return Eu(u,i)},Yc.selectAll=function(n){var t,e,r,i,u,a=this.id,o=[];n=y(n);for(var c=-1,l=this.length;++c<l;)for(var s=this[c],f=-1,h=s.length;++f<h;)if(r=s[f]){u=r.__transition__[a],e=n.call(r,r.__data__,f,c),o.push(t=[]);for(var g=-1,p=e.length;++g<p;)(i=e[g])&&Nu(i,g,a,u),t.push(i)}return Eu(o,a)},Yc.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=N(n));for(var u=0,a=this.length;a>u;u++){i.push(t=[]);for(var e=this[u],o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return Eu(i,this.id)},Yc.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):T(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Yc.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?Br:Sr,o=ya.ns.qualify(n);return ku(this,"attr."+n,t,o.local?u:i)},Yc.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ya.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yc.style=function(n,t,e){function r(){this.style.removeProperty(n)}function i(t){return null==t?r:(t+="",function(){var r,i=ba.getComputedStyle(this,null).getPropertyValue(n);return i!==t&&(r=Sr(i,t),function(t){this.style.setProperty(n,r(t),e)})})}var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return ku(this,"style."+n,t,i)},Yc.styleTween=function(n,t,e){function r(r,i){var u=t.call(this,r,i,ba.getComputedStyle(this,null).getPropertyValue(n));return u&&function(t){this.style.setProperty(n,u(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Yc.text=function(n){return ku(this,"text",n,Au)},Yc.remove=function(){return this.each("end.transition",function(){var n;!this.__transition__&&(n=this.parentNode)&&n.removeChild(this)})},Yc.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=ya.ease.apply(ya,arguments)),T(this,function(e){e.__transition__[t].ease=n}))},Yc.delay=function(n){var t=this.id;return T(this,"function"==typeof n?function(e,r,i){e.__transition__[t].delay=0|n.call(e,e.__data__,r,i)}:(n|=0,function(e){e.__transition__[t].delay=n}))},Yc.duration=function(n){var t=this.id;return T(this,"function"==typeof n?function(e,r,i){e.__transition__[t].duration=Math.max(1,0|n.call(e,e.__data__,r,i))}:(n=Math.max(1,0|n),function(e){e.__transition__[t].duration=n}))},Yc.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Fc,i=Hc;Hc=e,T(this,function(t,r,i){Fc=t.__transition__[e],n.call(t,t.__data__,r,i)}),Fc=r,Hc=i}else T(this,function(r){var i=r.__transition__[e];(i.event||(i.event=ya.dispatch("start","end"))).on(n,t)});return this},Yc.transition=function(){for(var n,t,e,r,i=this.id,u=++Rc,a=[],o=0,c=this.length;c>o;o++){a.push(n=[]);for(var t=this[o],l=0,s=t.length;s>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[i]),r.delay+=r.duration,Nu(e,l,u,r)),n.push(e)}return Eu(a,u)},ya.svg.axis=function(){function n(n){n.each(function(){var n,f=ya.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,g=null==t?e.tickFormat?e.tickFormat.apply(e,c):String:t,p=Cu(e,h,s),m=f.selectAll(".tick.minor").data(p,String),d=m.enter().insert("line",".tick").attr("class","tick minor").style("opacity",1e-6),v=ya.transition(m.exit()).style("opacity",1e-6).remove(),y=ya.transition(m).style("opacity",1),M=f.selectAll(".tick.major").data(h,String),x=M.enter().insert("g",".domain").attr("class","tick major").style("opacity",1e-6),b=ya.transition(M.exit()).style("opacity",1e-6).remove(),_=ya.transition(M).style("opacity",1),w=Bi(e),S=f.selectAll(".domain").data([0]),E=(S.enter().append("path").attr("class","domain"),ya.transition(S)),k=e.copy(),A=this.__chart__||k;
-this.__chart__=k,x.append("line"),x.append("text");var N=x.select("line"),q=_.select("line"),T=M.select("text").text(g),C=x.select("text"),z=_.select("text");switch(r){case"bottom":n=qu,d.attr("y2",u),y.attr("x2",0).attr("y2",u),N.attr("y2",i),C.attr("y",Math.max(i,0)+o),q.attr("x2",0).attr("y2",i),z.attr("x",0).attr("y",Math.max(i,0)+o),T.attr("dy",".71em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":n=qu,d.attr("y2",-u),y.attr("x2",0).attr("y2",-u),N.attr("y2",-i),C.attr("y",-(Math.max(i,0)+o)),q.attr("x2",0).attr("y2",-i),z.attr("x",0).attr("y",-(Math.max(i,0)+o)),T.attr("dy","0em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":n=Tu,d.attr("x2",-u),y.attr("x2",-u).attr("y2",0),N.attr("x2",-i),C.attr("x",-(Math.max(i,0)+o)),q.attr("x2",-i).attr("y2",0),z.attr("x",-(Math.max(i,0)+o)).attr("y",0),T.attr("dy",".32em").style("text-anchor","end"),E.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":n=Tu,d.attr("x2",u),y.attr("x2",u).attr("y2",0),N.attr("x2",i),C.attr("x",Math.max(i,0)+o),q.attr("x2",i).attr("y2",0),z.attr("x",Math.max(i,0)+o).attr("y",0),T.attr("dy",".32em").style("text-anchor","start"),E.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.rangeBand){var D=k.rangeBand()/2,j=function(n){return k(n)+D};x.call(n,j),_.call(n,j)}else x.call(n,A),_.call(n,k),b.call(n,k),d.call(n,A),y.call(n,k),v.call(n,k)})}var t,e=ya.scale.linear(),r=Uc,i=6,u=6,a=6,o=3,c=[10],l=null,s=0;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ic?t+"":Uc,n):r},n.ticks=function(){return arguments.length?(c=arguments,n):c},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t,e){if(!arguments.length)return i;var r=arguments.length-1;return i=+t,u=r>1?+e:i,a=r>0?+arguments[r]:i,n},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(t){return arguments.length?(s=+t,n):s},n};var Uc="bottom",Ic={top:1,right:1,bottom:1,left:1};ya.svg.brush=function(){function n(u){u.each(function(){var u,a=ya.select(this),s=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),s.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Vc[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",n.empty()?"none":null),h.exit().remove(),o&&(u=Bi(o),s.attr("x",u[0]).attr("width",u[1]-u[0]),e(a)),c&&(u=Bi(c),s.attr("y",u[0]).attr("height",u[1]-u[0]),r(a)),t(a)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)][0]+","+s[+/^s/.test(n)][1]+")"})}function e(n){n.select(".extent").attr("x",s[0][0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1][0]-s[0][0])}function r(n){n.select(".extent").attr("y",s[0][1]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1][1]-s[0][1])}function i(){function i(){var n=ya.event.changedTouches;return n?ya.touches(M,n)[0]:ya.mouse(M)}function l(){32==ya.event.keyCode&&(k||(v=null,N[0]-=s[1][0],N[1]-=s[1][1],k=2),g())}function h(){32==ya.event.keyCode&&2==k&&(N[0]+=s[1][0],N[1]+=s[1][1],k=0,g())}function p(){var n=i(),u=!1;y&&(n[0]+=y[0],n[1]+=y[1]),k||(ya.event.altKey?(v||(v=[(s[0][0]+s[1][0])/2,(s[0][1]+s[1][1])/2]),N[0]=s[+(n[0]<v[0])][0],N[1]=s[+(n[1]<v[1])][1]):v=null),S&&m(n,o,0)&&(e(_),u=!0),E&&m(n,c,1)&&(r(_),u=!0),u&&(t(_),b({type:"brush",mode:k?"move":"resize"}))}function m(n,t,e){var r,i,a=Bi(t),o=a[0],c=a[1],l=N[e],h=s[1][e]-s[0][e];return k&&(o-=l,c-=h+l),r=f[e]?Math.max(o,Math.min(c,n[e])):n[e],k?i=(r+=l)+h:(v&&(l=Math.max(o,Math.min(c,2*v[e]-r))),r>l?(i=r,r=l):i=l),s[0][e]!==r||s[1][e]!==i?(u=null,s[0][e]=r,s[1][e]=i,!0):void 0}function d(){p(),_.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ya.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),A(),b({type:"brushend"})}var v,y,M=this,x=ya.select(ya.event.target),b=a.of(M,arguments),_=ya.select(M),w=x.datum(),S=!/^(n|s)$/.test(w)&&o,E=!/^(e|w)$/.test(w)&&c,k=x.classed("extent"),A=H(),N=i(),q=ya.select(ba).on("keydown.brush",l).on("keyup.brush",h);if(ya.event.changedTouches?q.on("touchmove.brush",p).on("touchend.brush",d):q.on("mousemove.brush",p).on("mouseup.brush",d),k)N[0]=s[0][0]-N[0],N[1]=s[0][1]-N[1];else if(w){var T=+/w$/.test(w),C=+/^n/.test(w);y=[s[1-T][0]-N[0],s[1-C][1]-N[1]],N[0]=s[T][0],N[1]=s[C][1]}else ya.event.altKey&&(v=N.slice());_.style("pointer-events","none").selectAll(".resize").style("display",null),ya.select("body").style("cursor",x.style("cursor")),b({type:"brushstart"}),p()}var u,a=m(n,"brushstart","brush","brushend"),o=null,c=null,l=Xc[0],s=[[0,0],[0,0]],f=[!0,!0];return n.x=function(t){return arguments.length?(o=t,l=Xc[!o<<1|!c],n):o},n.y=function(t){return arguments.length?(c=t,l=Xc[!o<<1|!c],n):c},n.clamp=function(t){return arguments.length?(o&&c?f=[!!t[0],!!t[1]]:(o||c)&&(f[+!o]=!!t),n):o&&c?f:o||c?f[+!o]:null},n.extent=function(t){var e,r,i,a,l;return arguments.length?(u=[[0,0],[0,0]],o&&(e=t[0],r=t[1],c&&(e=e[0],r=r[0]),u[0][0]=e,u[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),s[0][0]=0|e,s[1][0]=0|r),c&&(i=t[0],a=t[1],o&&(i=i[1],a=a[1]),u[0][1]=i,u[1][1]=a,c.invert&&(i=c(i),a=c(a)),i>a&&(l=i,i=a,a=l),s[0][1]=0|i,s[1][1]=0|a),n):(t=u||s,o&&(e=t[0][0],r=t[1][0],u||(e=s[0][0],r=s[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(i=t[0][1],a=t[1][1],u||(i=s[0][1],a=s[1][1],c.invert&&(i=c.invert(i),a=c.invert(a)),i>a&&(l=i,i=a,a=l))),o&&c?[[e,i],[r,a]]:o?[e,r]:c&&[i,a])},n.clear=function(){return u=null,s[0][0]=s[0][1]=s[1][0]=s[1][1]=0,n},n.empty=function(){return o&&s[0][0]===s[1][0]||c&&s[0][1]===s[1][1]},ya.rebind(n,a,"on")};var Vc={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Xc=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];ya.time={};var Zc=Date,Bc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];zu.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){$c.setUTCDate.apply(this._,arguments)},setDay:function(){$c.setUTCDay.apply(this._,arguments)},setFullYear:function(){$c.setUTCFullYear.apply(this._,arguments)},setHours:function(){$c.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){$c.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){$c.setUTCMinutes.apply(this._,arguments)},setMonth:function(){$c.setUTCMonth.apply(this._,arguments)},setSeconds:function(){$c.setUTCSeconds.apply(this._,arguments)},setTime:function(){$c.setTime.apply(this._,arguments)}};var $c=Date.prototype,Wc="%a %b %e %X %Y",Jc="%m/%d/%Y",Gc="%H:%M:%S",Kc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Qc=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],nl=["January","February","March","April","May","June","July","August","September","October","November","December"],tl=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];ya.time.year=Du(function(n){return n=ya.time.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ya.time.years=ya.time.year.range,ya.time.years.utc=ya.time.year.utc.range,ya.time.day=Du(function(n){var t=new Zc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ya.time.days=ya.time.day.range,ya.time.days.utc=ya.time.day.utc.range,ya.time.dayOfYear=function(n){var t=ya.time.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Bc.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=ya.time[n]=Du(function(n){return(n=ya.time.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ya.time.year(n).getDay();return Math.floor((ya.time.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ya.time[n+"s"]=e.range,ya.time[n+"s"].utc=e.utc.range,ya.time[n+"OfYear"]=function(n){var e=ya.time.year(n).getDay();return Math.floor((ya.time.dayOfYear(n)+(e+t)%7)/7)}}),ya.time.week=ya.time.sunday,ya.time.weeks=ya.time.sunday.range,ya.time.weeks.utc=ya.time.sunday.utc.range,ya.time.weekOfYear=ya.time.sundayOfYear,ya.time.format=function(n){function t(t){for(var r,i,u,a=[],o=-1,c=0;++o<e;)37===n.charCodeAt(o)&&(a.push(n.substring(c,o)),null!=(i=fl[r=n.charAt(++o)])&&(r=n.charAt(++o)),(u=hl[r])&&(r=u(t,null==i?"e"===r?" ":"0":i)),a.push(r),c=o+1);return a.push(n.substring(c,o)),a.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Lu(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var i=new Zc;return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H,e.M,e.S,e.L),i},t.toString=function(){return n},t};var el=Hu(Kc),rl=Fu(Kc),il=Hu(Qc),ul=Fu(Qc),al=Hu(nl),ol=Fu(nl),cl=Hu(tl),ll=Fu(tl),sl=/^%/,fl={"-":"",_:" ",0:"0"},hl={a:function(n){return Qc[n.getDay()]},A:function(n){return Kc[n.getDay()]},b:function(n){return tl[n.getMonth()]},B:function(n){return nl[n.getMonth()]},c:ya.time.format(Wc),d:function(n,t){return Pu(n.getDate(),t,2)},e:function(n,t){return Pu(n.getDate(),t,2)},H:function(n,t){return Pu(n.getHours(),t,2)},I:function(n,t){return Pu(n.getHours()%12||12,t,2)},j:function(n,t){return Pu(1+ya.time.dayOfYear(n),t,3)},L:function(n,t){return Pu(n.getMilliseconds(),t,3)},m:function(n,t){return Pu(n.getMonth()+1,t,2)},M:function(n,t){return Pu(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return Pu(n.getSeconds(),t,2)},U:function(n,t){return Pu(ya.time.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Pu(ya.time.mondayOfYear(n),t,2)},x:ya.time.format(Jc),X:ya.time.format(Gc),y:function(n,t){return Pu(n.getFullYear()%100,t,2)},Y:function(n,t){return Pu(n.getFullYear()%1e4,t,4)},Z:aa,"%":function(){return"%"}},gl={a:Ou,A:Yu,b:Vu,B:Xu,c:Zu,d:Qu,e:Qu,H:ta,I:ta,j:na,L:ia,m:Ku,M:ea,p:ua,S:ra,U:Uu,w:Ru,W:Iu,x:Bu,X:$u,y:Ju,Y:Wu,"%":oa},pl=/^\s*\d+/,ml=ya.map({am:0,pm:1});ya.time.format.utc=function(n){function t(n){try{Zc=zu;var t=new Zc;return t._=n,e(t)}finally{Zc=Date}}var e=ya.time.format(n);return t.parse=function(n){try{Zc=zu;var t=e.parse(n);return t&&t._}finally{Zc=Date}},t.toString=e.toString,t};var dl=ya.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");ya.time.format.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ca:dl,ca.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ca.toString=dl.toString,ya.time.second=Du(function(n){return new Zc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ya.time.seconds=ya.time.second.range,ya.time.seconds.utc=ya.time.second.utc.range,ya.time.minute=Du(function(n){return new Zc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ya.time.minutes=ya.time.minute.range,ya.time.minutes.utc=ya.time.minute.utc.range,ya.time.hour=Du(function(n){var t=n.getTimezoneOffset()/60;return new Zc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ya.time.hours=ya.time.hour.range,ya.time.hours.utc=ya.time.hour.utc.range,ya.time.month=Du(function(n){return n=ya.time.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ya.time.months=ya.time.month.range,ya.time.months.utc=ya.time.month.utc.range;var vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],yl=[[ya.time.second,1],[ya.time.second,5],[ya.time.second,15],[ya.time.second,30],[ya.time.minute,1],[ya.time.minute,5],[ya.time.minute,15],[ya.time.minute,30],[ya.time.hour,1],[ya.time.hour,3],[ya.time.hour,6],[ya.time.hour,12],[ya.time.day,1],[ya.time.day,2],[ya.time.week,1],[ya.time.month,1],[ya.time.month,3],[ya.time.year,1]],Ml=[[ya.time.format("%Y"),Xt],[ya.time.format("%B"),function(n){return n.getMonth()}],[ya.time.format("%b %d"),function(n){return 1!=n.getDate()}],[ya.time.format("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[ya.time.format("%I %p"),function(n){return n.getHours()}],[ya.time.format("%I:%M"),function(n){return n.getMinutes()}],[ya.time.format(":%S"),function(n){return n.getSeconds()}],[ya.time.format(".%L"),function(n){return n.getMilliseconds()}]],xl=ya.scale.linear(),bl=fa(Ml);yl.year=function(n,t){return xl.domain(n.map(ga)).ticks(t).map(ha)},ya.time.scale=function(){return la(ya.scale.linear(),yl,bl)};var _l=yl.map(function(n){return[n[0].utc,n[1]]}),wl=[[ya.time.format.utc("%Y"),Xt],[ya.time.format.utc("%B"),function(n){return n.getUTCMonth()}],[ya.time.format.utc("%b %d"),function(n){return 1!=n.getUTCDate()}],[ya.time.format.utc("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[ya.time.format.utc("%I %p"),function(n){return n.getUTCHours()}],[ya.time.format.utc("%I:%M"),function(n){return n.getUTCMinutes()}],[ya.time.format.utc(":%S"),function(n){return n.getUTCSeconds()}],[ya.time.format.utc(".%L"),function(n){return n.getUTCMilliseconds()}]],Sl=fa(wl);return _l.year=function(n,t){return xl.domain(n.map(ma)).ticks(t).map(pa)},ya.time.scale.utc=function(){return la(ya.scale.linear(),_l,Sl)},ya.text=dt(function(n){return n.responseText}),ya.json=function(n,t){return vt(n,"application/json",da,t)},ya.html=function(n,t){return vt(n,"text/html",va,t)},ya.xml=dt(function(n){return n.responseXML}),ya}();
\ No newline at end of file
diff --git a/dashboard/dependencies/js/draper.activity_logger.js b/dashboard/dependencies/js/draper.activity_logger.js
deleted file mode 100644
index 48cb77c..0000000
--- a/dashboard/dependencies/js/draper.activity_logger.js
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
-* Draper activityLogger
-*
-* The purpose of this module is allow XDATA Developers to easily add a logging
-* mechanism into their own modules for the purposes of recording the behaviors
-* of the analysists using their tools.
-*
-* @author Draper Laboratory
-* @date 2014
-*/
-function activityLogger() {	
-  var draperLog = {version: "0.2.0"}; // semver
-
-  var muteUserActivityLogging = false;
-  var muteSystemActivityLogging = false;
-  var logToConsole = false;
-  var testing = false;
-  var workflowCodingVersion = '1.0'
-
-  /**
-  * Workflow Codes
-  */
-	draperLog.WF_OTHER       = 0;
-	draperLog.WF_PLAN        = 1;
-	draperLog.WF_SEARCH      = 2;
-	draperLog.WF_EXAMINE     = 3;
-	draperLog.WF_MARSHAL     = 4;
-	draperLog.WF_REASON      = 5;
-	draperLog.WF_COLLABORATE = 6;
-	draperLog.WF_REPORT      = 7;
-	
-
-	/**
-	* Registers this component with Draper's logging server.  The server creates
-	* a unique session_id, that is then used in subsequent logging messages.  This 
-	* is a blocking ajax call to ensure logged messages are tagged correctly.
-	* @todo investigate the use of promises, instead of the blocking call.
-	*
-	* @method registerActivityLogger
-	* @param {String} url the url of Draper's Logging Server
-	* @param {String} componentName the name of this component
-	* @param {String} componentVersion the version of this component
-	*/
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/register',
-				async: false,
-				dataType: 'json',
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: Session successfully registered', a);
-					}
-					draperLog.sessionID = a.session_id;
-					draperLog.clientHostname = a.client_ip;
-				},
-				error: function(){
-					console.error('DRAPER LOG: Could not register session with Drapers server!')
-				}
-			});
-		} else {
-
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) Session successfully registered');
-			}
-			draperLog.sessionID = 'test_session'
-			draperLog.clientHostname = 'test_client';
-		}
-
-		classListener();
-
-		return draperLog;
-	}
-
-	/**
-	* Create USER activity message.   
-	*
-	* @method logUserActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {String} userActivity a more generalized one word description of the current activity. 
-	* @param {Integer} userWorkflowState an integer representing one of the enumerated states above.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {	    
-
-	    if(!muteUserActivityLogging) {
-	    	msg = {
-	    		type: 'USERACTION',
-	    		parms: {
-	    			desc: actionDescription,
-						activity: userActivity,
-						wf_state: userWorkflowState,
-						wf_version: workflowCodingVersion 
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	/**
-	* Create SYSTEM activity message.  
-	*
-	* @method logSystemActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {	    
-               
-	    if(!muteSystemActivityLogging) {
-	    	msg = {
-	    		type: 'SYSACTION',
-	    		parms: {
-	    			desc: actionDescription,	          
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	/**
-	* Set Session Cookie on Client. NOT YET IMPLEMENTED.
-	*/
-	function setCookie(cname,cvalue,exdays)	{
-		var d = new Date();
-		d.setTime(d.getTime()+(exdays*24*60*60*1000));
-		var expires = "expires="+d.toGMTString();
-		document.cookie = cname + "=" + cvalue + "; " + expires;
-	}
-
-	/**
-	* Send activity message to Draper's logging server.  This function uses Jquery's ajax
-	* function to send the created message to draper's server.  
-	*
-	* @method sendMessage
-	* @param {JSON} msg the JSON message.
-	*/
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		if (logToConsole) {
-			console.log('DRAPER LOG: Sending message to Draper server', msg);
-		}
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/send_log',
-				type: 'POST',
-				dataType: 'json',
-				data: msg,
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: message received!');
-					}
-				},
-				error: function(){
-					console.error('DRAPER LOG: could not send activity log to Draper server!')
-				}
-			});
-		} else {
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) message received!');
-			}
-		}
-	}
-
-	draperLog.echo = function(d) {
-    if (!arguments.length) return logToConsole;
-    logToConsole = d;
-    return draperLog;
-  };
-
-  draperLog.mute = function(d) {
-  	d.forEach(function(d) {
-  		if(d == 'USER') muteUserActivityLogging = true;
-  		if(d == 'SYS') muteSystemActivityLogging = true;
-  	});  	
-    return draperLog;
-  };
-
-  draperLog.testing = function(d) {
-  	if (!arguments.length) return testing;
-    testing = d;
-    return draperLog;
-  }; 
-
-  function classListener() {
-
-  	$( document ).ready(function() {
-  		console.log('DOM Ready classListener');
-  		window.A = $(".draper")
-
-	    $(".draper").each(function(i,d){
-	    	var elem = $(d)
-	    	// console.log($(d).data('wf'))
-	    	$(d).on("click", function(a){	    		
-	    		console.log($(this).data('activity'), elem.data('activity'))
-	    		ac.logUserActivity('Testing User Activity Message ' + d, $(this).data('activity'), $(this).data('wf'))
-	    	})
-	    	$(d).on("mouseenter", function(a){	    		
-	    		ac.logUserActivity('Hover', 'hover', 3)
-	    	})
-	    })
-
-	    $(window).scroll(function() {
-		    clearTimeout($.data(this, 'scrollTimer'));
-		    $.data(this, 'scrollTimer', setTimeout(function() {
-		        ac.logUserActivity('User scrolled window', 'scroll', 3)
-		    }, 500));
-			});
-		});
-  }
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/dependencies/js/ember-data.js b/dashboard/dependencies/js/ember-data.js
deleted file mode 100644
index ea72af1..0000000
--- a/dashboard/dependencies/js/ember-data.js
+++ /dev/null
@@ -1,10620 +0,0 @@
-/*!
- * @overview  Ember Data
- * @copyright Copyright 2011-2014 Tilde Inc. and contributors.
- *            Portions Copyright 2011 LivingSocial Inc.
- * @license   Licensed under MIT license (see license.js)
- * @version   1.0.0-beta.7+canary.238bb5ce
- */
-
-
-(function() {
-var define, requireModule;
-
-(function() {
-  var registry = {}, seen = {};
-
-  define = function(name, deps, callback) {
-    registry[name] = { deps: deps, callback: callback };
-  };
-
-  requireModule = function(name) {
-    if (seen[name]) { return seen[name]; }
-    seen[name] = {};
-
-    var mod, deps, callback, reified , exports;
-
-    mod = registry[name];
-
-    if (!mod) {
-      throw new Error("Module '" + name + "' not found.");
-    }
-
-    deps = mod.deps;
-    callback = mod.callback;
-    reified = [];
-    exports;
-
-    for (var i=0, l=deps.length; i<l; i++) {
-      if (deps[i] === 'exports') {
-        reified.push(exports = {});
-      } else {
-        reified.push(requireModule(deps[i]));
-      }
-    }
-
-    var value = callback.apply(this, reified);
-    return seen[name] = exports || value;
-  };
-})();
-(function() {
-/**
-  @module ember-data
-*/
-
-/**
-  All Ember Data methods and functions are defined inside of this namespace.
-
-  @class DS
-  @static
-*/
-var DS;
-if ('undefined' === typeof DS) {
-  /**
-    @property VERSION
-    @type String
-    @default '1.0.0-beta.7+canary.238bb5ce'
-    @static
-  */
-  DS = Ember.Namespace.create({
-    VERSION: '1.0.0-beta.7+canary.238bb5ce'
-  });
-
-  if ('undefined' !== typeof window) {
-    window.DS = DS;
-  }
-
-  if (Ember.libraries) {
-    Ember.libraries.registerCoreLibrary('Ember Data', DS.VERSION);
-  }
-}
-
-})();
-
-
-
-(function() {
-/**
-  This is used internally to enable deprecation of container paths and provide
-  a decent message to the user indicating how to fix the issue.
-
-  @class ContainerProxy
-  @namespace DS
-  @private
-*/
-var ContainerProxy = function (container){
-  this.container = container;
-};
-
-ContainerProxy.prototype.aliasedFactory = function(path, preLookup) {
-  var _this = this;
-
-  return {create: function(){ 
-    if (preLookup) { preLookup(); }
-
-    return _this.container.lookup(path); 
-  }};
-};
-
-ContainerProxy.prototype.registerAlias = function(source, dest, preLookup) {
-  var factory = this.aliasedFactory(dest, preLookup);
-
-  return this.container.register(source, factory);
-};
-
-ContainerProxy.prototype.registerDeprecation = function(deprecated, valid) {
-  var preLookupCallback = function(){
-    Ember.deprecate("You tried to look up '" + deprecated + "', " +
-                    "but this has been deprecated in favor of '" + valid + "'.", false);
-  };
-
-  return this.registerAlias(deprecated, valid, preLookupCallback);
-};
-
-ContainerProxy.prototype.registerDeprecations = function(proxyPairs) {
-  for (var i = proxyPairs.length; i > 0; i--) {
-    var proxyPair = proxyPairs[i - 1],
-        deprecated = proxyPair['deprecated'],
-        valid = proxyPair['valid'];
-
-    this.registerDeprecation(deprecated, valid);
-  }
-};
-
-DS.ContainerProxy = ContainerProxy;
-
-})();
-
-
-
-(function() {
-var get = Ember.get, set = Ember.set, isNone = Ember.isNone;
-
-// Simple dispatcher to support overriding the aliased
-// method in subclasses.
-function aliasMethod(methodName) {
-  return function() {
-    return this[methodName].apply(this, arguments);
-  };
-}
-
-/**
-  In Ember Data a Serializer is used to serialize and deserialize
-  records when they are transferred in and out of an external source.
-  This process involves normalizing property names, transforming
-  attribute values and serializing relationships.
-
-  For maximum performance Ember Data recommends you use the
-  [RESTSerializer](DS.RESTSerializer.html) or one of its subclasses.
-
-  `JSONSerializer` is useful for simpler or legacy backends that may
-  not support the http://jsonapi.org/ spec.
-
-  @class JSONSerializer
-  @namespace DS
-*/
-DS.JSONSerializer = Ember.Object.extend({
-  /**
-    The primaryKey is used when serializing and deserializing
-    data. Ember Data always uses the `id` property to store the id of
-    the record. The external source may not always follow this
-    convention. In these cases it is useful to override the
-    primaryKey property to match the primaryKey of your external
-    store.
-
-    Example
-
-    ```javascript
-    App.ApplicationSerializer = DS.JSONSerializer.extend({
-      primaryKey: '_id'
-    });
-    ```
-
-    @property primaryKey
-    @type {String}
-    @default 'id'
-  */
-  primaryKey: 'id',
-
-  /**
-   Given a subclass of `DS.Model` and a JSON object this method will
-   iterate through each attribute of the `DS.Model` and invoke the
-   `DS.Transform#deserialize` method on the matching property of the
-   JSON object.  This method is typically called after the
-   serializer's `normalize` method.
-
-   @method applyTransforms
-   @private
-   @param {subclass of DS.Model} type
-   @param {Object} data The data to transform
-   @return {Object} data The transformed data object
-  */
-  applyTransforms: function(type, data) {
-    type.eachTransformedAttribute(function(key, type) {
-      var transform = this.transformFor(type);
-      data[key] = transform.deserialize(data[key]);
-    }, this);
-
-    return data;
-  },
-
-  /**
-    Normalizes a part of the JSON payload returned by
-    the server. You should override this method, munge the hash
-    and call super if you have generic normalization to do.
-
-    It takes the type of the record that is being normalized
-    (as a DS.Model class), the property where the hash was
-    originally found, and the hash to normalize.
-
-    You can use this method, for example, to normalize underscored keys to camelized
-    or other general-purpose normalizations.
-
-    Example
-
-    ```javascript
-    App.ApplicationSerializer = DS.JSONSerializer.extend({
-      normalize: function(type, hash) {
-        var fields = Ember.get(type, 'fields');
-        fields.forEach(function(field) {
-          var payloadField = Ember.String.underscore(field);
-          if (field === payloadField) { return; }
-
-          hash[field] = hash[payloadField];
-          delete hash[payloadField];
-        });
-        return this._super.apply(this, arguments);
-      }
-    });
-    ```
-
-    @method normalize
-    @param {subclass of DS.Model} type
-    @param {Object} hash
-    @return {Object}
-  */
-  normalize: function(type, hash) {
-    if (!hash) { return hash; }
-
-    this.applyTransforms(type, hash);
-    return hash;
-  },
-
-  // SERIALIZE
-  /**
-    Called when a record is saved in order to convert the
-    record into JSON.
-
-    By default, it creates a JSON object with a key for
-    each attribute and belongsTo relationship.
-
-    For example, consider this model:
-
-    ```javascript
-    App.Comment = DS.Model.extend({
-      title: DS.attr(),
-      body: DS.attr(),
-
-      author: DS.belongsTo('user')
-    });
-    ```
-
-    The default serialization would create a JSON object like:
-
-    ```javascript
-    {
-      "title": "Rails is unagi",
-      "body": "Rails? Omakase? O_O",
-      "author": 12
-    }
-    ```
-
-    By default, attributes are passed through as-is, unless
-    you specified an attribute type (`DS.attr('date')`). If
-    you specify a transform, the JavaScript value will be
-    serialized when inserted into the JSON hash.
-
-    By default, belongs-to relationships are converted into
-    IDs when inserted into the JSON hash.
-
-    ## IDs
-
-    `serialize` takes an options hash with a single option:
-    `includeId`. If this option is `true`, `serialize` will,
-    by default include the ID in the JSON object it builds.
-
-    The adapter passes in `includeId: true` when serializing
-    a record for `createRecord`, but not for `updateRecord`.
-
-    ## Customization
-
-    Your server may expect a different JSON format than the
-    built-in serialization format.
-
-    In that case, you can implement `serialize` yourself and
-    return a JSON hash of your choosing.
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      serialize: function(post, options) {
-        var json = {
-          POST_TTL: post.get('title'),
-          POST_BDY: post.get('body'),
-          POST_CMS: post.get('comments').mapProperty('id')
-        }
-
-        if (options.includeId) {
-          json.POST_ID_ = post.get('id');
-        }
-
-        return json;
-      }
-    });
-    ```
-
-    ## Customizing an App-Wide Serializer
-
-    If you want to define a serializer for your entire
-    application, you'll probably want to use `eachAttribute`
-    and `eachRelationship` on the record.
-
-    ```javascript
-    App.ApplicationSerializer = DS.JSONSerializer.extend({
-      serialize: function(record, options) {
-        var json = {};
-
-        record.eachAttribute(function(name) {
-          json[serverAttributeName(name)] = record.get(name);
-        })
-
-        record.eachRelationship(function(name, relationship) {
-          if (relationship.kind === 'hasMany') {
-            json[serverHasManyName(name)] = record.get(name).mapBy('id');
-          }
-        });
-
-        if (options.includeId) {
-          json.ID_ = record.get('id');
-        }
-
-        return json;
-      }
-    });
-
-    function serverAttributeName(attribute) {
-      return attribute.underscore().toUpperCase();
-    }
-
-    function serverHasManyName(name) {
-      return serverAttributeName(name.singularize()) + "_IDS";
-    }
-    ```
-
-    This serializer will generate JSON that looks like this:
-
-    ```javascript
-    {
-      "TITLE": "Rails is omakase",
-      "BODY": "Yep. Omakase.",
-      "COMMENT_IDS": [ 1, 2, 3 ]
-    }
-    ```
-
-    ## Tweaking the Default JSON
-
-    If you just want to do some small tweaks on the default JSON,
-    you can call super first and make the tweaks on the returned
-    JSON.
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      serialize: function(record, options) {
-        var json = this._super.apply(this, arguments);
-
-        json.subject = json.title;
-        delete json.title;
-
-        return json;
-      }
-    });
-    ```
-
-    @method serialize
-    @param {subclass of DS.Model} record
-    @param {Object} options
-    @return {Object} json
-  */
-  serialize: function(record, options) {
-    var json = {};
-
-    if (options && options.includeId) {
-      var id = get(record, 'id');
-
-      if (id) {
-        json[get(this, 'primaryKey')] = id;
-      }
-    }
-
-    record.eachAttribute(function(key, attribute) {
-      this.serializeAttribute(record, json, key, attribute);
-    }, this);
-
-    record.eachRelationship(function(key, relationship) {
-      if (relationship.kind === 'belongsTo') {
-        this.serializeBelongsTo(record, json, relationship);
-      } else if (relationship.kind === 'hasMany') {
-        this.serializeHasMany(record, json, relationship);
-      }
-    }, this);
-
-    return json;
-  },
-
-  /**
-   `serializeAttribute` can be used to customize how `DS.attr`
-   properties are serialized
-
-   For example if you wanted to ensure all you attributes were always
-   serialized as properties on an `attributes` object you could
-   write:
-
-   ```javascript
-   App.ApplicationSerializer = DS.JSONSerializer.extend({
-     serializeAttribute: function(record, json, key, attributes) {
-       json.attributes = json.attributes || {};
-       this._super(record, json.attributes, key, attributes);
-     }
-   });
-   ```
-
-   @method serializeAttribute
-   @param {DS.Model} record
-   @param {Object} json
-   @param {String} key
-   @param {Object} attribute
-  */
-  serializeAttribute: function(record, json, key, attribute) {
-    var attrs = get(this, 'attrs');
-    var value = get(record, key), type = attribute.type;
-
-    if (type) {
-      var transform = this.transformFor(type);
-      value = transform.serialize(value);
-    }
-
-    // if provided, use the mapping provided by `attrs` in
-    // the serializer
-    key = attrs && attrs[key] || (this.keyForAttribute ? this.keyForAttribute(key) : key);
-
-    json[key] = value;
-  },
-
-  /**
-   `serializeBelongsTo` can be used to customize how `DS.belongsTo`
-   properties are serialized.
-
-   Example
-
-   ```javascript
-   App.PostSerializer = DS.JSONSerializer.extend({
-     serializeBelongsTo: function(record, json, relationship) {
-       var key = relationship.key;
-
-       var belongsTo = get(record, key);
-
-       key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
-
-       json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.toJSON();
-     }
-   });
-   ```
-
-   @method serializeBelongsTo
-   @param {DS.Model} record
-   @param {Object} json
-   @param {Object} relationship
-  */
-  serializeBelongsTo: function(record, json, relationship) {
-    var key = relationship.key;
-
-    var belongsTo = get(record, key);
-
-    key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
-
-    if (isNone(belongsTo)) {
-      json[key] = belongsTo;
-    } else {
-      json[key] = get(belongsTo, 'id');
-    }
-
-    if (relationship.options.polymorphic) {
-      this.serializePolymorphicType(record, json, relationship);
-    }
-  },
-
-  /**
-   `serializeHasMany` can be used to customize how `DS.hasMany`
-   properties are serialized.
-
-   Example
-
-   ```javascript
-   App.PostSerializer = DS.JSONSerializer.extend({
-     serializeHasMany: function(record, json, relationship) {
-       var key = relationship.key;
-       if (key === 'comments') {
-         return;
-       } else {
-         this._super.apply(this, arguments);
-       }
-     }
-   });
-   ```
-
-   @method serializeHasMany
-   @param {DS.Model} record
-   @param {Object} json
-   @param {Object} relationship
-  */
-  serializeHasMany: function(record, json, relationship) {
-    var key = relationship.key;
-
-    var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
-
-    if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany') {
-      json[key] = get(record, key).mapBy('id');
-      // TODO support for polymorphic manyToNone and manyToMany relationships
-    }
-  },
-
-  /**
-    You can use this method to customize how polymorphic objects are
-    serialized. Objects are considered to be polymorphic if
-    `{polymorphic: true}` is pass as the second argument to the
-    `DS.belongsTo` function.
-
-    Example
-
-    ```javascript
-    App.CommentSerializer = DS.JSONSerializer.extend({
-      serializePolymorphicType: function(record, json, relationship) {
-        var key = relationship.key,
-            belongsTo = get(record, key);
-        key = this.keyForAttribute ? this.keyForAttribute(key) : key;
-        json[key + "_type"] = belongsTo.constructor.typeKey;
-      }
-    });
-   ```
-
-    @method serializePolymorphicType
-    @param {DS.Model} record
-    @param {Object} json
-    @param {Object} relationship
-  */
-  serializePolymorphicType: Ember.K,
-
-  // EXTRACT
-
-  /**
-    The `extract` method is used to deserialize payload data from the
-    server. By default the `JSONSerializer` does not push the records
-    into the store. However records that subclass `JSONSerializer`
-    such as the `RESTSerializer` may push records into the store as
-    part of the extract call.
-
-    This method delegates to a more specific extract method based on
-    the `requestType`.
-
-    Example
-
-    ```javascript
-    var get = Ember.get;
-    socket.on('message', function(message) {
-      var modelName = message.model;
-      var data = message.data;
-      var type = store.modelFor(modelName);
-      var serializer = store.serializerFor(type.typeKey);
-      var record = serializer.extract(store, type, data, get(data, 'id'), 'single');
-      store.push(modelName, record);
-    });
-    ```
-
-    @method extract
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @param {String or Number} id
-    @param {String} requestType
-    @return {Object} json The deserialized payload
-  */
-  extract: function(store, type, payload, id, requestType) {
-    this.extractMeta(store, type, payload);
-
-    var specificExtract = "extract" + requestType.charAt(0).toUpperCase() + requestType.substr(1);
-    return this[specificExtract](store, type, payload, id, requestType);
-  },
-
-  /**
-    `extractFindAll` is a hook into the extract method used when a
-    call is made to `DS.Store#findAll`. By default this method is an
-    alias for [extractArray](#method_extractArray).
-
-    @method extractFindAll
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Array} array An array of deserialized objects
-  */
-  extractFindAll: aliasMethod('extractArray'),
-  /**
-    `extractFindQuery` is a hook into the extract method used when a
-    call is made to `DS.Store#findQuery`. By default this method is an
-    alias for [extractArray](#method_extractArray).
-
-    @method extractFindQuery
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Array} array An array of deserialized objects
-  */
-  extractFindQuery: aliasMethod('extractArray'),
-  /**
-    `extractFindMany` is a hook into the extract method used when a
-    call is made to `DS.Store#findMany`. By default this method is
-    alias for [extractArray](#method_extractArray).
-
-    @method extractFindMany
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Array} array An array of deserialized objects
-  */
-  extractFindMany: aliasMethod('extractArray'),
-  /**
-    `extractFindHasMany` is a hook into the extract method used when a
-    call is made to `DS.Store#findHasMany`. By default this method is
-    alias for [extractArray](#method_extractArray).
-
-    @method extractFindHasMany
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Array} array An array of deserialized objects
-  */
-  extractFindHasMany: aliasMethod('extractArray'),
-
-  /**
-    `extractCreateRecord` is a hook into the extract method used when a
-    call is made to `DS.Store#createRecord`. By default this method is
-    alias for [extractSave](#method_extractSave).
-
-    @method extractCreateRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractCreateRecord: aliasMethod('extractSave'),
-  /**
-    `extractUpdateRecord` is a hook into the extract method used when
-    a call is made to `DS.Store#update`. By default this method is alias
-    for [extractSave](#method_extractSave).
-
-    @method extractUpdateRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractUpdateRecord: aliasMethod('extractSave'),
-  /**
-    `extractDeleteRecord` is a hook into the extract method used when
-    a call is made to `DS.Store#deleteRecord`. By default this method is
-    alias for [extractSave](#method_extractSave).
-
-    @method extractDeleteRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractDeleteRecord: aliasMethod('extractSave'),
-
-  /**
-    `extractFind` is a hook into the extract method used when
-    a call is made to `DS.Store#find`. By default this method is
-    alias for [extractSingle](#method_extractSingle).
-
-    @method extractFind
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractFind: aliasMethod('extractSingle'),
-  /**
-    `extractFindBelongsTo` is a hook into the extract method used when
-    a call is made to `DS.Store#findBelongsTo`. By default this method is
-    alias for [extractSingle](#method_extractSingle).
-
-    @method extractFindBelongsTo
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractFindBelongsTo: aliasMethod('extractSingle'),
-  /**
-    `extractSave` is a hook into the extract method used when a call
-    is made to `DS.Model#save`. By default this method is alias
-    for [extractSingle](#method_extractSingle).
-
-    @method extractSave
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractSave: aliasMethod('extractSingle'),
-
-  /**
-    `extractSingle` is used to deserialize a single record returned
-    from the adapter.
-
-    Example
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      extractSingle: function(store, type, payload) {
-        payload.comments = payload._embedded.comment;
-        delete payload._embedded;
-
-        return this._super(store, type, payload);
-      },
-    });
-    ```
-
-    @method extractSingle
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Object} json The deserialized payload
-  */
-  extractSingle: function(store, type, payload) {
-    return this.normalize(type, payload);
-  },
-
-  /**
-    `extractArray` is used to deserialize an array of records
-    returned from the adapter.
-
-    Example
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      extractArray: function(store, type, payload) {
-        return payload.map(function(json) {
-          return this.extractSingle(json);
-        }, this);
-      }
-    });
-    ```
-
-    @method extractArray
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @return {Array} array An array of deserialized objects
-  */
-  extractArray: function(store, type, payload) {
-    return this.normalize(type, payload);
-  },
-
-  /**
-    `extractMeta` is used to deserialize any meta information in the
-    adapter payload. By default Ember Data expects meta information to
-    be located on the `meta` property of the payload object.
-
-    Example
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      extractMeta: function(store, type, payload) {
-        if (payload && payload._pagination) {
-          store.metaForType(type, payload._pagination);
-          delete payload._pagination;
-        }
-      }
-    });
-    ```
-
-    @method extractMeta
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-  */
-  extractMeta: function(store, type, payload) {
-    if (payload && payload.meta) {
-      store.metaForType(type, payload.meta);
-      delete payload.meta;
-    }
-  },
-
-  /**
-   `keyForAttribute` can be used to define rules for how to convert an
-   attribute name in your model to a key in your JSON.
-
-   Example
-
-   ```javascript
-   App.ApplicationSerializer = DS.RESTSerializer.extend({
-     keyForAttribute: function(attr) {
-       return Ember.String.underscore(attr).toUpperCase();
-     }
-   });
-   ```
-
-   @method keyForAttribute
-   @param {String} key
-   @return {String} normalized key
-  */
-
-
-  /**
-   `keyForRelationship` can be used to define a custom key when
-   serializing relationship properties. By default `JSONSerializer`
-   does not provide an implementation of this method.
-
-   Example
-
-    ```javascript
-    App.PostSerializer = DS.JSONSerializer.extend({
-      keyForRelationship: function(key, relationship) {
-         return 'rel_' + Ember.String.underscore(key);
-      }
-    });
-    ```
-
-   @method keyForRelationship
-   @param {String} key
-   @param {String} relationship type
-   @return {String} normalized key
-  */
-
-  // HELPERS
-
-  /**
-   @method transformFor
-   @private
-   @param {String} attributeType
-   @param {Boolean} skipAssertion
-   @return {DS.Transform} transform
-  */
-  transformFor: function(attributeType, skipAssertion) {
-    var transform = this.container.lookup('transform:' + attributeType);
-    Ember.assert("Unable to find transform for '" + attributeType + "'", skipAssertion || !!transform);
-    return transform;
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-var get = Ember.get, capitalize = Ember.String.capitalize, underscore = Ember.String.underscore, DS = window.DS ;
-
-/**
-  Extend `Ember.DataAdapter` with ED specific code.
-
-  @class DebugAdapter
-  @namespace DS
-  @extends Ember.DataAdapter
-  @private
-*/
-DS.DebugAdapter = Ember.DataAdapter.extend({
-  getFilters: function() {
-    return [
-      { name: 'isNew', desc: 'New' },
-      { name: 'isModified', desc: 'Modified' },
-      { name: 'isClean', desc: 'Clean' }
-    ];
-  },
-
-  detect: function(klass) {
-    return klass !== DS.Model && DS.Model.detect(klass);
-  },
-
-  columnsForType: function(type) {
-    var columns = [{ name: 'id', desc: 'Id' }], count = 0, self = this;
-    get(type, 'attributes').forEach(function(name, meta) {
-        if (count++ > self.attributeLimit) { return false; }
-        var desc = capitalize(underscore(name).replace('_', ' '));
-        columns.push({ name: name, desc: desc });
-    });
-    return columns;
-  },
-
-  getRecords: function(type) {
-    return this.get('store').all(type);
-  },
-
-  getRecordColumnValues: function(record) {
-    var self = this, count = 0,
-        columnValues = { id: get(record, 'id') };
-
-    record.eachAttribute(function(key) {
-      if (count++ > self.attributeLimit) {
-        return false;
-      }
-      var value = get(record, key);
-      columnValues[key] = value;
-    });
-    return columnValues;
-  },
-
-  getRecordKeywords: function(record) {
-    var keywords = [], keys = Ember.A(['id']);
-    record.eachAttribute(function(key) {
-      keys.push(key);
-    });
-    keys.forEach(function(key) {
-      keywords.push(get(record, key));
-    });
-    return keywords;
-  },
-
-  getRecordFilterValues: function(record) {
-    return {
-      isNew: record.get('isNew'),
-      isModified: record.get('isDirty') && !record.get('isNew'),
-      isClean: !record.get('isDirty')
-    };
-  },
-
-  getRecordColor: function(record) {
-    var color = 'black';
-    if (record.get('isNew')) {
-      color = 'green';
-    } else if (record.get('isDirty')) {
-      color = 'blue';
-    }
-    return color;
-  },
-
-  observeRecord: function(record, recordUpdated) {
-    var releaseMethods = Ember.A(), self = this,
-        keysToObserve = Ember.A(['id', 'isNew', 'isDirty']);
-
-    record.eachAttribute(function(key) {
-      keysToObserve.push(key);
-    });
-
-    keysToObserve.forEach(function(key) {
-      var handler = function() {
-        recordUpdated(self.wrapRecord(record));
-      };
-      Ember.addObserver(record, key, handler);
-      releaseMethods.push(function() {
-        Ember.removeObserver(record, key, handler);
-      });
-    });
-
-    var release = function() {
-      releaseMethods.forEach(function(fn) { fn(); } );
-    };
-
-    return release;
-  }
-
-});
-
-})();
-
-
-
-(function() {
-/**
-  The `DS.Transform` class is used to serialize and deserialize model
-  attributes when they are saved or loaded from an
-  adapter. Subclassing `DS.Transform` is useful for creating custom
-  attributes. All subclasses of `DS.Transform` must implement a
-  `serialize` and a `deserialize` method.
-
-  Example
-
-  ```javascript
-  App.RawTransform = DS.Transform.extend({
-    deserialize: function(serialized) {
-      return serialized;
-    },
-    serialize: function(deserialized) {
-      return deserialized;
-    }
-  });
-  ```
-
-  Usage
-
-  ```javascript
-  var attr = DS.attr;
-  App.Requirement = DS.Model.extend({
-    name: attr('string'),
-    optionsArray: attr('raw')
-  });
-  ```
-
-  @class Transform
-  @namespace DS
- */
-DS.Transform = Ember.Object.extend({
-  /**
-    When given a deserialized value from a record attribute this
-    method must return the serialized value.
-
-    Example
-
-    ```javascript
-    serialize: function(deserialized) {
-      return Ember.isEmpty(deserialized) ? null : Number(deserialized);
-    }
-    ```
-
-    @method serialize
-    @param deserialized The deserialized value
-    @return The serialized value
-  */
-  serialize: Ember.required(),
-
-  /**
-    When given a serialize value from a JSON object this method must
-    return the deserialized value for the record attribute.
-
-    Example
-
-    ```javascript
-    deserialize: function(serialized) {
-      return empty(serialized) ? null : Number(serialized);
-    }
-    ```
-
-    @method deserialize
-    @param serialized The serialized value
-    @return The deserialized value
-  */
-  deserialize: Ember.required()
-
-});
-
-})();
-
-
-
-(function() {
-
-/**
-  The `DS.BooleanTransform` class is used to serialize and deserialize
-  boolean attributes on Ember Data record objects. This transform is
-  used when `boolean` is passed as the type parameter to the
-  [DS.attr](../../data#method_attr) function.
-
-  Usage
-
-  ```javascript
-  var attr = DS.attr;
-  App.User = DS.Model.extend({
-    isAdmin: attr('boolean'),
-    name: attr('string'),
-    email: attr('string')
-  });
-  ```
-
-  @class BooleanTransform
-  @extends DS.Transform
-  @namespace DS
- */
-DS.BooleanTransform = DS.Transform.extend({
-  deserialize: function(serialized) {
-    var type = typeof serialized;
-
-    if (type === "boolean") {
-      return serialized;
-    } else if (type === "string") {
-      return serialized.match(/^true$|^t$|^1$/i) !== null;
-    } else if (type === "number") {
-      return serialized === 1;
-    } else {
-      return false;
-    }
-  },
-
-  serialize: function(deserialized) {
-    return Boolean(deserialized);
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  The `DS.DateTransform` class is used to serialize and deserialize
-  date attributes on Ember Data record objects. This transform is used
-  when `date` is passed as the type parameter to the
-  [DS.attr](../../data#method_attr) function.
-
-  ```javascript
-  var attr = DS.attr;
-  App.Score = DS.Model.extend({
-    value: attr('number'),
-    player: DS.belongsTo('player'),
-    date: attr('date')
-  });
-  ```
-
-  @class DateTransform
-  @extends DS.Transform
-  @namespace DS
- */
-DS.DateTransform = DS.Transform.extend({
-
-  deserialize: function(serialized) {
-    var type = typeof serialized;
-
-    if (type === "string") {
-      return new Date(Ember.Date.parse(serialized));
-    } else if (type === "number") {
-      return new Date(serialized);
-    } else if (serialized === null || serialized === undefined) {
-      // if the value is not present in the data,
-      // return undefined, not null.
-      return serialized;
-    } else {
-      return null;
-    }
-  },
-
-  serialize: function(date) {
-    if (date instanceof Date) {
-      // Serialize it as a number to maintain millisecond precision
-      return Number(date);
-    } else {
-      return null;
-    }
-  }
-
-});
-
-})();
-
-
-
-(function() {
-var empty = Ember.isEmpty;
-/**
-  The `DS.NumberTransform` class is used to serialize and deserialize
-  numeric attributes on Ember Data record objects. This transform is
-  used when `number` is passed as the type parameter to the
-  [DS.attr](../../data#method_attr) function.
-
-  Usage
-
-  ```javascript
-  var attr = DS.attr;
-  App.Score = DS.Model.extend({
-    value: attr('number'),
-    player: DS.belongsTo('player'),
-    date: attr('date')
-  });
-  ```
-
-  @class NumberTransform
-  @extends DS.Transform
-  @namespace DS
- */
-DS.NumberTransform = DS.Transform.extend({
-
-  deserialize: function(serialized) {
-    return empty(serialized) ? null : Number(serialized);
-  },
-
-  serialize: function(deserialized) {
-    return empty(deserialized) ? null : Number(deserialized);
-  }
-});
-
-})();
-
-
-
-(function() {
-var none = Ember.isNone;
-
-/**
-  The `DS.StringTransform` class is used to serialize and deserialize
-  string attributes on Ember Data record objects. This transform is
-  used when `string` is passed as the type parameter to the
-  [DS.attr](../../data#method_attr) function.
-
-  Usage
-
-  ```javascript
-  var attr = DS.attr;
-  App.User = DS.Model.extend({
-    isAdmin: attr('boolean'),
-    name: attr('string'),
-    email: attr('string')
-  });
-  ```
-
-  @class StringTransform
-  @extends DS.Transform
-  @namespace DS
- */
-DS.StringTransform = DS.Transform.extend({
-
-  deserialize: function(serialized) {
-    return none(serialized) ? null : String(serialized);
-  },
-
-  serialize: function(deserialized) {
-    return none(deserialized) ? null : String(deserialized);
-  }
-
-});
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var set = Ember.set;
-
-/*
-  This code registers an injection for Ember.Application.
-
-  If an Ember.js developer defines a subclass of DS.Store on their application,
-  this code will automatically instantiate it and make it available on the
-  router.
-
-  Additionally, after an application's controllers have been injected, they will
-  each have the store made available to them.
-
-  For example, imagine an Ember.js application with the following classes:
-
-  App.Store = DS.Store.extend({
-    adapter: 'custom'
-  });
-
-  App.PostsController = Ember.ArrayController.extend({
-    // ...
-  });
-
-  When the application is initialized, `App.Store` will automatically be
-  instantiated, and the instance of `App.PostsController` will have its `store`
-  property set to that instance.
-
-  Note that this code will only be run if the `ember-application` package is
-  loaded. If Ember Data is being used in an environment other than a
-  typical application (e.g., node.js where only `ember-runtime` is available),
-  this code will be ignored.
-*/
-
-Ember.onLoad('Ember.Application', function(Application) {
-  Application.initializer({
-    name: "store",
-
-    initialize: function(container, application) {
-      application.register('store:main', application.Store || DS.Store);
-
-      // allow older names to be looked up
-
-      var proxy = new DS.ContainerProxy(container);
-      proxy.registerDeprecations([
-        {deprecated: 'serializer:_default',  valid: 'serializer:-default'},
-        {deprecated: 'serializer:_rest',     valid: 'serializer:-rest'},
-        {deprecated: 'adapter:_rest',        valid: 'adapter:-rest'}
-      ]);
-
-      // new go forward paths
-      application.register('serializer:-default', DS.JSONSerializer);
-      application.register('serializer:-rest', DS.RESTSerializer);
-      application.register('adapter:-rest', DS.RESTAdapter);
-
-      // Eagerly generate the store so defaultStore is populated.
-      // TODO: Do this in a finisher hook
-      container.lookup('store:main');
-    }
-  });
-
-  Application.initializer({
-    name: "transforms",
-    before: "store",
-
-    initialize: function(container, application) {
-      application.register('transform:boolean', DS.BooleanTransform);
-      application.register('transform:date', DS.DateTransform);
-      application.register('transform:number', DS.NumberTransform);
-      application.register('transform:string', DS.StringTransform);
-    }
-  });
-
-  Application.initializer({
-    name: "data-adapter",
-    before: "store",
-
-    initialize: function(container, application) {
-      application.register('data-adapter:main', DS.DebugAdapter);
-    }
-  });
-
-  Application.initializer({
-    name: "injectStore",
-    before: "store",
-
-    initialize: function(container, application) {
-      application.inject('controller', 'store', 'store:main');
-      application.inject('route', 'store', 'store:main');
-      application.inject('serializer', 'store', 'store:main');
-      application.inject('data-adapter', 'store', 'store:main');
-    }
-  });
-
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-/**
-  Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
-
-  © 2011 Colin Snover <http://zetafleet.com>
-
-  Released under MIT license.
-
-  @class Date
-  @namespace Ember
-  @static
-*/
-Ember.Date = Ember.Date || {};
-
-var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
-
-/**
-  @method parse
-  @param date
-*/
-Ember.Date.parse = function (date) {
-    var timestamp, struct, minutesOffset = 0;
-
-    // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
-    // before falling back to any implementation-specific date parsing, so that’s what we do, even if native
-    // implementations could be faster
-    //              1 YYYY                2 MM       3 DD           4 HH    5 mm       6 ss        7 msec        8 Z 9 ±    10 tzHH    11 tzmm
-    if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
-        // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
-        for (var i = 0, k; (k = numericKeys[i]); ++i) {
-            struct[k] = +struct[k] || 0;
-        }
-
-        // allow undefined days and months
-        struct[2] = (+struct[2] || 1) - 1;
-        struct[3] = +struct[3] || 1;
-
-        if (struct[8] !== 'Z' && struct[9] !== undefined) {
-            minutesOffset = struct[10] * 60 + struct[11];
-
-            if (struct[9] === '+') {
-                minutesOffset = 0 - minutesOffset;
-            }
-        }
-
-        timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
-    }
-    else {
-        timestamp = origParse ? origParse(date) : NaN;
-    }
-
-    return timestamp;
-};
-
-if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Date) {
-  Date.parse = Ember.Date.parse;
-}
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-
-/**
-  A record array is an array that contains records of a certain type. The record
-  array materializes records as needed when they are retrieved for the first
-  time. You should not create record arrays yourself. Instead, an instance of
-  `DS.RecordArray` or its subclasses will be returned by your application's store
-  in response to queries.
-
-  @class RecordArray
-  @namespace DS
-  @extends Ember.ArrayProxy
-  @uses Ember.Evented
-*/
-
-DS.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, {
-  /**
-    The model type contained by this record array.
-
-    @property type
-    @type DS.Model
-  */
-  type: null,
-
-  /**
-    The array of client ids backing the record array. When a
-    record is requested from the record array, the record
-    for the client id at the same index is materialized, if
-    necessary, by the store.
-
-    @property content
-    @private
-    @type Ember.Array
-  */
-  content: null,
-
-  /**
-    The flag to signal a `RecordArray` is currently loading data.
-
-    Example
-
-    ```javascript
-    var people = store.all(App.Person);
-    people.get('isLoaded'); // true
-    ```
-
-    @property isLoaded
-    @type Boolean
-  */
-  isLoaded: false,
-  /**
-    The flag to signal a `RecordArray` is currently loading data.
-
-    Example
-
-    ```javascript
-    var people = store.all(App.Person);
-    people.get('isUpdating'); // false
-    people.update();
-    people.get('isUpdating'); // true
-    ```
-
-    @property isUpdating
-    @type Boolean
-  */
-  isUpdating: false,
-
-  /**
-    The store that created this record array.
-
-    @property store
-    @private
-    @type DS.Store
-  */
-  store: null,
-
-  /**
-    Retrieves an object from the content by index.
-
-    @method objectAtContent
-    @private
-    @param {Number} index
-    @return {DS.Model} record
-  */
-  objectAtContent: function(index) {
-    var content = get(this, 'content');
-
-    return content.objectAt(index);
-  },
-
-  /**
-    Used to get the latest version of all of the records in this array
-    from the adapter.
-
-    Example
-
-    ```javascript
-    var people = store.all(App.Person);
-    people.get('isUpdating'); // false
-    people.update();
-    people.get('isUpdating'); // true
-    ```
-
-    @method update
-  */
-  update: function() {
-    if (get(this, 'isUpdating')) { return; }
-
-    var store = get(this, 'store'),
-        type = get(this, 'type');
-
-    return store.fetchAll(type, this);
-  },
-
-  /**
-    Adds a record to the `RecordArray`.
-
-    @method addRecord
-    @private
-    @param {DS.Model} record
-  */
-  addRecord: function(record) {
-    get(this, 'content').addObject(record);
-  },
-
-  /**
-    Removes a record to the `RecordArray`.
-
-    @method removeRecord
-    @private
-    @param {DS.Model} record
-  */
-  removeRecord: function(record) {
-    get(this, 'content').removeObject(record);
-  },
-
-  /**
-    Saves all of the records in the `RecordArray`.
-
-    Example
-
-    ```javascript
-    var messages = store.all(App.Message);
-    messages.forEach(function(message) {
-      message.set('hasBeenSeen', true);
-    });
-    messages.save();
-    ```
-
-    @method save
-    @return {DS.PromiseArray} promise
-  */
-  save: function() {
-    var promiseLabel = "DS: RecordArray#save " + get(this, 'type');
-    var promise = Ember.RSVP.all(this.invoke("save"), promiseLabel).then(function(array) {
-      return Ember.A(array);
-    }, null, "DS: RecordArray#save apply Ember.NativeArray");
-
-    return DS.PromiseArray.create({ promise: promise });
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get;
-
-/**
-  Represents a list of records whose membership is determined by the
-  store. As records are created, loaded, or modified, the store
-  evaluates them to determine if they should be part of the record
-  array.
-
-  @class FilteredRecordArray
-  @namespace DS
-  @extends DS.RecordArray
-*/
-DS.FilteredRecordArray = DS.RecordArray.extend({
-  /**
-    The filterFunction is a function used to test records from the store to
-    determine if they should be part of the record array.
-
-    Example
-
-    ```javascript
-    var allPeople = store.all('person');
-    allPeople.mapBy('name'); // ["Tom Dale", "Yehuda Katz", "Trek Glowacki"]
-
-    var people = store.filter('person', function(person) {
-      if (person.get('name').match(/Katz$/)) { return true; }
-    });
-    people.mapBy('name'); // ["Yehuda Katz"]
-
-    var notKatzFilter = function(person) {
-      return !person.get('name').match(/Katz$/);
-    };
-    people.set('filterFunction', notKatzFilter);
-    people.mapBy('name'); // ["Tom Dale", "Trek Glowacki"]
-    ```
-
-    @method filterFunction
-    @param {DS.Model} record
-    @return {Boolean} `true` if the record should be in the array
-  */
-  filterFunction: null,
-  isLoaded: true,
-
-  replace: function() {
-    var type = get(this, 'type').toString();
-    throw new Error("The result of a client-side filter (on " + type + ") is immutable.");
-  },
-
-  /**
-    @method updateFilter
-    @private
-  */
-  updateFilter: Ember.observer(function() {
-    var manager = get(this, 'manager');
-    manager.updateFilter(this, get(this, 'type'), get(this, 'filterFunction'));
-  }, 'filterFunction')
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-
-/**
-  Represents an ordered list of records whose order and membership is
-  determined by the adapter. For example, a query sent to the adapter
-  may trigger a search on the server, whose results would be loaded
-  into an instance of the `AdapterPopulatedRecordArray`.
-
-  @class AdapterPopulatedRecordArray
-  @namespace DS
-  @extends DS.RecordArray
-*/
-DS.AdapterPopulatedRecordArray = DS.RecordArray.extend({
-  query: null,
-
-  replace: function() {
-    var type = get(this, 'type').toString();
-    throw new Error("The result of a server query (on " + type + ") is immutable.");
-  },
-
-  /**
-    @method load
-    @private
-    @param {Array} data
-  */
-  load: function(data) {
-    var store = get(this, 'store'),
-        type = get(this, 'type'),
-        records = store.pushMany(type, data),
-        meta = store.metadataFor(type);
-
-    this.setProperties({
-      content: Ember.A(records),
-      isLoaded: true,
-      meta: meta
-    });
-
-    // TODO: does triggering didLoad event should be the last action of the runLoop?
-    Ember.run.once(this, 'trigger', 'didLoad');
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var map = Ember.EnumerableUtils.map;
-
-/**
-  A `ManyArray` is a `RecordArray` that represents the contents of a has-many
-  relationship.
-
-  The `ManyArray` is instantiated lazily the first time the relationship is
-  requested.
-
-  ### Inverses
-
-  Often, the relationships in Ember Data applications will have
-  an inverse. For example, imagine the following models are
-  defined:
-
-  ```javascript
-  App.Post = DS.Model.extend({
-    comments: DS.hasMany('comment')
-  });
-
-  App.Comment = DS.Model.extend({
-    post: DS.belongsTo('post')
-  });
-  ```
-
-  If you created a new instance of `App.Post` and added
-  a `App.Comment` record to its `comments` has-many
-  relationship, you would expect the comment's `post`
-  property to be set to the post that contained
-  the has-many.
-
-  We call the record to which a relationship belongs the
-  relationship's _owner_.
-
-  @class ManyArray
-  @namespace DS
-  @extends DS.RecordArray
-*/
-DS.ManyArray = DS.RecordArray.extend({
-  init: function() {
-    this._super.apply(this, arguments);
-    this._changesToSync = Ember.OrderedSet.create();
-  },
-
-  /**
-    The property name of the relationship
-
-    @property {String} name
-    @private
-  */
-  name: null,
-
-  /**
-    The record to which this relationship belongs.
-
-    @property {DS.Model} owner
-    @private
-  */
-  owner: null,
-
-  /**
-    `true` if the relationship is polymorphic, `false` otherwise.
-
-    @property {Boolean} isPolymorphic
-    @private
-  */
-  isPolymorphic: false,
-
-  // LOADING STATE
-
-  isLoaded: false,
-
-  /**
-    Used for async `hasMany` arrays
-    to keep track of when they will resolve.
-
-    @property {Ember.RSVP.Promise} promise
-    @private
-  */
-  promise: null,
-
-  /**
-    @method loadingRecordsCount
-    @param {Number} count
-    @private
-  */
-  loadingRecordsCount: function(count) {
-    this.loadingRecordsCount = count;
-  },
-
-  /**
-    @method loadedRecord
-    @private
-  */
-  loadedRecord: function() {
-    this.loadingRecordsCount--;
-    if (this.loadingRecordsCount === 0) {
-      set(this, 'isLoaded', true);
-      this.trigger('didLoad');
-    }
-  },
-
-  /**
-    @method fetch
-    @private
-  */
-  fetch: function() {
-    var records = get(this, 'content'),
-        store = get(this, 'store'),
-        owner = get(this, 'owner'),
-        resolver = Ember.RSVP.defer("DS: ManyArray#fetch " + get(this, 'type'));
-
-    var unloadedRecords = records.filterProperty('isEmpty', true);
-    store.fetchMany(unloadedRecords, owner, resolver);
-  },
-
-  // Overrides Ember.Array's replace method to implement
-  replaceContent: function(index, removed, added) {
-    // Map the array of record objects into an array of  client ids.
-    added = map(added, function(record) {
-      Ember.assert("You cannot add '" + record.constructor.typeKey + "' records to this relationship (only '" + this.type.typeKey + "' allowed)", !this.type || record instanceof this.type);
-      return record;
-    }, this);
-
-    this._super(index, removed, added);
-  },
-
-  arrangedContentDidChange: function() {
-    Ember.run.once(this, 'fetch');
-  },
-
-  arrayContentWillChange: function(index, removed, added) {
-    var owner = get(this, 'owner'),
-        name = get(this, 'name');
-
-    if (!owner._suspendedRelationships) {
-      // This code is the first half of code that continues inside
-      // of arrayContentDidChange. It gets or creates a change from
-      // the child object, adds the current owner as the old
-      // parent if this is the first time the object was removed
-      // from a ManyArray, and sets `newParent` to null.
-      //
-      // Later, if the object is added to another ManyArray,
-      // the `arrayContentDidChange` will set `newParent` on
-      // the change.
-      for (var i=index; i<index+removed; i++) {
-        var record = get(this, 'content').objectAt(i);
-
-        var change = DS.RelationshipChange.createChange(owner, record, get(this, 'store'), {
-          parentType: owner.constructor,
-          changeType: "remove",
-          kind: "hasMany",
-          key: name
-        });
-
-        this._changesToSync.add(change);
-      }
-    }
-
-    return this._super.apply(this, arguments);
-  },
-
-  arrayContentDidChange: function(index, removed, added) {
-    this._super.apply(this, arguments);
-
-    var owner = get(this, 'owner'),
-        name = get(this, 'name'),
-        store = get(this, 'store');
-
-    if (!owner._suspendedRelationships) {
-      // This code is the second half of code that started in
-      // `arrayContentWillChange`. It gets or creates a change
-      // from the child object, and adds the current owner as
-      // the new parent.
-      for (var i=index; i<index+added; i++) {
-        var record = get(this, 'content').objectAt(i);
-
-        var change = DS.RelationshipChange.createChange(owner, record, store, {
-          parentType: owner.constructor,
-          changeType: "add",
-          kind:"hasMany",
-          key: name
-        });
-        change.hasManyName = name;
-
-        this._changesToSync.add(change);
-      }
-
-      // We wait until the array has finished being
-      // mutated before syncing the OneToManyChanges created
-      // in arrayContentWillChange, so that the array
-      // membership test in the sync() logic operates
-      // on the final results.
-      this._changesToSync.forEach(function(change) {
-        change.sync();
-      });
-
-      this._changesToSync.clear();
-    }
-  },
-
-  /**
-    Create a child record within the owner
-
-    @method createRecord
-    @private
-    @param {Object} hash
-    @return {DS.Model} record
-  */
-  createRecord: function(hash) {
-    var owner = get(this, 'owner'),
-        store = get(owner, 'store'),
-        type = get(this, 'type'),
-        record;
-
-    Ember.assert("You cannot add '" + type.typeKey + "' records to this polymorphic relationship.", !get(this, 'isPolymorphic'));
-
-    record = store.createRecord.call(store, type, hash);
-    this.pushObject(record);
-
-    return record;
-  }
-
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-/*globals Ember*/
-/*jshint eqnull:true*/
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var once = Ember.run.once;
-var isNone = Ember.isNone;
-var forEach = Ember.EnumerableUtils.forEach;
-var indexOf = Ember.EnumerableUtils.indexOf;
-var map = Ember.EnumerableUtils.map;
-var resolve = Ember.RSVP.resolve;
-var copy = Ember.copy;
-
-// Implementors Note:
-//
-//   The variables in this file are consistently named according to the following
-//   scheme:
-//
-//   * +id+ means an identifier managed by an external source, provided inside
-//     the data provided by that source. These are always coerced to be strings
-//     before being used internally.
-//   * +clientId+ means a transient numerical identifier generated at runtime by
-//     the data store. It is important primarily because newly created objects may
-//     not yet have an externally generated id.
-//   * +reference+ means a record reference object, which holds metadata about a
-//     record, even if it has not yet been fully materialized.
-//   * +type+ means a subclass of DS.Model.
-
-// Used by the store to normalize IDs entering the store.  Despite the fact
-// that developers may provide IDs as numbers (e.g., `store.find(Person, 1)`),
-// it is important that internally we use strings, since IDs may be serialized
-// and lose type information.  For example, Ember's router may put a record's
-// ID into the URL, and if we later try to deserialize that URL and find the
-// corresponding record, we will not know if it is a string or a number.
-var coerceId = function(id) {
-  return id == null ? null : id+'';
-};
-
-/**
-  The store contains all of the data for records loaded from the server.
-  It is also responsible for creating instances of `DS.Model` that wrap
-  the individual data for a record, so that they can be bound to in your
-  Handlebars templates.
-
-  Define your application's store like this:
-
-  ```javascript
-  MyApp.Store = DS.Store.extend();
-  ```
-
-  Most Ember.js applications will only have a single `DS.Store` that is
-  automatically created by their `Ember.Application`.
-
-  You can retrieve models from the store in several ways. To retrieve a record
-  for a specific id, use `DS.Store`'s `find()` method:
-
-  ```javascript
-  var person = store.find('person', 123);
-  ```
-
-  If your application has multiple `DS.Store` instances (an unusual case), you can
-  specify which store should be used:
-
-  ```javascript
-  var person = store.find(App.Person, 123);
-  ```
-
-  By default, the store will talk to your backend using a standard
-  REST mechanism. You can customize how the store talks to your
-  backend by specifying a custom adapter:
-
-  ```javascript
-   MyApp.store = DS.Store.create({
-     adapter: 'MyApp.CustomAdapter'
-   });
-   ```
-
-  You can learn more about writing a custom adapter by reading the `DS.Adapter`
-  documentation.
-
-  @class Store
-  @namespace DS
-  @extends Ember.Object
-*/
-DS.Store = Ember.Object.extend({
-
-  /**
-    @method init
-    @private
-  */
-  init: function() {
-    // internal bookkeeping; not observable
-    this.typeMaps = {};
-    this.recordArrayManager = DS.RecordArrayManager.create({
-      store: this
-    });
-    this._relationshipChanges = {};
-    this._pendingSave = [];
-  },
-
-  /**
-    The adapter to use to communicate to a backend server or other persistence layer.
-
-    This can be specified as an instance, class, or string.
-
-    If you want to specify `App.CustomAdapter` as a string, do:
-
-    ```js
-    adapter: 'custom'
-    ```
-
-    @property adapter
-    @default DS.RESTAdapter
-    @type {DS.Adapter|String}
-  */
-  adapter: '-rest',
-
-  /**
-    Returns a JSON representation of the record using a custom
-    type-specific serializer, if one exists.
-
-    The available options are:
-
-    * `includeId`: `true` if the record's ID should be included in
-      the JSON representation
-
-    @method serialize
-    @private
-    @param {DS.Model} record the record to serialize
-    @param {Object} options an options hash
-  */
-  serialize: function(record, options) {
-    return this.serializerFor(record.constructor.typeKey).serialize(record, options);
-  },
-
-  /**
-    This property returns the adapter, after resolving a possible
-    string key.
-
-    If the supplied `adapter` was a class, or a String property
-    path resolved to a class, this property will instantiate the
-    class.
-
-    This property is cacheable, so the same instance of a specified
-    adapter class should be used for the lifetime of the store.
-
-    @property defaultAdapter
-    @private
-    @returns DS.Adapter
-  */
-  defaultAdapter: Ember.computed('adapter', function() {
-    var adapter = get(this, 'adapter');
-
-    Ember.assert('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name or a factory', !(adapter instanceof DS.Adapter));
-
-    if (typeof adapter === 'string') {
-      adapter = this.container.lookup('adapter:' + adapter) || this.container.lookup('adapter:application') || this.container.lookup('adapter:-rest');
-    }
-
-    if (DS.Adapter.detect(adapter)) {
-      adapter = adapter.create({ container: this.container });
-    }
-
-    return adapter;
-  }),
-
-  // .....................
-  // . CREATE NEW RECORD .
-  // .....................
-
-  /**
-    Create a new record in the current store. The properties passed
-    to this method are set on the newly created record.
-
-    To create a new instance of `App.Post`:
-
-    ```js
-    store.createRecord('post', {
-      title: "Rails is omakase"
-    });
-    ```
-
-    @method createRecord
-    @param {String} type
-    @param {Object} properties a hash of properties to set on the
-      newly created record.
-    @returns {DS.Model} record
-  */
-  createRecord: function(type, properties) {
-    type = this.modelFor(type);
-
-    properties = copy(properties) || {};
-
-    // If the passed properties do not include a primary key,
-    // give the adapter an opportunity to generate one. Typically,
-    // client-side ID generators will use something like uuid.js
-    // to avoid conflicts.
-
-    if (isNone(properties.id)) {
-      properties.id = this._generateId(type);
-    }
-
-    // Coerce ID to a string
-    properties.id = coerceId(properties.id);
-
-    var record = this.buildRecord(type, properties.id);
-
-    // Move the record out of its initial `empty` state into
-    // the `loaded` state.
-    record.loadedData();
-
-    // Set the properties specified on the record.
-    record.setProperties(properties);
-
-    return record;
-  },
-
-  /**
-    If possible, this method asks the adapter to generate an ID for
-    a newly created record.
-
-    @method _generateId
-    @private
-    @param {String} type
-    @returns {String} if the adapter can generate one, an ID
-  */
-  _generateId: function(type) {
-    var adapter = this.adapterFor(type);
-
-    if (adapter && adapter.generateIdForRecord) {
-      return adapter.generateIdForRecord(this);
-    }
-
-    return null;
-  },
-
-  // .................
-  // . DELETE RECORD .
-  // .................
-
-  /**
-    For symmetry, a record can be deleted via the store.
-
-    Example
-
-    ```javascript
-    var post = store.createRecord('post', {
-      title: "Rails is omakase"
-    });
-
-    store.deleteRecord(post);
-    ```
-
-    @method deleteRecord
-    @param {DS.Model} record
-  */
-  deleteRecord: function(record) {
-    record.deleteRecord();
-  },
-
-  /**
-    For symmetry, a record can be unloaded via the store. Only
-    non-dirty records can be unloaded.
-
-    Example
-
-    ```javascript
-    store.find('post', 1).then(function(post) {
-      store.unloadRecord(post);
-    });
-    ```
-
-    @method unloadRecord
-    @param {DS.Model} record
-  */
-  unloadRecord: function(record) {
-    record.unloadRecord();
-  },
-
-  // ................
-  // . FIND RECORDS .
-  // ................
-
-  /**
-    This is the main entry point into finding records. The first parameter to
-    this method is the model's name as a string.
-
-    ---
-
-    To find a record by ID, pass the `id` as the second parameter:
-
-    ```javascript
-    store.find('person', 1);
-    ```
-
-    The `find` method will always return a **promise** that will be resolved
-    with the record. If the record was already in the store, the promise will
-    be resolved immediately. Otherwise, the store will ask the adapter's `find`
-    method to find the necessary data.
-
-    The `find` method will always resolve its promise with the same object for
-    a given type and `id`.
-
-    ---
-
-    To find all records for a type, call `find` with no additional parameters:
-
-    ```javascript
-    store.find('person');
-    ```
-
-    This will ask the adapter's `findAll` method to find the records for the
-    given type, and return a promise that will be resolved once the server
-    returns the values.
-
-    ---
-
-    To find a record by a query, call `find` with a hash as the second
-    parameter:
-
-    ```javascript
-    store.find(App.Person, { page: 1 });
-    ```
-
-    This will ask the adapter's `findQuery` method to find the records for
-    the query, and return a promise that will be resolved once the server
-    responds.
-
-    @method find
-    @param {String or subclass of DS.Model} type
-    @param {Object|String|Integer|null} id
-    @return {Promise} promise
-  */
-  find: function(type, id) {
-    if (id === undefined) {
-      return this.findAll(type);
-    }
-
-    // We are passed a query instead of an id.
-    if (Ember.typeOf(id) === 'object') {
-      return this.findQuery(type, id);
-    }
-
-    return this.findById(type, coerceId(id));
-  },
-
-  /**
-    This method returns a record for a given type and id combination.
-
-    @method findById
-    @private
-    @param {String or subclass of DS.Model} type
-    @param {String|Integer} id
-    @return {Promise} promise
-  */
-  findById: function(type, id) {
-    type = this.modelFor(type);
-
-    var record = this.recordForId(type, id);
-
-    var promise = this.fetchRecord(record) || resolve(record, "DS: Store#findById " + type + " with id: " + id);
-    return promiseObject(promise);
-  },
-
-  /**
-    This method makes a series of requests to the adapter's `find` method
-    and returns a promise that resolves once they are all loaded.
-
-    @private
-    @method findByIds
-    @param {String} type
-    @param {Array} ids
-    @returns {Promise} promise
-  */
-  findByIds: function(type, ids) {
-    var store = this;
-    var promiseLabel = "DS: Store#findByIds " + type;
-    return promiseArray(Ember.RSVP.all(map(ids, function(id) {
-      return store.findById(type, id);
-    })).then(Ember.A, null, "DS: Store#findByIds of " + type + " complete"));
-  },
-
-  /**
-    This method is called by `findById` if it discovers that a particular
-    type/id pair hasn't been loaded yet to kick off a request to the
-    adapter.
-
-    @method fetchRecord
-    @private
-    @param {DS.Model} record
-    @returns {Promise} promise
-  */
-  fetchRecord: function(record) {
-    if (isNone(record)) { return null; }
-    if (record._loadingPromise) { return record._loadingPromise; }
-    if (!get(record, 'isEmpty')) { return null; }
-
-    var type = record.constructor,
-        id = get(record, 'id');
-
-    var adapter = this.adapterFor(type);
-
-    Ember.assert("You tried to find a record but you have no adapter (for " + type + ")", adapter);
-    Ember.assert("You tried to find a record but your adapter (for " + type + ") does not implement 'find'", adapter.find);
-
-    var promise = _find(adapter, this, type, id);
-    record.loadingData(promise);
-    return promise;
-  },
-
-  /**
-    Get a record by a given type and ID without triggering a fetch.
-
-    This method will synchronously return the record if it's available.
-    Otherwise, it will return null.
-
-    ```js
-    var post = store.getById('post', 1);
-    ```
-
-    @method getById
-    @param {String or subclass of DS.Model} type
-    @param {String|Integer} id
-    @param {DS.Model} record
-  */
-  getById: function(type, id) {
-    if (this.hasRecordForId(type, id)) {
-      return this.recordForId(type, id);
-    } else {
-      return null;
-    }
-  },
-
-  /**
-    This method is called by the record's `reload` method.
-
-    This method calls the adapter's `find` method, which returns a promise. When
-    **that** promise resolves, `reloadRecord` will resolve the promise returned
-    by the record's `reload`.
-
-    @method reloadRecord
-    @private
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  reloadRecord: function(record) {
-    var type = record.constructor,
-        adapter = this.adapterFor(type),
-        id = get(record, 'id');
-
-    Ember.assert("You cannot reload a record without an ID", id);
-    Ember.assert("You tried to reload a record but you have no adapter (for " + type + ")", adapter);
-    Ember.assert("You tried to reload a record but your adapter does not implement `find`", adapter.find);
-
-    return _find(adapter, this, type, id);
-  },
-
-  /**
-    This method takes a list of records, groups the records by type,
-    converts the records into IDs, and then invokes the adapter's `findMany`
-    method.
-
-    The records are grouped by type to invoke `findMany` on adapters
-    for each unique type in records.
-
-    It is used both by a brand new relationship (via the `findMany`
-    method) or when the data underlying an existing relationship
-    changes.
-
-    @method fetchMany
-    @private
-    @param {Array} records
-    @param {DS.Model} owner
-    @param {Resolver} resolver
-  */
-  fetchMany: function(records, owner, resolver) {
-    if (!records.length) { return; }
-
-    // Group By Type
-    var recordsByTypeMap = Ember.MapWithDefault.create({
-      defaultValue: function() { return Ember.A(); }
-    });
-
-    forEach(records, function(record) {
-      recordsByTypeMap.get(record.constructor).push(record);
-    });
-
-    forEach(recordsByTypeMap, function(type, records) {
-      var ids = records.mapProperty('id'),
-          adapter = this.adapterFor(type);
-
-      Ember.assert("You tried to load many records but you have no adapter (for " + type + ")", adapter);
-      Ember.assert("You tried to load many records but your adapter does not implement `findMany`", adapter.findMany);
-
-      resolver.resolve(_findMany(adapter, this, type, ids, owner));
-    }, this);
-  },
-
-  /**
-    Returns true if a record for a given type and ID is already loaded.
-
-    @method hasRecordForId
-    @param {String or subclass of DS.Model} type
-    @param {String|Integer} id
-    @returns {Boolean}
-  */
-  hasRecordForId: function(type, id) {
-    id = coerceId(id);
-    type = this.modelFor(type);
-    return !!this.typeMapFor(type).idToRecord[id];
-  },
-
-  /**
-    Returns id record for a given type and ID. If one isn't already loaded,
-    it builds a new record and leaves it in the `empty` state.
-
-    @method recordForId
-    @private
-    @param {String or subclass of DS.Model} type
-    @param {String|Integer} id
-    @returns {DS.Model} record
-  */
-  recordForId: function(type, id) {
-    type = this.modelFor(type);
-
-    id = coerceId(id);
-
-    var record = this.typeMapFor(type).idToRecord[id];
-
-    if (!record) {
-      record = this.buildRecord(type, id);
-    }
-
-    return record;
-  },
-
-  /**
-    @method findMany
-    @private
-    @param {DS.Model} owner
-    @param {Array} records
-    @param {String or subclass of DS.Model} type
-    @param {Resolver} resolver
-    @return {DS.ManyArray} records
-  */
-  findMany: function(owner, records, type, resolver) {
-    type = this.modelFor(type);
-
-    records = Ember.A(records);
-
-    var unloadedRecords = records.filterProperty('isEmpty', true),
-        manyArray = this.recordArrayManager.createManyArray(type, records);
-
-    forEach(unloadedRecords, function(record) {
-      record.loadingData();
-    });
-
-    manyArray.loadingRecordsCount = unloadedRecords.length;
-
-    if (unloadedRecords.length) {
-      forEach(unloadedRecords, function(record) {
-        this.recordArrayManager.registerWaitingRecordArray(record, manyArray);
-      }, this);
-
-      this.fetchMany(unloadedRecords, owner, resolver);
-    } else {
-      if (resolver) { resolver.resolve(); }
-      manyArray.set('isLoaded', true);
-      Ember.run.once(manyArray, 'trigger', 'didLoad');
-    }
-
-    return manyArray;
-  },
-
-  /**
-    If a relationship was originally populated by the adapter as a link
-    (as opposed to a list of IDs), this method is called when the
-    relationship is fetched.
-
-    The link (which is usually a URL) is passed through unchanged, so the
-    adapter can make whatever request it wants.
-
-    The usual use-case is for the server to register a URL as a link, and
-    then use that URL in the future to make a request for the relationship.
-
-    @method findHasMany
-    @private
-    @param {DS.Model} owner
-    @param {any} link
-    @param {String or subclass of DS.Model} type
-    @param {Resolver} resolver
-    @return {DS.ManyArray}
-  */
-  findHasMany: function(owner, link, relationship, resolver) {
-    var adapter = this.adapterFor(owner.constructor);
-
-    Ember.assert("You tried to load a hasMany relationship but you have no adapter (for " + owner.constructor + ")", adapter);
-    Ember.assert("You tried to load a hasMany relationship from a specified `link` in the original payload but your adapter does not implement `findHasMany`", adapter.findHasMany);
-
-    var records = this.recordArrayManager.createManyArray(relationship.type, Ember.A([]));
-    resolver.resolve(_findHasMany(adapter, this, owner, link, relationship));
-    return records;
-  },
-
-  /**
-    @method findBelongsTo
-    @private
-    @param {DS.Model} owner
-    @param {any} link
-    @param {Relationship} relationship
-    @param {Resolver} resolver
-  */
-  findBelongsTo: function(owner, link, relationship, resolver) {
-    var adapter = this.adapterFor(owner.constructor);
-
-    Ember.assert("You tried to load a belongsTo relationship but you have no adapter (for " + owner.constructor + ")", adapter);
-    Ember.assert("You tried to load a belongsTo relationship from a specified `link` in the original payload but your adapter does not implement `findBelongsTo`", adapter.findBelongsTo);
-
-    resolver.resolve(_findBelongsTo(adapter, this, owner, link, relationship));
-  },
-
-  /**
-    This method delegates a query to the adapter. This is the one place where
-    adapter-level semantics are exposed to the application.
-
-    Exposing queries this way seems preferable to creating an abstract query
-    language for all server-side queries, and then require all adapters to
-    implement them.
-
-    This method returns a promise, which is resolved with a `RecordArray`
-    once the server returns.
-
-    @method findQuery
-    @private
-    @param {String or subclass of DS.Model} type
-    @param {any} query an opaque query to be used by the adapter
-    @return {Promise} promise
-  */
-  findQuery: function(type, query) {
-    type = this.modelFor(type);
-
-    var array = this.recordArrayManager
-      .createAdapterPopulatedRecordArray(type, query);
-
-    var adapter = this.adapterFor(type),
-        promiseLabel = "DS: Store#findQuery " + type,
-        resolver = Ember.RSVP.defer(promiseLabel);
-
-    Ember.assert("You tried to load a query but you have no adapter (for " + type + ")", adapter);
-    Ember.assert("You tried to load a query but your adapter does not implement `findQuery`", adapter.findQuery);
-
-    resolver.resolve(_findQuery(adapter, this, type, query, array));
-
-    return promiseArray(resolver.promise);
-  },
-
-  /**
-    This method returns an array of all records adapter can find.
-    It triggers the adapter's `findAll` method to give it an opportunity to populate
-    the array with records of that type.
-
-    @method findAll
-    @private
-    @param {String or subclass of DS.Model} type
-    @return {DS.AdapterPopulatedRecordArray}
-  */
-  findAll: function(type) {
-    type = this.modelFor(type);
-
-    return this.fetchAll(type, this.all(type));
-  },
-
-  /**
-    @method fetchAll
-    @private
-    @param {DS.Model} type
-    @param {DS.RecordArray} array
-    @returns {Promise} promise
-  */
-  fetchAll: function(type, array) {
-    var adapter = this.adapterFor(type),
-        sinceToken = this.typeMapFor(type).metadata.since;
-
-    set(array, 'isUpdating', true);
-
-    Ember.assert("You tried to load all records but you have no adapter (for " + type + ")", adapter);
-    Ember.assert("You tried to load all records but your adapter does not implement `findAll`", adapter.findAll);
-
-    return promiseArray(_findAll(adapter, this, type, sinceToken));
-  },
-
-  /**
-    @method didUpdateAll
-    @param {DS.Model} type
-  */
-  didUpdateAll: function(type) {
-    var findAllCache = this.typeMapFor(type).findAllCache;
-    set(findAllCache, 'isUpdating', false);
-  },
-
-  /**
-    This method returns a filtered array that contains all of the known records
-    for a given type.
-
-    Note that because it's just a filter, it will have any locally
-    created records of the type.
-
-    Also note that multiple calls to `all` for a given type will always
-    return the same RecordArray.
-
-    Example
-
-    ```javascript
-    var local_posts = store.all(App.Post);
-    ```
-
-    @method all
-    @param {String or subclass of DS.Model} type
-    @return {DS.RecordArray}
-  */
-  all: function(type) {
-    type = this.modelFor(type);
-
-    var typeMap = this.typeMapFor(type),
-        findAllCache = typeMap.findAllCache;
-
-    if (findAllCache) { return findAllCache; }
-
-    var array = this.recordArrayManager.createRecordArray(type);
-
-    typeMap.findAllCache = array;
-    return array;
-  },
-
-
-  /**
-    This method unloads all of the known records for a given type.
-
-    ```javascript
-    store.unloadAll(App.Post);
-    ```
-
-    @method unloadAll
-    @param {String or subclass of DS.Model} type
-  */
-  unloadAll: function(type) {
-    type = this.modelFor(type);
-
-    var typeMap = this.typeMapFor(type),
-        records = typeMap.records.splice(0), record;
-
-    while(record = records.pop()) {
-      record.unloadRecord();
-    }
-
-    typeMap.findAllCache = null;
-  },
-
-  /**
-    Takes a type and filter function, and returns a live RecordArray that
-    remains up to date as new records are loaded into the store or created
-    locally.
-
-    The callback function takes a materialized record, and returns true
-    if the record should be included in the filter and false if it should
-    not.
-
-    The filter function is called once on all records for the type when
-    it is created, and then once on each newly loaded or created record.
-
-    If any of a record's properties change, or if it changes state, the
-    filter function will be invoked again to determine whether it should
-    still be in the array.
-
-    Optionally you can pass a query which will be triggered at first. The
-    results returned by the server could then appear in the filter if they
-    match the filter function.
-
-    Example
-
-    ```javascript
-    store.filter(App.Post, {unread: true}, function(post) {
-      return post.get('unread');
-    }).then(function(unreadPosts) {
-      unreadPosts.get('length'); // 5
-      var unreadPost = unreadPosts.objectAt(0);
-      unreadPost.set('unread', false);
-      unreadPosts.get('length'); // 4
-    });
-    ```
-
-    @method filter
-    @param {String or subclass of DS.Model} type
-    @param {Object} query optional query
-    @param {Function} filter
-    @return {DS.PromiseArray}
-  */
-  filter: function(type, query, filter) {
-    var promise;
-
-    // allow an optional server query
-    if (arguments.length === 3) {
-      promise = this.findQuery(type, query);
-    } else if (arguments.length === 2) {
-      filter = query;
-    }
-
-    type = this.modelFor(type);
-
-    var array = this.recordArrayManager
-      .createFilteredRecordArray(type, filter);
-    promise = promise || resolve(array);
-
-    return promiseArray(promise.then(function() {
-      return array;
-    }, null, "DS: Store#filter of " + type));
-  },
-
-  /**
-    This method returns if a certain record is already loaded
-    in the store. Use this function to know beforehand if a find()
-    will result in a request or that it will be a cache hit.
-
-     Example
-
-    ```javascript
-    store.recordIsLoaded(App.Post, 1); // false
-    store.find(App.Post, 1).then(function() {
-      store.recordIsLoaded(App.Post, 1); // true
-    });
-    ```
-
-    @method recordIsLoaded
-    @param {String or subclass of DS.Model} type
-    @param {string} id
-    @return {boolean}
-  */
-  recordIsLoaded: function(type, id) {
-    if (!this.hasRecordForId(type, id)) { return false; }
-    return !get(this.recordForId(type, id), 'isEmpty');
-  },
-
-  /**
-    This method returns the metadata for a specific type.
-
-    @method metadataFor
-    @param {String or subclass of DS.Model} type
-    @return {object}
-  */
-  metadataFor: function(type) {
-    type = this.modelFor(type);
-    return this.typeMapFor(type).metadata;
-  },
-
-  // ............
-  // . UPDATING .
-  // ............
-
-  /**
-    If the adapter updates attributes or acknowledges creation
-    or deletion, the record will notify the store to update its
-    membership in any filters.
-    To avoid thrashing, this method is invoked only once per
-
-    run loop per record.
-
-    @method dataWasUpdated
-    @private
-    @param {Class} type
-    @param {DS.Model} record
-  */
-  dataWasUpdated: function(type, record) {
-    this.recordArrayManager.recordDidChange(record);
-  },
-
-  // ..............
-  // . PERSISTING .
-  // ..............
-
-  /**
-    This method is called by `record.save`, and gets passed a
-    resolver for the promise that `record.save` returns.
-
-    It schedules saving to happen at the end of the run loop.
-
-    @method scheduleSave
-    @private
-    @param {DS.Model} record
-    @param {Resolver} resolver
-  */
-  scheduleSave: function(record, resolver) {
-    record.adapterWillCommit();
-    this._pendingSave.push([record, resolver]);
-    once(this, 'flushPendingSave');
-  },
-
-  /**
-    This method is called at the end of the run loop, and
-    flushes any records passed into `scheduleSave`
-
-    @method flushPendingSave
-    @private
-  */
-  flushPendingSave: function() {
-    var pending = this._pendingSave.slice();
-    this._pendingSave = [];
-
-    forEach(pending, function(tuple) {
-      var record = tuple[0], resolver = tuple[1],
-          adapter = this.adapterFor(record.constructor),
-          operation;
-
-      if (get(record, 'isNew')) {
-        operation = 'createRecord';
-      } else if (get(record, 'isDeleted')) {
-        operation = 'deleteRecord';
-      } else {
-        operation = 'updateRecord';
-      }
-
-      resolver.resolve(_commit(adapter, this, operation, record));
-    }, this);
-  },
-
-  /**
-    This method is called once the promise returned by an
-    adapter's `createRecord`, `updateRecord` or `deleteRecord`
-    is resolved.
-
-    If the data provides a server-generated ID, it will
-    update the record and the store's indexes.
-
-    @method didSaveRecord
-    @private
-    @param {DS.Model} record the in-flight record
-    @param {Object} data optional data (see above)
-  */
-  didSaveRecord: function(record, data) {
-    if (data) {
-      // normalize relationship IDs into records
-      data = normalizeRelationships(this, record.constructor, data, record);
-
-      this.updateId(record, data);
-    }
-
-    record.adapterDidCommit(data);
-  },
-
-  /**
-    This method is called once the promise returned by an
-    adapter's `createRecord`, `updateRecord` or `deleteRecord`
-    is rejected with a `DS.InvalidError`.
-
-    @method recordWasInvalid
-    @private
-    @param {DS.Model} record
-    @param {Object} errors
-  */
-  recordWasInvalid: function(record, errors) {
-    record.adapterDidInvalidate(errors);
-  },
-
-  /**
-    This method is called once the promise returned by an
-    adapter's `createRecord`, `updateRecord` or `deleteRecord`
-    is rejected (with anything other than a `DS.InvalidError`).
-
-    @method recordWasError
-    @private
-    @param {DS.Model} record
-  */
-  recordWasError: function(record) {
-    record.adapterDidError();
-  },
-
-  /**
-    When an adapter's `createRecord`, `updateRecord` or `deleteRecord`
-    resolves with data, this method extracts the ID from the supplied
-    data.
-
-    @method updateId
-    @private
-    @param {DS.Model} record
-    @param {Object} data
-  */
-  updateId: function(record, data) {
-    var oldId = get(record, 'id'),
-        id = coerceId(data.id);
-
-    Ember.assert("An adapter cannot assign a new id to a record that already has an id. " + record + " had id: " + oldId + " and you tried to update it with " + id + ". This likely happened because your server returned data in response to a find or update that had a different id than the one you sent.", oldId === null || id === oldId);
-
-    this.typeMapFor(record.constructor).idToRecord[id] = record;
-
-    set(record, 'id', id);
-  },
-
-  /**
-    Returns a map of IDs to client IDs for a given type.
-
-    @method typeMapFor
-    @private
-    @param type
-    @return {Object} typeMap
-  */
-  typeMapFor: function(type) {
-    var typeMaps = get(this, 'typeMaps'),
-        guid = Ember.guidFor(type),
-        typeMap;
-
-    typeMap = typeMaps[guid];
-
-    if (typeMap) { return typeMap; }
-
-    typeMap = {
-      idToRecord: {},
-      records: [],
-      metadata: {}
-    };
-
-    typeMaps[guid] = typeMap;
-
-    return typeMap;
-  },
-
-  // ................
-  // . LOADING DATA .
-  // ................
-
-  /**
-    This internal method is used by `push`.
-
-    @method _load
-    @private
-    @param {String or subclass of DS.Model} type
-    @param {Object} data
-    @param {Boolean} partial the data should be merged into
-      the existing data, not replace it.
-  */
-  _load: function(type, data, partial) {
-    var id = coerceId(data.id),
-        record = this.recordForId(type, id);
-
-    record.setupData(data, partial);
-    this.recordArrayManager.recordDidChange(record);
-
-    return record;
-  },
-
-  /**
-    Returns a model class for a particular key. Used by
-    methods that take a type key (like `find`, `createRecord`,
-    etc.)
-
-    @method modelFor
-    @param {String or subclass of DS.Model} key
-    @returns {subclass of DS.Model}
-  */
-  modelFor: function(key) {
-    var factory;
-
-
-    if (typeof key === 'string') {
-      var normalizedKey = this.container.normalize('model:' + key);
-
-      factory = this.container.lookupFactory(normalizedKey);
-      if (!factory) { throw new Ember.Error("No model was found for '" + key + "'"); }
-      factory.typeKey = normalizedKey.split(':', 2)[1];
-    } else {
-      // A factory already supplied.
-      factory = key;
-    }
-
-    factory.store = this;
-    return factory;
-  },
-
-  /**
-    Push some data for a given type into the store.
-
-    This method expects normalized data:
-
-    * The ID is a key named `id` (an ID is mandatory)
-    * The names of attributes are the ones you used in
-      your model's `DS.attr`s.
-    * Your relationships must be:
-      * represented as IDs or Arrays of IDs
-      * represented as model instances
-      * represented as URLs, under the `links` key
-
-    For this model:
-
-    ```js
-    App.Person = DS.Model.extend({
-      firstName: DS.attr(),
-      lastName: DS.attr(),
-
-      children: DS.hasMany('person')
-    });
-    ```
-
-    To represent the children as IDs:
-
-    ```js
-    {
-      id: 1,
-      firstName: "Tom",
-      lastName: "Dale",
-      children: [1, 2, 3]
-    }
-    ```
-
-    To represent the children relationship as a URL:
-
-    ```js
-    {
-      id: 1,
-      firstName: "Tom",
-      lastName: "Dale",
-      links: {
-        children: "/people/1/children"
-      }
-    }
-    ```
-
-    If you're streaming data or implementing an adapter,
-    make sure that you have converted the incoming data
-    into this form.
-
-    This method can be used both to push in brand new
-    records, as well as to update existing records.
-
-    @method push
-    @param {String or subclass of DS.Model} type
-    @param {Object} data
-    @returns {DS.Model} the record that was created or
-      updated.
-  */
-  push: function(type, data, _partial) {
-    // _partial is an internal param used by `update`.
-    // If passed, it means that the data should be
-    // merged into the existing data, not replace it.
-
-    Ember.assert("You must include an `id` in a hash passed to `push`", data.id != null);
-
-    type = this.modelFor(type);
-
-    // normalize relationship IDs into records
-    data = normalizeRelationships(this, type, data);
-
-    this._load(type, data, _partial);
-
-    return this.recordForId(type, data.id);
-  },
-
-  /**
-    Push some raw data into the store.
-
-    The data will be automatically deserialized using the
-    serializer for the `type` param.
-
-    This method can be used both to push in brand new
-    records, as well as to update existing records.
-
-    You can push in more than one type of object at once.
-    All objects should be in the format expected by the
-    serializer.
-
-    ```js
-    App.ApplicationSerializer = DS.ActiveModelSerializer;
-
-    var pushData = {
-      posts: [
-        {id: 1, post_title: "Great post", comment_ids: [2]}
-      ],
-      comments: [
-        {id: 2, comment_body: "Insightful comment"}
-      ]
-    }
-
-    store.pushPayload('post', pushData);
-    ```
-
-    @method pushPayload
-    @param {String} type
-    @param {Object} payload
-    @return {DS.Model} the record that was created or updated.
-  */
-  pushPayload: function (type, payload) {
-    var serializer;
-    if (!payload) {
-      payload = type;
-      serializer = defaultSerializer(this.container);
-      Ember.assert("You cannot use `store#pushPayload` without a type unless your default serializer defines `pushPayload`", serializer.pushPayload);
-    } else {
-      serializer = this.serializerFor(type);
-    }
-    serializer.pushPayload(this, payload);
-  },
-
-  update: function(type, data) {
-    Ember.assert("You must include an `id` in a hash passed to `update`", data.id != null);
-
-    return this.push(type, data, true);
-  },
-
-  /**
-    If you have an Array of normalized data to push,
-    you can call `pushMany` with the Array, and it will
-    call `push` repeatedly for you.
-
-    @method pushMany
-    @param {String or subclass of DS.Model} type
-    @param {Array} datas
-    @return {Array}
-  */
-  pushMany: function(type, datas) {
-    return map(datas, function(data) {
-      return this.push(type, data);
-    }, this);
-  },
-
-  /**
-    If you have some metadata to set for a type
-    you can call `metaForType`.
-
-    @method metaForType
-    @param {String or subclass of DS.Model} type
-    @param {Object} metadata
-  */
-  metaForType: function(type, metadata) {
-    type = this.modelFor(type);
-
-    Ember.merge(this.typeMapFor(type).metadata, metadata);
-  },
-
-  /**
-    Build a brand new record for a given type, ID, and
-    initial data.
-
-    @method buildRecord
-    @private
-    @param {subclass of DS.Model} type
-    @param {String} id
-    @param {Object} data
-    @returns {DS.Model} record
-  */
-  buildRecord: function(type, id, data) {
-    var typeMap = this.typeMapFor(type),
-        idToRecord = typeMap.idToRecord;
-
-    Ember.assert('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord[id]);
-
-    // lookupFactory should really return an object that creates
-    // instances with the injections applied
-    var record = type._create({
-      id: id,
-      store: this,
-      container: this.container
-    });
-
-    if (data) {
-      record.setupData(data);
-    }
-
-    // if we're creating an item, this process will be done
-    // later, once the object has been persisted.
-    if (id) {
-      idToRecord[id] = record;
-    }
-
-    typeMap.records.push(record);
-
-    return record;
-  },
-
-  // ...............
-  // . DESTRUCTION .
-  // ...............
-
-  /**
-    When a record is destroyed, this un-indexes it and
-    removes it from any record arrays so it can be GCed.
-
-    @method dematerializeRecord
-    @private
-    @param {DS.Model} record
-  */
-  dematerializeRecord: function(record) {
-    var type = record.constructor,
-        typeMap = this.typeMapFor(type),
-        id = get(record, 'id');
-
-    record.updateRecordArrays();
-
-    if (id) {
-      delete typeMap.idToRecord[id];
-    }
-
-    var loc = indexOf(typeMap.records, record);
-    typeMap.records.splice(loc, 1);
-  },
-
-  // ........................
-  // . RELATIONSHIP CHANGES .
-  // ........................
-
-  addRelationshipChangeFor: function(childRecord, childKey, parentRecord, parentKey, change) {
-    var clientId = childRecord.clientId,
-        parentClientId = parentRecord ? parentRecord : parentRecord;
-    var key = childKey + parentKey;
-    var changes = this._relationshipChanges;
-    if (!(clientId in changes)) {
-      changes[clientId] = {};
-    }
-    if (!(parentClientId in changes[clientId])) {
-      changes[clientId][parentClientId] = {};
-    }
-    if (!(key in changes[clientId][parentClientId])) {
-      changes[clientId][parentClientId][key] = {};
-    }
-    changes[clientId][parentClientId][key][change.changeType] = change;
-  },
-
-  removeRelationshipChangeFor: function(clientRecord, childKey, parentRecord, parentKey, type) {
-    var clientId = clientRecord.clientId,
-        parentClientId = parentRecord ? parentRecord.clientId : parentRecord;
-    var changes = this._relationshipChanges;
-    var key = childKey + parentKey;
-    if (!(clientId in changes) || !(parentClientId in changes[clientId]) || !(key in changes[clientId][parentClientId])){
-      return;
-    }
-    delete changes[clientId][parentClientId][key][type];
-  },
-
-  relationshipChangePairsFor: function(record){
-    var toReturn = [];
-
-    if( !record ) { return toReturn; }
-
-    //TODO(Igor) What about the other side
-    var changesObject = this._relationshipChanges[record.clientId];
-    for (var objKey in changesObject){
-      if(changesObject.hasOwnProperty(objKey)){
-        for (var changeKey in changesObject[objKey]){
-          if(changesObject[objKey].hasOwnProperty(changeKey)){
-            toReturn.push(changesObject[objKey][changeKey]);
-          }
-        }
-      }
-    }
-    return toReturn;
-  },
-
-  // ......................
-  // . PER-TYPE ADAPTERS
-  // ......................
-
-  /**
-    Returns the adapter for a given type.
-
-    @method adapterFor
-    @private
-    @param {subclass of DS.Model} type
-    @returns DS.Adapter
-  */
-  adapterFor: function(type) {
-    var container = this.container, adapter;
-
-    if (container) {
-      adapter = container.lookup('adapter:' + type.typeKey) || container.lookup('adapter:application');
-    }
-
-    return adapter || get(this, 'defaultAdapter');
-  },
-
-  // ..............................
-  // . RECORD CHANGE NOTIFICATION .
-  // ..............................
-
-  /**
-    Returns an instance of the serializer for a given type. For
-    example, `serializerFor('person')` will return an instance of
-    `App.PersonSerializer`.
-
-    If no `App.PersonSerializer` is found, this method will look
-    for an `App.ApplicationSerializer` (the default serializer for
-    your entire application).
-
-    If no `App.ApplicationSerializer` is found, it will fall back
-    to an instance of `DS.JSONSerializer`.
-
-    @method serializerFor
-    @private
-    @param {String} type the record to serialize
-    @return {DS.Serializer}
-  */
-  serializerFor: function(type) {
-    type = this.modelFor(type);
-    var adapter = this.adapterFor(type);
-
-    return serializerFor(this.container, type.typeKey, adapter && adapter.defaultSerializer);
-  }
-});
-
-function normalizeRelationships(store, type, data, record) {
-  type.eachRelationship(function(key, relationship) {
-    // A link (usually a URL) was already provided in
-    // normalized form
-    if (data.links && data.links[key]) {
-      if (record && relationship.options.async) { record._relationships[key] = null; }
-      return;
-    }
-
-    var kind = relationship.kind,
-        value = data[key];
-
-    if (value == null) { return; }
-
-    if (kind === 'belongsTo') {
-      deserializeRecordId(store, data, key, relationship, value);
-    } else if (kind === 'hasMany') {
-      deserializeRecordIds(store, data, key, relationship, value);
-      addUnsavedRecords(record, key, value);
-    }
-  });
-
-  return data;
-}
-
-function deserializeRecordId(store, data, key, relationship, id) {
-  if (isNone(id) || id instanceof DS.Model) {
-    return;
-  }
-
-  var type;
-
-  if (typeof id === 'number' || typeof id === 'string') {
-    type = typeFor(relationship, key, data);
-    data[key] = store.recordForId(type, id);
-  } else if (typeof id === 'object') {
-    // polymorphic
-    data[key] = store.recordForId(id.type, id.id);
-  }
-}
-
-function typeFor(relationship, key, data) {
-  if (relationship.options.polymorphic) {
-    return data[key + "Type"];
-  } else {
-    return relationship.type;
-  }
-}
-
-function deserializeRecordIds(store, data, key, relationship, ids) {
-  for (var i=0, l=ids.length; i<l; i++) {
-    deserializeRecordId(store, ids, i, relationship, ids[i]);
-  }
-}
-
-// If there are any unsaved records that are in a hasMany they won't be
-// in the payload, so add them back in manually.
-function addUnsavedRecords(record, key, data) {
-  if(record) {
-    data.pushObjects(record.get(key).filterBy('isNew'));
-  }
-}
-
-// Delegation to the adapter and promise management
-/**
-  A `PromiseArray` is an object that acts like both an `Ember.Array`
-  and a promise. When the promise is resolved the the resulting value
-  will be set to the `PromiseArray`'s `content` property. This makes
-  it easy to create data bindings with the `PromiseArray` that will be
-  updated when the promise resolves.
-
-  For more information see the [Ember.PromiseProxyMixin
-  documentation](/api/classes/Ember.PromiseProxyMixin.html).
-
-  Example
-
-  ```javascript
-  var promiseArray = DS.PromiseArray.create({
-    promise: $.getJSON('/some/remote/data.json')
-  });
-
-  promiseArray.get('length'); // 0
-
-  promiseArray.then(function() {
-    promiseArray.get('length'); // 100
-  });
-  ```
-
-  @class PromiseArray
-  @namespace DS
-  @extends Ember.ArrayProxy
-  @uses Ember.PromiseProxyMixin
-*/
-DS.PromiseArray = Ember.ArrayProxy.extend(Ember.PromiseProxyMixin);
-/**
-  A `PromiseObject` is an object that acts like both an `Ember.Object`
-  and a promise. When the promise is resolved the the resulting value
-  will be set to the `PromiseObject`'s `content` property. This makes
-  it easy to create data bindings with the `PromiseObject` that will
-  be updated when the promise resolves.
-
-  For more information see the [Ember.PromiseProxyMixin
-  documentation](/api/classes/Ember.PromiseProxyMixin.html).
-
-  Example
-
-  ```javascript
-  var promiseObject = DS.PromiseObject.create({
-    promise: $.getJSON('/some/remote/data.json')
-  });
-
-  promiseObject.get('name'); // null
-
-  promiseObject.then(function() {
-    promiseObject.get('name'); // 'Tomster'
-  });
-  ```
-
-  @class PromiseObject
-  @namespace DS
-  @extends Ember.ObjectProxy
-  @uses Ember.PromiseProxyMixin
-*/
-DS.PromiseObject = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
-
-function promiseObject(promise) {
-  return DS.PromiseObject.create({ promise: promise });
-}
-
-function promiseArray(promise) {
-  return DS.PromiseArray.create({ promise: promise });
-}
-
-function isThenable(object) {
-  return object && typeof object.then === 'function';
-}
-
-function serializerFor(container, type, defaultSerializer) {
-  return container.lookup('serializer:'+type) ||
-                 container.lookup('serializer:application') ||
-                 container.lookup('serializer:' + defaultSerializer) ||
-                 container.lookup('serializer:-default');
-}
-
-function defaultSerializer(container) {
-  return container.lookup('serializer:application') ||
-         container.lookup('serializer:-default');
-}
-
-function serializerForAdapter(adapter, type) {
-  var serializer = adapter.serializer,
-      defaultSerializer = adapter.defaultSerializer,
-      container = adapter.container;
-
-  if (container && serializer === undefined) {
-    serializer = serializerFor(container, type.typeKey, defaultSerializer);
-  }
-
-  if (serializer === null || serializer === undefined) {
-    serializer = {
-      extract: function(store, type, payload) { return payload; }
-    };
-  }
-
-  return serializer;
-}
-
-function _find(adapter, store, type, id) {
-  var promise = adapter.find(store, type, id),
-      serializer = serializerForAdapter(adapter, type);
-
-  return resolve(promise, "DS: Handle Adapter#find of " + type + " with id: " + id).then(function(payload) {
-    Ember.assert("You made a request for a " + type.typeKey + " with id " + id + ", but the adapter's response did not have any data", payload);
-    payload = serializer.extract(store, type, payload, id, 'find');
-
-    return store.push(type, payload);
-  }, function(error) {
-    var record = store.getById(type, id);
-    record.notFound();
-    throw error;
-  }, "DS: Extract payload of '" + type + "'");
-}
-
-function _findMany(adapter, store, type, ids, owner) {
-  var promise = adapter.findMany(store, type, ids, owner),
-      serializer = serializerForAdapter(adapter, type);
-
-  return resolve(promise, "DS: Handle Adapter#findMany of " + type).then(function(payload) {
-    payload = serializer.extract(store, type, payload, null, 'findMany');
-
-    Ember.assert("The response from a findMany must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array');
-
-    store.pushMany(type, payload);
-  }, null, "DS: Extract payload of " + type);
-}
-
-function _findHasMany(adapter, store, record, link, relationship) {
-  var promise = adapter.findHasMany(store, record, link, relationship),
-      serializer = serializerForAdapter(adapter, relationship.type);
-
-  return resolve(promise, "DS: Handle Adapter#findHasMany of " + record + " : " + relationship.type).then(function(payload) {
-    payload = serializer.extract(store, relationship.type, payload, null, 'findHasMany');
-
-    Ember.assert("The response from a findHasMany must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array');
-
-    var records = store.pushMany(relationship.type, payload);
-    record.updateHasMany(relationship.key, records);
-  }, null, "DS: Extract payload of " + record + " : hasMany " + relationship.type);
-}
-
-function _findBelongsTo(adapter, store, record, link, relationship) {
-  var promise = adapter.findBelongsTo(store, record, link, relationship),
-      serializer = serializerForAdapter(adapter, relationship.type);
-
-  return resolve(promise, "DS: Handle Adapter#findBelongsTo of " + record + " : " + relationship.type).then(function(payload) {
-    payload = serializer.extract(store, relationship.type, payload, null, 'findBelongsTo');
-
-    var record = store.push(relationship.type, payload);
-    record.updateBelongsTo(relationship.key, record);
-    return record;
-  }, null, "DS: Extract payload of " + record + " : " + relationship.type);
-}
-
-function _findAll(adapter, store, type, sinceToken) {
-  var promise = adapter.findAll(store, type, sinceToken),
-      serializer = serializerForAdapter(adapter, type);
-
-  return resolve(promise, "DS: Handle Adapter#findAll of " + type).then(function(payload) {
-    payload = serializer.extract(store, type, payload, null, 'findAll');
-
-    Ember.assert("The response from a findAll must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array');
-
-    store.pushMany(type, payload);
-    store.didUpdateAll(type);
-    return store.all(type);
-  }, null, "DS: Extract payload of findAll " + type);
-}
-
-function _findQuery(adapter, store, type, query, recordArray) {
-  var promise = adapter.findQuery(store, type, query, recordArray),
-      serializer = serializerForAdapter(adapter, type);
-
-  return resolve(promise, "DS: Handle Adapter#findQuery of " + type).then(function(payload) {
-    payload = serializer.extract(store, type, payload, null, 'findQuery');
-
-    Ember.assert("The response from a findQuery must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array');
-
-    recordArray.load(payload);
-    return recordArray;
-  }, null, "DS: Extract payload of findQuery " + type);
-}
-
-function _commit(adapter, store, operation, record) {
-  var type = record.constructor,
-      promise = adapter[operation](store, type, record),
-      serializer = serializerForAdapter(adapter, type);
-
-  Ember.assert("Your adapter's '" + operation + "' method must return a promise, but it returned " + promise, isThenable(promise));
-
-  return promise.then(function(payload) {
-    if (payload) { payload = serializer.extract(store, type, payload, get(record, 'id'), operation); }
-    store.didSaveRecord(record, payload);
-    return record;
-  }, function(reason) {
-    if (reason instanceof DS.InvalidError) {
-      store.recordWasInvalid(record, reason.errors);
-    } else {
-      store.recordWasError(record, reason);
-    }
-
-    throw reason;
-  }, "DS: Extract and notify about " + operation + " completion of " + record);
-}
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-/*
-  This file encapsulates the various states that a record can transition
-  through during its lifecycle.
-*/
-/**
-  ### State
-
-  Each record has a `currentState` property that explicitly tracks what
-  state a record is in at any given time. For instance, if a record is
-  newly created and has not yet been sent to the adapter to be saved,
-  it would be in the `root.loaded.created.uncommitted` state.  If a
-  record has had local modifications made to it that are in the
-  process of being saved, the record would be in the
-  `root.loaded.updated.inFlight` state. (These state paths will be
-  explained in more detail below.)
-
-  Events are sent by the record or its store to the record's
-  `currentState` property. How the state reacts to these events is
-  dependent on which state it is in. In some states, certain events
-  will be invalid and will cause an exception to be raised.
-
-  States are hierarchical and every state is a substate of the
-  `RootState`. For example, a record can be in the
-  `root.deleted.uncommitted` state, then transition into the
-  `root.deleted.inFlight` state. If a child state does not implement
-  an event handler, the state manager will attempt to invoke the event
-  on all parent states until the root state is reached. The state
-  hierarchy of a record is described in terms of a path string. You
-  can determine a record's current state by getting the state's
-  `stateName` property:
-
-  ```javascript
-  record.get('currentState.stateName');
-  //=> "root.created.uncommitted"
-   ```
-
-  The hierarchy of valid states that ship with ember data looks like
-  this:
-
-  ```text
-  * root
-    * deleted
-      * saved
-      * uncommitted
-      * inFlight
-    * empty
-    * loaded
-      * created
-        * uncommitted
-        * inFlight
-      * saved
-      * updated
-        * uncommitted
-        * inFlight
-    * loading
-  ```
-
-  The `DS.Model` states are themselves stateless. What we mean is
-  that, the hierarchical states that each of *those* points to is a
-  shared data structure. For performance reasons, instead of each
-  record getting its own copy of the hierarchy of states, each record
-  points to this global, immutable shared instance. How does a state
-  know which record it should be acting on? We pass the record
-  instance into the state's event handlers as the first argument.
-
-  The record passed as the first parameter is where you should stash
-  state about the record if needed; you should never store data on the state
-  object itself.
-
-  ### Events and Flags
-
-  A state may implement zero or more events and flags.
-
-  #### Events
-
-  Events are named functions that are invoked when sent to a record. The
-  record will first look for a method with the given name on the
-  current state. If no method is found, it will search the current
-  state's parent, and then its grandparent, and so on until reaching
-  the top of the hierarchy. If the root is reached without an event
-  handler being found, an exception will be raised. This can be very
-  helpful when debugging new features.
-
-  Here's an example implementation of a state with a `myEvent` event handler:
-
-  ```javascript
-  aState: DS.State.create({
-    myEvent: function(manager, param) {
-      console.log("Received myEvent with", param);
-    }
-  })
-  ```
-
-  To trigger this event:
-
-  ```javascript
-  record.send('myEvent', 'foo');
-  //=> "Received myEvent with foo"
-  ```
-
-  Note that an optional parameter can be sent to a record's `send()` method,
-  which will be passed as the second parameter to the event handler.
-
-  Events should transition to a different state if appropriate. This can be
-  done by calling the record's `transitionTo()` method with a path to the
-  desired state. The state manager will attempt to resolve the state path
-  relative to the current state. If no state is found at that path, it will
-  attempt to resolve it relative to the current state's parent, and then its
-  parent, and so on until the root is reached. For example, imagine a hierarchy
-  like this:
-
-      * created
-        * uncommitted <-- currentState
-        * inFlight
-      * updated
-        * inFlight
-
-  If we are currently in the `uncommitted` state, calling
-  `transitionTo('inFlight')` would transition to the `created.inFlight` state,
-  while calling `transitionTo('updated.inFlight')` would transition to
-  the `updated.inFlight` state.
-
-  Remember that *only events* should ever cause a state transition. You should
-  never call `transitionTo()` from outside a state's event handler. If you are
-  tempted to do so, create a new event and send that to the state manager.
-
-  #### Flags
-
-  Flags are Boolean values that can be used to introspect a record's current
-  state in a more user-friendly way than examining its state path. For example,
-  instead of doing this:
-
-  ```javascript
-  var statePath = record.get('stateManager.currentPath');
-  if (statePath === 'created.inFlight') {
-    doSomething();
-  }
-  ```
-
-  You can say:
-
-  ```javascript
-  if (record.get('isNew') && record.get('isSaving')) {
-    doSomething();
-  }
-  ```
-
-  If your state does not set a value for a given flag, the value will
-  be inherited from its parent (or the first place in the state hierarchy
-  where it is defined).
-
-  The current set of flags are defined below. If you want to add a new flag,
-  in addition to the area below, you will also need to declare it in the
-  `DS.Model` class.
-
-
-   * [isEmpty](DS.Model.html#property_isEmpty)
-   * [isLoading](DS.Model.html#property_isLoading)
-   * [isLoaded](DS.Model.html#property_isLoaded)
-   * [isDirty](DS.Model.html#property_isDirty)
-   * [isSaving](DS.Model.html#property_isSaving)
-   * [isDeleted](DS.Model.html#property_isDeleted)
-   * [isNew](DS.Model.html#property_isNew)
-   * [isValid](DS.Model.html#property_isValid)
-
-  @namespace DS
-  @class RootState
-*/
-
-var hasDefinedProperties = function(object) {
-  // Ignore internal property defined by simulated `Ember.create`.
-  var names = Ember.keys(object);
-  var i, l, name;
-  for (i = 0, l = names.length; i < l; i++ ) {
-    name = names[i];
-    if (object.hasOwnProperty(name) && object[name]) { return true; }
-  }
-
-  return false;
-};
-
-var didSetProperty = function(record, context) {
-  if (context.value === context.originalValue) {
-    delete record._attributes[context.name];
-    record.send('propertyWasReset', context.name);
-  } else if (context.value !== context.oldValue) {
-    record.send('becomeDirty');
-  }
-
-  record.updateRecordArraysLater();
-};
-
-// Implementation notes:
-//
-// Each state has a boolean value for all of the following flags:
-//
-// * isLoaded: The record has a populated `data` property. When a
-//   record is loaded via `store.find`, `isLoaded` is false
-//   until the adapter sets it. When a record is created locally,
-//   its `isLoaded` property is always true.
-// * isDirty: The record has local changes that have not yet been
-//   saved by the adapter. This includes records that have been
-//   created (but not yet saved) or deleted.
-// * isSaving: The record has been committed, but
-//   the adapter has not yet acknowledged that the changes have
-//   been persisted to the backend.
-// * isDeleted: The record was marked for deletion. When `isDeleted`
-//   is true and `isDirty` is true, the record is deleted locally
-//   but the deletion was not yet persisted. When `isSaving` is
-//   true, the change is in-flight. When both `isDirty` and
-//   `isSaving` are false, the change has persisted.
-// * isError: The adapter reported that it was unable to save
-//   local changes to the backend. This may also result in the
-//   record having its `isValid` property become false if the
-//   adapter reported that server-side validations failed.
-// * isNew: The record was created on the client and the adapter
-//   did not yet report that it was successfully saved.
-// * isValid: No client-side validations have failed and the
-//   adapter did not report any server-side validation failures.
-
-// The dirty state is a abstract state whose functionality is
-// shared between the `created` and `updated` states.
-//
-// The deleted state shares the `isDirty` flag with the
-// subclasses of `DirtyState`, but with a very different
-// implementation.
-//
-// Dirty states have three child states:
-//
-// `uncommitted`: the store has not yet handed off the record
-//   to be saved.
-// `inFlight`: the store has handed off the record to be saved,
-//   but the adapter has not yet acknowledged success.
-// `invalid`: the record has invalid information and cannot be
-//   send to the adapter yet.
-var DirtyState = {
-  initialState: 'uncommitted',
-
-  // FLAGS
-  isDirty: true,
-
-  // SUBSTATES
-
-  // When a record first becomes dirty, it is `uncommitted`.
-  // This means that there are local pending changes, but they
-  // have not yet begun to be saved, and are not invalid.
-  uncommitted: {
-    // EVENTS
-    didSetProperty: didSetProperty,
-
-    propertyWasReset: function(record, name) {
-      var stillDirty = false;
-
-      for (var prop in record._attributes) {
-        stillDirty = true;
-        break;
-      }
-
-      if (!stillDirty) { record.send('rolledBack'); }
-    },
-
-    pushedData: Ember.K,
-
-    becomeDirty: Ember.K,
-
-    willCommit: function(record) {
-      record.transitionTo('inFlight');
-    },
-
-    reloadRecord: function(record, resolve) {
-      resolve(get(record, 'store').reloadRecord(record));
-    },
-
-    rolledBack: function(record) {
-      record.transitionTo('loaded.saved');
-    },
-
-    becameInvalid: function(record) {
-      record.transitionTo('invalid');
-    },
-
-    rollback: function(record) {
-      record.rollback();
-    }
-  },
-
-  // Once a record has been handed off to the adapter to be
-  // saved, it is in the 'in flight' state. Changes to the
-  // record cannot be made during this window.
-  inFlight: {
-    // FLAGS
-    isSaving: true,
-
-    // EVENTS
-    didSetProperty: didSetProperty,
-    becomeDirty: Ember.K,
-    pushedData: Ember.K,
-
-    // TODO: More robust semantics around save-while-in-flight
-    willCommit: Ember.K,
-
-    didCommit: function(record) {
-      var dirtyType = get(this, 'dirtyType');
-
-      record.transitionTo('saved');
-      record.send('invokeLifecycleCallbacks', dirtyType);
-    },
-
-    becameInvalid: function(record) {
-      record.transitionTo('invalid');
-      record.send('invokeLifecycleCallbacks');
-    },
-
-    becameError: function(record) {
-      record.transitionTo('uncommitted');
-      record.triggerLater('becameError', record);
-    }
-  },
-
-  // A record is in the `invalid` state when its client-side
-  // invalidations have failed, or if the adapter has indicated
-  // the the record failed server-side invalidations.
-  invalid: {
-    // FLAGS
-    isValid: false,
-
-    // EVENTS
-    deleteRecord: function(record) {
-      record.transitionTo('deleted.uncommitted');
-      record.clearRelationships();
-    },
-
-    didSetProperty: function(record, context) {
-      get(record, 'errors').remove(context.name);
-
-      didSetProperty(record, context);
-    },
-
-    becomeDirty: Ember.K,
-
-    rolledBack: function(record) {
-      get(record, 'errors').clear();
-    },
-
-    becameValid: function(record) {
-      record.transitionTo('uncommitted');
-    },
-
-    invokeLifecycleCallbacks: function(record) {
-      record.triggerLater('becameInvalid', record);
-    }
-  }
-};
-
-// The created and updated states are created outside the state
-// chart so we can reopen their substates and add mixins as
-// necessary.
-
-function deepClone(object) {
-  var clone = {}, value;
-
-  for (var prop in object) {
-    value = object[prop];
-    if (value && typeof value === 'object') {
-      clone[prop] = deepClone(value);
-    } else {
-      clone[prop] = value;
-    }
-  }
-
-  return clone;
-}
-
-function mixin(original, hash) {
-  for (var prop in hash) {
-    original[prop] = hash[prop];
-  }
-
-  return original;
-}
-
-function dirtyState(options) {
-  var newState = deepClone(DirtyState);
-  return mixin(newState, options);
-}
-
-var createdState = dirtyState({
-  dirtyType: 'created',
-
-  // FLAGS
-  isNew: true
-});
-
-createdState.uncommitted.rolledBack = function(record) {
-  record.transitionTo('deleted.saved');
-};
-
-var updatedState = dirtyState({
-  dirtyType: 'updated'
-});
-
-createdState.uncommitted.deleteRecord = function(record) {
-  record.clearRelationships();
-  record.transitionTo('deleted.saved');
-};
-
-createdState.uncommitted.rollback = function(record) {
-  DirtyState.uncommitted.rollback.apply(this, arguments);
-  record.transitionTo('deleted.saved');
-};
-
-createdState.uncommitted.propertyWasReset = Ember.K;
-
-updatedState.uncommitted.deleteRecord = function(record) {
-  record.transitionTo('deleted.uncommitted');
-  record.clearRelationships();
-};
-
-var RootState = {
-  // FLAGS
-  isEmpty: false,
-  isLoading: false,
-  isLoaded: false,
-  isDirty: false,
-  isSaving: false,
-  isDeleted: false,
-  isNew: false,
-  isValid: true,
-
-  // DEFAULT EVENTS
-
-  // Trying to roll back if you're not in the dirty state
-  // doesn't change your state. For example, if you're in the
-  // in-flight state, rolling back the record doesn't move
-  // you out of the in-flight state.
-  rolledBack: Ember.K,
-
-  propertyWasReset: Ember.K,
-
-  // SUBSTATES
-
-  // A record begins its lifecycle in the `empty` state.
-  // If its data will come from the adapter, it will
-  // transition into the `loading` state. Otherwise, if
-  // the record is being created on the client, it will
-  // transition into the `created` state.
-  empty: {
-    isEmpty: true,
-
-    // EVENTS
-    loadingData: function(record, promise) {
-      record._loadingPromise = promise;
-      record.transitionTo('loading');
-    },
-
-    loadedData: function(record) {
-      record.transitionTo('loaded.created.uncommitted');
-
-      record.suspendRelationshipObservers(function() {
-        record.notifyPropertyChange('data');
-      });
-    },
-
-    pushedData: function(record) {
-      record.transitionTo('loaded.saved');
-      record.triggerLater('didLoad');
-    }
-  },
-
-  // A record enters this state when the store asks
-  // the adapter for its data. It remains in this state
-  // until the adapter provides the requested data.
-  //
-  // Usually, this process is asynchronous, using an
-  // XHR to retrieve the data.
-  loading: {
-    // FLAGS
-    isLoading: true,
-
-    exit: function(record) {
-      record._loadingPromise = null;
-    },
-
-    // EVENTS
-    pushedData: function(record) {
-      record.transitionTo('loaded.saved');
-      record.triggerLater('didLoad');
-      set(record, 'isError', false);
-    },
-
-    becameError: function(record) {
-      record.triggerLater('becameError', record);
-    },
-
-    notFound: function(record) {
-      record.transitionTo('empty');
-    }
-  },
-
-  // A record enters this state when its data is populated.
-  // Most of a record's lifecycle is spent inside substates
-  // of the `loaded` state.
-  loaded: {
-    initialState: 'saved',
-
-    // FLAGS
-    isLoaded: true,
-
-    // SUBSTATES
-
-    // If there are no local changes to a record, it remains
-    // in the `saved` state.
-    saved: {
-      setup: function(record) {
-        var attrs = record._attributes,
-            isDirty = false;
-
-        for (var prop in attrs) {
-          if (attrs.hasOwnProperty(prop)) {
-            isDirty = true;
-            break;
-          }
-        }
-
-        if (isDirty) {
-          record.adapterDidDirty();
-        }
-      },
-
-      // EVENTS
-      didSetProperty: didSetProperty,
-
-      pushedData: Ember.K,
-
-      becomeDirty: function(record) {
-        record.transitionTo('updated.uncommitted');
-      },
-
-      willCommit: function(record) {
-        record.transitionTo('updated.inFlight');
-      },
-
-      reloadRecord: function(record, resolve) {
-        resolve(get(record, 'store').reloadRecord(record));
-      },
-
-      deleteRecord: function(record) {
-        record.transitionTo('deleted.uncommitted');
-        record.clearRelationships();
-      },
-
-      unloadRecord: function(record) {
-        // clear relationships before moving to deleted state
-        // otherwise it fails
-        record.clearRelationships();
-        record.transitionTo('deleted.saved');
-      },
-
-      didCommit: function(record) {
-        record.send('invokeLifecycleCallbacks', get(record, 'lastDirtyType'));
-      },
-
-      // loaded.saved.notFound would be triggered by a failed
-      // `reload()` on an unchanged record
-      notFound: Ember.K
-
-    },
-
-    // A record is in this state after it has been locally
-    // created but before the adapter has indicated that
-    // it has been saved.
-    created: createdState,
-
-    // A record is in this state if it has already been
-    // saved to the server, but there are new local changes
-    // that have not yet been saved.
-    updated: updatedState
-  },
-
-  // A record is in this state if it was deleted from the store.
-  deleted: {
-    initialState: 'uncommitted',
-    dirtyType: 'deleted',
-
-    // FLAGS
-    isDeleted: true,
-    isLoaded: true,
-    isDirty: true,
-
-    // TRANSITIONS
-    setup: function(record) {
-      record.updateRecordArrays();
-    },
-
-    // SUBSTATES
-
-    // When a record is deleted, it enters the `start`
-    // state. It will exit this state when the record
-    // starts to commit.
-    uncommitted: {
-
-      // EVENTS
-
-      willCommit: function(record) {
-        record.transitionTo('inFlight');
-      },
-
-      rollback: function(record) {
-        record.rollback();
-      },
-
-      becomeDirty: Ember.K,
-      deleteRecord: Ember.K,
-
-      rolledBack: function(record) {
-        record.transitionTo('loaded.saved');
-      }
-    },
-
-    // After a record starts committing, but
-    // before the adapter indicates that the deletion
-    // has saved to the server, a record is in the
-    // `inFlight` substate of `deleted`.
-    inFlight: {
-      // FLAGS
-      isSaving: true,
-
-      // EVENTS
-
-      // TODO: More robust semantics around save-while-in-flight
-      willCommit: Ember.K,
-      didCommit: function(record) {
-        record.transitionTo('saved');
-
-        record.send('invokeLifecycleCallbacks');
-      },
-
-      becameError: function(record) {
-        record.transitionTo('uncommitted');
-        record.triggerLater('becameError', record);
-      }
-    },
-
-    // Once the adapter indicates that the deletion has
-    // been saved, the record enters the `saved` substate
-    // of `deleted`.
-    saved: {
-      // FLAGS
-      isDirty: false,
-
-      setup: function(record) {
-        var store = get(record, 'store');
-        store.dematerializeRecord(record);
-      },
-
-      invokeLifecycleCallbacks: function(record) {
-        record.triggerLater('didDelete', record);
-        record.triggerLater('didCommit', record);
-      }
-    }
-  },
-
-  invokeLifecycleCallbacks: function(record, dirtyType) {
-    if (dirtyType === 'created') {
-      record.triggerLater('didCreate', record);
-    } else {
-      record.triggerLater('didUpdate', record);
-    }
-
-    record.triggerLater('didCommit', record);
-  }
-};
-
-function wireState(object, parent, name) {
-  /*jshint proto:true*/
-  // TODO: Use Object.create and copy instead
-  object = mixin(parent ? Ember.create(parent) : {}, object);
-  object.parentState = parent;
-  object.stateName = name;
-
-  for (var prop in object) {
-    if (!object.hasOwnProperty(prop) || prop === 'parentState' || prop === 'stateName') { continue; }
-    if (typeof object[prop] === 'object') {
-      object[prop] = wireState(object[prop], object, name + "." + prop);
-    }
-  }
-
-  return object;
-}
-
-RootState = wireState(RootState, null, "root");
-
-DS.RootState = RootState;
-
-})();
-
-
-
-(function() {
-var get = Ember.get, isEmpty = Ember.isEmpty;
-
-/**
-@module ember-data
-*/
-
-/**
-  Holds validation errors for a given record organized by attribute names.
-
-  @class Errors
-  @namespace DS
-  @extends Ember.Object
-  @uses Ember.Enumerable
-  @uses Ember.Evented
- */
-DS.Errors = Ember.Object.extend(Ember.Enumerable, Ember.Evented, {
-  /**
-    Register with target handler
-
-    @method registerHandlers
-    @param {Object} target
-    @param {Function} becameInvalid
-    @param {Function} becameValid
-  */
-  registerHandlers: function(target, becameInvalid, becameValid) {
-    this.on('becameInvalid', target, becameInvalid);
-    this.on('becameValid', target, becameValid);
-  },
-
-  /**
-    @property errorsByAttributeName
-    @type {Ember.MapWithDefault}
-    @private
-  */
-  errorsByAttributeName: Ember.reduceComputed("content", {
-    initialValue: function() {
-      return Ember.MapWithDefault.create({
-        defaultValue: function() {
-          return Ember.A();
-        }
-      });
-    },
-
-    addedItem: function(errors, error) {
-      errors.get(error.attribute).pushObject(error);
-
-      return errors;
-    },
-
-    removedItem: function(errors, error) {
-      errors.get(error.attribute).removeObject(error);
-
-      return errors;
-    }
-  }),
-
-  /**
-    Returns errors for a given attribute
-
-    @method errorsFor
-    @param {String} attribute
-    @returns {Array}
-  */
-  errorsFor: function(attribute) {
-    return get(this, 'errorsByAttributeName').get(attribute);
-  },
-
-  /**
-  */
-  messages: Ember.computed.mapBy('content', 'message'),
-
-  /**
-    @property content
-    @type {Array}
-    @private
-  */
-  content: Ember.computed(function() {
-    return Ember.A();
-  }),
-
-  /**
-    @method unknownProperty
-    @private
-  */
-  unknownProperty: function(attribute) {
-    var errors = this.errorsFor(attribute);
-    if (isEmpty(errors)) { return null; }
-    return errors;
-  },
-
-  /**
-    @method nextObject
-    @private
-  */
-  nextObject: function(index, previousObject, context) {
-    return get(this, 'content').objectAt(index);
-  },
-
-  /**
-    Total number of errors.
-
-    @property length
-    @type {Number}
-    @readOnly
-  */
-  length: Ember.computed.oneWay('content.length').readOnly(),
-
-  /**
-    @property isEmpty
-    @type {Boolean}
-    @readOnly
-  */
-  isEmpty: Ember.computed.not('length').readOnly(),
-
-  /**
-    Adds error messages to a given attribute and sends
-    `becameInvalid` event to the record.
-
-    @method add
-    @param {String} attribute
-    @param {Array|String} messages
-  */
-  add: function(attribute, messages) {
-    var wasEmpty = get(this, 'isEmpty');
-
-    messages = this._findOrCreateMessages(attribute, messages);
-    get(this, 'content').addObjects(messages);
-
-    this.notifyPropertyChange(attribute);
-    this.enumerableContentDidChange();
-
-    if (wasEmpty && !get(this, 'isEmpty')) {
-      this.trigger('becameInvalid');
-    }
-  },
-
-  /**
-    @method _findOrCreateMessages
-    @private
-  */
-  _findOrCreateMessages: function(attribute, messages) {
-    var errors = this.errorsFor(attribute);
-
-    return Ember.makeArray(messages).map(function(message) {
-      return errors.findBy('message', message) || {
-        attribute: attribute,
-        message: message
-      };
-    });
-  },
-
-  /**
-    Removes all error messages from the given attribute and sends
-    `becameValid` event to the record if there no more errors left.
-
-    @method remove
-    @param {String} attribute
-  */
-  remove: function(attribute) {
-    if (get(this, 'isEmpty')) { return; }
-
-    var content = get(this, 'content').rejectBy('attribute', attribute);
-    get(this, 'content').setObjects(content);
-
-    this.notifyPropertyChange(attribute);
-    this.enumerableContentDidChange();
-
-    if (get(this, 'isEmpty')) {
-      this.trigger('becameValid');
-    }
-  },
-
-  /**
-    Removes all error messages and sends `becameValid` event
-    to the record.
-
-    @method clear
-  */
-  clear: function() {
-    if (get(this, 'isEmpty')) { return; }
-
-    get(this, 'content').clear();
-    this.enumerableContentDidChange();
-
-    this.trigger('becameValid');
-  },
-
-  /**
-    Checks if there is error messages for the given attribute.
-
-    @method has
-    @param {String} attribute
-    @returns {Boolean} true if there some errors on given attribute
-  */
-  has: function(attribute) {
-    return !isEmpty(this.errorsFor(attribute));
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set,
-    merge = Ember.merge;
-
-var retrieveFromCurrentState = Ember.computed('currentState', function(key, value) {
-  return get(get(this, 'currentState'), key);
-}).readOnly();
-
-/**
-
-  The model class that all Ember Data records descend from.
-
-  @class Model
-  @namespace DS
-  @extends Ember.Object
-  @uses Ember.Evented
-*/
-DS.Model = Ember.Object.extend(Ember.Evented, {
-  /**
-    If this property is `true` the record is in the `empty`
-    state. Empty is the first state all records enter after they have
-    been created. Most records created by the store will quickly
-    transition to the `loading` state if data needs to be fetched from
-    the server or the `created` state if the record is created on the
-    client. A record can also enter the empty state if the adapter is
-    unable to locate the record.
-
-    @property isEmpty
-    @type {Boolean}
-    @readOnly
-  */
-  isEmpty: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `loading` state. A
-    record enters this state when the store asks the adapter for its
-    data. It remains in this state until the adapter provides the
-    requested data.
-
-    @property isLoading
-    @type {Boolean}
-    @readOnly
-  */
-  isLoading: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `loaded` state. A
-    record enters this state when its data is populated. Most of a
-    record's lifecycle is spent inside substates of the `loaded`
-    state.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('isLoaded'); // true
-
-    store.find('model', 1).then(function(model) {
-      model.get('isLoaded'); // true
-    });
-    ```
-
-    @property isLoaded
-    @type {Boolean}
-    @readOnly
-  */
-  isLoaded: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `dirty` state. The
-    record has local changes that have not yet been saved by the
-    adapter. This includes records that have been created (but not yet
-    saved) or deleted.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('isDirty'); // true
-
-    store.find('model', 1).then(function(model) {
-      model.get('isDirty'); // false
-      model.set('foo', 'some value');
-      model.set('isDirty'); // true
-    });
-    ```
-
-    @property isDirty
-    @type {Boolean}
-    @readOnly
-  */
-  isDirty: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `saving` state. A
-    record enters the saving state when `save` is called, but the
-    adapter has not yet acknowledged that the changes have been
-    persisted to the backend.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('isSaving'); // false
-    var promise = record.save();
-    record.get('isSaving'); // true
-    promise.then(function() {
-      record.get('isSaving'); // false
-    });
-    ```
-
-    @property isSaving
-    @type {Boolean}
-    @readOnly
-  */
-  isSaving: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `deleted` state
-    and has been marked for deletion. When `isDeleted` is true and
-    `isDirty` is true, the record is deleted locally but the deletion
-    was not yet persisted. When `isSaving` is true, the change is
-    in-flight. When both `isDirty` and `isSaving` are false, the
-    change has persisted.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('isDeleted'); // false
-    record.deleteRecord();
-    record.get('isDeleted'); // true
-    ```
-
-    @property isDeleted
-    @type {Boolean}
-    @readOnly
-  */
-  isDeleted: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `new` state. A
-    record will be in the `new` state when it has been created on the
-    client and the adapter has not yet report that it was successfully
-    saved.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('isNew'); // true
-
-    record.save().then(function(model) {
-      model.get('isNew'); // false
-    });
-    ```
-
-    @property isNew
-    @type {Boolean}
-    @readOnly
-  */
-  isNew: retrieveFromCurrentState,
-  /**
-    If this property is `true` the record is in the `valid` state. A
-    record will be in the `valid` state when no client-side
-    validations have failed and the adapter did not report any
-    server-side validation failures.
-
-    @property isValid
-    @type {Boolean}
-    @readOnly
-  */
-  isValid: retrieveFromCurrentState,
-  /**
-    If the record is in the dirty state this property will report what
-    kind of change has caused it to move into the dirty
-    state. Possible values are:
-
-    - `created` The record has been created by the client and not yet saved to the adapter.
-    - `updated` The record has been updated by the client and not yet saved to the adapter.
-    - `deleted` The record has been deleted by the client and not yet saved to the adapter.
-
-    Example
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('dirtyType'); // 'created'
-    ```
-
-    @property dirtyType
-    @type {String}
-    @readOnly
-  */
-  dirtyType: retrieveFromCurrentState,
-
-  /**
-    If `true` the adapter reported that it was unable to save local
-    changes to the backend. This may also result in the record having
-    its `isValid` property become false if the adapter reported that
-    server-side validations failed.
-
-    Example
-
-    ```javascript
-    record.get('isError'); // false
-    record.set('foo', 'invalid value');
-    record.save().then(null, function() {
-      record.get('isError'); // true
-    });
-    ```
-
-    @property isError
-    @type {Boolean}
-    @readOnly
-  */
-  isError: false,
-  /**
-    If `true` the store is attempting to reload the record form the adapter.
-
-    Example
-
-    ```javascript
-    record.get('isReloading'); // false
-    record.reload();
-    record.get('isReloading'); // true
-    ```
-
-    @property isReloading
-    @type {Boolean}
-    @readOnly
-  */
-  isReloading: false,
-
-  /**
-    The `clientId` property is a transient numerical identifier
-    generated at runtime by the data store. It is important
-    primarily because newly created objects may not yet have an
-    externally generated id.
-
-    @property clientId
-    @private
-    @type {Number|String}
-  */
-  clientId: null,
-  /**
-    All ember models have an id property. This is an identifier
-    managed by an external source. These are always coerced to be
-    strings before being used internally. Note when declaring the
-    attributes for a model it is an error to declare an id
-    attribute.
-
-    ```javascript
-    var record = store.createRecord(App.Model);
-    record.get('id'); // null
-
-    store.find('model', 1).then(function(model) {
-      model.get('id'); // '1'
-    });
-    ```
-
-    @property id
-    @type {String}
-  */
-  id: null,
-  transaction: null,
-  /**
-    @property currentState
-    @private
-    @type {Object}
-  */
-  currentState: null,
-  /**
-    When the record is in the `invalid` state this object will contain
-    any errors returned by the adapter. When present the errors hash
-    typically contains keys corresponding to the invalid property names
-    and values which are an array of error messages.
-
-    ```javascript
-    record.get('errors.length'); // 0
-    record.set('foo', 'invalid value');
-    record.save().then(null, function() {
-      record.get('errors').get('foo'); // ['foo should be a number.']
-    });
-    ```
-
-    @property errors
-    @type {Object}
-  */
-  errors: null,
-
-  /**
-    Create a JSON representation of the record, using the serialization
-    strategy of the store's adapter.
-
-   `serialize` takes an optional hash as a parameter, currently
-    supported options are:
-
-   - `includeId`: `true` if the record's ID should be included in the
-      JSON representation.
-
-    @method serialize
-    @param {Object} options
-    @returns {Object} an object whose values are primitive JSON values only
-  */
-  serialize: function(options) {
-    var store = get(this, 'store');
-    return store.serialize(this, options);
-  },
-
-  /**
-    Use [DS.JSONSerializer](DS.JSONSerializer.html) to
-    get the JSON representation of a record.
-
-    `toJSON` takes an optional hash as a parameter, currently
-    supported options are:
-
-    - `includeId`: `true` if the record's ID should be included in the
-      JSON representation.
-
-    @method toJSON
-    @param {Object} options
-    @returns {Object} A JSON representation of the object.
-  */
-  toJSON: function(options) {
-    // container is for lazy transform lookups
-    var serializer = DS.JSONSerializer.create({ container: this.container });
-    return serializer.serialize(this, options);
-  },
-
-  /**
-    Fired when the record is loaded from the server.
-
-    @event didLoad
-  */
-  didLoad: Ember.K,
-
-  /**
-    Fired when the record is updated.
-
-    @event didUpdate
-  */
-  didUpdate: Ember.K,
-
-  /**
-    Fired when the record is created.
-
-    @event didCreate
-  */
-  didCreate: Ember.K,
-
-  /**
-    Fired when the record is deleted.
-
-    @event didDelete
-  */
-  didDelete: Ember.K,
-
-  /**
-    Fired when the record becomes invalid.
-
-    @event becameInvalid
-  */
-  becameInvalid: Ember.K,
-
-  /**
-    Fired when the record enters the error state.
-
-    @event becameError
-  */
-  becameError: Ember.K,
-
-  /**
-    @property data
-    @private
-    @type {Object}
-  */
-  data: Ember.computed(function() {
-    this._data = this._data || {};
-    return this._data;
-  }).property(),
-
-  _data: null,
-
-  init: function() {
-    set(this, 'currentState', DS.RootState.empty);
-    var errors = DS.Errors.create();
-    errors.registerHandlers(this, function() {
-      this.send('becameInvalid');
-    }, function() {
-      this.send('becameValid');
-    });
-    set(this, 'errors', errors);
-    this._super();
-    this._setup();
-  },
-
-  _setup: function() {
-    this._changesToSync = {};
-    this._deferredTriggers = [];
-    this._data = {};
-    this._attributes = {};
-    this._inFlightAttributes = {};
-    this._relationships = {};
-  },
-
-  /**
-    @method send
-    @private
-    @param {String} name
-    @param {Object} context
-  */
-  send: function(name, context) {
-    var currentState = get(this, 'currentState');
-
-    if (!currentState[name]) {
-      this._unhandledEvent(currentState, name, context);
-    }
-
-    return currentState[name](this, context);
-  },
-
-  /**
-    @method transitionTo
-    @private
-    @param {String} name
-  */
-  transitionTo: function(name) {
-    // POSSIBLE TODO: Remove this code and replace with
-    // always having direct references to state objects
-
-    var pivotName = name.split(".", 1),
-        currentState = get(this, 'currentState'),
-        state = currentState;
-
-    do {
-      if (state.exit) { state.exit(this); }
-      state = state.parentState;
-    } while (!state.hasOwnProperty(pivotName));
-
-    var path = name.split(".");
-
-    var setups = [], enters = [], i, l;
-
-    for (i=0, l=path.length; i<l; i++) {
-      state = state[path[i]];
-
-      if (state.enter) { enters.push(state); }
-      if (state.setup) { setups.push(state); }
-    }
-
-    for (i=0, l=enters.length; i<l; i++) {
-      enters[i].enter(this);
-    }
-
-    set(this, 'currentState', state);
-
-    for (i=0, l=setups.length; i<l; i++) {
-      setups[i].setup(this);
-    }
-
-    this.updateRecordArraysLater();
-  },
-
-  _unhandledEvent: function(state, name, context) {
-    var errorMessage = "Attempted to handle event `" + name + "` ";
-    errorMessage    += "on " + String(this) + " while in state ";
-    errorMessage    += state.stateName + ". ";
-
-    if (context !== undefined) {
-      errorMessage  += "Called with " + Ember.inspect(context) + ".";
-    }
-
-    throw new Ember.Error(errorMessage);
-  },
-
-  withTransaction: function(fn) {
-    var transaction = get(this, 'transaction');
-    if (transaction) { fn(transaction); }
-  },
-
-  /**
-    @method loadingData
-    @private
-    @param {Promise} promise
-  */
-  loadingData: function(promise) {
-    this.send('loadingData', promise);
-  },
-
-  /**
-    @method loadedData
-    @private
-  */
-  loadedData: function() {
-    this.send('loadedData');
-  },
-
-  /**
-    @method notFound
-    @private
-  */
-  notFound: function() {
-    this.send('notFound');
-  },
-
-  /**
-    @method pushedData
-    @private
-  */
-  pushedData: function() {
-    this.send('pushedData');
-  },
-
-  /**
-    Marks the record as deleted but does not save it. You must call
-    `save` afterwards if you want to persist it. You might use this
-    method if you want to allow the user to still `rollback()` a
-    delete after it was made.
-
-    Example
-
-    ```javascript
-    App.ModelDeleteRoute = Ember.Route.extend({
-      actions: {
-        softDelete: function() {
-          this.get('model').deleteRecord();
-        },
-        confirm: function() {
-          this.get('model').save();
-        },
-        undo: function() {
-          this.get('model').rollback();
-        }
-      }
-    });
-    ```
-
-    @method deleteRecord
-  */
-  deleteRecord: function() {
-    this.send('deleteRecord');
-  },
-
-  /**
-    Same as `deleteRecord`, but saves the record immediately.
-
-    Example
-
-    ```javascript
-    App.ModelDeleteRoute = Ember.Route.extend({
-      actions: {
-        delete: function() {
-          var controller = this.controller;
-          this.get('model').destroyRecord().then(function() {
-            controller.transitionToRoute('model.index');
-          });
-        }
-      }
-    });
-    ```
-
-    @method destroyRecord
-    @return {Promise} a promise that will be resolved when the adapter returns
-    successfully or rejected if the adapter returns with an error.
-  */
-  destroyRecord: function() {
-    this.deleteRecord();
-    return this.save();
-  },
-
-  /**
-    @method unloadRecord
-    @private
-  */
-  unloadRecord: function() {
-    Ember.assert("You can only unload a loaded, non-dirty record.", !get(this, 'isDirty'));
-
-    this.send('unloadRecord');
-  },
-
-  /**
-    @method clearRelationships
-    @private
-  */
-  clearRelationships: function() {
-    this.eachRelationship(function(name, relationship) {
-      if (relationship.kind === 'belongsTo') {
-        set(this, name, null);
-      } else if (relationship.kind === 'hasMany') {
-        var hasMany = this._relationships[relationship.name];
-        if (hasMany) { hasMany.clear(); }
-      }
-    }, this);
-  },
-
-  /**
-    @method updateRecordArrays
-    @private
-  */
-  updateRecordArrays: function() {
-    this._updatingRecordArraysLater = false;
-    get(this, 'store').dataWasUpdated(this.constructor, this);
-  },
-
-  /**
-    Returns an object, whose keys are changed properties, and value is
-    an [oldProp, newProp] array.
-
-    Example
-
-    ```javascript
-    App.Mascot = DS.Model.extend({
-      name: attr('string')
-    });
-
-    var person = store.createRecord('person');
-    person.changedAttributes(); // {}
-    person.set('name', 'Tomster');
-    person.changedAttributes(); // {name: [undefined, 'Tomster']}
-    ```
-
-    @method changedAttributes
-    @return {Object} an object, whose keys are changed properties,
-      and value is an [oldProp, newProp] array.
-  */
-  changedAttributes: function() {
-    var oldData = get(this, '_data'),
-        newData = get(this, '_attributes'),
-        diffData = {},
-        prop;
-
-    for (prop in newData) {
-      diffData[prop] = [oldData[prop], newData[prop]];
-    }
-
-    return diffData;
-  },
-
-  /**
-    @method adapterWillCommit
-    @private
-  */
-  adapterWillCommit: function() {
-    this.send('willCommit');
-  },
-
-  /**
-    If the adapter did not return a hash in response to a commit,
-    merge the changed attributes and relationships into the existing
-    saved data.
-
-    @method adapterDidCommit
-  */
-  adapterDidCommit: function(data) {
-    set(this, 'isError', false);
-
-    if (data) {
-      this._data = data;
-    } else {
-      Ember.mixin(this._data, this._inFlightAttributes);
-    }
-
-    this._inFlightAttributes = {};
-
-    this.send('didCommit');
-    this.updateRecordArraysLater();
-
-    if (!data) { return; }
-
-    this.suspendRelationshipObservers(function() {
-      this.notifyPropertyChange('data');
-    });
-  },
-
-  /**
-    @method adapterDidDirty
-    @private
-  */
-  adapterDidDirty: function() {
-    this.send('becomeDirty');
-    this.updateRecordArraysLater();
-  },
-
-  dataDidChange: Ember.observer(function() {
-    this.reloadHasManys();
-  }, 'data'),
-
-  reloadHasManys: function() {
-    var relationships = get(this.constructor, 'relationshipsByName');
-    this.updateRecordArraysLater();
-    relationships.forEach(function(name, relationship) {
-      if (this._data.links && this._data.links[name]) { return; }
-      if (relationship.kind === 'hasMany') {
-        this.hasManyDidChange(relationship.key);
-      }
-    }, this);
-  },
-
-  hasManyDidChange: function(key) {
-    var hasMany = this._relationships[key];
-
-    if (hasMany) {
-      var records = this._data[key] || [];
-
-      set(hasMany, 'content', Ember.A(records));
-      set(hasMany, 'isLoaded', true);
-      hasMany.trigger('didLoad');
-    }
-  },
-
-  /**
-    @method updateRecordArraysLater
-    @private
-  */
-  updateRecordArraysLater: function() {
-    // quick hack (something like this could be pushed into run.once
-    if (this._updatingRecordArraysLater) { return; }
-    this._updatingRecordArraysLater = true;
-
-    Ember.run.schedule('actions', this, this.updateRecordArrays);
-  },
-
-  /**
-    @method setupData
-    @private
-    @param {Object} data
-    @param {Boolean} partial the data should be merged into
-      the existing data, not replace it.
-  */
-  setupData: function(data, partial) {
-    if (partial) {
-      Ember.merge(this._data, data);
-    } else {
-      this._data = data;
-    }
-
-    var relationships = this._relationships;
-
-    this.eachRelationship(function(name, rel) {
-      if (data.links && data.links[name]) { return; }
-      if (rel.options.async) { relationships[name] = null; }
-    });
-
-    if (data) { this.pushedData(); }
-
-    this.suspendRelationshipObservers(function() {
-      this.notifyPropertyChange('data');
-    });
-  },
-
-  materializeId: function(id) {
-    set(this, 'id', id);
-  },
-
-  materializeAttributes: function(attributes) {
-    Ember.assert("Must pass a hash of attributes to materializeAttributes", !!attributes);
-    merge(this._data, attributes);
-  },
-
-  materializeAttribute: function(name, value) {
-    this._data[name] = value;
-  },
-
-  /**
-    @method updateHasMany
-    @private
-    @param {String} name
-    @param {Array} records
-  */
-  updateHasMany: function(name, records) {
-    this._data[name] = records;
-    this.hasManyDidChange(name);
-  },
-
-  /**
-    @method updateBelongsTo
-    @private
-    @param {String} name
-    @param {DS.Model} record
-  */
-  updateBelongsTo: function(name, record) {
-    this._data[name] = record;
-  },
-
-  /**
-    If the model `isDirty` this function will discard any unsaved
-    changes
-
-    Example
-
-    ```javascript
-    record.get('name'); // 'Untitled Document'
-    record.set('name', 'Doc 1');
-    record.get('name'); // 'Doc 1'
-    record.rollback();
-    record.get('name'); // 'Untitled Document'
-    ```
-
-    @method rollback
-  */
-  rollback: function() {
-    this._attributes = {};
-
-    if (get(this, 'isError')) {
-      this._inFlightAttributes = {};
-      set(this, 'isError', false);
-    }
-
-    if (!get(this, 'isValid')) {
-      this._inFlightAttributes = {};
-    }
-
-    this.send('rolledBack');
-
-    this.suspendRelationshipObservers(function() {
-      this.notifyPropertyChange('data');
-    });
-  },
-
-  toStringExtension: function() {
-    return get(this, 'id');
-  },
-
-  /**
-    The goal of this method is to temporarily disable specific observers
-    that take action in response to application changes.
-
-    This allows the system to make changes (such as materialization and
-    rollback) that should not trigger secondary behavior (such as setting an
-    inverse relationship or marking records as dirty).
-
-    The specific implementation will likely change as Ember proper provides
-    better infrastructure for suspending groups of observers, and if Array
-    observation becomes more unified with regular observers.
-
-    @method suspendRelationshipObservers
-    @private
-    @param callback
-    @param binding
-  */
-  suspendRelationshipObservers: function(callback, binding) {
-    var observers = get(this.constructor, 'relationshipNames').belongsTo;
-    var self = this;
-
-    try {
-      this._suspendedRelationships = true;
-      Ember._suspendObservers(self, observers, null, 'belongsToDidChange', function() {
-        Ember._suspendBeforeObservers(self, observers, null, 'belongsToWillChange', function() {
-          callback.call(binding || self);
-        });
-      });
-    } finally {
-      this._suspendedRelationships = false;
-    }
-  },
-
-  /**
-    Save the record and persist any changes to the record to an
-    extenal source via the adapter.
-
-    Example
-
-    ```javascript
-    record.set('name', 'Tomster');
-    record.save().then(function(){
-      // Success callback
-    }, function() {
-      // Error callback
-    });
-    ```
-    @method save
-    @return {Promise} a promise that will be resolved when the adapter returns
-    successfully or rejected if the adapter returns with an error.
-  */
-  save: function() {
-    var promiseLabel = "DS: Model#save " + this;
-    var resolver = Ember.RSVP.defer(promiseLabel);
-
-    this.get('store').scheduleSave(this, resolver);
-    this._inFlightAttributes = this._attributes;
-    this._attributes = {};
-
-    return DS.PromiseObject.create({ promise: resolver.promise });
-  },
-
-  /**
-    Reload the record from the adapter.
-
-    This will only work if the record has already finished loading
-    and has not yet been modified (`isLoaded` but not `isDirty`,
-    or `isSaving`).
-
-    Example
-
-    ```javascript
-    App.ModelViewRoute = Ember.Route.extend({
-      actions: {
-        reload: function() {
-          this.get('model').reload();
-        }
-      }
-    });
-    ```
-
-    @method reload
-    @return {Promise} a promise that will be resolved with the record when the
-    adapter returns successfully or rejected if the adapter returns
-    with an error.
-  */
-  reload: function() {
-    set(this, 'isReloading', true);
-
-    var  record = this;
-
-    var promiseLabel = "DS: Model#reload of " + this;
-    var promise = new Ember.RSVP.Promise(function(resolve){
-       record.send('reloadRecord', resolve);
-    }, promiseLabel).then(function() {
-      record.set('isReloading', false);
-      record.set('isError', false);
-      return record;
-    }, function(reason) {
-      record.set('isError', true);
-      throw reason;
-    }, "DS: Model#reload complete, update flags");
-
-    return DS.PromiseObject.create({ promise: promise });
-  },
-
-  // FOR USE DURING COMMIT PROCESS
-
-  adapterDidUpdateAttribute: function(attributeName, value) {
-
-    // If a value is passed in, update the internal attributes and clear
-    // the attribute cache so it picks up the new value. Otherwise,
-    // collapse the current value into the internal attributes because
-    // the adapter has acknowledged it.
-    if (value !== undefined) {
-      this._data[attributeName] = value;
-      this.notifyPropertyChange(attributeName);
-    } else {
-      this._data[attributeName] = this._inFlightAttributes[attributeName];
-    }
-
-    this.updateRecordArraysLater();
-  },
-
-  /**
-    @method adapterDidInvalidate
-    @private
-  */
-  adapterDidInvalidate: function(errors) {
-    var recordErrors = get(this, 'errors');
-    function addError(name) {
-      if (errors[name]) {
-        recordErrors.add(name, errors[name]);
-      }
-    }
-
-    this.eachAttribute(addError);
-    this.eachRelationship(addError);
-  },
-
-  /**
-    @method adapterDidError
-    @private
-  */
-  adapterDidError: function() {
-    this.send('becameError');
-    set(this, 'isError', true);
-  },
-
-  /**
-    Override the default event firing from Ember.Evented to
-    also call methods with the given name.
-
-    @method trigger
-    @private
-    @param name
-  */
-  trigger: function(name) {
-    Ember.tryInvoke(this, name, [].slice.call(arguments, 1));
-    this._super.apply(this, arguments);
-  },
-
-  triggerLater: function() {
-    if (this._deferredTriggers.push(arguments) !== 1) { return; }
-    Ember.run.schedule('actions', this, '_triggerDeferredTriggers');
-  },
-
-  _triggerDeferredTriggers: function() {
-    for (var i=0, l=this._deferredTriggers.length; i<l; i++) {
-      this.trigger.apply(this, this._deferredTriggers[i]);
-    }
-
-    this._deferredTriggers.length = 0;
-  }
-});
-
-DS.Model.reopenClass({
-
-  /**
-    Alias DS.Model's `create` method to `_create`. This allows us to create DS.Model
-    instances from within the store, but if end users accidentally call `create()`
-    (instead of `createRecord()`), we can raise an error.
-
-    @method _create
-    @private
-    @static
-  */
-  _create: DS.Model.create,
-
-  /**
-    Override the class' `create()` method to raise an error. This
-    prevents end users from inadvertently calling `create()` instead
-    of `createRecord()`. The store is still able to create instances
-    by calling the `_create()` method. To create an instance of a
-    `DS.Model` use [store.createRecord](DS.Store.html#method_createRecord).
-
-    @method create
-    @private
-    @static
-  */
-  create: function() {
-    throw new Ember.Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.");
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get;
-
-/**
-  @class Model
-  @namespace DS
-*/
-DS.Model.reopenClass({
-  /**
-    A map whose keys are the attributes of the model (properties
-    described by DS.attr) and whose values are the meta object for the
-    property.
-
-    Example
-
-    ```javascript
-
-    App.Person = DS.Model.extend({
-      firstName: attr('string'),
-      lastName: attr('string'),
-      birthday: attr('date')
-    });
-
-    var attributes = Ember.get(App.Person, 'attributes')
-
-    attributes.forEach(function(name, meta) {
-      console.log(name, meta);
-    });
-
-    // prints:
-    // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
-    // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
-    // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
-    ```
-
-    @property attributes
-    @static
-    @type {Ember.Map}
-    @readOnly
-  */
-  attributes: Ember.computed(function() {
-    var map = Ember.Map.create();
-
-    this.eachComputedProperty(function(name, meta) {
-      if (meta.isAttribute) {
-        Ember.assert("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from " + this.toString(), name !== 'id');
-
-        meta.name = name;
-        map.set(name, meta);
-      }
-    });
-
-    return map;
-  }),
-
-  /**
-    A map whose keys are the attributes of the model (properties
-    described by DS.attr) and whose values are type of transformation
-    applied to each attribute. This map does not include any
-    attributes that do not have an transformation type.
-
-    Example
-
-    ```javascript
-    App.Person = DS.Model.extend({
-      firstName: attr(),
-      lastName: attr('string'),
-      birthday: attr('date')
-    });
-
-    var transformedAttributes = Ember.get(App.Person, 'transformedAttributes')
-
-    transformedAttributes.forEach(function(field, type) {
-      console.log(field, type);
-    });
-
-    // prints:
-    // lastName string
-    // birthday date
-    ```
-
-    @property transformedAttributes
-    @static
-    @type {Ember.Map}
-    @readOnly
-  */
-  transformedAttributes: Ember.computed(function() {
-    var map = Ember.Map.create();
-
-    this.eachAttribute(function(key, meta) {
-      if (meta.type) {
-        map.set(key, meta.type);
-      }
-    });
-
-    return map;
-  }),
-
-  /**
-    Iterates through the attributes of the model, calling the passed function on each
-    attribute.
-
-    The callback method you provide should have the following signature (all
-    parameters are optional):
-
-    ```javascript
-    function(name, meta);
-    ```
-
-    - `name` the name of the current property in the iteration
-    - `meta` the meta object for the attribute property in the iteration
-
-    Note that in addition to a callback, you can also pass an optional target
-    object that will be set as `this` on the context.
-
-    Example
-
-    ```javascript
-    App.Person = DS.Model.extend({
-      firstName: attr('string'),
-      lastName: attr('string'),
-      birthday: attr('date')
-    });
-
-    App.Person.eachAttribute(function(name, meta) {
-      console.log(name, meta);
-    });
-
-    // prints:
-    // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
-    // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
-    // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
-   ```
-
-    @method eachAttribute
-    @param {Function} callback The callback to execute
-    @param {Object} [target] The target object to use
-    @static
-  */
-  eachAttribute: function(callback, binding) {
-    get(this, 'attributes').forEach(function(name, meta) {
-      callback.call(binding, name, meta);
-    }, binding);
-  },
-
-  /**
-    Iterates through the transformedAttributes of the model, calling
-    the passed function on each attribute. Note the callback will not be
-    called for any attributes that do not have an transformation type.
-
-    The callback method you provide should have the following signature (all
-    parameters are optional):
-
-    ```javascript
-    function(name, type);
-    ```
-
-    - `name` the name of the current property in the iteration
-    - `type` a string containing the name of the type of transformed
-      applied to the attribute
-
-    Note that in addition to a callback, you can also pass an optional target
-    object that will be set as `this` on the context.
-
-    Example
-
-    ```javascript
-    App.Person = DS.Model.extend({
-      firstName: attr(),
-      lastName: attr('string'),
-      birthday: attr('date')
-    });
-
-    App.Person.eachTransformedAttribute(function(name, type) {
-      console.log(name, type);
-    });
-
-    // prints:
-    // lastName string
-    // birthday date
-   ```
-
-    @method eachTransformedAttribute
-    @param {Function} callback The callback to execute
-    @param {Object} [target] The target object to use
-    @static
-  */
-  eachTransformedAttribute: function(callback, binding) {
-    get(this, 'transformedAttributes').forEach(function(name, type) {
-      callback.call(binding, name, type);
-    });
-  }
-});
-
-
-DS.Model.reopen({
-  eachAttribute: function(callback, binding) {
-    this.constructor.eachAttribute(callback, binding);
-  }
-});
-
-function getDefaultValue(record, options, key) {
-  if (typeof options.defaultValue === "function") {
-    return options.defaultValue();
-  } else {
-    return options.defaultValue;
-  }
-}
-
-function hasValue(record, key) {
-  return record._attributes.hasOwnProperty(key) ||
-         record._inFlightAttributes.hasOwnProperty(key) ||
-         record._data.hasOwnProperty(key);
-}
-
-function getValue(record, key) {
-  if (record._attributes.hasOwnProperty(key)) {
-    return record._attributes[key];
-  } else if (record._inFlightAttributes.hasOwnProperty(key)) {
-    return record._inFlightAttributes[key];
-  } else {
-    return record._data[key];
-  }
-}
-
-/**
-  `DS.attr` defines an attribute on a [DS.Model](DS.Model.html).
-  By default, attributes are passed through as-is, however you can specify an
-  optional type to have the value automatically transformed.
-  Ember Data ships with four basic transform types: `string`, `number`,
-  `boolean` and `date`. You can define your own transforms by subclassing
-  [DS.Transform](DS.Transform.html).
-
-  `DS.attr` takes an optional hash as a second parameter, currently
-  supported options are:
-
-  - `defaultValue`: Pass a string or a function to be called to set the attribute
-                    to a default value if none is supplied.
-
-  Example
-
-  ```javascript
-  var attr = DS.attr;
-
-  App.User = DS.Model.extend({
-    username: attr('string'),
-    email: attr('string'),
-    verified: attr('boolean', {defaultValue: false})
-  });
-  ```
-
-  @namespace
-  @method attr
-  @for DS
-  @param {String} type the attribute type
-  @param {Object} options a hash of options
-  @return {Attribute}
-*/
-
-DS.attr = function(type, options) {
-  options = options || {};
-
-  var meta = {
-    type: type,
-    isAttribute: true,
-    options: options
-  };
-
-  return Ember.computed(function(key, value) {
-    if (arguments.length > 1) {
-      Ember.assert("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from " + this.constructor.toString(), key !== 'id');
-      var oldValue = this._attributes[key] || this._inFlightAttributes[key] || this._data[key];
-
-      this.send('didSetProperty', {
-        name: key,
-        oldValue: oldValue,
-        originalValue: this._data[key],
-        value: value
-      });
-
-      this._attributes[key] = value;
-      return value;
-    } else if (hasValue(this, key)) {
-      return getValue(this, key);
-    } else {
-      return getDefaultValue(this, options, key);
-    }
-
-  // `data` is never set directly. However, it may be
-  // invalidated from the state manager's setData
-  // event.
-  }).property('data').meta(meta);
-};
-
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-/**
-  An AttributeChange object is created whenever a record's
-  attribute changes value. It is used to track changes to a
-  record between transaction commits.
-
-  @class AttributeChange
-  @namespace DS
-  @private
-  @constructor
-*/
-var AttributeChange = DS.AttributeChange = function(options) {
-  this.record = options.record;
-  this.store = options.store;
-  this.name = options.name;
-  this.value = options.value;
-  this.oldValue = options.oldValue;
-};
-
-AttributeChange.createChange = function(options) {
-  return new AttributeChange(options);
-};
-
-AttributeChange.prototype = {
-  sync: function() {
-    if (this.value !== this.oldValue) {
-      this.record.send('becomeDirty');
-      this.record.updateRecordArraysLater();
-    }
-
-    // TODO: Use this object in the commit process
-    this.destroy();
-  },
-
-  /**
-    If the AttributeChange is destroyed (either by being rolled back
-    or being committed), remove it from the list of pending changes
-    on the record.
-
-    @method destroy
-  */
-  destroy: function() {
-    delete this.record._changesToSync[this.name];
-  }
-};
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var forEach = Ember.EnumerableUtils.forEach;
-
-/**
-  @class RelationshipChange
-  @namespace DS
-  @private
-  @constructor
-*/
-DS.RelationshipChange = function(options) {
-  this.parentRecord = options.parentRecord;
-  this.childRecord = options.childRecord;
-  this.firstRecord = options.firstRecord;
-  this.firstRecordKind = options.firstRecordKind;
-  this.firstRecordName = options.firstRecordName;
-  this.secondRecord = options.secondRecord;
-  this.secondRecordKind = options.secondRecordKind;
-  this.secondRecordName = options.secondRecordName;
-  this.changeType = options.changeType;
-  this.store = options.store;
-
-  this.committed = {};
-};
-
-/**
-  @class RelationshipChangeAdd
-  @namespace DS
-  @private
-  @constructor
-*/
-DS.RelationshipChangeAdd = function(options){
-  DS.RelationshipChange.call(this, options);
-};
-
-/**
-  @class RelationshipChangeRemove
-  @namespace DS
-  @private
-  @constructor
-*/
-DS.RelationshipChangeRemove = function(options){
-  DS.RelationshipChange.call(this, options);
-};
-
-DS.RelationshipChange.create = function(options) {
-  return new DS.RelationshipChange(options);
-};
-
-DS.RelationshipChangeAdd.create = function(options) {
-  return new DS.RelationshipChangeAdd(options);
-};
-
-DS.RelationshipChangeRemove.create = function(options) {
-  return new DS.RelationshipChangeRemove(options);
-};
-
-DS.OneToManyChange = {};
-DS.OneToNoneChange = {};
-DS.ManyToNoneChange = {};
-DS.OneToOneChange = {};
-DS.ManyToManyChange = {};
-
-DS.RelationshipChange._createChange = function(options){
-  if(options.changeType === "add"){
-    return DS.RelationshipChangeAdd.create(options);
-  }
-  if(options.changeType === "remove"){
-    return DS.RelationshipChangeRemove.create(options);
-  }
-};
-
-
-DS.RelationshipChange.determineRelationshipType = function(recordType, knownSide){
-  var knownKey = knownSide.key, key, otherKind;
-  var knownKind = knownSide.kind;
-
-  var inverse = recordType.inverseFor(knownKey);
-
-  if (inverse){
-    key = inverse.name;
-    otherKind = inverse.kind;
-  }
-
-  if (!inverse){
-    return knownKind === "belongsTo" ? "oneToNone" : "manyToNone";
-  }
-  else{
-    if(otherKind === "belongsTo"){
-      return knownKind === "belongsTo" ? "oneToOne" : "manyToOne";
-    }
-    else{
-      return knownKind === "belongsTo" ? "oneToMany" : "manyToMany";
-    }
-  }
-
-};
-
-DS.RelationshipChange.createChange = function(firstRecord, secondRecord, store, options){
-  // Get the type of the child based on the child's client ID
-  var firstRecordType = firstRecord.constructor, changeType;
-  changeType = DS.RelationshipChange.determineRelationshipType(firstRecordType, options);
-  if (changeType === "oneToMany"){
-    return DS.OneToManyChange.createChange(firstRecord, secondRecord, store, options);
-  }
-  else if (changeType === "manyToOne"){
-    return DS.OneToManyChange.createChange(secondRecord, firstRecord, store, options);
-  }
-  else if (changeType === "oneToNone"){
-    return DS.OneToNoneChange.createChange(firstRecord, secondRecord, store, options);
-  }
-  else if (changeType === "manyToNone"){
-    return DS.ManyToNoneChange.createChange(firstRecord, secondRecord, store, options);
-  }
-  else if (changeType === "oneToOne"){
-    return DS.OneToOneChange.createChange(firstRecord, secondRecord, store, options);
-  }
-  else if (changeType === "manyToMany"){
-    return DS.ManyToManyChange.createChange(firstRecord, secondRecord, store, options);
-  }
-};
-
-DS.OneToNoneChange.createChange = function(childRecord, parentRecord, store, options) {
-  var key = options.key;
-  var change = DS.RelationshipChange._createChange({
-      parentRecord: parentRecord,
-      childRecord: childRecord,
-      firstRecord: childRecord,
-      store: store,
-      changeType: options.changeType,
-      firstRecordName: key,
-      firstRecordKind: "belongsTo"
-  });
-
-  store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change);
-
-  return change;
-};
-
-DS.ManyToNoneChange.createChange = function(childRecord, parentRecord, store, options) {
-  var key = options.key;
-  var change = DS.RelationshipChange._createChange({
-      parentRecord: childRecord,
-      childRecord: parentRecord,
-      secondRecord: childRecord,
-      store: store,
-      changeType: options.changeType,
-      secondRecordName: options.key,
-      secondRecordKind: "hasMany"
-  });
-
-  store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change);
-  return change;
-};
-
-
-DS.ManyToManyChange.createChange = function(childRecord, parentRecord, store, options) {
-  // If the name of the belongsTo side of the relationship is specified,
-  // use that
-  // If the type of the parent is specified, look it up on the child's type
-  // definition.
-  var key = options.key;
-
-  var change = DS.RelationshipChange._createChange({
-      parentRecord: parentRecord,
-      childRecord: childRecord,
-      firstRecord: childRecord,
-      secondRecord: parentRecord,
-      firstRecordKind: "hasMany",
-      secondRecordKind: "hasMany",
-      store: store,
-      changeType: options.changeType,
-      firstRecordName:  key
-  });
-
-  store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change);
-
-
-  return change;
-};
-
-DS.OneToOneChange.createChange = function(childRecord, parentRecord, store, options) {
-  var key;
-
-  // If the name of the belongsTo side of the relationship is specified,
-  // use that
-  // If the type of the parent is specified, look it up on the child's type
-  // definition.
-  if (options.parentType) {
-    key = options.parentType.inverseFor(options.key).name;
-  } else if (options.key) {
-    key = options.key;
-  } else {
-    Ember.assert("You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent", false);
-  }
-
-  var change = DS.RelationshipChange._createChange({
-      parentRecord: parentRecord,
-      childRecord: childRecord,
-      firstRecord: childRecord,
-      secondRecord: parentRecord,
-      firstRecordKind: "belongsTo",
-      secondRecordKind: "belongsTo",
-      store: store,
-      changeType: options.changeType,
-      firstRecordName:  key
-  });
-
-  store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change);
-
-
-  return change;
-};
-
-DS.OneToOneChange.maintainInvariant = function(options, store, childRecord, key){
-  if (options.changeType === "add" && store.recordIsMaterialized(childRecord)) {
-    var oldParent = get(childRecord, key);
-    if (oldParent){
-      var correspondingChange = DS.OneToOneChange.createChange(childRecord, oldParent, store, {
-          parentType: options.parentType,
-          hasManyName: options.hasManyName,
-          changeType: "remove",
-          key: options.key
-        });
-      store.addRelationshipChangeFor(childRecord, key, options.parentRecord , null, correspondingChange);
-     correspondingChange.sync();
-    }
-  }
-};
-
-DS.OneToManyChange.createChange = function(childRecord, parentRecord, store, options) {
-  var key;
-
-  // If the name of the belongsTo side of the relationship is specified,
-  // use that
-  // If the type of the parent is specified, look it up on the child's type
-  // definition.
-  if (options.parentType) {
-    key = options.parentType.inverseFor(options.key).name;
-    DS.OneToManyChange.maintainInvariant( options, store, childRecord, key );
-  } else if (options.key) {
-    key = options.key;
-  } else {
-    Ember.assert("You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent", false);
-  }
-
-  var change = DS.RelationshipChange._createChange({
-      parentRecord: parentRecord,
-      childRecord: childRecord,
-      firstRecord: childRecord,
-      secondRecord: parentRecord,
-      firstRecordKind: "belongsTo",
-      secondRecordKind: "hasMany",
-      store: store,
-      changeType: options.changeType,
-      firstRecordName:  key
-  });
-
-  store.addRelationshipChangeFor(childRecord, key, parentRecord, change.getSecondRecordName(), change);
-
-
-  return change;
-};
-
-
-DS.OneToManyChange.maintainInvariant = function(options, store, childRecord, key){
-  if (options.changeType === "add" && childRecord) {
-    var oldParent = get(childRecord, key);
-    if (oldParent){
-      var correspondingChange = DS.OneToManyChange.createChange(childRecord, oldParent, store, {
-          parentType: options.parentType,
-          hasManyName: options.hasManyName,
-          changeType: "remove",
-          key: options.key
-        });
-      store.addRelationshipChangeFor(childRecord, key, options.parentRecord, correspondingChange.getSecondRecordName(), correspondingChange);
-      correspondingChange.sync();
-    }
-  }
-};
-
-/**
-  @class RelationshipChange
-  @namespace DS
-*/
-DS.RelationshipChange.prototype = {
-
-  getSecondRecordName: function() {
-    var name = this.secondRecordName, parent;
-
-    if (!name) {
-      parent = this.secondRecord;
-      if (!parent) { return; }
-
-      var childType = this.firstRecord.constructor;
-      var inverse = childType.inverseFor(this.firstRecordName);
-      this.secondRecordName = inverse.name;
-    }
-
-    return this.secondRecordName;
-  },
-
-  /**
-    Get the name of the relationship on the belongsTo side.
-
-    @method getFirstRecordName
-    @return {String}
-  */
-  getFirstRecordName: function() {
-    var name = this.firstRecordName;
-    return name;
-  },
-
-  /**
-    @method destroy
-    @private
-  */
-  destroy: function() {
-    var childRecord = this.childRecord,
-        belongsToName = this.getFirstRecordName(),
-        hasManyName = this.getSecondRecordName(),
-        store = this.store;
-
-    store.removeRelationshipChangeFor(childRecord, belongsToName, this.parentRecord, hasManyName, this.changeType);
-  },
-
-  getSecondRecord: function(){
-    return this.secondRecord;
-  },
-
-  /**
-    @method getFirstRecord
-    @private
-  */
-  getFirstRecord: function() {
-    return this.firstRecord;
-  },
-
-  coalesce: function(){
-    var relationshipPairs = this.store.relationshipChangePairsFor(this.firstRecord);
-    forEach(relationshipPairs, function(pair){
-      var addedChange = pair["add"];
-      var removedChange = pair["remove"];
-      if(addedChange && removedChange) {
-        addedChange.destroy();
-        removedChange.destroy();
-      }
-    });
-  }
-};
-
-DS.RelationshipChangeAdd.prototype = Ember.create(DS.RelationshipChange.create({}));
-DS.RelationshipChangeRemove.prototype = Ember.create(DS.RelationshipChange.create({}));
-
-// the object is a value, and not a promise
-function isValue(object) {
-  return typeof object === 'object' && (!object.then || typeof object.then !== 'function');
-}
-
-DS.RelationshipChangeAdd.prototype.changeType = "add";
-DS.RelationshipChangeAdd.prototype.sync = function() {
-  var secondRecordName = this.getSecondRecordName(),
-      firstRecordName = this.getFirstRecordName(),
-      firstRecord = this.getFirstRecord(),
-      secondRecord = this.getSecondRecord();
-
-  //Ember.assert("You specified a hasMany (" + hasManyName + ") on " + (!belongsToName && (newParent || oldParent || this.lastParent).constructor) + " but did not specify an inverse belongsTo on " + child.constructor, belongsToName);
-  //Ember.assert("You specified a belongsTo (" + belongsToName + ") on " + child.constructor + " but did not specify an inverse hasMany on " + (!hasManyName && (newParent || oldParent || this.lastParentRecord).constructor), hasManyName);
-
-  if (secondRecord instanceof DS.Model && firstRecord instanceof DS.Model) {
-    if(this.secondRecordKind === "belongsTo"){
-      secondRecord.suspendRelationshipObservers(function(){
-        set(secondRecord, secondRecordName, firstRecord);
-      });
-
-     }
-     else if(this.secondRecordKind === "hasMany"){
-      secondRecord.suspendRelationshipObservers(function(){
-        var relationship = get(secondRecord, secondRecordName);
-        if (isValue(relationship)) { relationship.addObject(firstRecord); }
-      });
-    }
-  }
-
-  if (firstRecord instanceof DS.Model && secondRecord instanceof DS.Model && get(firstRecord, firstRecordName) !== secondRecord) {
-    if(this.firstRecordKind === "belongsTo"){
-      firstRecord.suspendRelationshipObservers(function(){
-        set(firstRecord, firstRecordName, secondRecord);
-      });
-    }
-    else if(this.firstRecordKind === "hasMany"){
-      firstRecord.suspendRelationshipObservers(function(){
-        var relationship = get(firstRecord, firstRecordName);
-        if (isValue(relationship)) { relationship.addObject(secondRecord); }
-      });
-    }
-  }
-
-  this.coalesce();
-};
-
-DS.RelationshipChangeRemove.prototype.changeType = "remove";
-DS.RelationshipChangeRemove.prototype.sync = function() {
-  var secondRecordName = this.getSecondRecordName(),
-      firstRecordName = this.getFirstRecordName(),
-      firstRecord = this.getFirstRecord(),
-      secondRecord = this.getSecondRecord();
-
-  //Ember.assert("You specified a hasMany (" + hasManyName + ") on " + (!belongsToName && (newParent || oldParent || this.lastParent).constructor) + " but did not specify an inverse belongsTo on " + child.constructor, belongsToName);
-  //Ember.assert("You specified a belongsTo (" + belongsToName + ") on " + child.constructor + " but did not specify an inverse hasMany on " + (!hasManyName && (newParent || oldParent || this.lastParentRecord).constructor), hasManyName);
-
-  if (secondRecord instanceof DS.Model && firstRecord instanceof DS.Model) {
-    if(this.secondRecordKind === "belongsTo"){
-      secondRecord.suspendRelationshipObservers(function(){
-        set(secondRecord, secondRecordName, null);
-      });
-    }
-    else if(this.secondRecordKind === "hasMany"){
-      secondRecord.suspendRelationshipObservers(function(){
-        var relationship = get(secondRecord, secondRecordName);
-        if (isValue(relationship)) { relationship.removeObject(firstRecord); }
-      });
-    }
-  }
-
-  if (firstRecord instanceof DS.Model && get(firstRecord, firstRecordName)) {
-    if(this.firstRecordKind === "belongsTo"){
-      firstRecord.suspendRelationshipObservers(function(){
-        set(firstRecord, firstRecordName, null);
-      });
-     }
-     else if(this.firstRecordKind === "hasMany"){
-       firstRecord.suspendRelationshipObservers(function(){
-         var relationship = get(firstRecord, firstRecordName);
-         if (isValue(relationship)) { relationship.removeObject(secondRecord); }
-      });
-    }
-  }
-
-  this.coalesce();
-};
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-var get = Ember.get, set = Ember.set,
-    isNone = Ember.isNone;
-
-/**
-  @module ember-data
-*/
-
-function asyncBelongsTo(type, options, meta) {
-  return Ember.computed(function(key, value) {
-    var data = get(this, 'data'),
-        store = get(this, 'store'),
-        promiseLabel = "DS: Async belongsTo " + this + " : " + key;
-
-    if (arguments.length === 2) {
-      Ember.assert("You can only add a '" + type + "' record to this relationship", !value || value instanceof store.modelFor(type));
-      return value === undefined ? null : DS.PromiseObject.create({ promise: Ember.RSVP.resolve(value, promiseLabel) });
-    }
-
-    var link = data.links && data.links[key],
-        belongsTo = data[key];
-
-    if(!isNone(belongsTo)) {
-      var promise = store.fetchRecord(belongsTo) || Ember.RSVP.resolve(belongsTo, promiseLabel);
-      return DS.PromiseObject.create({ promise: promise});
-    } else if (link) {
-      var resolver = Ember.RSVP.defer("DS: Async belongsTo (link) " + this + " : " + key);
-      store.findBelongsTo(this, link, meta, resolver);
-      return DS.PromiseObject.create({ promise: resolver.promise });
-    } else {
-      return null;
-    }
-  }).property('data').meta(meta);
-}
-
-/**
-  `DS.belongsTo` is used to define One-To-One and One-To-Many
-  relationships on a [DS.Model](DS.Model.html).
-
-
-  `DS.belongsTo` takes an optional hash as a second parameter, currently
-  supported options are:
-
-  - `async`: A boolean value used to explicitly declare this to be an async relationship.
-  - `inverse`: A string used to identify the inverse property on a
-    related model in a One-To-Many relationship. See [Explicit Inverses](#toc_explicit-inverses)
-
-  #### One-To-One
-  To declare a one-to-one relationship between two models, use
-  `DS.belongsTo`:
-
-  ```javascript
-  App.User = DS.Model.extend({
-    profile: DS.belongsTo('profile')
-  });
-
-  App.Profile = DS.Model.extend({
-    user: DS.belongsTo('user')
-  });
-  ```
-
-  #### One-To-Many
-  To declare a one-to-many relationship between two models, use
-  `DS.belongsTo` in combination with `DS.hasMany`, like this:
-
-  ```javascript
-  App.Post = DS.Model.extend({
-    comments: DS.hasMany('comment')
-  });
-
-  App.Comment = DS.Model.extend({
-    post: DS.belongsTo('post')
-  });
-  ```
-
-  @namespace
-  @method belongsTo
-  @for DS
-  @param {String or DS.Model} type the model type of the relationship
-  @param {Object} options a hash of options
-  @return {Ember.computed} relationship
-*/
-DS.belongsTo = function(type, options) {
-  if (typeof type === 'object') {
-    options = type;
-    type = undefined;
-  } else {
-    Ember.assert("The first argument DS.belongsTo must be a model type or string, like DS.belongsTo(App.Person)", !!type && (typeof type === 'string' || DS.Model.detect(type)));
-  }
-
-  options = options || {};
-
-  var meta = { type: type, isRelationship: true, options: options, kind: 'belongsTo' };
-
-  if (options.async) {
-    return asyncBelongsTo(type, options, meta);
-  }
-
-  return Ember.computed(function(key, value) {
-    var data = get(this, 'data'),
-        store = get(this, 'store'), belongsTo, typeClass;
-
-    if (typeof type === 'string') {
-      typeClass = store.modelFor(type);
-    } else {
-      typeClass = type;
-    }
-
-    if (arguments.length === 2) {
-      Ember.assert("You can only add a '" + type + "' record to this relationship", !value || value instanceof typeClass);
-      return value === undefined ? null : value;
-    }
-
-    belongsTo = data[key];
-
-    if (isNone(belongsTo)) { return null; }
-
-    store.fetchRecord(belongsTo);
-
-    return belongsTo;
-  }).property('data').meta(meta);
-};
-
-/**
-  These observers observe all `belongsTo` relationships on the record. See
-  `relationships/ext` to see how these observers get their dependencies.
-
-  @class Model
-  @namespace DS
-*/
-DS.Model.reopen({
-
-  /**
-    @method belongsToWillChange
-    @private
-    @static
-    @param record
-    @param key
-  */
-  belongsToWillChange: Ember.beforeObserver(function(record, key) {
-    if (get(record, 'isLoaded')) {
-      var oldParent = get(record, key);
-
-      if (oldParent) {
-        var store = get(record, 'store'),
-            change = DS.RelationshipChange.createChange(record, oldParent, store, { key: key, kind: "belongsTo", changeType: "remove" });
-
-        change.sync();
-        this._changesToSync[key] = change;
-      }
-    }
-  }),
-
-  /**
-    @method belongsToDidChange
-    @private
-    @static
-    @param record
-    @param key
-  */
-  belongsToDidChange: Ember.immediateObserver(function(record, key) {
-    if (get(record, 'isLoaded')) {
-      var newParent = get(record, key);
-
-      if (newParent) {
-        var store = get(record, 'store'),
-            change = DS.RelationshipChange.createChange(record, newParent, store, { key: key, kind: "belongsTo", changeType: "add" });
-
-        change.sync();
-      }
-    }
-
-    delete this._changesToSync[key];
-  })
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set, setProperties = Ember.setProperties;
-
-function asyncHasMany(type, options, meta) {
-  return Ember.computed(function(key, value) {
-    var relationship = this._relationships[key],
-        promiseLabel = "DS: Async hasMany " + this + " : " + key;
-
-    if (!relationship) {
-      var resolver = Ember.RSVP.defer(promiseLabel);
-      relationship = buildRelationship(this, key, options, function(store, data) {
-        var link = data.links && data.links[key];
-        var rel;
-        if (link) {
-          rel = store.findHasMany(this, link, meta, resolver);
-        } else {
-          rel = store.findMany(this, data[key], meta.type, resolver);
-        }
-        // cache the promise so we can use it
-        // when we come back and don't need to rebuild
-        // the relationship.
-        set(rel, 'promise', resolver.promise);
-        return rel;
-      });
-    }
-
-    var promise = relationship.get('promise').then(function() {
-      return relationship;
-    }, null, "DS: Async hasMany records received");
-
-    return DS.PromiseArray.create({ promise: promise });
-  }).property('data').meta(meta);
-}
-
-function buildRelationship(record, key, options, callback) {
-  var rels = record._relationships;
-
-  if (rels[key]) { return rels[key]; }
-
-  var data = get(record, 'data'),
-      store = get(record, 'store');
-
-  var relationship = rels[key] = callback.call(record, store, data);
-
-  return setProperties(relationship, {
-    owner: record, name: key, isPolymorphic: options.polymorphic
-  });
-}
-
-function hasRelationship(type, options) {
-  options = options || {};
-
-  var meta = { type: type, isRelationship: true, options: options, kind: 'hasMany' };
-
-  if (options.async) {
-    return asyncHasMany(type, options, meta);
-  }
-
-  return Ember.computed(function(key, value) {
-    return buildRelationship(this, key, options, function(store, data) {
-      var records = data[key];
-      Ember.assert("You looked up the '" + key + "' relationship on '" + this + "' but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)", Ember.A(records).everyProperty('isEmpty', false));
-      return store.findMany(this, data[key], meta.type);
-    });
-  }).property('data').meta(meta);
-}
-
-/**
-  `DS.hasMany` is used to define One-To-Many and Many-To-Many
-  relationships on a [DS.Model](DS.Model.html).
-
-  `DS.hasMany` takes an optional hash as a second parameter, currently
-  supported options are:
-
-  - `async`: A boolean value used to explicitly declare this to be an async relationship.
-  - `inverse`: A string used to identify the inverse property on a related model.
-
-  #### One-To-Many
-  To declare a one-to-many relationship between two models, use
-  `DS.belongsTo` in combination with `DS.hasMany`, like this:
-
-  ```javascript
-  App.Post = DS.Model.extend({
-    comments: DS.hasMany('comment')
-  });
-
-  App.Comment = DS.Model.extend({
-    post: DS.belongsTo('post')
-  });
-  ```
-
-  #### Many-To-Many
-  To declare a many-to-many relationship between two models, use
-  `DS.hasMany`:
-
-  ```javascript
-  App.Post = DS.Model.extend({
-    tags: DS.hasMany('tag')
-  });
-
-  App.Tag = DS.Model.extend({
-    posts: DS.hasMany('post')
-  });
-  ```
-
-  #### Explicit Inverses
-
-  Ember Data will do its best to discover which relationships map to
-  one another. In the one-to-many code above, for example, Ember Data
-  can figure out that changing the `comments` relationship should update
-  the `post` relationship on the inverse because post is the only
-  relationship to that model.
-
-  However, sometimes you may have multiple `belongsTo`/`hasManys` for the
-  same type. You can specify which property on the related model is
-  the inverse using `DS.hasMany`'s `inverse` option:
-
-  ```javascript
-  var belongsTo = DS.belongsTo,
-      hasMany = DS.hasMany;
-
-  App.Comment = DS.Model.extend({
-    onePost: belongsTo('post'),
-    twoPost: belongsTo('post'),
-    redPost: belongsTo('post'),
-    bluePost: belongsTo('post')
-  });
-
-  App.Post = DS.Model.extend({
-    comments: hasMany('comment', {
-      inverse: 'redPost'
-    })
-  });
-  ```
-
-  You can also specify an inverse on a `belongsTo`, which works how
-  you'd expect.
-
-  @namespace
-  @method hasMany
-  @for DS
-  @param {String or DS.Model} type the model type of the relationship
-  @param {Object} options a hash of options
-  @return {Ember.computed} relationship
-*/
-DS.hasMany = function(type, options) {
-  if (typeof type === 'object') {
-    options = type;
-    type = undefined;
-  }
-  return hasRelationship(type, options);
-};
-
-})();
-
-
-
-(function() {
-var get = Ember.get, set = Ember.set;
-
-/**
-  @module ember-data
-*/
-
-/*
-  This file defines several extensions to the base `DS.Model` class that
-  add support for one-to-many relationships.
-*/
-
-/**
-  @class Model
-  @namespace DS
-*/
-DS.Model.reopen({
-
-  /**
-    This Ember.js hook allows an object to be notified when a property
-    is defined.
-
-    In this case, we use it to be notified when an Ember Data user defines a
-    belongs-to relationship. In that case, we need to set up observers for
-    each one, allowing us to track relationship changes and automatically
-    reflect changes in the inverse has-many array.
-
-    This hook passes the class being set up, as well as the key and value
-    being defined. So, for example, when the user does this:
-
-    ```javascript
-    DS.Model.extend({
-      parent: DS.belongsTo('user')
-    });
-    ```
-
-    This hook would be called with "parent" as the key and the computed
-    property returned by `DS.belongsTo` as the value.
-
-    @method didDefineProperty
-    @param proto
-    @param key
-    @param value
-  */
-  didDefineProperty: function(proto, key, value) {
-    // Check if the value being set is a computed property.
-    if (value instanceof Ember.Descriptor) {
-
-      // If it is, get the metadata for the relationship. This is
-      // populated by the `DS.belongsTo` helper when it is creating
-      // the computed property.
-      var meta = value.meta();
-
-      if (meta.isRelationship && meta.kind === 'belongsTo') {
-        Ember.addObserver(proto, key, null, 'belongsToDidChange');
-        Ember.addBeforeObserver(proto, key, null, 'belongsToWillChange');
-      }
-
-      meta.parentType = proto.constructor;
-    }
-  }
-});
-
-/*
-  These DS.Model extensions add class methods that provide relationship
-  introspection abilities about relationships.
-
-  A note about the computed properties contained here:
-
-  **These properties are effectively sealed once called for the first time.**
-  To avoid repeatedly doing expensive iteration over a model's fields, these
-  values are computed once and then cached for the remainder of the runtime of
-  your application.
-
-  If your application needs to modify a class after its initial definition
-  (for example, using `reopen()` to add additional attributes), make sure you
-  do it before using your model with the store, which uses these properties
-  extensively.
-*/
-
-DS.Model.reopenClass({
-  /**
-    For a given relationship name, returns the model type of the relationship.
-
-    For example, if you define a model like this:
-
-   ```javascript
-    App.Post = DS.Model.extend({
-      comments: DS.hasMany('comment')
-    });
-   ```
-
-    Calling `App.Post.typeForRelationship('comments')` will return `App.Comment`.
-
-    @method typeForRelationship
-    @static
-    @param {String} name the name of the relationship
-    @return {subclass of DS.Model} the type of the relationship, or undefined
-  */
-  typeForRelationship: function(name) {
-    var relationship = get(this, 'relationshipsByName').get(name);
-    return relationship && relationship.type;
-  },
-
-  inverseFor: function(name) {
-    var inverseType = this.typeForRelationship(name);
-
-    if (!inverseType) { return null; }
-
-    var options = this.metaForProperty(name).options;
-
-    if (options.inverse === null) { return null; }
-
-    var inverseName, inverseKind;
-
-    if (options.inverse) {
-      inverseName = options.inverse;
-      inverseKind = Ember.get(inverseType, 'relationshipsByName').get(inverseName).kind;
-    } else {
-      var possibleRelationships = findPossibleInverses(this, inverseType);
-
-      if (possibleRelationships.length === 0) { return null; }
-
-      Ember.assert("You defined the '" + name + "' relationship on " + this + ", but multiple possible inverse relationships of type " + this + " were found on " + inverseType + ". Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses", possibleRelationships.length === 1);
-
-      inverseName = possibleRelationships[0].name;
-      inverseKind = possibleRelationships[0].kind;
-    }
-
-    function findPossibleInverses(type, inverseType, possibleRelationships) {
-      possibleRelationships = possibleRelationships || [];
-
-      var relationshipMap = get(inverseType, 'relationships');
-      if (!relationshipMap) { return; }
-
-      var relationships = relationshipMap.get(type);
-      if (relationships) {
-        possibleRelationships.push.apply(possibleRelationships, relationshipMap.get(type));
-      }
-
-      if (type.superclass) {
-        findPossibleInverses(type.superclass, inverseType, possibleRelationships);
-      }
-
-      return possibleRelationships;
-    }
-
-    return {
-      type: inverseType,
-      name: inverseName,
-      kind: inverseKind
-    };
-  },
-
-  /**
-    The model's relationships as a map, keyed on the type of the
-    relationship. The value of each entry is an array containing a descriptor
-    for each relationship with that type, describing the name of the relationship
-    as well as the type.
-
-    For example, given the following model definition:
-
-    ```javascript
-    App.Blog = DS.Model.extend({
-      users: DS.hasMany('user'),
-      owner: DS.belongsTo('user'),
-      posts: DS.hasMany('post')
-    });
-    ```
-
-    This computed property would return a map describing these
-    relationships, like this:
-
-    ```javascript
-    var relationships = Ember.get(App.Blog, 'relationships');
-    relationships.get(App.User);
-    //=> [ { name: 'users', kind: 'hasMany' },
-    //     { name: 'owner', kind: 'belongsTo' } ]
-    relationships.get(App.Post);
-    //=> [ { name: 'posts', kind: 'hasMany' } ]
-    ```
-
-    @property relationships
-    @static
-    @type Ember.Map
-    @readOnly
-  */
-  relationships: Ember.computed(function() {
-    var map = new Ember.MapWithDefault({
-      defaultValue: function() { return []; }
-    });
-
-    // Loop through each computed property on the class
-    this.eachComputedProperty(function(name, meta) {
-
-      // If the computed property is a relationship, add
-      // it to the map.
-      if (meta.isRelationship) {
-        if (typeof meta.type === 'string') {
-          meta.type = this.store.modelFor(meta.type);
-        }
-
-        var relationshipsForType = map.get(meta.type);
-
-        relationshipsForType.push({ name: name, kind: meta.kind });
-      }
-    });
-
-    return map;
-  }),
-
-  /**
-    A hash containing lists of the model's relationships, grouped
-    by the relationship kind. For example, given a model with this
-    definition:
-
-    ```javascript
-    App.Blog = DS.Model.extend({
-      users: DS.hasMany('user'),
-      owner: DS.belongsTo('user'),
-
-      posts: DS.hasMany('post')
-    });
-    ```
-
-    This property would contain the following:
-
-    ```javascript
-    var relationshipNames = Ember.get(App.Blog, 'relationshipNames');
-    relationshipNames.hasMany;
-    //=> ['users', 'posts']
-    relationshipNames.belongsTo;
-    //=> ['owner']
-    ```
-
-    @property relationshipNames
-    @static
-    @type Object
-    @readOnly
-  */
-  relationshipNames: Ember.computed(function() {
-    var names = { hasMany: [], belongsTo: [] };
-
-    this.eachComputedProperty(function(name, meta) {
-      if (meta.isRelationship) {
-        names[meta.kind].push(name);
-      }
-    });
-
-    return names;
-  }),
-
-  /**
-    An array of types directly related to a model. Each type will be
-    included once, regardless of the number of relationships it has with
-    the model.
-
-    For example, given a model with this definition:
-
-    ```javascript
-    App.Blog = DS.Model.extend({
-      users: DS.hasMany('user'),
-      owner: DS.belongsTo('user'),
-
-      posts: DS.hasMany('post')
-    });
-    ```
-
-    This property would contain the following:
-
-    ```javascript
-    var relatedTypes = Ember.get(App.Blog, 'relatedTypes');
-    //=> [ App.User, App.Post ]
-    ```
-
-    @property relatedTypes
-    @static
-    @type Ember.Array
-    @readOnly
-  */
-  relatedTypes: Ember.computed(function() {
-    var type,
-        types = Ember.A();
-
-    // Loop through each computed property on the class,
-    // and create an array of the unique types involved
-    // in relationships
-    this.eachComputedProperty(function(name, meta) {
-      if (meta.isRelationship) {
-        type = meta.type;
-
-        if (typeof type === 'string') {
-          type = get(this, type, false) || this.store.modelFor(type);
-        }
-
-        Ember.assert("You specified a hasMany (" + meta.type + ") on " + meta.parentType + " but " + meta.type + " was not found.",  type);
-
-        if (!types.contains(type)) {
-          Ember.assert("Trying to sideload " + name + " on " + this.toString() + " but the type doesn't exist.", !!type);
-          types.push(type);
-        }
-      }
-    });
-
-    return types;
-  }),
-
-  /**
-    A map whose keys are the relationships of a model and whose values are
-    relationship descriptors.
-
-    For example, given a model with this
-    definition:
-
-    ```javascript
-    App.Blog = DS.Model.extend({
-      users: DS.hasMany('user'),
-      owner: DS.belongsTo('user'),
-
-      posts: DS.hasMany('post')
-    });
-    ```
-
-    This property would contain the following:
-
-    ```javascript
-    var relationshipsByName = Ember.get(App.Blog, 'relationshipsByName');
-    relationshipsByName.get('users');
-    //=> { key: 'users', kind: 'hasMany', type: App.User }
-    relationshipsByName.get('owner');
-    //=> { key: 'owner', kind: 'belongsTo', type: App.User }
-    ```
-
-    @property relationshipsByName
-    @static
-    @type Ember.Map
-    @readOnly
-  */
-  relationshipsByName: Ember.computed(function() {
-    var map = Ember.Map.create(), type;
-
-    this.eachComputedProperty(function(name, meta) {
-      if (meta.isRelationship) {
-        meta.key = name;
-        type = meta.type;
-
-        if (!type && meta.kind === 'hasMany') {
-          type = Ember.String.singularize(name);
-        } else if (!type) {
-          type = name;
-        }
-
-        if (typeof type === 'string') {
-          meta.type = this.store.modelFor(type);
-        }
-
-        map.set(name, meta);
-      }
-    });
-
-    return map;
-  }),
-
-  /**
-    A map whose keys are the fields of the model and whose values are strings
-    describing the kind of the field. A model's fields are the union of all of its
-    attributes and relationships.
-
-    For example:
-
-    ```javascript
-
-    App.Blog = DS.Model.extend({
-      users: DS.hasMany('user'),
-      owner: DS.belongsTo('user'),
-
-      posts: DS.hasMany('post'),
-
-      title: DS.attr('string')
-    });
-
-    var fields = Ember.get(App.Blog, 'fields');
-    fields.forEach(function(field, kind) {
-      console.log(field, kind);
-    });
-
-    // prints:
-    // users, hasMany
-    // owner, belongsTo
-    // posts, hasMany
-    // title, attribute
-    ```
-
-    @property fields
-    @static
-    @type Ember.Map
-    @readOnly
-  */
-  fields: Ember.computed(function() {
-    var map = Ember.Map.create();
-
-    this.eachComputedProperty(function(name, meta) {
-      if (meta.isRelationship) {
-        map.set(name, meta.kind);
-      } else if (meta.isAttribute) {
-        map.set(name, 'attribute');
-      }
-    });
-
-    return map;
-  }),
-
-  /**
-    Given a callback, iterates over each of the relationships in the model,
-    invoking the callback with the name of each relationship and its relationship
-    descriptor.
-
-    @method eachRelationship
-    @static
-    @param {Function} callback the callback to invoke
-    @param {any} binding the value to which the callback's `this` should be bound
-  */
-  eachRelationship: function(callback, binding) {
-    get(this, 'relationshipsByName').forEach(function(name, relationship) {
-      callback.call(binding, name, relationship);
-    });
-  },
-
-  /**
-    Given a callback, iterates over each of the types related to a model,
-    invoking the callback with the related type's class. Each type will be
-    returned just once, regardless of how many different relationships it has
-    with a model.
-
-    @method eachRelatedType
-    @static
-    @param {Function} callback the callback to invoke
-    @param {any} binding the value to which the callback's `this` should be bound
-  */
-  eachRelatedType: function(callback, binding) {
-    get(this, 'relatedTypes').forEach(function(type) {
-      callback.call(binding, type);
-    });
-  }
-});
-
-DS.Model.reopen({
-  /**
-    Given a callback, iterates over each of the relationships in the model,
-    invoking the callback with the name of each relationship and its relationship
-    descriptor.
-
-    @method eachRelationship
-    @param {Function} callback the callback to invoke
-    @param {any} binding the value to which the callback's `this` should be bound
-  */
-  eachRelationship: function(callback, binding) {
-    this.constructor.eachRelationship(callback, binding);
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var forEach = Ember.EnumerableUtils.forEach;
-
-/**
-  @class RecordArrayManager
-  @namespace DS
-  @private
-  @extends Ember.Object
-*/
-DS.RecordArrayManager = Ember.Object.extend({
-  init: function() {
-    this.filteredRecordArrays = Ember.MapWithDefault.create({
-      defaultValue: function() { return []; }
-    });
-
-    this.changedRecords = [];
-  },
-
-  recordDidChange: function(record) {
-    if (this.changedRecords.push(record) !== 1) { return; }
-
-    Ember.run.schedule('actions', this, this.updateRecordArrays);
-  },
-
-  recordArraysForRecord: function(record) {
-    record._recordArrays = record._recordArrays || Ember.OrderedSet.create();
-    return record._recordArrays;
-  },
-
-  /**
-    This method is invoked whenever data is loaded into the store by the
-    adapter or updated by the adapter, or when a record has changed.
-
-    It updates all record arrays that a record belongs to.
-
-    To avoid thrashing, it only runs at most once per run loop.
-
-    @method updateRecordArrays
-    @param {Class} type
-    @param {Number|String} clientId
-  */
-  updateRecordArrays: function() {
-    forEach(this.changedRecords, function(record) {
-      if (get(record, 'isDeleted')) {
-        this._recordWasDeleted(record);
-      } else {
-        this._recordWasChanged(record);
-      }
-    }, this);
-
-    this.changedRecords.length = 0;
-  },
-
-  _recordWasDeleted: function (record) {
-    var recordArrays = record._recordArrays;
-
-    if (!recordArrays) { return; }
-
-    forEach(recordArrays, function(array) {
-      array.removeRecord(record);
-    });
-  },
-
-  _recordWasChanged: function (record) {
-    var type = record.constructor,
-        recordArrays = this.filteredRecordArrays.get(type),
-        filter;
-
-    forEach(recordArrays, function(array) {
-      filter = get(array, 'filterFunction');
-      this.updateRecordArray(array, filter, type, record);
-    }, this);
-
-    // loop through all manyArrays containing an unloaded copy of this
-    // clientId and notify them that the record was loaded.
-    var manyArrays = record._loadingRecordArrays;
-
-    if (manyArrays) {
-      for (var i=0, l=manyArrays.length; i<l; i++) {
-        manyArrays[i].loadedRecord();
-      }
-
-      record._loadingRecordArrays = [];
-    }
-  },
-
-  /**
-    Update an individual filter.
-
-    @method updateRecordArray
-    @param {DS.FilteredRecordArray} array
-    @param {Function} filter
-    @param {Class} type
-    @param {Number|String} clientId
-  */
-  updateRecordArray: function(array, filter, type, record) {
-    var shouldBeInArray;
-
-    if (!filter) {
-      shouldBeInArray = true;
-    } else {
-      shouldBeInArray = filter(record);
-    }
-
-    var recordArrays = this.recordArraysForRecord(record);
-
-    if (shouldBeInArray) {
-      recordArrays.add(array);
-      array.addRecord(record);
-    } else if (!shouldBeInArray) {
-      recordArrays.remove(array);
-      array.removeRecord(record);
-    }
-  },
-
-  /**
-    This method is invoked if the `filterFunction` property is
-    changed on a `DS.FilteredRecordArray`.
-
-    It essentially re-runs the filter from scratch. This same
-    method is invoked when the filter is created in th first place.
-
-    @method updateFilter
-    @param array
-    @param type
-    @param filter
-  */
-  updateFilter: function(array, type, filter) {
-    var typeMap = this.store.typeMapFor(type),
-        records = typeMap.records, record;
-
-    for (var i=0, l=records.length; i<l; i++) {
-      record = records[i];
-
-      if (!get(record, 'isDeleted') && !get(record, 'isEmpty')) {
-        this.updateRecordArray(array, filter, type, record);
-      }
-    }
-  },
-
-  /**
-    Create a `DS.ManyArray` for a type and list of record references, and index
-    the `ManyArray` under each reference. This allows us to efficiently remove
-    records from `ManyArray`s when they are deleted.
-
-    @method createManyArray
-    @param {Class} type
-    @param {Array} references
-    @return {DS.ManyArray}
-  */
-  createManyArray: function(type, records) {
-    var manyArray = DS.ManyArray.create({
-      type: type,
-      content: records,
-      store: this.store
-    });
-
-    forEach(records, function(record) {
-      var arrays = this.recordArraysForRecord(record);
-      arrays.add(manyArray);
-    }, this);
-
-    return manyArray;
-  },
-
-  /**
-    Create a `DS.RecordArray` for a type and register it for updates.
-
-    @method createRecordArray
-    @param {Class} type
-    @return {DS.RecordArray}
-  */
-  createRecordArray: function(type) {
-    var array = DS.RecordArray.create({
-      type: type,
-      content: Ember.A(),
-      store: this.store,
-      isLoaded: true
-    });
-
-    this.registerFilteredRecordArray(array, type);
-
-    return array;
-  },
-
-  /**
-    Create a `DS.FilteredRecordArray` for a type and register it for updates.
-
-    @method createFilteredRecordArray
-    @param {Class} type
-    @param {Function} filter
-    @return {DS.FilteredRecordArray}
-  */
-  createFilteredRecordArray: function(type, filter) {
-    var array = DS.FilteredRecordArray.create({
-      type: type,
-      content: Ember.A(),
-      store: this.store,
-      manager: this,
-      filterFunction: filter
-    });
-
-    this.registerFilteredRecordArray(array, type, filter);
-
-    return array;
-  },
-
-  /**
-    Create a `DS.AdapterPopulatedRecordArray` for a type with given query.
-
-    @method createAdapterPopulatedRecordArray
-    @param {Class} type
-    @param {Object} query
-    @return {DS.AdapterPopulatedRecordArray}
-  */
-  createAdapterPopulatedRecordArray: function(type, query) {
-    return DS.AdapterPopulatedRecordArray.create({
-      type: type,
-      query: query,
-      content: Ember.A(),
-      store: this.store
-    });
-  },
-
-  /**
-    Register a RecordArray for a given type to be backed by
-    a filter function. This will cause the array to update
-    automatically when records of that type change attribute
-    values or states.
-
-    @method registerFilteredRecordArray
-    @param {DS.RecordArray} array
-    @param {Class} type
-    @param {Function} filter
-  */
-  registerFilteredRecordArray: function(array, type, filter) {
-    var recordArrays = this.filteredRecordArrays.get(type);
-    recordArrays.push(array);
-
-    this.updateFilter(array, type, filter);
-  },
-
-  // Internally, we maintain a map of all unloaded IDs requested by
-  // a ManyArray. As the adapter loads data into the store, the
-  // store notifies any interested ManyArrays. When the ManyArray's
-  // total number of loading records drops to zero, it becomes
-  // `isLoaded` and fires a `didLoad` event.
-  registerWaitingRecordArray: function(record, array) {
-    var loadingRecordArrays = record._loadingRecordArrays || [];
-    loadingRecordArrays.push(array);
-    record._loadingRecordArrays = loadingRecordArrays;
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var map = Ember.ArrayPolyfills.map;
-
-var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
-
-/**
-  A `DS.InvalidError` is used by an adapter to signal the external API
-  was unable to process a request because the content was not
-  semantically correct or meaningful per the API. Usually this means a
-  record failed some form of server side validation. When a promise
-  from an adapter is rejected with a `DS.InvalidError` the record will
-  transition to the `invalid` state and the errors will be set to the
-  `errors` property on the record.
-
-  Example
-
-  ```javascript
-  App.ApplicationAdapter = DS.RESTAdapter.extend({
-    ajaxError: function(jqXHR) {
-      var error = this._super(jqXHR);
-
-      if (jqXHR && jqXHR.status === 422) {
-        var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"];
-        return new DS.InvalidError(jsonErrors);
-      } else {
-        return error;
-      }
-    }
-  });
-  ```
-
-  @class InvalidError
-  @namespace DS
-*/
-DS.InvalidError = function(errors) {
-  var tmp = Error.prototype.constructor.call(this, "The backend rejected the commit because it was invalid: " + Ember.inspect(errors));
-  this.errors = errors;
-
-  for (var i=0, l=errorProps.length; i<l; i++) {
-    this[errorProps[i]] = tmp[errorProps[i]];
-  }
-};
-DS.InvalidError.prototype = Ember.create(Error.prototype);
-
-/**
-  An adapter is an object that receives requests from a store and
-  translates them into the appropriate action to take against your
-  persistence layer. The persistence layer is usually an HTTP API, but
-  may be anything, such as the browser's local storage. Typically the
-  adapter is not invoked directly instead its functionality is accessed
-  through the `store`.
-
-  ### Creating an Adapter
-
-  First, create a new subclass of `DS.Adapter`:
-
-  ```javascript
-  App.MyAdapter = DS.Adapter.extend({
-    // ...your code here
-  });
-  ```
-
-  To tell your store which adapter to use, set its `adapter` property:
-
-  ```javascript
-  App.store = DS.Store.create({
-    adapter: 'MyAdapter'
-  });
-  ```
-
-  `DS.Adapter` is an abstract base class that you should override in your
-  application to customize it for your backend. The minimum set of methods
-  that you should implement is:
-
-    * `find()`
-    * `createRecord()`
-    * `updateRecord()`
-    * `deleteRecord()`
-    * `findAll()`
-    * `findQuery()`
-
-  To improve the network performance of your application, you can optimize
-  your adapter by overriding these lower-level methods:
-
-    * `findMany()`
-
-
-  For an example implementation, see `DS.RESTAdapter`, the
-  included REST adapter.
-
-  @class Adapter
-  @namespace DS
-  @extends Ember.Object
-*/
-
-DS.Adapter = Ember.Object.extend({
-
-  /**
-    If you would like your adapter to use a custom serializer you can
-    set the `defaultSerializer` property to be the name of the custom
-    serializer.
-
-    Note the `defaultSerializer` serializer has a lower priority then
-    a model specific serializer (i.e. `PostSerializer`) or the
-    `application` serializer.
-
-    ```javascript
-    var DjangoAdapter = DS.Adapter.extend({
-      defaultSerializer: 'django'
-    });
-    ```
-
-    @property defaultSerializer
-    @type {String}
-  */
-
-  /**
-    The `find()` method is invoked when the store is asked for a record that
-    has not previously been loaded. In response to `find()` being called, you
-    should query your persistence layer for a record with the given ID. Once
-    found, you can asynchronously call the store's `push()` method to push
-    the record into the store.
-
-    Here is an example `find` implementation:
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      find: function(store, type, id) {
-        var url = [type, id].join('/');
-
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.getJSON(url).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @method find
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} id
-    @return {Promise} promise
-  */
-  find: Ember.required(Function),
-
-  /**
-    The `findAll()` method is called when you call `find` on the store
-    without an ID (i.e. `store.find('post')`).
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      findAll: function(store, type, sinceToken) {
-        var url = type;
-        var query = { since: sinceToken };
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.getJSON(url, query).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @private
-    @method findAll
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} sinceToken
-    @return {Promise} promise
-  */
-  findAll: null,
-
-  /**
-    This method is called when you call `find` on the store with a
-    query object as the second parameter (i.e. `store.find('person', {
-    page: 1 })`).
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      findQuery: function(store, type, query) {
-        var url = type;
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.getJSON(url, query).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @private
-    @method findQuery
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} query
-    @param {DS.AdapterPopulatedRecordArray} recordArray
-    @return {Promise} promise
-  */
-  findQuery: null,
-
-  /**
-    If the globally unique IDs for your records should be generated on the client,
-    implement the `generateIdForRecord()` method. This method will be invoked
-    each time you create a new record, and the value returned from it will be
-    assigned to the record's `primaryKey`.
-
-    Most traditional REST-like HTTP APIs will not use this method. Instead, the ID
-    of the record will be set by the server, and your adapter will update the store
-    with the new ID when it calls `didCreateRecord()`. Only implement this method if
-    you intend to generate record IDs on the client-side.
-
-    The `generateIdForRecord()` method will be invoked with the requesting store as
-    the first parameter and the newly created record as the second parameter:
-
-    ```javascript
-    generateIdForRecord: function(store, record) {
-      var uuid = App.generateUUIDWithStatisticallyLowOddsOfCollision();
-      return uuid;
-    }
-    ```
-
-    @method generateIdForRecord
-    @param {DS.Store} store
-    @param {DS.Model} record
-    @return {String|Number} id
-  */
-  generateIdForRecord: null,
-
-  /**
-    Proxies to the serializer's `serialize` method.
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      createRecord: function(store, type, record) {
-        var data = this.serialize(record, { includeId: true });
-        var url = type;
-
-        // ...
-      }
-    });
-    ```
-
-    @method serialize
-    @param {DS.Model} record
-    @param {Object}   options
-    @return {Object} serialized record
-  */
-  serialize: function(record, options) {
-    return get(record, 'store').serializerFor(record.constructor.typeKey).serialize(record, options);
-  },
-
-  /**
-    Implement this method in a subclass to handle the creation of
-    new records.
-
-    Serializes the record and send it to the server.
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      createRecord: function(store, type, record) {
-        var data = this.serialize(record, { includeId: true });
-        var url = type;
-
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.ajax({
-            type: 'POST',
-            url: url,
-            dataType: 'json',
-            data: data
-          }).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @method createRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type   the DS.Model class of the record
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  createRecord: Ember.required(Function),
-
-  /**
-    Implement this method in a subclass to handle the updating of
-    a record.
-
-    Serializes the record update and send it to the server.
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      updateRecord: function(store, type, record) {
-        var data = this.serialize(record, { includeId: true });
-        var id = record.get('id');
-        var url = [type, id].join('/');
-
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.ajax({
-            type: 'PUT',
-            url: url,
-            dataType: 'json',
-            data: data
-          }).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @method updateRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type   the DS.Model class of the record
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  updateRecord: Ember.required(Function),
-
-  /**
-    Implement this method in a subclass to handle the deletion of
-    a record.
-
-    Sends a delete request for the record to the server.
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      deleteRecord: function(store, type, record) {
-        var data = this.serialize(record, { includeId: true });
-        var id = record.get('id');
-        var url = [type, id].join('/');
-
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.ajax({
-            type: 'DELETE',
-            url: url,
-            dataType: 'json',
-            data: data
-          }).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @method deleteRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type   the DS.Model class of the record
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  deleteRecord: Ember.required(Function),
-
-  /**
-    Find multiple records at once.
-
-    By default, it loops over the provided ids and calls `find` on each.
-    May be overwritten to improve performance and reduce the number of
-    server requests.
-
-    Example
-
-    ```javascript
-    App.ApplicationAdapter = DS.Adapter.extend({
-      findMany: function(store, type, ids) {
-        var url = type;
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-          jQuery.getJSON(url, {ids: ids}).then(function(data) {
-            Ember.run(null, resolve, data);
-          }, function(jqXHR) {
-            jqXHR.then = null; // tame jQuery's ill mannered promises
-            Ember.run(null, reject, jqXHR);
-          });
-        });
-      }
-    });
-    ```
-
-    @method findMany
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type   the DS.Model class of the records
-    @param {Array}    ids
-    @return {Promise} promise
-  */
-  findMany: function(store, type, ids) {
-    var promises = map.call(ids, function(id) {
-      return this.find(store, type, id);
-    }, this);
-
-    return Ember.RSVP.all(promises);
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, fmt = Ember.String.fmt,
-    indexOf = Ember.EnumerableUtils.indexOf;
-
-var counter = 0;
-
-/**
-  `DS.FixtureAdapter` is an adapter that loads records from memory.
-  Its primarily used for development and testing. You can also use
-  `DS.FixtureAdapter` while working on the API but are not ready to
-  integrate yet. It is a fully functioning adapter. All CRUD methods
-  are implemented. You can also implement query logic that a remote
-  system would do. Its possible to do develop your entire application
-  with `DS.FixtureAdapter`.
-
-  For information on how to use the `FixtureAdapter` in your
-  application please see the [FixtureAdapter
-  guide](/guides/models/the-fixture-adapter/).
-
-  @class FixtureAdapter
-  @namespace DS
-  @extends DS.Adapter
-*/
-DS.FixtureAdapter = DS.Adapter.extend({
-  // by default, fixtures are already in normalized form
-  serializer: null,
-
-  /**
-    If `simulateRemoteResponse` is `true` the `FixtureAdapter` will
-    wait a number of milliseconds before resolving promises with the
-    fixture values. The wait time can be configured via the `latency`
-    property.
-
-    @property simulateRemoteResponse
-    @type {Boolean}
-    @default true
-  */
-  simulateRemoteResponse: true,
-
-  /**
-    By default the `FixtureAdapter` will simulate a wait of the
-    `latency` milliseconds before resolving promises with the fixture
-    values. This behavior can be turned off via the
-    `simulateRemoteResponse` property.
-
-    @property latency
-    @type {Number}
-    @default 50
-  */
-  latency: 50,
-
-  /**
-    Implement this method in order to provide data associated with a type
-
-    @method fixturesForType
-    @param {Subclass of DS.Model} type
-    @return {Array}
-  */
-  fixturesForType: function(type) {
-    if (type.FIXTURES) {
-      var fixtures = Ember.A(type.FIXTURES);
-      return fixtures.map(function(fixture){
-        var fixtureIdType = typeof fixture.id;
-        if(fixtureIdType !== "number" && fixtureIdType !== "string"){
-          throw new Error(fmt('the id property must be defined as a number or string for fixture %@', [fixture]));
-        }
-        fixture.id = fixture.id + '';
-        return fixture;
-      });
-    }
-    return null;
-  },
-
-  /**
-    Implement this method in order to query fixtures data
-
-    @method queryFixtures
-    @param {Array} fixture
-    @param {Object} query
-    @param {Subclass of DS.Model} type
-    @return {Promise|Array}
-  */
-  queryFixtures: function(fixtures, query, type) {
-    Ember.assert('Not implemented: You must override the DS.FixtureAdapter::queryFixtures method to support querying the fixture store.');
-  },
-
-  /**
-    @method updateFixtures
-    @param {Subclass of DS.Model} type
-    @param {Array} fixture
-  */
-  updateFixtures: function(type, fixture) {
-    if(!type.FIXTURES) {
-      type.FIXTURES = [];
-    }
-
-    var fixtures = type.FIXTURES;
-
-    this.deleteLoadedFixture(type, fixture);
-
-    fixtures.push(fixture);
-  },
-
-  /**
-    Implement this method in order to provide json for CRUD methods
-
-    @method mockJSON
-    @param {Subclass of DS.Model} type
-    @param {DS.Model} record
-  */
-  mockJSON: function(store, type, record) {
-    return store.serializerFor(type).serialize(record, { includeId: true });
-  },
-
-  /**
-    @method generateIdForRecord
-    @param {DS.Store} store
-    @param {DS.Model} record
-    @return {String} id
-  */
-  generateIdForRecord: function(store) {
-    return "fixture-" + counter++;
-  },
-
-  /**
-    @method find
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} id
-    @return {Promise} promise
-  */
-  find: function(store, type, id) {
-    var fixtures = this.fixturesForType(type),
-        fixture;
-
-    Ember.assert("Unable to find fixtures for model type "+type.toString(), fixtures);
-
-    if (fixtures) {
-      fixture = Ember.A(fixtures).findProperty('id', id);
-    }
-
-    if (fixture) {
-      return this.simulateRemoteCall(function() {
-        return fixture;
-      }, this);
-    }
-  },
-
-  /**
-    @method findMany
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Array} ids
-    @return {Promise} promise
-  */
-  findMany: function(store, type, ids) {
-    var fixtures = this.fixturesForType(type);
-
-    Ember.assert("Unable to find fixtures for model type "+type.toString(), fixtures);
-
-    if (fixtures) {
-      fixtures = fixtures.filter(function(item) {
-        return indexOf(ids, item.id) !== -1;
-      });
-    }
-
-    if (fixtures) {
-      return this.simulateRemoteCall(function() {
-        return fixtures;
-      }, this);
-    }
-  },
-
-  /**
-    @private
-    @method findAll
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} sinceToken
-    @return {Promise} promise
-  */
-  findAll: function(store, type) {
-    var fixtures = this.fixturesForType(type);
-
-    Ember.assert("Unable to find fixtures for model type "+type.toString(), fixtures);
-
-    return this.simulateRemoteCall(function() {
-      return fixtures;
-    }, this);
-  },
-
-  /**
-    @private
-    @method findQuery
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} query
-    @param {DS.AdapterPopulatedRecordArray} recordArray
-    @return {Promise} promise
-  */
-  findQuery: function(store, type, query, array) {
-    var fixtures = this.fixturesForType(type);
-
-    Ember.assert("Unable to find fixtures for model type "+type.toString(), fixtures);
-
-    fixtures = this.queryFixtures(fixtures, query, type);
-
-    if (fixtures) {
-      return this.simulateRemoteCall(function() {
-        return fixtures;
-      }, this);
-    }
-  },
-
-  /**
-    @method createRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  createRecord: function(store, type, record) {
-    var fixture = this.mockJSON(store, type, record);
-
-    this.updateFixtures(type, fixture);
-
-    return this.simulateRemoteCall(function() {
-      return fixture;
-    }, this);
-  },
-
-  /**
-    @method updateRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  updateRecord: function(store, type, record) {
-    var fixture = this.mockJSON(store, type, record);
-
-    this.updateFixtures(type, fixture);
-
-    return this.simulateRemoteCall(function() {
-      return fixture;
-    }, this);
-  },
-
-  /**
-    @method deleteRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @return {Promise} promise
-  */
-  deleteRecord: function(store, type, record) {
-    var fixture = this.mockJSON(store, type, record);
-
-    this.deleteLoadedFixture(type, fixture);
-
-    return this.simulateRemoteCall(function() {
-      // no payload in a deletion
-      return null;
-    });
-  },
-
-  /*
-    @method deleteLoadedFixture
-    @private
-    @param type
-    @param record
-  */
-  deleteLoadedFixture: function(type, record) {
-    var existingFixture = this.findExistingFixture(type, record);
-
-    if(existingFixture) {
-      var index = indexOf(type.FIXTURES, existingFixture);
-      type.FIXTURES.splice(index, 1);
-      return true;
-    }
-  },
-
-  /*
-    @method findExistingFixture
-    @private
-    @param type
-    @param record
-  */
-  findExistingFixture: function(type, record) {
-    var fixtures = this.fixturesForType(type);
-    var id = get(record, 'id');
-
-    return this.findFixtureById(fixtures, id);
-  },
-
-  /*
-    @method findFixtureById
-    @private
-    @param fixtures
-    @param id
-  */
-  findFixtureById: function(fixtures, id) {
-    return Ember.A(fixtures).find(function(r) {
-      if(''+get(r, 'id') === ''+id) {
-        return true;
-      } else {
-        return false;
-      }
-    });
-  },
-
-  /*
-    @method simulateRemoteCall
-    @private
-    @param callback
-    @param context
-  */
-  simulateRemoteCall: function(callback, context) {
-    var adapter = this;
-
-    return new Ember.RSVP.Promise(function(resolve) {
-      if (get(adapter, 'simulateRemoteResponse')) {
-        // Schedule with setTimeout
-        Ember.run.later(function() {
-          resolve(callback.call(context));
-        }, get(adapter, 'latency'));
-      } else {
-        // Asynchronous, but at the of the runloop with zero latency
-        Ember.run.schedule('actions', null, function() {
-          resolve(callback.call(context));
-        });
-      }
-    }, "DS: FixtureAdapter#simulateRemoteCall");
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var forEach = Ember.ArrayPolyfills.forEach;
-var map = Ember.ArrayPolyfills.map;
-
-function coerceId(id) {
-  return id == null ? null : id+'';
-}
-
-/**
-  Normally, applications will use the `RESTSerializer` by implementing
-  the `normalize` method and individual normalizations under
-  `normalizeHash`.
-
-  This allows you to do whatever kind of munging you need, and is
-  especially useful if your server is inconsistent and you need to
-  do munging differently for many different kinds of responses.
-
-  See the `normalize` documentation for more information.
-
-  ## Across the Board Normalization
-
-  There are also a number of hooks that you might find useful to defined
-  across-the-board rules for your payload. These rules will be useful
-  if your server is consistent, or if you're building an adapter for
-  an infrastructure service, like Parse, and want to encode service
-  conventions.
-
-  For example, if all of your keys are underscored and all-caps, but
-  otherwise consistent with the names you use in your models, you
-  can implement across-the-board rules for how to convert an attribute
-  name in your model to a key in your JSON.
-
-  ```js
-  App.ApplicationSerializer = DS.RESTSerializer.extend({
-    keyForAttribute: function(attr) {
-      return Ember.String.underscore(attr).toUpperCase();
-    }
-  });
-  ```
-
-  You can also implement `keyForRelationship`, which takes the name
-  of the relationship as the first parameter, and the kind of
-  relationship (`hasMany` or `belongsTo`) as the second parameter.
-
-  @class RESTSerializer
-  @namespace DS
-  @extends DS.JSONSerializer
-*/
-DS.RESTSerializer = DS.JSONSerializer.extend({
-  /**
-    If you want to do normalizations specific to some part of the payload, you
-    can specify those under `normalizeHash`.
-
-    For example, given the following json where the the `IDs` under
-    `"comments"` are provided as `_id` instead of `id`.
-
-    ```javascript
-    {
-      "post": {
-        "id": 1,
-        "title": "Rails is omakase",
-        "comments": [ 1, 2 ]
-      },
-      "comments": [{
-        "_id": 1,
-        "body": "FIRST"
-      }, {
-        "_id": 2,
-        "body": "Rails is unagi"
-      }]
-    }
-    ```
-
-    You use `normalizeHash` to normalize just the comments:
-
-    ```javascript
-    App.PostSerializer = DS.RESTSerializer.extend({
-      normalizeHash: {
-        comments: function(hash) {
-          hash.id = hash._id;
-          delete hash._id;
-          return hash;
-        }
-      }
-    });
-    ```
-
-    The key under `normalizeHash` is usually just the original key
-    that was in the original payload. However, key names will be
-    impacted by any modifications done in the `normalizePayload`
-    method. The `DS.RESTSerializer`'s default implementation makes no
-    changes to the payload keys.
-
-    @property normalizeHash
-    @type {Object}
-    @default undefined
-  */
-
-  /**
-    Normalizes a part of the JSON payload returned by
-    the server. You should override this method, munge the hash
-    and call super if you have generic normalization to do.
-
-    It takes the type of the record that is being normalized
-    (as a DS.Model class), the property where the hash was
-    originally found, and the hash to normalize.
-
-    For example, if you have a payload that looks like this:
-
-    ```js
-    {
-      "post": {
-        "id": 1,
-        "title": "Rails is omakase",
-        "comments": [ 1, 2 ]
-      },
-      "comments": [{
-        "id": 1,
-        "body": "FIRST"
-      }, {
-        "id": 2,
-        "body": "Rails is unagi"
-      }]
-    }
-    ```
-
-    The `normalize` method will be called three times:
-
-    * With `App.Post`, `"posts"` and `{ id: 1, title: "Rails is omakase", ... }`
-    * With `App.Comment`, `"comments"` and `{ id: 1, body: "FIRST" }`
-    * With `App.Comment`, `"comments"` and `{ id: 2, body: "Rails is unagi" }`
-
-    You can use this method, for example, to normalize underscored keys to camelized
-    or other general-purpose normalizations.
-
-    If you want to do normalizations specific to some part of the payload, you
-    can specify those under `normalizeHash`.
-
-    For example, if the `IDs` under `"comments"` are provided as `_id` instead of
-    `id`, you can specify how to normalize just the comments:
-
-    ```js
-    App.PostSerializer = DS.RESTSerializer.extend({
-      normalizeHash: {
-        comments: function(hash) {
-          hash.id = hash._id;
-          delete hash._id;
-          return hash;
-        }
-      }
-    });
-    ```
-
-    The key under `normalizeHash` is just the original key that was in the original
-    payload.
-
-    @method normalize
-    @param {subclass of DS.Model} type
-    @param {Object} hash
-    @param {String} prop
-    @returns {Object}
-  */
-  normalize: function(type, hash, prop) {
-    this.normalizeId(hash);
-    this.normalizeAttributes(type, hash);
-    this.normalizeRelationships(type, hash);
-
-    this.normalizeUsingDeclaredMapping(type, hash);
-
-    if (this.normalizeHash && this.normalizeHash[prop]) {
-      this.normalizeHash[prop](hash);
-    }
-
-    return this._super(type, hash, prop);
-  },
-
-  /**
-    You can use this method to normalize all payloads, regardless of whether they
-    represent single records or an array.
-
-    For example, you might want to remove some extraneous data from the payload:
-
-    ```js
-    App.ApplicationSerializer = DS.RESTSerializer.extend({
-      normalizePayload: function(type, payload) {
-        delete payload.version;
-        delete payload.status;
-        return payload;
-      }
-    });
-    ```
-
-    @method normalizePayload
-    @param {subclass of DS.Model} type
-    @param {Object} hash
-    @returns {Object} the normalized payload
-  */
-  normalizePayload: function(type, payload) {
-    return payload;
-  },
-
-  /**
-    @method normalizeId
-    @private
-  */
-  normalizeId: function(hash) {
-    var primaryKey = get(this, 'primaryKey');
-
-    if (primaryKey === 'id') { return; }
-
-    hash.id = hash[primaryKey];
-    delete hash[primaryKey];
-  },
-
-  /**
-    @method normalizeUsingDeclaredMapping
-    @private
-  */
-  normalizeUsingDeclaredMapping: function(type, hash) {
-    var attrs = get(this, 'attrs'), payloadKey, key;
-
-    if (attrs) {
-      for (key in attrs) {
-        payloadKey = attrs[key];
-        if (payloadKey && payloadKey.key) {
-          payloadKey = payloadKey.key;
-        }
-        if (typeof payloadKey === 'string') {
-          hash[key] = hash[payloadKey];
-          delete hash[payloadKey];
-        }
-      }
-    }
-  },
-
-  /**
-    @method normalizeAttributes
-    @private
-  */
-  normalizeAttributes: function(type, hash) {
-    var payloadKey, key;
-
-    if (this.keyForAttribute) {
-      type.eachAttribute(function(key) {
-        payloadKey = this.keyForAttribute(key);
-        if (key === payloadKey) { return; }
-
-        hash[key] = hash[payloadKey];
-        delete hash[payloadKey];
-      }, this);
-    }
-  },
-
-  /**
-    @method normalizeRelationships
-    @private
-  */
-  normalizeRelationships: function(type, hash) {
-    var payloadKey, key;
-
-    if (this.keyForRelationship) {
-      type.eachRelationship(function(key, relationship) {
-        payloadKey = this.keyForRelationship(key, relationship.kind);
-        if (key === payloadKey) { return; }
-
-        hash[key] = hash[payloadKey];
-        delete hash[payloadKey];
-      }, this);
-    }
-  },
-
-  /**
-    Called when the server has returned a payload representing
-    a single record, such as in response to a `find` or `save`.
-
-    It is your opportunity to clean up the server's response into the normalized
-    form expected by Ember Data.
-
-    If you want, you can just restructure the top-level of your payload, and
-    do more fine-grained normalization in the `normalize` method.
-
-    For example, if you have a payload like this in response to a request for
-    post 1:
-
-    ```js
-    {
-      "id": 1,
-      "title": "Rails is omakase",
-
-      "_embedded": {
-        "comment": [{
-          "_id": 1,
-          "comment_title": "FIRST"
-        }, {
-          "_id": 2,
-          "comment_title": "Rails is unagi"
-        }]
-      }
-    }
-    ```
-
-    You could implement a serializer that looks like this to get your payload
-    into shape:
-
-    ```js
-    App.PostSerializer = DS.RESTSerializer.extend({
-      // First, restructure the top-level so it's organized by type
-      extractSingle: function(store, type, payload, id, requestType) {
-        var comments = payload._embedded.comment;
-        delete payload._embedded;
-
-        payload = { comments: comments, post: payload };
-        return this._super(store, type, payload, id, requestType);
-      },
-
-      normalizeHash: {
-        // Next, normalize individual comments, which (after `extract`)
-        // are now located under `comments`
-        comments: function(hash) {
-          hash.id = hash._id;
-          hash.title = hash.comment_title;
-          delete hash._id;
-          delete hash.comment_title;
-          return hash;
-        }
-      }
-    })
-    ```
-
-    When you call super from your own implementation of `extractSingle`, the
-    built-in implementation will find the primary record in your normalized
-    payload and push the remaining records into the store.
-
-    The primary record is the single hash found under `post` or the first
-    element of the `posts` array.
-
-    The primary record has special meaning when the record is being created
-    for the first time or updated (`createRecord` or `updateRecord`). In
-    particular, it will update the properties of the record that was saved.
-
-    @method extractSingle
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @param {String} id
-    @param {'find'|'createRecord'|'updateRecord'|'deleteRecord'} requestType
-    @returns {Object} the primary response to the original request
-  */
-  extractSingle: function(store, primaryType, payload, recordId, requestType) {
-    payload = this.normalizePayload(primaryType, payload);
-
-    var primaryTypeName = primaryType.typeKey,
-        primaryRecord;
-
-    for (var prop in payload) {
-      var typeName  = this.typeForRoot(prop),
-          type = store.modelFor(typeName),
-          isPrimary = type.typeKey === primaryTypeName;
-
-      // legacy support for singular resources
-      if (isPrimary && Ember.typeOf(payload[prop]) !== "array" ) {
-        primaryRecord = this.normalize(primaryType, payload[prop], prop);
-        continue;
-      }
-
-      /*jshint loopfunc:true*/
-      forEach.call(payload[prop], function(hash) {
-        var typeName = this.typeForRoot(prop),
-            type = store.modelFor(typeName),
-            typeSerializer = store.serializerFor(type);
-
-        hash = typeSerializer.normalize(type, hash, prop);
-
-        var isFirstCreatedRecord = isPrimary && !recordId && !primaryRecord,
-            isUpdatedRecord = isPrimary && coerceId(hash.id) === recordId;
-
-        // find the primary record.
-        //
-        // It's either:
-        // * the record with the same ID as the original request
-        // * in the case of a newly created record that didn't have an ID, the first
-        //   record in the Array
-        if (isFirstCreatedRecord || isUpdatedRecord) {
-          primaryRecord = hash;
-        } else {
-          store.push(typeName, hash);
-        }
-      }, this);
-    }
-
-    return primaryRecord;
-  },
-
-  /**
-    Called when the server has returned a payload representing
-    multiple records, such as in response to a `findAll` or `findQuery`.
-
-    It is your opportunity to clean up the server's response into the normalized
-    form expected by Ember Data.
-
-    If you want, you can just restructure the top-level of your payload, and
-    do more fine-grained normalization in the `normalize` method.
-
-    For example, if you have a payload like this in response to a request for
-    all posts:
-
-    ```js
-    {
-      "_embedded": {
-        "post": [{
-          "id": 1,
-          "title": "Rails is omakase"
-        }, {
-          "id": 2,
-          "title": "The Parley Letter"
-        }],
-        "comment": [{
-          "_id": 1,
-          "comment_title": "Rails is unagi"
-          "post_id": 1
-        }, {
-          "_id": 2,
-          "comment_title": "Don't tread on me",
-          "post_id": 2
-        }]
-      }
-    }
-    ```
-
-    You could implement a serializer that looks like this to get your payload
-    into shape:
-
-    ```js
-    App.PostSerializer = DS.RESTSerializer.extend({
-      // First, restructure the top-level so it's organized by type
-      // and the comments are listed under a post's `comments` key.
-      extractArray: function(store, type, payload, id, requestType) {
-        var posts = payload._embedded.post;
-        var comments = [];
-        var postCache = {};
-
-        posts.forEach(function(post) {
-          post.comments = [];
-          postCache[post.id] = post;
-        });
-
-        payload._embedded.comment.forEach(function(comment) {
-          comments.push(comment);
-          postCache[comment.post_id].comments.push(comment);
-          delete comment.post_id;
-        }
-
-        payload = { comments: comments, posts: payload };
-
-        return this._super(store, type, payload, id, requestType);
-      },
-
-      normalizeHash: {
-        // Next, normalize individual comments, which (after `extract`)
-        // are now located under `comments`
-        comments: function(hash) {
-          hash.id = hash._id;
-          hash.title = hash.comment_title;
-          delete hash._id;
-          delete hash.comment_title;
-          return hash;
-        }
-      }
-    })
-    ```
-
-    When you call super from your own implementation of `extractArray`, the
-    built-in implementation will find the primary array in your normalized
-    payload and push the remaining records into the store.
-
-    The primary array is the array found under `posts`.
-
-    The primary record has special meaning when responding to `findQuery`
-    or `findHasMany`. In particular, the primary array will become the
-    list of records in the record array that kicked off the request.
-
-    If your primary array contains secondary (embedded) records of the same type,
-    you cannot place these into the primary array `posts`. Instead, place the
-    secondary items into an underscore prefixed property `_posts`, which will
-    push these items into the store and will not affect the resulting query.
-
-    @method extractArray
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} payload
-    @param {'findAll'|'findMany'|'findHasMany'|'findQuery'} requestType
-    @returns {Array} The primary array that was returned in response
-      to the original query.
-  */
-  extractArray: function(store, primaryType, payload) {
-    payload = this.normalizePayload(primaryType, payload);
-
-    var primaryTypeName = primaryType.typeKey,
-        primaryArray;
-
-    for (var prop in payload) {
-      var typeKey = prop,
-          forcedSecondary = false;
-
-      if (prop.charAt(0) === '_') {
-        forcedSecondary = true;
-        typeKey = prop.substr(1);
-      }
-
-      var typeName = this.typeForRoot(typeKey),
-          type = store.modelFor(typeName),
-          typeSerializer = store.serializerFor(type),
-          isPrimary = (!forcedSecondary && (type.typeKey === primaryTypeName));
-
-      /*jshint loopfunc:true*/
-      var normalizedArray = map.call(payload[prop], function(hash) {
-        return typeSerializer.normalize(type, hash, prop);
-      }, this);
-
-      if (isPrimary) {
-        primaryArray = normalizedArray;
-      } else {
-        store.pushMany(typeName, normalizedArray);
-      }
-    }
-
-    return primaryArray;
-  },
-
-  /**
-    This method allows you to push a payload containing top-level
-    collections of records organized per type.
-
-    ```js
-    {
-      "posts": [{
-        "id": "1",
-        "title": "Rails is omakase",
-        "author", "1",
-        "comments": [ "1" ]
-      }],
-      "comments": [{
-        "id": "1",
-        "body": "FIRST"
-      }],
-      "users": [{
-        "id": "1",
-        "name": "@d2h"
-      }]
-    }
-    ```
-
-    It will first normalize the payload, so you can use this to push
-    in data streaming in from your server structured the same way
-    that fetches and saves are structured.
-
-    @method pushPayload
-    @param {DS.Store} store
-    @param {Object} payload
-  */
-  pushPayload: function(store, payload) {
-    payload = this.normalizePayload(null, payload);
-
-    for (var prop in payload) {
-      var typeName = this.typeForRoot(prop),
-          type = store.modelFor(typeName);
-
-      /*jshint loopfunc:true*/
-      var normalizedArray = map.call(Ember.makeArray(payload[prop]), function(hash) {
-        return this.normalize(type, hash, prop);
-      }, this);
-
-      store.pushMany(typeName, normalizedArray);
-    }
-  },
-
-  /**
-    You can use this method to normalize the JSON root keys returned
-    into the model type expected by your store.
-
-    For example, your server may return underscored root keys rather than
-    the expected camelcased versions.
-
-    ```js
-    App.ApplicationSerializer = DS.RESTSerializer.extend({
-      typeForRoot: function(root) {
-        var camelized = Ember.String.camelize(root);
-        return Ember.String.singularize(camelized);
-      }
-    });
-    ```
-
-    @method typeForRoot
-    @param {String} root
-    @returns {String} the model's typeKey
-  */
-  typeForRoot: function(root) {
-    return Ember.String.singularize(root);
-  },
-
-  // SERIALIZE
-
-  /**
-    Called when a record is saved in order to convert the
-    record into JSON.
-
-    By default, it creates a JSON object with a key for
-    each attribute and belongsTo relationship.
-
-    For example, consider this model:
-
-    ```js
-    App.Comment = DS.Model.extend({
-      title: DS.attr(),
-      body: DS.attr(),
-
-      author: DS.belongsTo('user')
-    });
-    ```
-
-    The default serialization would create a JSON object like:
-
-    ```js
-    {
-      "title": "Rails is unagi",
-      "body": "Rails? Omakase? O_O",
-      "author": 12
-    }
-    ```
-
-    By default, attributes are passed through as-is, unless
-    you specified an attribute type (`DS.attr('date')`). If
-    you specify a transform, the JavaScript value will be
-    serialized when inserted into the JSON hash.
-
-    By default, belongs-to relationships are converted into
-    IDs when inserted into the JSON hash.
-
-    ## IDs
-
-    `serialize` takes an options hash with a single option:
-    `includeId`. If this option is `true`, `serialize` will,
-    by default include the ID in the JSON object it builds.
-
-    The adapter passes in `includeId: true` when serializing
-    a record for `createRecord`, but not for `updateRecord`.
-
-    ## Customization
-
-    Your server may expect a different JSON format than the
-    built-in serialization format.
-
-    In that case, you can implement `serialize` yourself and
-    return a JSON hash of your choosing.
-
-    ```js
-    App.PostSerializer = DS.RESTSerializer.extend({
-      serialize: function(post, options) {
-        var json = {
-          POST_TTL: post.get('title'),
-          POST_BDY: post.get('body'),
-          POST_CMS: post.get('comments').mapProperty('id')
-        }
-
-        if (options.includeId) {
-          json.POST_ID_ = post.get('id');
-        }
-
-        return json;
-      }
-    });
-    ```
-
-    ## Customizing an App-Wide Serializer
-
-    If you want to define a serializer for your entire
-    application, you'll probably want to use `eachAttribute`
-    and `eachRelationship` on the record.
-
-    ```js
-    App.ApplicationSerializer = DS.RESTSerializer.extend({
-      serialize: function(record, options) {
-        var json = {};
-
-        record.eachAttribute(function(name) {
-          json[serverAttributeName(name)] = record.get(name);
-        })
-
-        record.eachRelationship(function(name, relationship) {
-          if (relationship.kind === 'hasMany') {
-            json[serverHasManyName(name)] = record.get(name).mapBy('id');
-          }
-        });
-
-        if (options.includeId) {
-          json.ID_ = record.get('id');
-        }
-
-        return json;
-      }
-    });
-
-    function serverAttributeName(attribute) {
-      return attribute.underscore().toUpperCase();
-    }
-
-    function serverHasManyName(name) {
-      return serverAttributeName(name.singularize()) + "_IDS";
-    }
-    ```
-
-    This serializer will generate JSON that looks like this:
-
-    ```js
-    {
-      "TITLE": "Rails is omakase",
-      "BODY": "Yep. Omakase.",
-      "COMMENT_IDS": [ 1, 2, 3 ]
-    }
-    ```
-
-    ## Tweaking the Default JSON
-
-    If you just want to do some small tweaks on the default JSON,
-    you can call super first and make the tweaks on the returned
-    JSON.
-
-    ```js
-    App.PostSerializer = DS.RESTSerializer.extend({
-      serialize: function(record, options) {
-        var json = this._super(record, options);
-
-        json.subject = json.title;
-        delete json.title;
-
-        return json;
-      }
-    });
-    ```
-
-    @method serialize
-    @param record
-    @param options
-  */
-  serialize: function(record, options) {
-    return this._super.apply(this, arguments);
-  },
-
-  /**
-    You can use this method to customize the root keys serialized into the JSON.
-    By default the REST Serializer sends camelized root keys.
-    For example, your server may expect underscored root objects.
-
-    ```js
-    App.ApplicationSerializer = DS.RESTSerializer.extend({
-      serializeIntoHash: function(data, type, record, options) {
-        var root = Ember.String.decamelize(type.typeKey);
-        data[root] = this.serialize(record, options);
-      }
-    });
-    ```
-
-    @method serializeIntoHash
-    @param {Object} hash
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @param {Object} options
-  */
-  serializeIntoHash: function(hash, type, record, options) {
-    var root = Ember.String.camelize(type.typeKey);
-    hash[root] = this.serialize(record, options);
-  },
-
-  /**
-    You can use this method to customize how polymorphic objects are serialized.
-    By default the JSON Serializer creates the key by appending `Type` to
-    the attribute and value from the model's camelcased model name.
-
-    @method serializePolymorphicType
-    @param {DS.Model} record
-    @param {Object} json
-    @param {Object} relationship
-  */
-  serializePolymorphicType: function(record, json, relationship) {
-    var key = relationship.key,
-        belongsTo = get(record, key);
-    key = this.keyForAttribute ? this.keyForAttribute(key) : key;
-    json[key + "Type"] = Ember.String.camelize(belongsTo.constructor.typeKey);
-  }
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get, set = Ember.set;
-var forEach = Ember.ArrayPolyfills.forEach;
-
-/**
-  The REST adapter allows your store to communicate with an HTTP server by
-  transmitting JSON via XHR. Most Ember.js apps that consume a JSON API
-  should use the REST adapter.
-
-  This adapter is designed around the idea that the JSON exchanged with
-  the server should be conventional.
-
-  ## JSON Structure
-
-  The REST adapter expects the JSON returned from your server to follow
-  these conventions.
-
-  ### Object Root
-
-  The JSON payload should be an object that contains the record inside a
-  root property. For example, in response to a `GET` request for
-  `/posts/1`, the JSON should look like this:
-
-  ```js
-  {
-    "post": {
-      "title": "I'm Running to Reform the W3C's Tag",
-      "author": "Yehuda Katz"
-    }
-  }
-  ```
-
-  ### Conventional Names
-
-  Attribute names in your JSON payload should be the camelCased versions of
-  the attributes in your Ember.js models.
-
-  For example, if you have a `Person` model:
-
-  ```js
-  App.Person = DS.Model.extend({
-    firstName: DS.attr('string'),
-    lastName: DS.attr('string'),
-    occupation: DS.attr('string')
-  });
-  ```
-
-  The JSON returned should look like this:
-
-  ```js
-  {
-    "person": {
-      "firstName": "Barack",
-      "lastName": "Obama",
-      "occupation": "President"
-    }
-  }
-  ```
-
-  ## Customization
-
-  ### Endpoint path customization
-
-  Endpoint paths can be prefixed with a `namespace` by setting the namespace
-  property on the adapter:
-
-  ```js
-  DS.RESTAdapter.reopen({
-    namespace: 'api/1'
-  });
-  ```
-  Requests for `App.Person` would now target `/api/1/people/1`.
-
-  ### Host customization
-
-  An adapter can target other hosts by setting the `host` property.
-
-  ```js
-  DS.RESTAdapter.reopen({
-    host: 'https://api.example.com'
-  });
-  ```
-
-  ### Headers customization
-
-  Some APIs require HTTP headers, e.g. to provide an API key. An array of
-  headers can be added to the adapter which are passed with every request:
-
-  ```js
-  DS.RESTAdapter.reopen({
-    headers: {
-      "API_KEY": "secret key",
-      "ANOTHER_HEADER": "Some header value"
-    }
-  });
-  ```
-
-  @class RESTAdapter
-  @constructor
-  @namespace DS
-  @extends DS.Adapter
-*/
-DS.RESTAdapter = DS.Adapter.extend({
-  defaultSerializer: '-rest',
-
-
-  /**
-    Endpoint paths can be prefixed with a `namespace` by setting the namespace
-    property on the adapter:
-
-    ```javascript
-    DS.RESTAdapter.reopen({
-      namespace: 'api/1'
-    });
-    ```
-
-    Requests for `App.Post` would now target `/api/1/post/`.
-
-    @property namespace
-    @type {String}
-  */
-
-  /**
-    An adapter can target other hosts by setting the `host` property.
-
-    ```javascript
-    DS.RESTAdapter.reopen({
-      host: 'https://api.example.com'
-    });
-    ```
-
-    Requests for `App.Post` would now target `https://api.example.com/post/`.
-
-    @property host
-    @type {String}
-  */
-
-  /**
-    Some APIs require HTTP headers, e.g. to provide an API key. An array of
-    headers can be added to the adapter which are passed with every request:
-
-    ```javascript
-    DS.RESTAdapter.reopen({
-      headers: {
-        "API_KEY": "secret key",
-        "ANOTHER_HEADER": "Some header value"
-      }
-    });
-    ```
-
-    @property headers
-    @type {Object}
-  */
-
-  /**
-    Called by the store in order to fetch the JSON for a given
-    type and ID.
-
-    The `find` method makes an Ajax request to a URL computed by `buildURL`, and returns a
-    promise for the resulting payload.
-
-    This method performs an HTTP `GET` request with the id provided as part of the query string.
-
-    @method find
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} id
-    @returns {Promise} promise
-  */
-  find: function(store, type, id) {
-    return this.ajax(this.buildURL(type.typeKey, id), 'GET');
-  },
-
-  /**
-    Called by the store in order to fetch a JSON array for all
-    of the records for a given type.
-
-    The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
-    promise for the resulting payload.
-
-    @private
-    @method findAll
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {String} sinceToken
-    @returns {Promise} promise
-  */
-  findAll: function(store, type, sinceToken) {
-    var query;
-
-    if (sinceToken) {
-      query = { since: sinceToken };
-    }
-
-    return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
-  },
-
-  /**
-    Called by the store in order to fetch a JSON array for
-    the records that match a particular query.
-
-    The `findQuery` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
-    promise for the resulting payload.
-
-    The `query` argument is a simple JavaScript object that will be passed directly
-    to the server as parameters.
-
-    @private
-    @method findQuery
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Object} query
-    @returns {Promise} promise
-  */
-  findQuery: function(store, type, query) {
-    return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
-  },
-
-  /**
-    Called by the store in order to fetch a JSON array for
-    the unloaded records in a has-many relationship that were originally
-    specified as IDs.
-
-    For example, if the original payload looks like:
-
-    ```js
-    {
-      "id": 1,
-      "title": "Rails is omakase",
-      "comments": [ 1, 2, 3 ]
-    }
-    ```
-
-    The IDs will be passed as a URL-encoded Array of IDs, in this form:
-
-    ```
-    ids[]=1&ids[]=2&ids[]=3
-    ```
-
-    Many servers, such as Rails and PHP, will automatically convert this URL-encoded array
-    into an Array for you on the server-side. If you want to encode the
-    IDs, differently, just override this (one-line) method.
-
-    The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
-    promise for the resulting payload.
-
-    @method findMany
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {Array} ids
-    @returns {Promise} promise
-  */
-  findMany: function(store, type, ids) {
-    return this.ajax(this.buildURL(type.typeKey), 'GET', { data: { ids: ids } });
-  },
-
-  /**
-    Called by the store in order to fetch a JSON array for
-    the unloaded records in a has-many relationship that were originally
-    specified as a URL (inside of `links`).
-
-    For example, if your original payload looks like this:
-
-    ```js
-    {
-      "post": {
-        "id": 1,
-        "title": "Rails is omakase",
-        "links": { "comments": "/posts/1/comments" }
-      }
-    }
-    ```
-
-    This method will be called with the parent record and `/posts/1/comments`.
-
-    The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.
-    If the URL is host-relative (starting with a single slash), the
-    request will use the host specified on the adapter (if any).
-
-    @method findHasMany
-    @param {DS.Store} store
-    @param {DS.Model} record
-    @param {String} url
-    @returns {Promise} promise
-  */
-  findHasMany: function(store, record, url) {
-    var host = get(this, 'host'),
-        id   = get(record, 'id'),
-        type = record.constructor.typeKey;
-
-    if (host && url.charAt(0) === '/' && url.charAt(1) !== '/') {
-      url = host + url;
-    }
-
-    return this.ajax(this.urlPrefix(url, this.buildURL(type, id)), 'GET');
-  },
-
-  /**
-    Called by the store in order to fetch a JSON array for
-    the unloaded records in a belongs-to relationship that were originally
-    specified as a URL (inside of `links`).
-
-    For example, if your original payload looks like this:
-
-    ```js
-    {
-      "person": {
-        "id": 1,
-        "name": "Tom Dale",
-        "links": { "group": "/people/1/group" }
-      }
-    }
-    ```
-
-    This method will be called with the parent record and `/people/1/group`.
-
-    The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.
-
-    @method findBelongsTo
-    @param {DS.Store} store
-    @param {DS.Model} record
-    @param {String} url
-    @returns {Promise} promise
-  */
-  findBelongsTo: function(store, record, url) {
-    var id   = get(record, 'id'),
-        type = record.constructor.typeKey;
-
-    return this.ajax(this.urlPrefix(url, this.buildURL(type, id)), 'GET');
-  },
-
-  /**
-    Called by the store when a newly created record is
-    saved via the `save` method on a model record instance.
-
-    The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request
-    to a URL computed by `buildURL`.
-
-    See `serialize` for information on how to customize the serialized form
-    of a record.
-
-    @method createRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @returns {Promise} promise
-  */
-  createRecord: function(store, type, record) {
-    var data = {};
-    var serializer = store.serializerFor(type.typeKey);
-
-    serializer.serializeIntoHash(data, type, record, { includeId: true });
-
-    return this.ajax(this.buildURL(type.typeKey), "POST", { data: data });
-  },
-
-  /**
-    Called by the store when an existing record is saved
-    via the `save` method on a model record instance.
-
-    The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request
-    to a URL computed by `buildURL`.
-
-    See `serialize` for information on how to customize the serialized form
-    of a record.
-
-    @method updateRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @returns {Promise} promise
-  */
-  updateRecord: function(store, type, record) {
-    var data = {};
-    var serializer = store.serializerFor(type.typeKey);
-
-    serializer.serializeIntoHash(data, type, record);
-
-    var id = get(record, 'id');
-
-    return this.ajax(this.buildURL(type.typeKey, id), "PUT", { data: data });
-  },
-
-  /**
-    Called by the store when a record is deleted.
-
-    The `deleteRecord` method  makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.
-
-    @method deleteRecord
-    @param {DS.Store} store
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @returns {Promise} promise
-  */
-  deleteRecord: function(store, type, record) {
-    var id = get(record, 'id');
-
-    return this.ajax(this.buildURL(type.typeKey, id), "DELETE");
-  },
-
-  /**
-    Builds a URL for a given type and optional ID.
-
-    By default, it pluralizes the type's name (for example, 'post'
-    becomes 'posts' and 'person' becomes 'people'). To override the
-    pluralization see [pathForType](#method_pathForType).
-
-    If an ID is specified, it adds the ID to the path generated
-    for the type, separated by a `/`.
-
-    @method buildURL
-    @param {String} type
-    @param {String} id
-    @returns {String} url
-  */
-  buildURL: function(type, id) {
-    var url = [],
-        host = get(this, 'host'),
-        prefix = this.urlPrefix();
-
-    if (type) { url.push(this.pathForType(type)); }
-    if (id) { url.push(id); }
-
-    if (prefix) { url.unshift(prefix); }
-
-    url = url.join('/');
-    if (!host && url) { url = '/' + url; }
-
-    return url;
-  },
-
-  /**
-    @method urlPrefix
-    @private
-    @param {String} path
-    @param {String} parentUrl
-    @return {String} urlPrefix
-  */
-  urlPrefix: function(path, parentURL) {
-    var host = get(this, 'host'),
-        namespace = get(this, 'namespace'),
-        url = [];
-
-    if (path) {
-      // Absolute path
-      if (path.charAt(0) === '/') {
-        if (host) {
-          path = path.slice(1);
-          url.push(host);
-        }
-      // Relative path
-      } else if (!/^http(s)?:\/\//.test(path)) {
-        url.push(parentURL);
-      }
-    } else {
-      if (host) { url.push(host); }
-      if (namespace) { url.push(namespace); }
-    }
-
-    if (path) {
-      url.push(path);
-    }
-
-    return url.join('/');
-  },
-
-  /**
-    Determines the pathname for a given type.
-
-    By default, it pluralizes the type's name (for example,
-    'post' becomes 'posts' and 'person' becomes 'people').
-
-    ### Pathname customization
-
-    For example if you have an object LineItem with an
-    endpoint of "/line_items/".
-
-    ```js
-    DS.RESTAdapter.reopen({
-      pathForType: function(type) {
-        var decamelized = Ember.String.decamelize(type);
-        return Ember.String.pluralize(decamelized);
-      };
-    });
-    ```
-
-    @method pathForType
-    @param {String} type
-    @returns {String} path
-  **/
-  pathForType: function(type) {
-    var camelized = Ember.String.camelize(type);
-    return Ember.String.pluralize(camelized);
-  },
-
-  /**
-    Takes an ajax response, and returns a relevant error.
-
-    Returning a `DS.InvalidError` from this method will cause the
-    record to transition into the `invalid` state and make the
-    `errors` object available on the record.
-
-    ```javascript
-    App.ApplicationAdapter = DS.RESTAdapter.extend({
-      ajaxError: function(jqXHR) {
-        var error = this._super(jqXHR);
-
-        if (jqXHR && jqXHR.status === 422) {
-          var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"];
-
-          return new DS.InvalidError(jsonErrors);
-        } else {
-          return error;
-        }
-      }
-    });
-    ```
-
-    Note: As a correctness optimization, the default implementation of
-    the `ajaxError` method strips out the `then` method from jquery's
-    ajax response (jqXHR). This is important because the jqXHR's
-    `then` method fulfills the promise with itself resulting in a
-    circular "thenable" chain which may cause problems for some
-    promise libraries.
-
-    @method ajaxError
-    @param  {Object} jqXHR
-    @return {Object} jqXHR
-  */
-  ajaxError: function(jqXHR) {
-    if (jqXHR) {
-      jqXHR.then = null;
-    }
-
-    return jqXHR;
-  },
-
-  /**
-    Takes a URL, an HTTP method and a hash of data, and makes an
-    HTTP request.
-
-    When the server responds with a payload, Ember Data will call into `extractSingle`
-    or `extractArray` (depending on whether the original query was for one record or
-    many records).
-
-    By default, `ajax` method has the following behavior:
-
-    * It sets the response `dataType` to `"json"`
-    * If the HTTP method is not `"GET"`, it sets the `Content-Type` to be
-      `application/json; charset=utf-8`
-    * If the HTTP method is not `"GET"`, it stringifies the data passed in. The
-      data is the serialized record in the case of a save.
-    * Registers success and failure handlers.
-
-    @method ajax
-    @private
-    @param {String} url
-    @param {String} type The request type GET, POST, PUT, DELETE etc.
-    @param {Object} hash
-    @return {Promise} promise
-  */
-  ajax: function(url, type, hash) {
-    var adapter = this;
-
-    return new Ember.RSVP.Promise(function(resolve, reject) {
-      hash = adapter.ajaxOptions(url, type, hash);
-
-      hash.success = function(json) {
-        Ember.run(null, resolve, json);
-      };
-
-      hash.error = function(jqXHR, textStatus, errorThrown) {
-        Ember.run(null, reject, adapter.ajaxError(jqXHR));
-      };
-
-      Ember.$.ajax(hash);
-    }, "DS: RestAdapter#ajax " + type + " to " + url);
-  },
-
-  /**
-    @method ajaxOptions
-    @private
-    @param {String} url
-    @param {String} type The request type GET, POST, PUT, DELETE etc.
-    @param {Object} hash
-    @return {Object} hash
-  */
-  ajaxOptions: function(url, type, hash) {
-    hash = hash || {};
-    hash.url = url;
-    hash.type = type;
-    hash.dataType = 'json';
-    hash.context = this;
-
-    if (hash.data && type !== 'GET') {
-      hash.contentType = 'application/json; charset=utf-8';
-      hash.data = JSON.stringify(hash.data);
-    }
-
-    if (this.headers !== undefined) {
-      var headers = this.headers;
-      hash.beforeSend = function (xhr) {
-        forEach.call(Ember.keys(headers), function(key) {
-          xhr.setRequestHeader(key, headers[key]);
-        });
-      };
-    }
-
-
-    return hash;
-  }
-
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-DS.Model.reopen({
-
-  /**
-    Provides info about the model for debugging purposes
-    by grouping the properties into more semantic groups.
-
-    Meant to be used by debugging tools such as the Chrome Ember Extension.
-
-    - Groups all attributes in "Attributes" group.
-    - Groups all belongsTo relationships in "Belongs To" group.
-    - Groups all hasMany relationships in "Has Many" group.
-    - Groups all flags in "Flags" group.
-    - Flags relationship CPs as expensive properties.
-
-    @method _debugInfo
-    @for DS.Model
-    @private
-  */
-  _debugInfo: function() {
-    var attributes = ['id'],
-        relationships = { belongsTo: [], hasMany: [] },
-        expensiveProperties = [];
-
-    this.eachAttribute(function(name, meta) {
-      attributes.push(name);
-    }, this);
-
-    this.eachRelationship(function(name, relationship) {
-      relationships[relationship.kind].push(name);
-      expensiveProperties.push(name);
-    });
-
-    var groups = [
-      {
-        name: 'Attributes',
-        properties: attributes,
-        expand: true
-      },
-      {
-        name: 'Belongs To',
-        properties: relationships.belongsTo,
-        expand: true
-      },
-      {
-        name: 'Has Many',
-        properties: relationships.hasMany,
-        expand: true
-      },
-      {
-        name: 'Flags',
-        properties: ['isLoaded', 'isDirty', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']
-      }
-    ];
-
-    return {
-      propertyInfo: {
-        // include all other mixins / properties (not just the grouped ones)
-        includeOtherProperties: true,
-        groups: groups,
-        // don't pre-calculate unless cached
-        expensiveProperties: expensiveProperties
-      }
-    };
-  }
-
-});
-
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-})();
-
-
-
-(function() {
-/**
-  Ember Data
-
-  @module ember-data
-  @main ember-data
-*/
-
-})();
-
-(function() {
-Ember.String.pluralize = function(word) {
-  return Ember.Inflector.inflector.pluralize(word);
-};
-
-Ember.String.singularize = function(word) {
-  return Ember.Inflector.inflector.singularize(word);
-};
-
-})();
-
-
-
-(function() {
-var BLANK_REGEX = /^\s*$/;
-
-function loadUncountable(rules, uncountable) {
-  for (var i = 0, length = uncountable.length; i < length; i++) {
-    rules.uncountable[uncountable[i].toLowerCase()] = true;
-  }
-}
-
-function loadIrregular(rules, irregularPairs) {
-  var pair;
-
-  for (var i = 0, length = irregularPairs.length; i < length; i++) {
-    pair = irregularPairs[i];
-
-    rules.irregular[pair[0].toLowerCase()] = pair[1];
-    rules.irregularInverse[pair[1].toLowerCase()] = pair[0];
-  }
-}
-
-/**
-  Inflector.Ember provides a mechanism for supplying inflection rules for your
-  application. Ember includes a default set of inflection rules, and provides an
-  API for providing additional rules.
-
-  Examples:
-
-  Creating an inflector with no rules.
-
-  ```js
-  var inflector = new Ember.Inflector();
-  ```
-
-  Creating an inflector with the default ember ruleset.
-
-  ```js
-  var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);
-
-  inflector.pluralize('cow') //=> 'kine'
-  inflector.singularize('kine') //=> 'cow'
-  ```
-
-  Creating an inflector and adding rules later.
-
-  ```javascript
-  var inflector = Ember.Inflector.inflector;
-
-  inflector.pluralize('advice') // => 'advices'
-  inflector.uncountable('advice');
-  inflector.pluralize('advice') // => 'advice'
-
-  inflector.pluralize('formula') // => 'formulas'
-  inflector.irregular('formula', 'formulae');
-  inflector.pluralize('formula') // => 'formulae'
-
-  // you would not need to add these as they are the default rules
-  inflector.plural(/$/, 's');
-  inflector.singular(/s$/i, '');
-  ```
-
-  Creating an inflector with a nondefault ruleset.
-
-  ```javascript
-  var rules = {
-    plurals:  [ /$/, 's' ],
-    singular: [ /\s$/, '' ],
-    irregularPairs: [
-      [ 'cow', 'kine' ]
-    ],
-    uncountable: [ 'fish' ]
-  };
-
-  var inflector = new Ember.Inflector(rules);
-  ```
-
-  @class Inflector
-  @namespace Ember
-*/
-function Inflector(ruleSet) {
-  ruleSet = ruleSet || {};
-  ruleSet.uncountable = ruleSet.uncountable || {};
-  ruleSet.irregularPairs = ruleSet.irregularPairs || {};
-
-  var rules = this.rules = {
-    plurals:  ruleSet.plurals || [],
-    singular: ruleSet.singular || [],
-    irregular: {},
-    irregularInverse: {},
-    uncountable: {}
-  };
-
-  loadUncountable(rules, ruleSet.uncountable);
-  loadIrregular(rules, ruleSet.irregularPairs);
-}
-
-Inflector.prototype = {
-  /**
-    @method plural
-    @param {RegExp} regex
-    @param {String} string
-  */
-  plural: function(regex, string) {
-    this.rules.plurals.push([regex, string.toLowerCase()]);
-  },
-
-  /**
-    @method singular
-    @param {RegExp} regex
-    @param {String} string
-  */
-  singular: function(regex, string) {
-    this.rules.singular.push([regex, string.toLowerCase()]);
-  },
-
-  /**
-    @method uncountable
-    @param {String} regex
-  */
-  uncountable: function(string) {
-    loadUncountable(this.rules, [string.toLowerCase()]);
-  },
-
-  /**
-    @method irregular
-    @param {String} singular
-    @param {String} plural
-  */
-  irregular: function (singular, plural) {
-    loadIrregular(this.rules, [[singular, plural]]);
-  },
-
-  /**
-    @method pluralize
-    @param {String} word
-  */
-  pluralize: function(word) {
-    return this.inflect(word, this.rules.plurals, this.rules.irregular);
-  },
-
-  /**
-    @method singularize
-    @param {String} word
-  */
-  singularize: function(word) {
-    return this.inflect(word, this.rules.singular,  this.rules.irregularInverse);
-  },
-
-  /**
-    @protected
-
-    @method inflect
-    @param {String} word
-    @param {Object} typeRules
-    @param {Object} irregular
-  */
-  inflect: function(word, typeRules, irregular) {
-    var inflection, substitution, result, lowercase, isBlank,
-    isUncountable, isIrregular, isIrregularInverse, rule;
-
-    isBlank = BLANK_REGEX.test(word);
-
-    if (isBlank) {
-      return word;
-    }
-
-    lowercase = word.toLowerCase();
-
-    isUncountable = this.rules.uncountable[lowercase];
-
-    if (isUncountable) {
-      return word;
-    }
-
-    isIrregular = irregular && irregular[lowercase];
-
-    if (isIrregular) {
-      return isIrregular;
-    }
-
-    for (var i = typeRules.length, min = 0; i > min; i--) {
-       inflection = typeRules[i-1];
-       rule = inflection[0];
-
-      if (rule.test(word)) {
-        break;
-      }
-    }
-
-    inflection = inflection || [];
-
-    rule = inflection[0];
-    substitution = inflection[1];
-
-    result = word.replace(rule, substitution);
-
-    return result;
-  }
-};
-
-Ember.Inflector = Inflector;
-
-})();
-
-
-
-(function() {
-Ember.Inflector.defaultRules = {
-  plurals: [
-    [/$/, 's'],
-    [/s$/i, 's'],
-    [/^(ax|test)is$/i, '$1es'],
-    [/(octop|vir)us$/i, '$1i'],
-    [/(octop|vir)i$/i, '$1i'],
-    [/(alias|status)$/i, '$1es'],
-    [/(bu)s$/i, '$1ses'],
-    [/(buffal|tomat)o$/i, '$1oes'],
-    [/([ti])um$/i, '$1a'],
-    [/([ti])a$/i, '$1a'],
-    [/sis$/i, 'ses'],
-    [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'],
-    [/(hive)$/i, '$1s'],
-    [/([^aeiouy]|qu)y$/i, '$1ies'],
-    [/(x|ch|ss|sh)$/i, '$1es'],
-    [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'],
-    [/^(m|l)ouse$/i, '$1ice'],
-    [/^(m|l)ice$/i, '$1ice'],
-    [/^(ox)$/i, '$1en'],
-    [/^(oxen)$/i, '$1'],
-    [/(quiz)$/i, '$1zes']
-  ],
-
-  singular: [
-    [/s$/i, ''],
-    [/(ss)$/i, '$1'],
-    [/(n)ews$/i, '$1ews'],
-    [/([ti])a$/i, '$1um'],
-    [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'],
-    [/(^analy)(sis|ses)$/i, '$1sis'],
-    [/([^f])ves$/i, '$1fe'],
-    [/(hive)s$/i, '$1'],
-    [/(tive)s$/i, '$1'],
-    [/([lr])ves$/i, '$1f'],
-    [/([^aeiouy]|qu)ies$/i, '$1y'],
-    [/(s)eries$/i, '$1eries'],
-    [/(m)ovies$/i, '$1ovie'],
-    [/(x|ch|ss|sh)es$/i, '$1'],
-    [/^(m|l)ice$/i, '$1ouse'],
-    [/(bus)(es)?$/i, '$1'],
-    [/(o)es$/i, '$1'],
-    [/(shoe)s$/i, '$1'],
-    [/(cris|test)(is|es)$/i, '$1is'],
-    [/^(a)x[ie]s$/i, '$1xis'],
-    [/(octop|vir)(us|i)$/i, '$1us'],
-    [/(alias|status)(es)?$/i, '$1'],
-    [/^(ox)en/i, '$1'],
-    [/(vert|ind)ices$/i, '$1ex'],
-    [/(matr)ices$/i, '$1ix'],
-    [/(quiz)zes$/i, '$1'],
-    [/(database)s$/i, '$1']
-  ],
-
-  irregularPairs: [
-    ['person', 'people'],
-    ['man', 'men'],
-    ['child', 'children'],
-    ['sex', 'sexes'],
-    ['move', 'moves'],
-    ['cow', 'kine'],
-    ['zombie', 'zombies']
-  ],
-
-  uncountable: [
-    'equipment',
-    'information',
-    'rice',
-    'money',
-    'species',
-    'series',
-    'fish',
-    'sheep',
-    'jeans',
-    'police'
-  ]
-};
-
-})();
-
-
-
-(function() {
-if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
-  /**
-    See {{#crossLink "Ember.String/pluralize"}}{{/crossLink}}
-
-    @method pluralize
-    @for String
-  */
-  String.prototype.pluralize = function() {
-    return Ember.String.pluralize(this);
-  };
-
-  /**
-    See {{#crossLink "Ember.String/singularize"}}{{/crossLink}}
-
-    @method singularize
-    @for String
-  */
-  String.prototype.singularize = function() {
-    return Ember.String.singularize(this);
-  };
-}
-
-})();
-
-
-
-(function() {
-Ember.Inflector.inflector = new Ember.Inflector(Ember.Inflector.defaultRules);
-
-})();
-
-
-
-(function() {
-
-})();
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var get = Ember.get,
-    forEach = Ember.EnumerableUtils.forEach,
-    camelize =   Ember.String.camelize,
-    capitalize = Ember.String.capitalize,
-    decamelize = Ember.String.decamelize,
-    singularize = Ember.String.singularize,
-    underscore = Ember.String.underscore;
-
-DS.ActiveModelSerializer = DS.RESTSerializer.extend({
-  // SERIALIZE
-
-  /**
-    Converts camelcased attributes to underscored when serializing.
-
-    @method keyForAttribute
-    @param {String} attribute
-    @returns String
-  */
-  keyForAttribute: function(attr) {
-    return decamelize(attr);
-  },
-
-  /**
-    Underscores relationship names and appends "_id" or "_ids" when serializing
-    relationship keys.
-
-    @method keyForRelationship
-    @param {String} key
-    @param {String} kind
-    @returns String
-  */
-  keyForRelationship: function(key, kind) {
-    key = decamelize(key);
-    if (kind === "belongsTo") {
-      return key + "_id";
-    } else if (kind === "hasMany") {
-      return singularize(key) + "_ids";
-    } else {
-      return key;
-    }
-  },
-
-  /**
-    Does not serialize hasMany relationships by default.
-  */
-  serializeHasMany: Ember.K,
-
-  /**
-    Underscores the JSON root keys when serializing.
-
-    @method serializeIntoHash
-    @param {Object} hash
-    @param {subclass of DS.Model} type
-    @param {DS.Model} record
-    @param {Object} options
-  */
-  serializeIntoHash: function(data, type, record, options) {
-    var root = underscore(decamelize(type.typeKey));
-    data[root] = this.serialize(record, options);
-  },
-
-  /**
-    Serializes a polymorphic type as a fully capitalized model name.
-
-    @method serializePolymorphicType
-    @param {DS.Model} record
-    @param {Object} json
-    @param relationship
-  */
-  serializePolymorphicType: function(record, json, relationship) {
-    var key = relationship.key,
-        belongsTo = get(record, key);
-    key = this.keyForAttribute(key);
-    json[key + "_type"] = capitalize(camelize(belongsTo.constructor.typeKey));
-  },
-
-  // EXTRACT
-
-  /**
-    Extracts the model typeKey from underscored root objects.
-
-    @method typeForRoot
-    @param {String} root
-    @returns String the model's typeKey
-  */
-  typeForRoot: function(root) {
-    var camelized = camelize(root);
-    return singularize(camelized);
-  },
-
-  /**
-    Add extra step to `DS.RESTSerializer.normalize` so links are
-    normalized.
-
-    If your payload looks like this
-
-    ```js
-    {
-      "post": {
-        "id": 1,
-        "title": "Rails is omakase",
-        "links": { "flagged_comments": "api/comments/flagged" }
-      }
-    }
-    ```
-    The normalized version would look like this
-
-    ```js
-    {
-      "post": {
-        "id": 1,
-        "title": "Rails is omakase",
-        "links": { "flaggedComments": "api/comments/flagged" }
-      }
-    }
-    ```
-
-    @method normalize
-    @param {subclass of DS.Model} type
-    @param {Object} hash
-    @param {String} prop
-    @returns Object
-  */
-
-  normalize: function(type, hash, prop) {
-    this.normalizeLinks(hash);
-
-    return this._super(type, hash, prop);
-  },
-
-  /**
-    Convert `snake_cased` links  to `camelCase`
-
-    @method normalizeLinks
-    @param {Object} hash
-  */
-
-  normalizeLinks: function(data){
-    if (data.links) {
-      var links = data.links;
-
-      for (var link in links) {
-        var camelizedLink = camelize(link);
-
-        if (camelizedLink !== link) {
-          links[camelizedLink] = links[link];
-          delete links[link];
-        }
-      }
-    }
-  },
-
-  /**
-    Normalize the polymorphic type from the JSON.
-
-    Normalize:
-    ```js
-      {
-        id: "1"
-        minion: { type: "evil_minion", id: "12"}
-      }
-    ```
-
-    To:
-    ```js
-      {
-        id: "1"
-        minion: { type: "evilMinion", id: "12"}
-      }
-    ```
-
-    @method normalizeRelationships
-    @private
-  */
-  normalizeRelationships: function(type, hash) {
-    var payloadKey, payload;
-
-    if (this.keyForRelationship) {
-      type.eachRelationship(function(key, relationship) {
-        if (relationship.options.polymorphic) {
-          payloadKey = this.keyForAttribute(key);
-          payload = hash[payloadKey];
-          if (payload && payload.type) {
-            payload.type = this.typeForRoot(payload.type);
-          } else if (payload && relationship.kind === "hasMany") {
-            var self = this;
-            forEach(payload, function(single) {
-              single.type = self.typeForRoot(single.type);
-            });
-          }
-        } else {
-          payloadKey = this.keyForRelationship(key, relationship.kind);
-          payload = hash[payloadKey];
-        }
-
-        hash[key] = payload;
-
-        if (key !== payloadKey) {
-          delete hash[payloadKey];
-        }
-      }, this);
-    }
-  }
-});
-
-})();
-
-
-
-(function() {
-var get = Ember.get;
-var forEach = Ember.EnumerableUtils.forEach;
-
-/**
-  The EmbeddedRecordsMixin allows you to add embedded record support to your
-  serializers.
-  To set up embedded records, you include the mixin into the serializer and then
-  define your embedded relations.
-
-  ```js
-  App.PostSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
-    attrs: {
-      comments: {embedded: 'always'}
-    }
-  })
-  ```
-
-  Currently only `{embedded: 'always'}` records are supported.
-
-  @class EmbeddedRecordsMixin
-  @namespace DS
-*/
-DS.EmbeddedRecordsMixin = Ember.Mixin.create({
-
-  /**
-    Serialize has-may relationship when it is configured as embedded objects.
-
-    @method serializeHasMany
-  */
-  serializeHasMany: function(record, json, relationship) {
-    var key   = relationship.key,
-        attrs = get(this, 'attrs'),
-        embed = attrs && attrs[key] && attrs[key].embedded === 'always';
-
-    if (embed) {
-      json[this.keyForAttribute(key)] = get(record, key).map(function(relation) {
-        var data = relation.serialize(),
-            primaryKey = get(this, 'primaryKey');
-
-        data[primaryKey] = get(relation, primaryKey);
-
-        return data;
-      }, this);
-    }
-  },
-
-  /**
-    Extract embedded objects out of the payload for a single object
-    and add them as sideloaded objects instead.
-
-    @method extractSingle
-  */
-  extractSingle: function(store, primaryType, payload, recordId, requestType) {
-    var root = this.keyForAttribute(primaryType.typeKey),
-        partial = payload[root];
-
-    updatePayloadWithEmbedded(store, this, primaryType, partial, payload);
-
-    return this._super(store, primaryType, payload, recordId, requestType);
-  },
-
-  /**
-    Extract embedded objects out of a standard payload
-    and add them as sideloaded objects instead.
-
-    @method extractArray
-  */
-  extractArray: function(store, type, payload) {
-    var root = this.keyForAttribute(type.typeKey),
-        partials = payload[Ember.String.pluralize(root)];
-
-    forEach(partials, function(partial) {
-      updatePayloadWithEmbedded(store, this, type, partial, payload);
-    }, this);
-
-    return this._super(store, type, payload);
-  }
-});
-
-function updatePayloadWithEmbedded(store, serializer, type, partial, payload) {
-  var attrs = get(serializer, 'attrs');
-
-  if (!attrs) {
-    return;
-  }
-
-  type.eachRelationship(function(key, relationship) {
-    var expandedKey, embeddedTypeKey, attribute, ids,
-        config = attrs[key],
-        serializer = store.serializerFor(relationship.type.typeKey),
-        primaryKey = get(serializer, "primaryKey");
-
-    if (relationship.kind !== "hasMany") {
-      return;
-    }
-
-    if (config && (config.embedded === 'always' || config.embedded === 'load')) {
-      // underscore forces the embedded records to be side loaded.
-      // it is needed when main type === relationship.type
-      embeddedTypeKey = '_' + Ember.String.pluralize(relationship.type.typeKey);
-      expandedKey = this.keyForRelationship(key, relationship.kind);
-      attribute  = this.keyForAttribute(key);
-      ids = [];
-
-      if (!partial[attribute]) {
-        return;
-      }
-
-      payload[embeddedTypeKey] = payload[embeddedTypeKey] || [];
-
-      forEach(partial[attribute], function(data) {
-        var embeddedType = store.modelFor(relationship.type.typeKey);
-        updatePayloadWithEmbedded(store, serializer, embeddedType, data, payload);
-        ids.push(data[primaryKey]);
-        payload[embeddedTypeKey].push(data);
-      });
-
-      partial[expandedKey] = ids;
-      delete partial[attribute];
-    }
-  }, serializer);
-}
-})();
-
-
-
-(function() {
-/**
-  @module ember-data
-*/
-
-var forEach = Ember.EnumerableUtils.forEach;
-var decamelize = Ember.String.decamelize,
-    underscore = Ember.String.underscore,
-    pluralize  = Ember.String.pluralize;
-
-/**
-  The ActiveModelAdapter is a subclass of the RESTAdapter designed to integrate
-  with a JSON API that uses an underscored naming convention instead of camelcasing.
-  It has been designed to work out of the box with the
-  [active_model_serializers](http://github.com/rails-api/active_model_serializers)
-  Ruby gem.
-
-  This adapter extends the DS.RESTAdapter by making consistent use of the camelization,
-  decamelization and pluralization methods to normalize the serialized JSON into a
-  format that is compatible with a conventional Rails backend and Ember Data.
-
-  ## JSON Structure
-
-  The ActiveModelAdapter expects the JSON returned from your server to follow
-  the REST adapter conventions substituting underscored keys for camelcased ones.
-
-  ### Conventional Names
-
-  Attribute names in your JSON payload should be the underscored versions of
-  the attributes in your Ember.js models.
-
-  For example, if you have a `Person` model:
-
-  ```js
-  App.FamousPerson = DS.Model.extend({
-    firstName: DS.attr('string'),
-    lastName: DS.attr('string'),
-    occupation: DS.attr('string')
-  });
-  ```
-
-  The JSON returned should look like this:
-
-  ```js
-  {
-    "famous_person": {
-      "first_name": "Barack",
-      "last_name": "Obama",
-      "occupation": "President"
-    }
-  }
-  ```
-
-  @class ActiveModelAdapter
-  @constructor
-  @namespace DS
-  @extends DS.Adapter
-**/
-
-DS.ActiveModelAdapter = DS.RESTAdapter.extend({
-  defaultSerializer: '-active-model',
-  /**
-    The ActiveModelAdapter overrides the `pathForType` method to build
-    underscored URLs by decamelizing and pluralizing the object type name.
-
-    ```js
-      this.pathForType("famousPerson");
-      //=> "famous_people"
-    ```
-
-    @method pathForType
-    @param {String} type
-    @returns String
-  */
-  pathForType: function(type) {
-    var decamelized = decamelize(type);
-    var underscored = underscore(decamelized);
-    return pluralize(underscored);
-  },
-
-  /**
-    The ActiveModelAdapter overrides the `ajaxError` method
-    to return a DS.InvalidError for all 422 Unprocessable Entity
-    responses.
-
-    A 422 HTTP response from the server generally implies that the request
-    was well formed but the API was unable to process it because the
-    content was not semantically correct or meaningful per the API.
-
-    For more information on 422 HTTP Error code see 11.2 WebDAV RFC 4918
-    https://tools.ietf.org/html/rfc4918#section-11.2
-
-    @method ajaxError
-    @param jqXHR
-    @returns error
-  */
-  ajaxError: function(jqXHR) {
-    var error = this._super(jqXHR);
-
-    if (jqXHR && jqXHR.status === 422) {
-      var response = Ember.$.parseJSON(jqXHR.responseText),
-          errors = {};
-
-      if (response.errors !== undefined) {
-        var jsonErrors = response.errors;
-
-        forEach(Ember.keys(jsonErrors), function(key) {
-          errors[Ember.String.camelize(key)] = jsonErrors[key];
-        });
-      }
-
-      return new DS.InvalidError(errors);
-    } else {
-      return error;
-    }
-  }
-});
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-
-(function() {
-Ember.onLoad('Ember.Application', function(Application) {
-  Application.initializer({
-    name: "activeModelAdapter",
-
-    initialize: function(container, application) {
-      var proxy = new DS.ContainerProxy(container);
-      proxy.registerDeprecations([
-        {deprecated: 'serializer:_ams',  valid: 'serializer:-active-model'},
-        {deprecated: 'adapter:_ams',     valid: 'adapter:-active-model'}
-      ]);
-
-      application.register('serializer:-active-model', DS.ActiveModelSerializer);
-      application.register('adapter:-active-model', DS.ActiveModelAdapter);
-    }
-  });
-});
-
-})();
-
-
-
-(function() {
-
-})();
-
-
-})();
diff --git a/dashboard/dependencies/js/ember.js b/dashboard/dependencies/js/ember.js
deleted file mode 100644
index b75284a..0000000
--- a/dashboard/dependencies/js/ember.js
+++ /dev/null
@@ -1,46394 +0,0 @@
-/*!
- * @overview  Ember - JavaScript Application Framework
- * @copyright Copyright 2011-2014 Tilde Inc. and contributors
- *            Portions Copyright 2006-2011 Strobe Inc.
- *            Portions Copyright 2008-2011 Apple Inc. All rights reserved.
- * @license   Licensed under MIT license
- *            See https://raw.github.com/emberjs/ember.js/master/LICENSE
- * @version   1.6.0-beta.1+canary.24b19e51
- */
-
-
-(function() {
-var define, requireModule, require, requirejs, Ember;
-
-(function() {
-  Ember = this.Ember = this.Ember || {};
-  if (typeof Ember === 'undefined') { Ember = {} };
-
-  if (typeof Ember.__loader === 'undefined') {
-    var registry = {}, seen = {};
-
-    define = function(name, deps, callback) {
-      registry[name] = { deps: deps, callback: callback };
-    };
-
-    requirejs = require = requireModule = function(name) {
-      if (seen.hasOwnProperty(name)) { return seen[name]; }
-      seen[name] = {};
-
-      if (!registry[name]) {
-        throw new Error("Could not find module " + name);
-      }
-
-      var mod = registry[name],
-      deps = mod.deps,
-      callback = mod.callback,
-      reified = [],
-      exports;
-
-      for (var i=0, l=deps.length; i<l; i++) {
-        if (deps[i] === 'exports') {
-          reified.push(exports = {});
-        } else {
-          reified.push(requireModule(resolve(deps[i])));
-        }
-      }
-
-      var value = callback.apply(this, reified);
-      return seen[name] = exports || value;
-
-      function resolve(child) {
-        if (child.charAt(0) !== '.') { return child; }
-        var parts = child.split("/");
-        var parentBase = name.split("/").slice(0, -1);
-
-        for (var i=0, l=parts.length; i<l; i++) {
-          var part = parts[i];
-
-          if (part === '..') { parentBase.pop(); }
-          else if (part === '.') { continue; }
-          else { parentBase.push(part); }
-        }
-
-        return parentBase.join("/");
-      }
-    };
-    requirejs._eak_seen = registry;
-
-    Ember.__loader = {define: define, require: require, registry: registry};
-  } else {
-    define = Ember.__loader.define;
-    requirejs = require = requireModule = Ember.__loader.require;
-  }
-})();
-(function() {
-define("ember-debug", 
-  ["ember-metal/core","ember-metal/error","ember-metal/logger"],
-  function(__dependency1__, __dependency2__, __dependency3__) {
-    "use strict";
-    /*global __fail__*/
-
-    var Ember = __dependency1__["default"];
-    var EmberError = __dependency2__["default"];
-    var Logger = __dependency3__["default"];
-
-    /**
-    Ember Debug
-
-    @module ember
-    @submodule ember-debug
-    */
-
-    /**
-    @class Ember
-    */
-
-    /**
-      Define an assertion that will throw an exception if the condition is not
-      met. Ember build tools will remove any calls to `Ember.assert()` when
-      doing a production build. Example:
-
-      ```javascript
-      // Test for truthiness
-      Ember.assert('Must pass a valid object', obj);
-      // Fail unconditionally
-      Ember.assert('This code path should never be run')
-      ```
-
-      @method assert
-      @param {String} desc A description of the assertion. This will become
-        the text of the Error thrown if the assertion fails.
-      @param {Boolean} test Must be truthy for the assertion to pass. If
-        falsy, an exception will be thrown.
-    */
-    Ember.assert = function(desc, test) {
-      if (!test) {
-        throw new EmberError("Assertion Failed: " + desc);
-      }
-    };
-
-
-    /**
-      Display a warning with the provided message. Ember build tools will
-      remove any calls to `Ember.warn()` when doing a production build.
-
-      @method warn
-      @param {String} message A warning to display.
-      @param {Boolean} test An optional boolean. If falsy, the warning
-        will be displayed.
-    */
-    Ember.warn = function(message, test) {
-      if (!test) {
-        Logger.warn("WARNING: "+message);
-        if ('trace' in Logger) Logger.trace();
-      }
-    };
-
-    /**
-      Display a debug notice. Ember build tools will remove any calls to
-      `Ember.debug()` when doing a production build.
-
-      ```javascript
-      Ember.debug("I'm a debug notice!");
-      ```
-
-      @method debug
-      @param {String} message A debug message to display.
-    */
-    Ember.debug = function(message) {
-      Logger.debug("DEBUG: "+message);
-    };
-
-    /**
-      Display a deprecation warning with the provided message and a stack trace
-      (Chrome and Firefox only). Ember build tools will remove any calls to
-      `Ember.deprecate()` when doing a production build.
-
-      @method deprecate
-      @param {String} message A description of the deprecation.
-      @param {Boolean} test An optional boolean. If falsy, the deprecation
-        will be displayed.
-    */
-    Ember.deprecate = function(message, test) {
-      if (test) { return; }
-
-      if (Ember.ENV.RAISE_ON_DEPRECATION) { throw new EmberError(message); }
-
-      var error;
-
-      // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome
-      try { __fail__.fail(); } catch (e) { error = e; }
-
-      if (Ember.LOG_STACKTRACE_ON_DEPRECATION && error.stack) {
-        var stack, stackStr = '';
-        if (error['arguments']) {
-          // Chrome
-          stack = error.stack.replace(/^\s+at\s+/gm, '').
-                              replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').
-                              replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
-          stack.shift();
-        } else {
-          // Firefox
-          stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').
-                              replace(/^\(/gm, '{anonymous}(').split('\n');
-        }
-
-        stackStr = "\n    " + stack.slice(2).join("\n    ");
-        message = message + stackStr;
-      }
-
-      Logger.warn("DEPRECATION: "+message);
-    };
-
-
-
-    /**
-      Alias an old, deprecated method with its new counterpart.
-
-      Display a deprecation warning with the provided message and a stack trace
-      (Chrome and Firefox only) when the assigned method is called.
-
-      Ember build tools will not remove calls to `Ember.deprecateFunc()`, though
-      no warnings will be shown in production.
-
-      ```javascript
-      Ember.oldMethod = Ember.deprecateFunc("Please use the new, updated method", Ember.newMethod);
-      ```
-
-      @method deprecateFunc
-      @param {String} message A description of the deprecation.
-      @param {Function} func The new function called to replace its deprecated counterpart.
-      @return {Function} a new function that wrapped the original function with a deprecation warning
-    */
-    Ember.deprecateFunc = function(message, func) {
-      return function() {
-        Ember.deprecate(message);
-        return func.apply(this, arguments);
-      };
-    };
-
-
-    /**
-      Run a function meant for debugging. Ember build tools will remove any calls to
-      `Ember.runInDebug()` when doing a production build.
-
-      ```javascript
-      Ember.runInDebug( function() {
-        Ember.Handlebars.EachView.reopen({
-          didInsertElement: function() {
-            console.log("I'm happy");
-          }
-        });
-      });
-      ```
-
-      @method runInDebug
-      @param {Function} func The function to be executed.
-    */
-    Ember.runInDebug = function(func) {
-      func()
-    };
-
-    // Inform the developer about the Ember Inspector if not installed.
-    if (!Ember.testing) {
-      var isFirefox = typeof InstallTrigger !== 'undefined';
-      var isChrome = !!window.chrome && !window.opera;
-
-      if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {
-        window.addEventListener("load", function() {
-          if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {
-            var downloadURL;
-
-            if(isChrome) {
-              downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';
-            } else if(isFirefox) {
-              downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';
-            }
-
-            Ember.debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);
-          }
-        }, false);
-      }
-    }
-  });
-})();
-
-(function() {
-define("ember-metal/array", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /*jshint newcap:false*/
-    /**
-    @module ember-metal
-    */
-
-    var ArrayPrototype = Array.prototype;
-
-    // NOTE: There is a bug in jshint that doesn't recognize `Object()` without `new`
-    // as being ok unless both `newcap:false` and not `use strict`.
-    // https://github.com/jshint/jshint/issues/392
-
-    // Testing this is not ideal, but we want to use native functions
-    // if available, but not to use versions created by libraries like Prototype
-    var isNativeFunc = function(func) {
-      // This should probably work in all browsers likely to have ES5 array methods
-      return func && Function.prototype.toString.call(func).indexOf('[native code]') > -1;
-    };
-
-    // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map
-    var map = isNativeFunc(ArrayPrototype.map) ? ArrayPrototype.map : function(fun /*, thisp */) {
-      //"use strict";
-
-      if (this === void 0 || this === null) {
-        throw new TypeError();
-      }
-
-      var t = Object(this);
-      var len = t.length >>> 0;
-      if (typeof fun !== "function") {
-        throw new TypeError();
-      }
-
-      var res = new Array(len);
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++) {
-        if (i in t) {
-          res[i] = fun.call(thisp, t[i], i, t);
-        }
-      }
-
-      return res;
-    };
-
-    // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
-    var forEach = isNativeFunc(ArrayPrototype.forEach) ? ArrayPrototype.forEach : function(fun /*, thisp */) {
-      //"use strict";
-
-      if (this === void 0 || this === null) {
-        throw new TypeError();
-      }
-
-      var t = Object(this);
-      var len = t.length >>> 0;
-      if (typeof fun !== "function") {
-        throw new TypeError();
-      }
-
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++) {
-        if (i in t) {
-          fun.call(thisp, t[i], i, t);
-        }
-      }
-    };
-
-    var indexOf = isNativeFunc(ArrayPrototype.indexOf) ? ArrayPrototype.indexOf : function (obj, fromIndex) {
-      if (fromIndex === null || fromIndex === undefined) { fromIndex = 0; }
-      else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); }
-      for (var i = fromIndex, j = this.length; i < j; i++) {
-        if (this[i] === obj) { return i; }
-      }
-      return -1;
-    };
-
-    var filter = isNativeFunc(ArrayPrototype.filter) ? ArrayPrototype.filter : function (fn, context) {
-      var i,
-      value,
-      result = [],
-      length = this.length;
-
-      for (i = 0; i < length; i++) {
-        if (this.hasOwnProperty(i)) {
-          value = this[i];
-          if (fn.call(context, value, i, this)) {
-            result.push(value);
-          }
-        }
-      }
-      return result;
-    };
-
-
-    if (Ember.SHIM_ES5) {
-      if (!ArrayPrototype.map) {
-        ArrayPrototype.map = map;
-      }
-
-      if (!ArrayPrototype.forEach) {
-        ArrayPrototype.forEach = forEach;
-      }
-
-      if (!ArrayPrototype.filter) {
-        ArrayPrototype.filter = filter;
-      }
-
-      if (!ArrayPrototype.indexOf) {
-        ArrayPrototype.indexOf = indexOf;
-      }
-    }
-
-    /**
-      Array polyfills to support ES5 features in older browsers.
-
-      @namespace Ember
-      @property ArrayPolyfills
-    */
-    __exports__.map = map;
-    __exports__.forEach = forEach;
-    __exports__.filter = filter;
-    __exports__.indexOf = indexOf;
-  });
-define("ember-metal/binding", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/map","ember-metal/observer","ember-metal/run_loop","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.Logger, Ember.LOG_BINDINGS, assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var trySet = __dependency3__.trySet;
-    var guidFor = __dependency4__.guidFor;
-    var Map = __dependency5__.Map;
-    var addObserver = __dependency6__.addObserver;
-    var removeObserver = __dependency6__.removeObserver;
-    var _suspendObserver = __dependency6__._suspendObserver;
-    var run = __dependency7__["default"];
-
-    // ES6TODO: where is Ember.lookup defined?
-    /**
-    @module ember-metal
-    */
-
-    // ..........................................................
-    // CONSTANTS
-    //
-
-    /**
-      Debug parameter you can turn on. This will log all bindings that fire to
-      the console. This should be disabled in production code. Note that you
-      can also enable this from the console or temporarily.
-
-      @property LOG_BINDINGS
-      @for Ember
-      @type Boolean
-      @default false
-    */
-    Ember.LOG_BINDINGS = false || !!Ember.ENV.LOG_BINDINGS;
-
-    var IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/;
-
-    /**
-      Returns true if the provided path is global (e.g., `MyApp.fooController.bar`)
-      instead of local (`foo.bar.baz`).
-
-      @method isGlobalPath
-      @for Ember
-      @private
-      @param {String} path
-      @return Boolean
-    */
-    function isGlobalPath(path) {
-      return IS_GLOBAL.test(path);
-    };
-
-    function getWithGlobals(obj, path) {
-      return get(isGlobalPath(path) ? Ember.lookup : obj, path);
-    }
-
-    // ..........................................................
-    // BINDING
-    //
-
-    var Binding = function(toPath, fromPath) {
-      this._direction = 'fwd';
-      this._from = fromPath;
-      this._to   = toPath;
-      this._directionMap = Map.create();
-    };
-
-    /**
-    @class Binding
-    @namespace Ember
-    */
-
-    Binding.prototype = {
-      /**
-        This copies the Binding so it can be connected to another object.
-
-        @method copy
-        @return {Ember.Binding} `this`
-      */
-      copy: function () {
-        var copy = new Binding(this._to, this._from);
-        if (this._oneWay) { copy._oneWay = true; }
-        return copy;
-      },
-
-      // ..........................................................
-      // CONFIG
-      //
-
-      /**
-        This will set `from` property path to the specified value. It will not
-        attempt to resolve this property path to an actual object until you
-        connect the binding.
-
-        The binding will search for the property path starting at the root object
-        you pass when you `connect()` the binding. It follows the same rules as
-        `get()` - see that method for more information.
-
-        @method from
-        @param {String} path the property path to connect to
-        @return {Ember.Binding} `this`
-      */
-      from: function(path) {
-        this._from = path;
-        return this;
-      },
-
-      /**
-        This will set the `to` property path to the specified value. It will not
-        attempt to resolve this property path to an actual object until you
-        connect the binding.
-
-        The binding will search for the property path starting at the root object
-        you pass when you `connect()` the binding. It follows the same rules as
-        `get()` - see that method for more information.
-
-        @method to
-        @param {String|Tuple} path A property path or tuple
-        @return {Ember.Binding} `this`
-      */
-      to: function(path) {
-        this._to = path;
-        return this;
-      },
-
-      /**
-        Configures the binding as one way. A one-way binding will relay changes
-        on the `from` side to the `to` side, but not the other way around. This
-        means that if you change the `to` side directly, the `from` side may have
-        a different value.
-
-        @method oneWay
-        @return {Ember.Binding} `this`
-      */
-      oneWay: function() {
-        this._oneWay = true;
-        return this;
-      },
-
-      /**
-        @method toString
-        @return {String} string representation of binding
-      */
-      toString: function() {
-        var oneWay = this._oneWay ? '[oneWay]' : '';
-        return "Ember.Binding<" + guidFor(this) + ">(" + this._from + " -> " + this._to + ")" + oneWay;
-      },
-
-      // ..........................................................
-      // CONNECT AND SYNC
-      //
-
-      /**
-        Attempts to connect this binding instance so that it can receive and relay
-        changes. This method will raise an exception if you have not set the
-        from/to properties yet.
-
-        @method connect
-        @param {Object} obj The root object for this binding.
-        @return {Ember.Binding} `this`
-      */
-      connect: function(obj) {
-        Ember.assert('Must pass a valid object to Ember.Binding.connect()', !!obj);
-
-        var fromPath = this._from, toPath = this._to;
-        trySet(obj, toPath, getWithGlobals(obj, fromPath));
-
-        // add an observer on the object to be notified when the binding should be updated
-        addObserver(obj, fromPath, this, this.fromDidChange);
-
-        // if the binding is a two-way binding, also set up an observer on the target
-        if (!this._oneWay) { addObserver(obj, toPath, this, this.toDidChange); }
-
-        this._readyToSync = true;
-
-        return this;
-      },
-
-      /**
-        Disconnects the binding instance. Changes will no longer be relayed. You
-        will not usually need to call this method.
-
-        @method disconnect
-        @param {Object} obj The root object you passed when connecting the binding.
-        @return {Ember.Binding} `this`
-      */
-      disconnect: function(obj) {
-        Ember.assert('Must pass a valid object to Ember.Binding.disconnect()', !!obj);
-
-        var twoWay = !this._oneWay;
-
-        // remove an observer on the object so we're no longer notified of
-        // changes that should update bindings.
-        removeObserver(obj, this._from, this, this.fromDidChange);
-
-        // if the binding is two-way, remove the observer from the target as well
-        if (twoWay) { removeObserver(obj, this._to, this, this.toDidChange); }
-
-        this._readyToSync = false; // disable scheduled syncs...
-        return this;
-      },
-
-      // ..........................................................
-      // PRIVATE
-      //
-
-      /* called when the from side changes */
-      fromDidChange: function(target) {
-        this._scheduleSync(target, 'fwd');
-      },
-
-      /* called when the to side changes */
-      toDidChange: function(target) {
-        this._scheduleSync(target, 'back');
-      },
-
-      _scheduleSync: function(obj, dir) {
-        var directionMap = this._directionMap;
-        var existingDir = directionMap.get(obj);
-
-        // if we haven't scheduled the binding yet, schedule it
-        if (!existingDir) {
-          run.schedule('sync', this, this._sync, obj);
-          directionMap.set(obj, dir);
-        }
-
-        // If both a 'back' and 'fwd' sync have been scheduled on the same object,
-        // default to a 'fwd' sync so that it remains deterministic.
-        if (existingDir === 'back' && dir === 'fwd') {
-          directionMap.set(obj, 'fwd');
-        }
-      },
-
-      _sync: function(obj) {
-        var log = Ember.LOG_BINDINGS;
-
-        // don't synchronize destroyed objects or disconnected bindings
-        if (obj.isDestroyed || !this._readyToSync) { return; }
-
-        // get the direction of the binding for the object we are
-        // synchronizing from
-        var directionMap = this._directionMap;
-        var direction = directionMap.get(obj);
-
-        var fromPath = this._from, toPath = this._to;
-
-        directionMap.remove(obj);
-
-        // if we're synchronizing from the remote object...
-        if (direction === 'fwd') {
-          var fromValue = getWithGlobals(obj, this._from);
-          if (log) {
-            Ember.Logger.log(' ', this.toString(), '->', fromValue, obj);
-          }
-          if (this._oneWay) {
-            trySet(obj, toPath, fromValue);
-          } else {
-            _suspendObserver(obj, toPath, this, this.toDidChange, function () {
-              trySet(obj, toPath, fromValue);
-            });
-          }
-        // if we're synchronizing *to* the remote object
-        } else if (direction === 'back') {
-          var toValue = get(obj, this._to);
-          if (log) {
-            Ember.Logger.log(' ', this.toString(), '<-', toValue, obj);
-          }
-          _suspendObserver(obj, fromPath, this, this.fromDidChange, function () {
-            trySet(isGlobalPath(fromPath) ? Ember.lookup : obj, fromPath, toValue);
-          });
-        }
-      }
-
-    };
-
-    function mixinProperties(to, from) {
-      for (var key in from) {
-        if (from.hasOwnProperty(key)) {
-          to[key] = from[key];
-        }
-      }
-    }
-
-    mixinProperties(Binding, {
-
-      /*
-        See `Ember.Binding.from`.
-
-        @method from
-        @static
-      */
-      from: function() {
-        var C = this, binding = new C();
-        return binding.from.apply(binding, arguments);
-      },
-
-      /*
-        See `Ember.Binding.to`.
-
-        @method to
-        @static
-      */
-      to: function() {
-        var C = this, binding = new C();
-        return binding.to.apply(binding, arguments);
-      },
-
-      /**
-        Creates a new Binding instance and makes it apply in a single direction.
-        A one-way binding will relay changes on the `from` side object (supplied
-        as the `from` argument) the `to` side, but not the other way around.
-        This means that if you change the "to" side directly, the "from" side may have
-        a different value.
-
-        See `Binding.oneWay`.
-
-        @method oneWay
-        @param {String} from from path.
-        @param {Boolean} [flag] (Optional) passing nothing here will make the
-          binding `oneWay`. You can instead pass `false` to disable `oneWay`, making the
-          binding two way again.
-        @return {Ember.Binding} `this`
-      */
-      oneWay: function(from, flag) {
-        var C = this, binding = new C(null, from);
-        return binding.oneWay(flag);
-      }
-
-    });
-
-    /**
-      An `Ember.Binding` connects the properties of two objects so that whenever
-      the value of one property changes, the other property will be changed also.
-
-      ## Automatic Creation of Bindings with `/^*Binding/`-named Properties
-
-      You do not usually create Binding objects directly but instead describe
-      bindings in your class or object definition using automatic binding
-      detection.
-
-      Properties ending in a `Binding` suffix will be converted to `Ember.Binding`
-      instances. The value of this property should be a string representing a path
-      to another object or a custom binding instanced created using Binding helpers
-      (see "One Way Bindings"):
-
-      ```
-      valueBinding: "MyApp.someController.title"
-      ```
-
-      This will create a binding from `MyApp.someController.title` to the `value`
-      property of your object instance automatically. Now the two values will be
-      kept in sync.
-
-      ## One Way Bindings
-
-      One especially useful binding customization you can use is the `oneWay()`
-      helper. This helper tells Ember that you are only interested in
-      receiving changes on the object you are binding from. For example, if you
-      are binding to a preference and you want to be notified if the preference
-      has changed, but your object will not be changing the preference itself, you
-      could do:
-
-      ```
-      bigTitlesBinding: Ember.Binding.oneWay("MyApp.preferencesController.bigTitles")
-      ```
-
-      This way if the value of `MyApp.preferencesController.bigTitles` changes the
-      `bigTitles` property of your object will change also. However, if you
-      change the value of your `bigTitles` property, it will not update the
-      `preferencesController`.
-
-      One way bindings are almost twice as fast to setup and twice as fast to
-      execute because the binding only has to worry about changes to one side.
-
-      You should consider using one way bindings anytime you have an object that
-      may be created frequently and you do not intend to change a property; only
-      to monitor it for changes (such as in the example above).
-
-      ## Adding Bindings Manually
-
-      All of the examples above show you how to configure a custom binding, but the
-      result of these customizations will be a binding template, not a fully active
-      Binding instance. The binding will actually become active only when you
-      instantiate the object the binding belongs to. It is useful however, to
-      understand what actually happens when the binding is activated.
-
-      For a binding to function it must have at least a `from` property and a `to`
-      property. The `from` property path points to the object/key that you want to
-      bind from while the `to` path points to the object/key you want to bind to.
-
-      When you define a custom binding, you are usually describing the property
-      you want to bind from (such as `MyApp.someController.value` in the examples
-      above). When your object is created, it will automatically assign the value
-      you want to bind `to` based on the name of your binding key. In the
-      examples above, during init, Ember objects will effectively call
-      something like this on your binding:
-
-      ```javascript
-      binding = Ember.Binding.from(this.valueBinding).to("value");
-      ```
-
-      This creates a new binding instance based on the template you provide, and
-      sets the to path to the `value` property of the new object. Now that the
-      binding is fully configured with a `from` and a `to`, it simply needs to be
-      connected to become active. This is done through the `connect()` method:
-
-      ```javascript
-      binding.connect(this);
-      ```
-
-      Note that when you connect a binding you pass the object you want it to be
-      connected to. This object will be used as the root for both the from and
-      to side of the binding when inspecting relative paths. This allows the
-      binding to be automatically inherited by subclassed objects as well.
-
-      Now that the binding is connected, it will observe both the from and to side
-      and relay changes.
-
-      If you ever needed to do so (you almost never will, but it is useful to
-      understand this anyway), you could manually create an active binding by
-      using the `Ember.bind()` helper method. (This is the same method used by
-      to setup your bindings on objects):
-
-      ```javascript
-      Ember.bind(MyApp.anotherObject, "value", "MyApp.someController.value");
-      ```
-
-      Both of these code fragments have the same effect as doing the most friendly
-      form of binding creation like so:
-
-      ```javascript
-      MyApp.anotherObject = Ember.Object.create({
-        valueBinding: "MyApp.someController.value",
-
-        // OTHER CODE FOR THIS OBJECT...
-      });
-      ```
-
-      Ember's built in binding creation method makes it easy to automatically
-      create bindings for you. You should always use the highest-level APIs
-      available, even if you understand how it works underneath.
-
-      @class Binding
-      @namespace Ember
-      @since Ember 0.9
-    */
-    // Ember.Binding = Binding; ES6TODO: where to put this?
-
-
-    /**
-      Global helper method to create a new binding. Just pass the root object
-      along with a `to` and `from` path to create and connect the binding.
-
-      @method bind
-      @for Ember
-      @param {Object} obj The root object of the transform.
-      @param {String} to The path to the 'to' side of the binding.
-        Must be relative to obj.
-      @param {String} from The path to the 'from' side of the binding.
-        Must be relative to obj or a global path.
-      @return {Ember.Binding} binding instance
-    */
-    function bind(obj, to, from) {
-      return new Binding(to, from).connect(obj);
-    };
-
-    /**
-      @method oneWay
-      @for Ember
-      @param {Object} obj The root object of the transform.
-      @param {String} to The path to the 'to' side of the binding.
-        Must be relative to obj.
-      @param {String} from The path to the 'from' side of the binding.
-        Must be relative to obj or a global path.
-      @return {Ember.Binding} binding instance
-    */
-    function oneWay(obj, to, from) {
-      return new Binding(to, from).oneWay().connect(obj);
-    };
-
-    __exports__.Binding = Binding;
-    __exports__.bind = bind;
-    __exports__.oneWay = oneWay;
-    __exports__.isGlobalPath = isGlobalPath;
-  });
-define("ember-metal/chains", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/array","ember-metal/watch_key","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // warn, assert, etc;
-    var get = __dependency2__.get;
-    var normalizeTuple = __dependency2__.normalizeTuple;
-    var meta = __dependency3__.meta;
-    var META_KEY = __dependency3__.META_KEY;
-    var forEach = __dependency4__.forEach;
-    var watchKey = __dependency5__.watchKey;
-    var unwatchKey = __dependency5__.unwatchKey;
-
-    var metaFor = meta,
-        warn = Ember.warn,
-        FIRST_KEY = /^([^\.\*]+)/;
-
-    function firstKey(path) {
-      return path.match(FIRST_KEY)[0];
-    }
-
-    var pendingQueue = [];
-
-    // attempts to add the pendingQueue chains again. If some of them end up
-    // back in the queue and reschedule is true, schedules a timeout to try
-    // again.
-    function flushPendingChains() {
-      if (pendingQueue.length === 0) { return; } // nothing to do
-
-      var queue = pendingQueue;
-      pendingQueue = [];
-
-      forEach.call(queue, function(q) { q[0].add(q[1]); });
-
-      warn('Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos', pendingQueue.length === 0);
-    };
-
-
-    function addChainWatcher(obj, keyName, node) {
-      if (!obj || ('object' !== typeof obj)) { return; } // nothing to do
-
-      var m = metaFor(obj), nodes = m.chainWatchers;
-
-      if (!m.hasOwnProperty('chainWatchers')) {
-        nodes = m.chainWatchers = {};
-      }
-
-      if (!nodes[keyName]) { nodes[keyName] = []; }
-      nodes[keyName].push(node);
-      watchKey(obj, keyName, m);
-    }
-
-    function removeChainWatcher(obj, keyName, node) {
-      if (!obj || 'object' !== typeof obj) { return; } // nothing to do
-
-      var m = obj[META_KEY];
-      if (m && !m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
-
-      var nodes = m && m.chainWatchers;
-
-      if (nodes && nodes[keyName]) {
-        nodes = nodes[keyName];
-        for (var i = 0, l = nodes.length; i < l; i++) {
-          if (nodes[i] === node) { nodes.splice(i, 1); }
-        }
-      }
-      unwatchKey(obj, keyName, m);
-    };
-
-    // A ChainNode watches a single key on an object. If you provide a starting
-    // value for the key then the node won't actually watch it. For a root node
-    // pass null for parent and key and object for value.
-    function ChainNode(parent, key, value) {
-      this._parent = parent;
-      this._key    = key;
-
-      // _watching is true when calling get(this._parent, this._key) will
-      // return the value of this node.
-      //
-      // It is false for the root of a chain (because we have no parent)
-      // and for global paths (because the parent node is the object with
-      // the observer on it)
-      this._watching = value===undefined;
-
-      this._value  = value;
-      this._paths = {};
-      if (this._watching) {
-        this._object = parent.value();
-        if (this._object) { addChainWatcher(this._object, this._key, this); }
-      }
-
-      // Special-case: the EachProxy relies on immediate evaluation to
-      // establish its observers.
-      //
-      // TODO: Replace this with an efficient callback that the EachProxy
-      // can implement.
-      if (this._parent && this._parent._key === '@each') {
-        this.value();
-      }
-    };
-
-    var ChainNodePrototype = ChainNode.prototype;
-
-    function lazyGet(obj, key) {
-      if (!obj) return undefined;
-
-      var meta = obj[META_KEY];
-      // check if object meant only to be a prototype
-      if (meta && meta.proto === obj) return undefined;
-
-      if (key === "@each") return get(obj, key);
-
-      // if a CP only return cached value
-      var desc = meta && meta.descs[key];
-      if (desc && desc._cacheable) {
-        if (key in meta.cache) {
-          return meta.cache[key];
-        } else {
-          return undefined;
-        }
-      }
-
-      return get(obj, key);
-    }
-
-    ChainNodePrototype.value = function() {
-      if (this._value === undefined && this._watching) {
-        var obj = this._parent.value();
-        this._value = lazyGet(obj, this._key);
-      }
-      return this._value;
-    };
-
-    ChainNodePrototype.destroy = function() {
-      if (this._watching) {
-        var obj = this._object;
-        if (obj) { removeChainWatcher(obj, this._key, this); }
-        this._watching = false; // so future calls do nothing
-      }
-    };
-
-    // copies a top level object only
-    ChainNodePrototype.copy = function(obj) {
-      var ret = new ChainNode(null, null, obj),
-          paths = this._paths, path;
-      for (path in paths) {
-        if (paths[path] <= 0) { continue; } // this check will also catch non-number vals.
-        ret.add(path);
-      }
-      return ret;
-    };
-
-    // called on the root node of a chain to setup watchers on the specified
-    // path.
-    ChainNodePrototype.add = function(path) {
-      var obj, tuple, key, src, paths;
-
-      paths = this._paths;
-      paths[path] = (paths[path] || 0) + 1;
-
-      obj = this.value();
-      tuple = normalizeTuple(obj, path);
-
-      // the path was a local path
-      if (tuple[0] && tuple[0] === obj) {
-        path = tuple[1];
-        key  = firstKey(path);
-        path = path.slice(key.length+1);
-
-      // global path, but object does not exist yet.
-      // put into a queue and try to connect later.
-      } else if (!tuple[0]) {
-        pendingQueue.push([this, path]);
-        tuple.length = 0;
-        return;
-
-      // global path, and object already exists
-      } else {
-        src  = tuple[0];
-        key  = path.slice(0, 0-(tuple[1].length+1));
-        path = tuple[1];
-      }
-
-      tuple.length = 0;
-      this.chain(key, path, src);
-    };
-
-    // called on the root node of a chain to teardown watcher on the specified
-    // path
-    ChainNodePrototype.remove = function(path) {
-      var obj, tuple, key, src, paths;
-
-      paths = this._paths;
-      if (paths[path] > 0) { paths[path]--; }
-
-      obj = this.value();
-      tuple = normalizeTuple(obj, path);
-      if (tuple[0] === obj) {
-        path = tuple[1];
-        key  = firstKey(path);
-        path = path.slice(key.length+1);
-      } else {
-        src  = tuple[0];
-        key  = path.slice(0, 0-(tuple[1].length+1));
-        path = tuple[1];
-      }
-
-      tuple.length = 0;
-      this.unchain(key, path);
-    };
-
-    ChainNodePrototype.count = 0;
-
-    ChainNodePrototype.chain = function(key, path, src) {
-      var chains = this._chains, node;
-      if (!chains) { chains = this._chains = {}; }
-
-      node = chains[key];
-      if (!node) { node = chains[key] = new ChainNode(this, key, src); }
-      node.count++; // count chains...
-
-      // chain rest of path if there is one
-      if (path && path.length>0) {
-        key = firstKey(path);
-        path = path.slice(key.length+1);
-        node.chain(key, path); // NOTE: no src means it will observe changes...
-      }
-    };
-
-    ChainNodePrototype.unchain = function(key, path) {
-      var chains = this._chains, node = chains[key];
-
-      // unchain rest of path first...
-      if (path && path.length>1) {
-        key  = firstKey(path);
-        path = path.slice(key.length+1);
-        node.unchain(key, path);
-      }
-
-      // delete node if needed.
-      node.count--;
-      if (node.count<=0) {
-        delete chains[node._key];
-        node.destroy();
-      }
-
-    };
-
-    ChainNodePrototype.willChange = function(events) {
-      var chains = this._chains;
-      if (chains) {
-        for(var key in chains) {
-          if (!chains.hasOwnProperty(key)) { continue; }
-          chains[key].willChange(events);
-        }
-      }
-
-      if (this._parent) { this._parent.chainWillChange(this, this._key, 1, events); }
-    };
-
-    ChainNodePrototype.chainWillChange = function(chain, path, depth, events) {
-      if (this._key) { path = this._key + '.' + path; }
-
-      if (this._parent) {
-        this._parent.chainWillChange(this, path, depth+1, events);
-      } else {
-        if (depth > 1) {
-          events.push(this.value(), path);
-        }
-        path = 'this.' + path;
-        if (this._paths[path] > 0) {
-          events.push(this.value(), path);
-        }
-      }
-    };
-
-    ChainNodePrototype.chainDidChange = function(chain, path, depth, events) {
-      if (this._key) { path = this._key + '.' + path; }
-      if (this._parent) {
-        this._parent.chainDidChange(this, path, depth+1, events);
-      } else {
-        if (depth > 1) {
-          events.push(this.value(), path);
-        }
-        path = 'this.' + path;
-        if (this._paths[path] > 0) {
-          events.push(this.value(), path);
-        }
-      }
-    };
-
-    ChainNodePrototype.didChange = function(events) {
-      // invalidate my own value first.
-      if (this._watching) {
-        var obj = this._parent.value();
-        if (obj !== this._object) {
-          removeChainWatcher(this._object, this._key, this);
-          this._object = obj;
-          addChainWatcher(obj, this._key, this);
-        }
-        this._value  = undefined;
-
-        // Special-case: the EachProxy relies on immediate evaluation to
-        // establish its observers.
-        if (this._parent && this._parent._key === '@each')
-          this.value();
-      }
-
-      // then notify chains...
-      var chains = this._chains;
-      if (chains) {
-        for(var key in chains) {
-          if (!chains.hasOwnProperty(key)) { continue; }
-          chains[key].didChange(events);
-        }
-      }
-
-      // if no events are passed in then we only care about the above wiring update
-      if (events === null) { return; }
-
-      // and finally tell parent about my path changing...
-      if (this._parent) { this._parent.chainDidChange(this, this._key, 1, events); }
-    };
-
-    function finishChains(obj) {
-      // We only create meta if we really have to
-      var m = obj[META_KEY], chains = m && m.chains;
-      if (chains) {
-        if (chains.value() !== obj) {
-          metaFor(obj).chains = chains = chains.copy(obj);
-        } else {
-          chains.didChange(null);
-        }
-      }
-    };
-
-    __exports__.flushPendingChains = flushPendingChains;
-    __exports__.removeChainWatcher = removeChainWatcher;
-    __exports__.ChainNode = ChainNode;
-    __exports__.finishChains = finishChains;
-  });
-define("ember-metal/computed", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/watching","ember-metal/expand_properties","ember-metal/error","ember-metal/properties","ember-metal/property_events","ember-metal/is_empty","ember-metal/is_none","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var meta = __dependency4__.meta;
-    var META_KEY = __dependency4__.META_KEY;
-    var guidFor = __dependency4__.guidFor;
-    var typeOf = __dependency4__.typeOf;
-    var inspect = __dependency4__.inspect;
-    var EnumerableUtils = __dependency5__["default"];
-    var create = __dependency6__.create;
-    var watch = __dependency7__.watch;
-    var unwatch = __dependency7__.unwatch;
-    var expandProperties = __dependency8__["default"];
-    var EmberError = __dependency9__["default"];
-    var Descriptor = __dependency10__.Descriptor;
-    var defineProperty = __dependency10__.defineProperty;
-    var propertyWillChange = __dependency11__.propertyWillChange;
-    var propertyDidChange = __dependency11__.propertyDidChange;
-    var isEmpty = __dependency12__["default"];
-    var isNone = __dependency13__.isNone;
-
-    /**
-    @module ember-metal
-    */
-
-    Ember.warn("The CP_DEFAULT_CACHEABLE flag has been removed and computed properties are always cached by default. Use `volatile` if you don't want caching.", Ember.ENV.CP_DEFAULT_CACHEABLE !== false);
-
-
-    var metaFor = meta,
-        a_slice = [].slice,
-        o_create = create;
-
-    function UNDEFINED() { }
-
-    
-      var lengthPattern = /\.(length|\[\])$/;
-    
-
-    // ..........................................................
-    // DEPENDENT KEYS
-    //
-
-    // data structure:
-    //  meta.deps = {
-    //   'depKey': {
-    //     'keyName': count,
-    //   }
-    //  }
-
-    /*
-      This function returns a map of unique dependencies for a
-      given object and key.
-    */
-    function keysForDep(depsMeta, depKey) {
-      var keys = depsMeta[depKey];
-      if (!keys) {
-        // if there are no dependencies yet for a the given key
-        // create a new empty list of dependencies for the key
-        keys = depsMeta[depKey] = {};
-      } else if (!depsMeta.hasOwnProperty(depKey)) {
-        // otherwise if the dependency list is inherited from
-        // a superclass, clone the hash
-        keys = depsMeta[depKey] = o_create(keys);
-      }
-      return keys;
-    }
-
-    function metaForDeps(meta) {
-      return keysForDep(meta, 'deps');
-    }
-
-    function addDependentKeys(desc, obj, keyName, meta) {
-      // the descriptor has a list of dependent keys, so
-      // add all of its dependent keys.
-      var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys;
-      if (!depKeys) return;
-
-      depsMeta = metaForDeps(meta);
-
-      for(idx = 0, len = depKeys.length; idx < len; idx++) {
-        depKey = depKeys[idx];
-        // Lookup keys meta for depKey
-        keys = keysForDep(depsMeta, depKey);
-        // Increment the number of times depKey depends on keyName.
-        keys[keyName] = (keys[keyName] || 0) + 1;
-        // Watch the depKey
-        watch(obj, depKey, meta);
-      }
-    }
-
-    function removeDependentKeys(desc, obj, keyName, meta) {
-      // the descriptor has a list of dependent keys, so
-      // add all of its dependent keys.
-      var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys;
-      if (!depKeys) return;
-
-      depsMeta = metaForDeps(meta);
-
-      for(idx = 0, len = depKeys.length; idx < len; idx++) {
-        depKey = depKeys[idx];
-        // Lookup keys meta for depKey
-        keys = keysForDep(depsMeta, depKey);
-        // Increment the number of times depKey depends on keyName.
-        keys[keyName] = (keys[keyName] || 0) - 1;
-        // Watch the depKey
-        unwatch(obj, depKey, meta);
-      }
-    }
-
-    // ..........................................................
-    // COMPUTED PROPERTY
-    //
-
-    /**
-      A computed property transforms an objects function into a property.
-
-      By default the function backing the computed property will only be called
-      once and the result will be cached. You can specify various properties
-      that your computed property is dependent on. This will force the cached
-      result to be recomputed if the dependencies are modified.
-
-      In the following example we declare a computed property (by calling
-      `.property()` on the fullName function) and setup the properties
-      dependencies (depending on firstName and lastName). The fullName function
-      will be called once (regardless of how many times it is accessed) as long
-      as it's dependencies have not been changed. Once firstName or lastName are updated
-      any future calls (or anything bound) to fullName will incorporate the new
-      values.
-
-      ```javascript
-      Person = Ember.Object.extend({
-        // these will be supplied by `create`
-        firstName: null,
-        lastName: null,
-
-        fullName: function() {
-          var firstName = this.get('firstName');
-          var lastName = this.get('lastName');
-
-         return firstName + ' ' + lastName;
-        }.property('firstName', 'lastName')
-      });
-
-      var tom = Person.create({
-        firstName: "Tom",
-        lastName: "Dale"
-      });
-
-      tom.get('fullName') // "Tom Dale"
-      ```
-
-      You can also define what Ember should do when setting a computed property.
-      If you try to set a computed property, it will be invoked with the key and
-      value you want to set it to. You can also accept the previous value as the
-      third parameter.
-
-      ```javascript
-
-     Person = Ember.Object.extend({
-        // these will be supplied by `create`
-        firstName: null,
-        lastName: null,
-
-        fullName: function(key, value, oldValue) {
-          // getter
-          if (arguments.length === 1) {
-            var firstName = this.get('firstName');
-            var lastName = this.get('lastName');
-
-            return firstName + ' ' + lastName;
-
-          // setter
-          } else {
-            var name = value.split(" ");
-
-            this.set('firstName', name[0]);
-            this.set('lastName', name[1]);
-
-            return value;
-          }
-        }.property('firstName', 'lastName')
-      });
-
-      var person = Person.create();
-      person.set('fullName', "Peter Wagenet");
-      person.get('firstName') // Peter
-      person.get('lastName') // Wagenet
-      ```
-
-      @class ComputedProperty
-      @namespace Ember
-      @extends Ember.Descriptor
-      @constructor
-    */
-    function ComputedProperty(func, opts) {
-      func.__ember_arity__ = func.length;
-      this.func = func;
-
-      this._cacheable = (opts && opts.cacheable !== undefined) ? opts.cacheable : true;
-      this._dependentKeys = opts && opts.dependentKeys;
-      this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false;
-    }
-
-    ComputedProperty.prototype = new Descriptor();
-
-    var ComputedPropertyPrototype = ComputedProperty.prototype;
-    ComputedPropertyPrototype._dependentKeys = undefined;
-    ComputedPropertyPrototype._suspended = undefined;
-    ComputedPropertyPrototype._meta = undefined;
-
-    /**
-      Properties are cacheable by default. Computed property will automatically
-      cache the return value of your function until one of the dependent keys changes.
-
-      Call `volatile()` to set it into non-cached mode. When in this mode
-      the computed property will not automatically cache the return value.
-
-      However, if a property is properly observable, there is no reason to disable
-      caching.
-
-      @method cacheable
-      @param {Boolean} aFlag optional set to `false` to disable caching
-      @return {Ember.ComputedProperty} this
-      @chainable
-    */
-    ComputedPropertyPrototype.cacheable = function(aFlag) {
-      this._cacheable = aFlag !== false;
-      return this;
-    };
-
-    /**
-      Call on a computed property to set it into non-cached mode. When in this
-      mode the computed property will not automatically cache the return value.
-
-      ```javascript
-      MyApp.outsideService = Ember.Object.extend({
-        value: function() {
-          return OutsideService.getValue();
-        }.property().volatile()
-      }).create();
-      ```
-
-      @method volatile
-      @return {Ember.ComputedProperty} this
-      @chainable
-    */
-    ComputedPropertyPrototype.volatile = function() {
-      return this.cacheable(false);
-    };
-
-    /**
-      Call on a computed property to set it into read-only mode. When in this
-      mode the computed property will throw an error when set.
-
-      ```javascript
-      MyApp.Person = Ember.Object.extend({
-        guid: function() {
-          return 'guid-guid-guid';
-        }.property().readOnly()
-      });
-
-      MyApp.person = MyApp.Person.create();
-
-      MyApp.person.set('guid', 'new-guid'); // will throw an exception
-      ```
-
-      @method readOnly
-      @return {Ember.ComputedProperty} this
-      @chainable
-    */
-    ComputedPropertyPrototype.readOnly = function(readOnly) {
-      this._readOnly = readOnly === undefined || !!readOnly;
-      return this;
-    };
-
-    /**
-      Sets the dependent keys on this computed property. Pass any number of
-      arguments containing key paths that this computed property depends on.
-
-      ```javascript
-      MyApp.President = Ember.Object.extend({
-        fullName: computed(function() {
-          return this.get('firstName') + ' ' + this.get('lastName');
-
-          // Tell Ember that this computed property depends on firstName
-          // and lastName
-        }).property('firstName', 'lastName')
-      });
-
-      MyApp.president = MyApp.President.create({
-        firstName: 'Barack',
-        lastName: 'Obama',
-      });
-      MyApp.president.get('fullName'); // Barack Obama
-      ```
-
-      @method property
-      @param {String} path* zero or more property paths
-      @return {Ember.ComputedProperty} this
-      @chainable
-    */
-    ComputedPropertyPrototype.property = function() {
-      var args;
-
-      var addArg = function (property) {
-        args.push(property);
-      };
-
-      args = [];
-      for (var i = 0, l = arguments.length; i < l; i++) {
-        expandProperties(arguments[i], addArg);
-      }
-
-      this._dependentKeys = args;
-      return this;
-    };
-
-    /**
-      In some cases, you may want to annotate computed properties with additional
-      metadata about how they function or what values they operate on. For example,
-      computed property functions may close over variables that are then no longer
-      available for introspection.
-
-      You can pass a hash of these values to a computed property like this:
-
-      ```
-      person: function() {
-        var personId = this.get('personId');
-        return App.Person.create({ id: personId });
-      }.property().meta({ type: App.Person })
-      ```
-
-      The hash that you pass to the `meta()` function will be saved on the
-      computed property descriptor under the `_meta` key. Ember runtime
-      exposes a public API for retrieving these values from classes,
-      via the `metaForProperty()` function.
-
-      @method meta
-      @param {Hash} meta
-      @chainable
-    */
-
-    ComputedPropertyPrototype.meta = function(meta) {
-      if (arguments.length === 0) {
-        return this._meta || {};
-      } else {
-        this._meta = meta;
-        return this;
-      }
-    };
-
-    /* impl descriptor API */
-    ComputedPropertyPrototype.didChange = function(obj, keyName) {
-      // _suspended is set via a CP.set to ensure we don't clear
-      // the cached value set by the setter
-      if (this._cacheable && this._suspended !== obj) {
-        var meta = metaFor(obj);
-        if (meta.cache[keyName] !== undefined) {
-          meta.cache[keyName] = undefined;
-          removeDependentKeys(this, obj, keyName, meta);
-        }
-      }
-    };
-
-    function finishChains(chainNodes)
-    {
-      for (var i=0, l=chainNodes.length; i<l; i++) {
-        chainNodes[i].didChange(null);
-      }
-    }
-
-    /**
-      Access the value of the function backing the computed property.
-      If this property has already been cached, return the cached result.
-      Otherwise, call the function passing the property name as an argument.
-
-      ```javascript
-      Person = Ember.Object.extend({
-        fullName: function(keyName) {
-          // the keyName parameter is 'fullName' in this case.
-
-          return this.get('firstName') + ' ' + this.get('lastName');
-        }.property('firstName', 'lastName')
-      });
-
-
-      var tom = Person.create({
-        firstName: "Tom",
-        lastName: "Dale"
-      });
-
-      tom.get('fullName') // "Tom Dale"
-      ```
-
-      @method get
-      @param {String} keyName The key being accessed.
-      @return {Object} The return value of the function backing the CP.
-    */
-    ComputedPropertyPrototype.get = function(obj, keyName) {
-      var ret, cache, meta, chainNodes;
-      if (this._cacheable) {
-        meta = metaFor(obj);
-        cache = meta.cache;
-
-        var result = cache[keyName];
-
-        if (result === UNDEFINED) {
-          return undefined;
-        }  else if (result !== undefined) {
-          return result;
-        }
-
-        ret = this.func.call(obj, keyName);
-        if (ret === undefined) {
-          cache[keyName] = UNDEFINED;
-        } else {
-          cache[keyName] = ret;
-        }
-
-        chainNodes = meta.chainWatchers && meta.chainWatchers[keyName];
-        if (chainNodes) { finishChains(chainNodes); }
-        addDependentKeys(this, obj, keyName, meta);
-      } else {
-        ret = this.func.call(obj, keyName);
-      }
-      return ret;
-    };
-
-    /**
-      Set the value of a computed property. If the function that backs your
-      computed property does not accept arguments then the default action for
-      setting would be to define the property on the current object, and set
-      the value of the property to the value being set.
-
-      Generally speaking if you intend for your computed property to be set
-      your backing function should accept either two or three arguments.
-
-      @method set
-      @param {String} keyName The key being accessed.
-      @param {Object} newValue The new value being assigned.
-      @param {String} oldValue The old value being replaced.
-      @return {Object} The return value of the function backing the CP.
-    */
-    ComputedPropertyPrototype.set = function(obj, keyName, value) {
-      var cacheable = this._cacheable,
-          func = this.func,
-          meta = metaFor(obj, cacheable),
-          oldSuspended = this._suspended,
-          hadCachedValue = false,
-          cache = meta.cache,
-          funcArgLength, cachedValue, ret;
-
-      if (this._readOnly) {
-        throw new EmberError('Cannot set read-only property "' + keyName + '" on object: ' + inspect(obj));
-      }
-
-      this._suspended = obj;
-
-      try {
-
-        if (cacheable && cache[keyName] !== undefined) {
-          cachedValue = cache[keyName];
-          hadCachedValue = true;
-        }
-
-        // Check if the CP has been wrapped. If if has, use the
-        // length from the wrapped function.
-
-        funcArgLength = func.wrappedFunction ? func.wrappedFunction.__ember_arity__ : func.__ember_arity__;
-
-        // For backwards-compatibility with computed properties
-        // that check for arguments.length === 2 to determine if
-        // they are being get or set, only pass the old cached
-        // value if the computed property opts into a third
-        // argument.
-        if (funcArgLength === 3) {
-          ret = func.call(obj, keyName, value, cachedValue);
-        } else if (funcArgLength === 2) {
-          ret = func.call(obj, keyName, value);
-        } else {
-          defineProperty(obj, keyName, null, cachedValue);
-          set(obj, keyName, value);
-          return;
-        }
-
-        if (hadCachedValue && cachedValue === ret) { return; }
-
-        var watched = meta.watching[keyName];
-        if (watched) { propertyWillChange(obj, keyName); }
-
-        if (hadCachedValue) {
-          cache[keyName] = undefined;
-        }
-
-        if (cacheable) {
-          if (!hadCachedValue) {
-            addDependentKeys(this, obj, keyName, meta);
-          }
-          if (ret === undefined) {
-            cache[keyName] = UNDEFINED;
-          } else {
-            cache[keyName] = ret;
-          }
-        }
-
-        if (watched) { propertyDidChange(obj, keyName); }
-      } finally {
-        this._suspended = oldSuspended;
-      }
-      return ret;
-    };
-
-    /* called before property is overridden */
-    ComputedPropertyPrototype.teardown = function(obj, keyName) {
-      var meta = metaFor(obj);
-
-      if (keyName in meta.cache) {
-        removeDependentKeys(this, obj, keyName, meta);
-      }
-
-      if (this._cacheable) { delete meta.cache[keyName]; }
-
-      return null; // no value to restore
-    };
-
-
-    /**
-      This helper returns a new property descriptor that wraps the passed
-      computed property function. You can use this helper to define properties
-      with mixins or via `Ember.defineProperty()`.
-
-      The function you pass will be used to both get and set property values.
-      The function should accept two parameters, key and value. If value is not
-      undefined you should set the value first. In either case return the
-      current value of the property.
-      @method computed
-      @for Ember
-      @param {Function} func The computed property function.
-      @return {Ember.ComputedProperty} property descriptor instance
-    */
-    function computed(func) {
-      var args;
-
-      if (arguments.length > 1) {
-        args = a_slice.call(arguments, 0, -1);
-        func = a_slice.call(arguments, -1)[0];
-      }
-
-      if (typeof func !== "function") {
-        throw new EmberError("Computed Property declared without a property function");
-      }
-
-      var cp = new ComputedProperty(func);
-
-      if (args) {
-        cp.property.apply(cp, args);
-      }
-
-      return cp;
-    };
-
-    /**
-      Returns the cached value for a property, if one exists.
-      This can be useful for peeking at the value of a computed
-      property that is generated lazily, without accidentally causing
-      it to be created.
-
-      @method cacheFor
-      @for Ember
-      @param {Object} obj the object whose property you want to check
-      @param {String} key the name of the property whose cached value you want
-        to return
-      @return {Object} the cached value
-    */
-    function cacheFor(obj, key) {
-      var meta = obj[META_KEY],
-          cache = meta && meta.cache,
-          ret = cache && cache[key];
-
-      if (ret === UNDEFINED) { return undefined; }
-      return ret;
-    };
-
-    cacheFor.set = function(cache, key, value) {
-      if (value === undefined) {
-        cache[key] = UNDEFINED;
-      } else {
-        cache[key] = value;
-      }
-    };
-
-    cacheFor.get = function(cache, key) {
-      var ret = cache[key];
-      if (ret === UNDEFINED) { return undefined; }
-      return ret;
-    };
-
-    cacheFor.remove = function(cache, key) {
-      cache[key] = undefined;
-    };
-
-    function getProperties(self, propertyNames) {
-      var ret = {};
-      for(var i = 0; i < propertyNames.length; i++) {
-        ret[propertyNames[i]] = get(self, propertyNames[i]);
-      }
-      return ret;
-    }
-
-    function registerComputed(name, macro) {
-      computed[name] = function(dependentKey) {
-        var args = a_slice.call(arguments);
-        return computed(dependentKey, function() {
-          return macro.apply(this, args);
-        });
-      };
-    };
-
-    function registerComputedWithProperties(name, macro) {
-      computed[name] = function() {
-        var properties = a_slice.call(arguments);
-
-        var computedFunc = computed(function() {
-          return macro.apply(this, [getProperties(this, properties)]);
-        });
-
-        return computedFunc.property.apply(computedFunc, properties);
-      };
-    };
-
-    
-      /**
-        A computed property that returns true if the value of the dependent
-        property is null, an empty string, empty array, or empty function.
-
-        Example
-
-        ```javascript
-        var ToDoList = Ember.Object.extend({
-          done: Ember.computed.empty('todos')
-        });
-        var todoList = ToDoList.create({todos: ['Unit Test', 'Documentation', 'Release']});
-        todoList.get('done'); // false
-        todoList.get('todos').clear();
-        todoList.get('done'); // true
-        ```
-
-        @method computed.empty
-        @for Ember
-        @param {String} dependentKey
-        @return {Ember.ComputedProperty} computed property which negate
-        the original value for property
-      */
-      computed.empty = function (dependentKey) {
-        return computed(dependentKey + '.length', function () {
-          return isEmpty(get(this, dependentKey));
-        });
-      };
-    
-    /**
-      A computed property that returns true if the value of the dependent
-      property is NOT null, an empty string, empty array, or empty function.
-
-      Note: When using `computed.notEmpty` to watch an array make sure to
-      use the `array.[]` syntax so the computed can subscribe to transitions
-      from empty to non-empty states.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        hasStuff: computed.notEmpty('backpack.[]')
-      });
-      var hamster = Hamster.create({backpack: ['Food', 'Sleeping Bag', 'Tent']});
-      hamster.get('hasStuff'); // true
-      hamster.get('backpack').clear(); // []
-      hamster.get('hasStuff'); // false
-      ```
-
-      @method computed.notEmpty
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which returns true if
-      original value for property is not empty.
-    */
-    registerComputed('notEmpty', function(dependentKey) {
-      return !isEmpty(get(this, dependentKey));
-    });
-
-    /**
-      A computed property that returns true if the value of the dependent
-      property is null or undefined. This avoids errors from JSLint complaining
-      about use of ==, which can be technically confusing.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        isHungry: computed.none('food')
-      });
-      var hamster = Hamster.create();
-      hamster.get('isHungry'); // true
-      hamster.set('food', 'Banana');
-      hamster.get('isHungry'); // false
-      hamster.set('food', null);
-      hamster.get('isHungry'); // true
-      ```
-
-      @method computed.none
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which
-      returns true if original value for property is null or undefined.
-    */
-    registerComputed('none', function(dependentKey) {
-      return isNone(get(this, dependentKey));
-    });
-
-    /**
-      A computed property that returns the inverse boolean value
-      of the original value for the dependent property.
-
-      Example
-
-      ```javascript
-      var User = Ember.Object.extend({
-        isAnonymous: computed.not('loggedIn')
-      });
-      var user = User.create({loggedIn: false});
-      user.get('isAnonymous'); // true
-      user.set('loggedIn', true);
-      user.get('isAnonymous'); // false
-      ```
-
-      @method computed.not
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which returns
-      inverse of the original value for property
-    */
-    registerComputed('not', function(dependentKey) {
-      return !get(this, dependentKey);
-    });
-
-    /**
-      A computed property that converts the provided dependent property
-      into a boolean value.
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        hasBananas: computed.bool('numBananas')
-      });
-      var hamster = Hamster.create();
-      hamster.get('hasBananas'); // false
-      hamster.set('numBananas', 0);
-      hamster.get('hasBananas'); // false
-      hamster.set('numBananas', 1);
-      hamster.get('hasBananas'); // true
-      hamster.set('numBananas', null);
-      hamster.get('hasBananas'); // false
-      ```
-
-      @method computed.bool
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which converts
-      to boolean the original value for property
-    */
-    registerComputed('bool', function(dependentKey) {
-      return !!get(this, dependentKey);
-    });
-
-    /**
-      A computed property which matches the original value for the
-      dependent property against a given RegExp, returning `true`
-      if they values matches the RegExp and `false` if it does not.
-
-      Example
-
-      ```javascript
-      var User = Ember.Object.extend({
-        hasValidEmail: computed.match('email', /^.+@.+\..+$/)
-      });
-      var user = User.create({loggedIn: false});
-      user.get('hasValidEmail'); // false
-      user.set('email', '');
-      user.get('hasValidEmail'); // false
-      user.set('email', 'ember_hamster@example.com');
-      user.get('hasValidEmail'); // true
-      ```
-
-      @method computed.match
-      @for Ember
-      @param {String} dependentKey
-      @param {RegExp} regexp
-      @return {Ember.ComputedProperty} computed property which match
-      the original value for property against a given RegExp
-    */
-    registerComputed('match', function(dependentKey, regexp) {
-      var value = get(this, dependentKey);
-      return typeof value === 'string' ? regexp.test(value) : false;
-    });
-
-    /**
-      A computed property that returns true if the provided dependent property
-      is equal to the given value.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        napTime: computed.equal('state', 'sleepy')
-      });
-      var hamster = Hamster.create();
-      hamster.get('napTime'); // false
-      hamster.set('state', 'sleepy');
-      hamster.get('napTime'); // true
-      hamster.set('state', 'hungry');
-      hamster.get('napTime'); // false
-      ```
-
-      @method computed.equal
-      @for Ember
-      @param {String} dependentKey
-      @param {String|Number|Object} value
-      @return {Ember.ComputedProperty} computed property which returns true if
-      the original value for property is equal to the given value.
-    */
-    registerComputed('equal', function(dependentKey, value) {
-      return get(this, dependentKey) === value;
-    });
-
-    /**
-      A computed property that returns true if the provied dependent property
-      is greater than the provided value.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        hasTooManyBananas: computed.gt('numBananas', 10)
-      });
-      var hamster = Hamster.create();
-      hamster.get('hasTooManyBananas'); // false
-      hamster.set('numBananas', 3);
-      hamster.get('hasTooManyBananas'); // false
-      hamster.set('numBananas', 11);
-      hamster.get('hasTooManyBananas'); // true
-      ```
-
-      @method computed.gt
-      @for Ember
-      @param {String} dependentKey
-      @param {Number} value
-      @return {Ember.ComputedProperty} computed property which returns true if
-      the original value for property is greater then given value.
-    */
-    registerComputed('gt', function(dependentKey, value) {
-      return get(this, dependentKey) > value;
-    });
-
-    /**
-      A computed property that returns true if the provided dependent property
-      is greater than or equal to the provided value.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        hasTooManyBananas: computed.gte('numBananas', 10)
-      });
-      var hamster = Hamster.create();
-      hamster.get('hasTooManyBananas'); // false
-      hamster.set('numBananas', 3);
-      hamster.get('hasTooManyBananas'); // false
-      hamster.set('numBananas', 10);
-      hamster.get('hasTooManyBananas'); // true
-      ```
-
-      @method computed.gte
-      @for Ember
-      @param {String} dependentKey
-      @param {Number} value
-      @return {Ember.ComputedProperty} computed property which returns true if
-      the original value for property is greater or equal then given value.
-    */
-    registerComputed('gte', function(dependentKey, value) {
-      return get(this, dependentKey) >= value;
-    });
-
-    /**
-      A computed property that returns true if the provided dependent property
-      is less than the provided value.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        needsMoreBananas: computed.lt('numBananas', 3)
-      });
-      var hamster = Hamster.create();
-      hamster.get('needsMoreBananas'); // true
-      hamster.set('numBananas', 3);
-      hamster.get('needsMoreBananas'); // false
-      hamster.set('numBananas', 2);
-      hamster.get('needsMoreBananas'); // true
-      ```
-
-      @method computed.lt
-      @for Ember
-      @param {String} dependentKey
-      @param {Number} value
-      @return {Ember.ComputedProperty} computed property which returns true if
-      the original value for property is less then given value.
-    */
-    registerComputed('lt', function(dependentKey, value) {
-      return get(this, dependentKey) < value;
-    });
-
-    /**
-      A computed property that returns true if the provided dependent property
-      is less than or equal to the provided value.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        needsMoreBananas: computed.lte('numBananas', 3)
-      });
-      var hamster = Hamster.create();
-      hamster.get('needsMoreBananas'); // true
-      hamster.set('numBananas', 5);
-      hamster.get('needsMoreBananas'); // false
-      hamster.set('numBananas', 3);
-      hamster.get('needsMoreBananas'); // true
-      ```
-
-      @method computed.lte
-      @for Ember
-      @param {String} dependentKey
-      @param {Number} value
-      @return {Ember.ComputedProperty} computed property which returns true if
-      the original value for property is less or equal then given value.
-    */
-    registerComputed('lte', function(dependentKey, value) {
-      return get(this, dependentKey) <= value;
-    });
-
-    /**
-      A computed property that performs a logical `and` on the
-      original values for the provided dependent properties.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        readyForCamp: computed.and('hasTent', 'hasBackpack')
-      });
-      var hamster = Hamster.create();
-      hamster.get('readyForCamp'); // false
-      hamster.set('hasTent', true);
-      hamster.get('readyForCamp'); // false
-      hamster.set('hasBackpack', true);
-      hamster.get('readyForCamp'); // true
-      ```
-
-      @method computed.and
-      @for Ember
-      @param {String} dependentKey*
-      @return {Ember.ComputedProperty} computed property which performs
-      a logical `and` on the values of all the original values for properties.
-    */
-    registerComputedWithProperties('and', function(properties) {
-      for (var key in properties) {
-        if (properties.hasOwnProperty(key) && !properties[key]) {
-          return false;
-        }
-      }
-      return true;
-    });
-
-    /**
-      A computed property which performs a logical `or` on the
-      original values for the provided dependent properties.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        readyForRain: computed.or('hasJacket', 'hasUmbrella')
-      });
-      var hamster = Hamster.create();
-      hamster.get('readyForRain'); // false
-      hamster.set('hasJacket', true);
-      hamster.get('readyForRain'); // true
-      ```
-
-      @method computed.or
-      @for Ember
-      @param {String} dependentKey*
-      @return {Ember.ComputedProperty} computed property which performs
-      a logical `or` on the values of all the original values for properties.
-    */
-    registerComputedWithProperties('or', function(properties) {
-      for (var key in properties) {
-        if (properties.hasOwnProperty(key) && properties[key]) {
-          return true;
-        }
-      }
-      return false;
-    });
-
-    /**
-      A computed property that returns the first truthy value
-      from a list of dependent properties.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        hasClothes: computed.any('hat', 'shirt')
-      });
-      var hamster = Hamster.create();
-      hamster.get('hasClothes'); // null
-      hamster.set('shirt', 'Hawaiian Shirt');
-      hamster.get('hasClothes'); // 'Hawaiian Shirt'
-      ```
-
-      @method computed.any
-      @for Ember
-      @param {String} dependentKey*
-      @return {Ember.ComputedProperty} computed property which returns
-      the first truthy value of given list of properties.
-    */
-    registerComputedWithProperties('any', function(properties) {
-      for (var key in properties) {
-        if (properties.hasOwnProperty(key) && properties[key]) {
-          return properties[key];
-        }
-      }
-      return null;
-    });
-
-    /**
-      A computed property that returns the array of values
-      for the provided dependent properties.
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        clothes: computed.collect('hat', 'shirt')
-      });
-      var hamster = Hamster.create();
-      hamster.get('clothes'); // [null, null]
-      hamster.set('hat', 'Camp Hat');
-      hamster.set('shirt', 'Camp Shirt');
-      hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
-      ```
-
-      @method computed.collect
-      @for Ember
-      @param {String} dependentKey*
-      @return {Ember.ComputedProperty} computed property which maps
-      values of all passed properties in to an array.
-    */
-    registerComputedWithProperties('collect', function(properties) {
-      var res = [];
-      for (var key in properties) {
-        if (properties.hasOwnProperty(key)) {
-          if (isNone(properties[key])) {
-            res.push(null);
-          } else {
-            res.push(properties[key]);
-          }
-        }
-      }
-      return res;
-    });
-
-    /**
-      Creates a new property that is an alias for another property
-      on an object. Calls to `get` or `set` this property behave as
-      though they were called on the original property.
-
-      ```javascript
-      Person = Ember.Object.extend({
-        name: 'Alex Matchneer',
-        nomen: computed.alias('name')
-      });
-
-      alex = Person.create();
-      alex.get('nomen'); // 'Alex Matchneer'
-      alex.get('name');  // 'Alex Matchneer'
-
-      alex.set('nomen', '@machty');
-      alex.get('name');  // '@machty'
-      ```
-      @method computed.alias
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which creates an
-      alias to the original value for property.
-    */
-    computed.alias = function(dependentKey) {
-      return computed(dependentKey, function(key, value) {
-        if (arguments.length > 1) {
-          set(this, dependentKey, value);
-          return value;
-        } else {
-          return get(this, dependentKey);
-        }
-      });
-    };
-
-    /**
-      Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
-      data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
-      not mutate the upstream property, rather causes the current property to
-      become the value set. This causes the downstream property to permentantly
-      diverge from the upstream property.
-
-      Example
-
-      ```javascript
-      User = Ember.Object.extend({
-        firstName: null,
-        lastName: null,
-        nickName: computed.oneWay('firstName')
-      });
-
-      user = User.create({
-        firstName: 'Teddy',
-        lastName:  'Zeenny'
-      });
-
-      user.get('nickName');
-      # 'Teddy'
-
-      user.set('nickName', 'TeddyBear');
-      # 'TeddyBear'
-
-      user.get('firstName');
-      # 'Teddy'
-      ```
-
-      @method computed.oneWay
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which creates a
-      one way computed property to the original value for property.
-    */
-    computed.oneWay = function(dependentKey) {
-      return computed(dependentKey, function() {
-        return get(this, dependentKey);
-      });
-    };
-
-    if (Ember.FEATURES.isEnabled('query-params-new')) {
-      /**
-        This is a more semantically meaningful alias of `computed.oneWay`,
-        whose name is somewhat ambiguous as to which direction the data flows.
-
-        @method computed.reads
-        @for Ember
-        @param {String} dependentKey
-        @return {Ember.ComputedProperty} computed property which creates a
-          one way computed property to the original value for property.
-       */
-      computed.reads = computed.oneWay;
-    }
-
-    /**
-      Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
-      a readOnly one way binding. Very often when using `computed.oneWay` one does
-      not also want changes to propogate back up, as they will replace the value.
-
-      This prevents the reverse flow, and also throws an exception when it occurs.
-
-      Example
-
-      ```javascript
-      User = Ember.Object.extend({
-        firstName: null,
-        lastName: null,
-        nickName: computed.readOnly('firstName')
-      });
-
-      user = User.create({
-        firstName: 'Teddy',
-        lastName:  'Zeenny'
-      });
-
-      user.get('nickName');
-      # 'Teddy'
-
-      user.set('nickName', 'TeddyBear');
-      # throws Exception
-      # throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
-
-      user.get('firstName');
-      # 'Teddy'
-      ```
-
-      @method computed.readOnly
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computed property which creates a
-      one way computed property to the original value for property.
-    */
-    computed.readOnly = function(dependentKey) {
-      return computed(dependentKey, function() {
-        return get(this, dependentKey);
-      }).readOnly();
-    };
-    /**
-      A computed property that acts like a standard getter and setter,
-      but returns the value at the provided `defaultPath` if the
-      property itself has not been set to a value
-
-      Example
-
-      ```javascript
-      var Hamster = Ember.Object.extend({
-        wishList: computed.defaultTo('favoriteFood')
-      });
-      var hamster = Hamster.create({favoriteFood: 'Banana'});
-      hamster.get('wishList'); // 'Banana'
-      hamster.set('wishList', 'More Unit Tests');
-      hamster.get('wishList'); // 'More Unit Tests'
-      hamster.get('favoriteFood'); // 'Banana'
-      ```
-
-      @method computed.defaultTo
-      @for Ember
-      @param {String} defaultPath
-      @return {Ember.ComputedProperty} computed property which acts like
-      a standard getter and setter, but defaults to the value from `defaultPath`.
-    */
-    // ES6TODO: computed should have its own export path so you can do import {defaultTo} from computed
-    computed.defaultTo = function(defaultPath) {
-      return computed(function(key, newValue, cachedValue) {
-        if (arguments.length === 1) {
-          return get(this, defaultPath);
-        }
-        return newValue != null ? newValue : get(this, defaultPath);
-      });
-    };
-
-    __exports__.ComputedProperty = ComputedProperty;
-    __exports__.computed = computed;
-    __exports__.cacheFor = cacheFor;
-  });
-define("ember-metal/core", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /*globals Em:true ENV EmberENV MetamorphENV:true */
-
-    /**
-    @module ember
-    @submodule ember-metal
-    */
-
-    /**
-      All Ember methods and functions are defined inside of this namespace. You
-      generally should not add new properties to this namespace as it may be
-      overwritten by future versions of Ember.
-
-      You can also use the shorthand `Em` instead of `Ember`.
-
-      Ember-Runtime is a framework that provides core functions for Ember including
-      cross-platform functions, support for property observing and objects. Its
-      focus is on small size and performance. You can use this in place of or
-      along-side other cross-platform libraries such as jQuery.
-
-      The core Runtime framework is based on the jQuery API with a number of
-      performance optimizations.
-
-      @class Ember
-      @static
-      @version 1.6.0-beta.1+canary.24b19e51
-    */
-
-    if ('undefined' === typeof Ember) {
-      // Create core object. Make it act like an instance of Ember.Namespace so that
-      // objects assigned to it are given a sane string representation.
-      Ember = {};
-    }
-
-    // Default imports, exports and lookup to the global object;
-    var imports = Ember.imports = Ember.imports || this;
-    var exports = Ember.exports = Ember.exports || this;
-    var lookup  = Ember.lookup  = Ember.lookup  || this;
-
-    // aliases needed to keep minifiers from removing the global context
-    exports.Em = exports.Ember = Ember;
-
-    // Make sure these are set whether Ember was already defined or not
-
-    Ember.isNamespace = true;
-
-    Ember.toString = function() { return "Ember"; };
-
-
-    /**
-      @property VERSION
-      @type String
-      @default '1.6.0-beta.1+canary.24b19e51'
-      @static
-    */
-    Ember.VERSION = '1.6.0-beta.1+canary.24b19e51';
-
-    /**
-      Standard environmental variables. You can define these in a global `EmberENV`
-      variable before loading Ember to control various configuration settings.
-
-      For backwards compatibility with earlier versions of Ember the global `ENV`
-      variable will be used if `EmberENV` is not defined.
-
-      @property ENV
-      @type Hash
-    */
-
-    if (Ember.ENV) {
-      // do nothing if Ember.ENV is already setup
-    } else if ('undefined' !== typeof EmberENV) {
-      Ember.ENV = EmberENV;
-    } else if('undefined' !== typeof ENV) {
-      Ember.ENV = ENV;
-    } else {
-      Ember.ENV = {};
-    }
-
-    Ember.config = Ember.config || {};
-
-    // We disable the RANGE API by default for performance reasons
-    if ('undefined' === typeof Ember.ENV.DISABLE_RANGE_API) {
-      Ember.ENV.DISABLE_RANGE_API = true;
-    }
-
-    if ("undefined" === typeof MetamorphENV) {
-      exports.MetamorphENV = {};
-    }
-
-    MetamorphENV.DISABLE_RANGE_API = Ember.ENV.DISABLE_RANGE_API;
-
-    /**
-      Hash of enabled Canary features. Add to before creating your application.
-
-      You can also define `ENV.FEATURES` if you need to enable features flagged at runtime.
-
-      @property FEATURES
-      @type Hash
-    */
-
-    Ember.FEATURES = Ember.ENV.FEATURES || {};
-
-    /**
-      Test that a feature is enabled. Parsed by Ember's build tools to leave
-      experimental features out of beta/stable builds.
-
-      You can define the following configuration options:
-
-      * `ENV.ENABLE_ALL_FEATURES` - force all features to be enabled.
-      * `ENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly
-        enabled/disabled.
-
-      @method isEnabled
-      @param {string} feature
-    */
-
-    Ember.FEATURES.isEnabled = function(feature) {
-      var featureValue = Ember.FEATURES[feature];
-
-      if (Ember.ENV.ENABLE_ALL_FEATURES) {
-        return true;
-      } else if (featureValue === true || featureValue === false || featureValue === undefined) {
-        return featureValue;
-      } else if (Ember.ENV.ENABLE_OPTIONAL_FEATURES) {
-        return true;
-      } else {
-        return false;
-      }
-    };
-
-    // ..........................................................
-    // BOOTSTRAP
-    //
-
-    /**
-      Determines whether Ember should enhances some built-in object prototypes to
-      provide a more friendly API. If enabled, a few methods will be added to
-      `Function`, `String`, and `Array`. `Object.prototype` will not be enhanced,
-      which is the one that causes most trouble for people.
-
-      In general we recommend leaving this option set to true since it rarely
-      conflicts with other code. If you need to turn it off however, you can
-      define an `ENV.EXTEND_PROTOTYPES` config to disable it.
-
-      @property EXTEND_PROTOTYPES
-      @type Boolean
-      @default true
-    */
-    Ember.EXTEND_PROTOTYPES = Ember.ENV.EXTEND_PROTOTYPES;
-
-    if (typeof Ember.EXTEND_PROTOTYPES === 'undefined') {
-      Ember.EXTEND_PROTOTYPES = true;
-    }
-
-    /**
-      Determines whether Ember logs a full stack trace during deprecation warnings
-
-      @property LOG_STACKTRACE_ON_DEPRECATION
-      @type Boolean
-      @default true
-    */
-    Ember.LOG_STACKTRACE_ON_DEPRECATION = (Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION !== false);
-
-    /**
-      Determines whether Ember should add ECMAScript 5 shims to older browsers.
-
-      @property SHIM_ES5
-      @type Boolean
-      @default Ember.EXTEND_PROTOTYPES
-    */
-    Ember.SHIM_ES5 = (Ember.ENV.SHIM_ES5 === false) ? false : Ember.EXTEND_PROTOTYPES;
-
-    /**
-      Determines whether Ember logs info about version of used libraries
-
-      @property LOG_VERSION
-      @type Boolean
-      @default true
-    */
-    Ember.LOG_VERSION = (Ember.ENV.LOG_VERSION === false) ? false : true;
-
-    /**
-      Empty function. Useful for some operations. Always returns `this`.
-
-      @method K
-      @private
-      @return {Object}
-    */
-    Ember.K = function() { return this; };
-
-
-    // Stub out the methods defined by the ember-debug package in case it's not loaded
-
-    if ('undefined' === typeof Ember.assert) { Ember.assert = Ember.K; }
-    if ('undefined' === typeof Ember.warn) { Ember.warn = Ember.K; }
-    if ('undefined' === typeof Ember.debug) { Ember.debug = Ember.K; }
-    if ('undefined' === typeof Ember.runInDebug) { Ember.runInDebug = Ember.K; }
-    if ('undefined' === typeof Ember.deprecate) { Ember.deprecate = Ember.K; }
-    if ('undefined' === typeof Ember.deprecateFunc) {
-      Ember.deprecateFunc = function(_, func) { return func; };
-    }
-
-    /**
-      Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from
-      jQuery master. We'll just bootstrap our own uuid now.
-
-      @property uuid
-      @type Number
-      @private
-    */
-    Ember.uuid = 0;
-
-    __exports__["default"] = Ember;
-  });
-define("ember-metal/enumerable_utils", 
-  ["ember-metal/array","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var map, forEach, indexOf, splice, filter;
-
-    var map = __dependency1__.map;
-    var forEach = __dependency1__.forEach;
-    var indexOf = __dependency1__.indexOf;
-    var filter = __dependency1__.filter;
-
-    // ES6TODO: doesn't array polyfills already do this?
-    map     = Array.prototype.map     || map;
-    forEach = Array.prototype.forEach || forEach;
-    indexOf = Array.prototype.indexOf || indexOf;
-    filter  = Array.prototype.filter   || filter;
-    splice  = Array.prototype.splice;
-
-    /**
-     * Defines some convenience methods for working with Enumerables.
-     * `Ember.EnumerableUtils` uses `Ember.ArrayPolyfills` when necessary.
-     *
-     * @class EnumerableUtils
-     * @namespace Ember
-     * @static
-     * */
-    var utils = {
-      /**
-       * Calls the map function on the passed object with a specified callback. This
-       * uses `Ember.ArrayPolyfill`'s-map method when necessary.
-       *
-       * @method map
-       * @param {Object} obj The object that should be mapped
-       * @param {Function} callback The callback to execute
-       * @param {Object} thisArg Value to use as this when executing *callback*
-       *
-       * @return {Array} An array of mapped values.
-       */
-      map: function(obj, callback, thisArg) {
-        return obj.map ? obj.map.call(obj, callback, thisArg) : map.call(obj, callback, thisArg);
-      },
-
-      /**
-       * Calls the forEach function on the passed object with a specified callback. This
-       * uses `Ember.ArrayPolyfill`'s-forEach method when necessary.
-       *
-       * @method forEach
-       * @param {Object} obj The object to call forEach on
-       * @param {Function} callback The callback to execute
-       * @param {Object} thisArg Value to use as this when executing *callback*
-       *
-       */
-      forEach: function(obj, callback, thisArg) {
-        return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : forEach.call(obj, callback, thisArg);
-      },
-
-      /**
-       * Calls the filter function on the passed object with a specified callback. This
-       * uses `Ember.ArrayPolyfill`'s-filter method when necessary.
-       *
-       * @method filter
-       * @param {Object} obj The object to call filter on
-       * @param {Function} callback The callback to execute
-       * @param {Object} thisArg Value to use as this when executing *callback*
-       *
-       * @return {Array} An array containing the filtered values
-       */
-      filter: function(obj, callback, thisArg) {
-        return obj.filter ? obj.filter.call(obj, callback, thisArg) : filter.call(obj, callback, thisArg);
-      },
-
-      /**
-       * Calls the indexOf function on the passed object with a specified callback. This
-       * uses `Ember.ArrayPolyfill`'s-indexOf method when necessary.
-       *
-       * @method indexOf
-       * @param {Object} obj The object to call indexOn on
-       * @param {Function} callback The callback to execute
-       * @param {Object} index The index to start searching from
-       *
-       */
-      indexOf: function(obj, element, index) {
-        return obj.indexOf ? obj.indexOf.call(obj, element, index) : indexOf.call(obj, element, index);
-      },
-
-      /**
-       * Returns an array of indexes of the first occurrences of the passed elements
-       * on the passed object.
-       *
-       * ```javascript
-       *  var array = [1, 2, 3, 4, 5];
-       *  Ember.EnumerableUtils.indexesOf(array, [2, 5]); // [1, 4]
-       *
-       *  var fubar = "Fubarr";
-       *  Ember.EnumerableUtils.indexesOf(fubar, ['b', 'r']); // [2, 4]
-       * ```
-       *
-       * @method indexesOf
-       * @param {Object} obj The object to check for element indexes
-       * @param {Array} elements The elements to search for on *obj*
-       *
-       * @return {Array} An array of indexes.
-       *
-       */
-      indexesOf: function(obj, elements) {
-        return elements === undefined ? [] : utils.map(elements, function(item) {
-          return utils.indexOf(obj, item);
-        });
-      },
-
-      /** 
-       * Adds an object to an array. If the array already includes the object this
-       * method has no effect.
-       *
-       * @method addObject
-       * @param {Array} array The array the passed item should be added to
-       * @param {Object} item The item to add to the passed array
-       *
-       * @return 'undefined'
-       */
-      addObject: function(array, item) {
-        var index = utils.indexOf(array, item);
-        if (index === -1) { array.push(item); }
-      },
-
-      /**
-       * Removes an object from an array. If the array does not contain the passed
-       * object this method has no effect.
-       *
-       * @method removeObject
-       * @param {Array} array The array to remove the item from.
-       * @param {Object} item The item to remove from the passed array.
-       *
-       * @return 'undefined'
-       */
-      removeObject: function(array, item) {
-        var index = utils.indexOf(array, item);
-        if (index !== -1) { array.splice(index, 1); }
-      },
-
-      _replace: function(array, idx, amt, objects) {
-        var args = [].concat(objects), chunk, ret = [],
-            // https://code.google.com/p/chromium/issues/detail?id=56588
-            size = 60000, start = idx, ends = amt, count;
-
-        while (args.length) {
-          count = ends > size ? size : ends;
-          if (count <= 0) { count = 0; }
-
-          chunk = args.splice(0, size);
-          chunk = [start, count].concat(chunk);
-
-          start += size;
-          ends -= count;
-
-          ret = ret.concat(splice.apply(array, chunk));
-        }
-        return ret;
-      },
-
-      /**
-       * Replaces objects in an array with the passed objects.
-       *
-       * ```javascript
-       *   var array = [1,2,3];
-       *   Ember.EnumerableUtils.replace(array, 1, 2, [4, 5]); // [1, 4, 5]
-       *
-       *   var array = [1,2,3];
-       *   Ember.EnumerableUtils.replace(array, 1, 1, [4, 5]); // [1, 4, 5, 3]
-       *
-       *   var array = [1,2,3];
-       *   Ember.EnumerableUtils.replace(array, 10, 1, [4, 5]); // [1, 2, 3, 4, 5]
-       * ```
-       * 
-       * @method replace
-       * @param {Array} array The array the objects should be inserted into.
-       * @param {Number} idx Starting index in the array to replace. If *idx* >=
-       * length, then append to the end of the array.
-       * @param {Number} amt Number of elements that should be removed from the array,
-       * starting at *idx*
-       * @param {Array} objects An array of zero or more objects that should be
-       * inserted into the array at *idx*
-       *
-       * @return {Array} The modified array.
-       */
-      replace: function(array, idx, amt, objects) {
-        if (array.replace) {
-          return array.replace(idx, amt, objects);
-        } else {
-          return utils._replace(array, idx, amt, objects);
-        }
-      },
-
-      /**
-       * Calculates the intersection of two arrays. This method returns a new array
-       * filled with the records that the two passed arrays share with each other. 
-       * If there is no intersection, an empty array will be returned.
-       *
-       * ```javascript
-       * var array1 = [1, 2, 3, 4, 5];
-       * var array2 = [1, 3, 5, 6, 7];
-       *
-       * Ember.EnumerableUtils.intersection(array1, array2); // [1, 3, 5]
-       *
-       * var array1 = [1, 2, 3];
-       * var array2 = [4, 5, 6];
-       *
-       * Ember.EnumerableUtils.intersection(array1, array2); // []
-       * ```
-       *
-       * @method intersection
-       * @param {Array} array1 The first array
-       * @param {Array} array2 The second array
-       *
-       * @return {Array} The intersection of the two passed arrays.
-       */
-      intersection: function(array1, array2) {
-        var intersection = [];
-
-        utils.forEach(array1, function(element) {
-          if (utils.indexOf(array2, element) >= 0) {
-            intersection.push(element);
-          }
-        });
-
-        return intersection;
-      }
-    };
-
-    __exports__["default"] = utils;
-  });
-define("ember-metal/error", 
-  ["ember-metal/platform","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var create = __dependency1__.create;
-
-    var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
-
-    /**
-      A subclass of the JavaScript Error object for use in Ember.
-
-      @class Error
-      @namespace Ember
-      @extends Error
-      @constructor
-    */
-    var EmberError = function() {
-      var tmp = Error.apply(this, arguments);
-
-      // Adds a `stack` property to the given error object that will yield the
-      // stack trace at the time captureStackTrace was called.
-      // When collecting the stack trace all frames above the topmost call
-      // to this function, including that call, will be left out of the
-      // stack trace.
-      // This is useful because we can hide Ember implementation details
-      // that are not very helpful for the user.
-      if (Error.captureStackTrace) {
-        Error.captureStackTrace(this, Ember.Error);
-      }
-      // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
-      for (var idx = 0; idx < errorProps.length; idx++) {
-        this[errorProps[idx]] = tmp[errorProps[idx]];
-      }
-    };
-
-    EmberError.prototype = create(Error.prototype);
-
-    __exports__["default"] = EmberError;
-  });
-define("ember-metal/events", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/platform","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    /**
-    @module ember-metal
-    */
-    var Ember = __dependency1__["default"];
-    var meta = __dependency2__.meta;
-    var META_KEY = __dependency2__.META_KEY;
-    var tryFinally = __dependency2__.tryFinally;
-    var apply = __dependency2__.apply;
-    var applyStr = __dependency2__.applyStr;
-    var create = __dependency3__.create;
-
-    var a_slice = [].slice,
-        metaFor = meta,
-        /* listener flags */
-        ONCE = 1, SUSPENDED = 2;
-
-
-    /*
-      The event system uses a series of nested hashes to store listeners on an
-      object. When a listener is registered, or when an event arrives, these
-      hashes are consulted to determine which target and action pair to invoke.
-
-      The hashes are stored in the object's meta hash, and look like this:
-
-          // Object's meta hash
-          {
-            listeners: {       // variable name: `listenerSet`
-              "foo:changed": [ // variable name: `actions`
-                target, method, flags
-              ]
-            }
-          }
-
-    */
-
-    function indexOf(array, target, method) {
-      var index = -1;
-      // hashes are added to the end of the event array
-      // so it makes sense to start searching at the end
-      // of the array and search in reverse
-      for (var i = array.length - 3 ; i >=0; i -= 3) {
-        if (target === array[i] && method === array[i + 1]) {
-             index = i; break;
-        }
-      }
-      return index;
-    }
-
-    function actionsFor(obj, eventName) {
-      var meta = metaFor(obj, true),
-          actions;
-
-      if (!meta.listeners) { meta.listeners = {}; }
-
-      if (!meta.hasOwnProperty('listeners')) {
-        // setup inherited copy of the listeners object
-        meta.listeners = create(meta.listeners);
-      }
-
-      actions = meta.listeners[eventName];
-
-      // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
-      if (actions && !meta.listeners.hasOwnProperty(eventName)) {
-        actions = meta.listeners[eventName] = meta.listeners[eventName].slice();
-      } else if (!actions) {
-        actions = meta.listeners[eventName] = [];
-      }
-
-      return actions;
-    }
-
-    function listenersUnion(obj, eventName, otherActions) {
-      var meta = obj[META_KEY],
-          actions = meta && meta.listeners && meta.listeners[eventName];
-
-      if (!actions) { return; }
-      for (var i = actions.length - 3; i >= 0; i -= 3) {
-        var target = actions[i],
-            method = actions[i+1],
-            flags = actions[i+2],
-            actionIndex = indexOf(otherActions, target, method);
-
-        if (actionIndex === -1) {
-          otherActions.push(target, method, flags);
-        }
-      }
-    }
-
-    function listenersDiff(obj, eventName, otherActions) {
-      var meta = obj[META_KEY],
-          actions = meta && meta.listeners && meta.listeners[eventName],
-          diffActions = [];
-
-      if (!actions) { return; }
-      for (var i = actions.length - 3; i >= 0; i -= 3) {
-        var target = actions[i],
-            method = actions[i+1],
-            flags = actions[i+2],
-            actionIndex = indexOf(otherActions, target, method);
-
-        if (actionIndex !== -1) { continue; }
-
-        otherActions.push(target, method, flags);
-        diffActions.push(target, method, flags);
-      }
-
-      return diffActions;
-    }
-
-    /**
-      Add an event listener
-
-      @method addListener
-      @for Ember
-      @param obj
-      @param {String} eventName
-      @param {Object|Function} targetOrMethod A target object or a function
-      @param {Function|String} method A function or the name of a function to be called on `target`
-      @param {Boolean} once A flag whether a function should only be called once
-    */
-    function addListener(obj, eventName, target, method, once) {
-      Ember.assert("You must pass at least an object and event name to Ember.addListener", !!obj && !!eventName);
-
-      if (!method && 'function' === typeof target) {
-        method = target;
-        target = null;
-      }
-
-      var actions = actionsFor(obj, eventName),
-          actionIndex = indexOf(actions, target, method),
-          flags = 0;
-
-      if (once) flags |= ONCE;
-
-      if (actionIndex !== -1) { return; }
-
-      actions.push(target, method, flags);
-
-      if ('function' === typeof obj.didAddListener) {
-        obj.didAddListener(eventName, target, method);
-      }
-    }
-
-    /**
-      Remove an event listener
-
-      Arguments should match those passed to `Ember.addListener`.
-
-      @method removeListener
-      @for Ember
-      @param obj
-      @param {String} eventName
-      @param {Object|Function} targetOrMethod A target object or a function
-      @param {Function|String} method A function or the name of a function to be called on `target`
-    */
-    function removeListener(obj, eventName, target, method) {
-      Ember.assert("You must pass at least an object and event name to Ember.removeListener", !!obj && !!eventName);
-
-      if (!method && 'function' === typeof target) {
-        method = target;
-        target = null;
-      }
-
-      function _removeListener(target, method) {
-        var actions = actionsFor(obj, eventName),
-            actionIndex = indexOf(actions, target, method);
-
-        // action doesn't exist, give up silently
-        if (actionIndex === -1) { return; }
-
-        actions.splice(actionIndex, 3);
-
-        if ('function' === typeof obj.didRemoveListener) {
-          obj.didRemoveListener(eventName, target, method);
-        }
-      }
-
-      if (method) {
-        _removeListener(target, method);
-      } else {
-        var meta = obj[META_KEY],
-            actions = meta && meta.listeners && meta.listeners[eventName];
-
-        if (!actions) { return; }
-        for (var i = actions.length - 3; i >= 0; i -= 3) {
-          _removeListener(actions[i], actions[i+1]);
-        }
-      }
-    }
-
-    /**
-      Suspend listener during callback.
-
-      This should only be used by the target of the event listener
-      when it is taking an action that would cause the event, e.g.
-      an object might suspend its property change listener while it is
-      setting that property.
-
-      @method suspendListener
-      @for Ember
-
-      @private
-      @param obj
-      @param {String} eventName
-      @param {Object|Function} targetOrMethod A target object or a function
-      @param {Function|String} method A function or the name of a function to be called on `target`
-      @param {Function} callback
-    */
-    function suspendListener(obj, eventName, target, method, callback) {
-      if (!method && 'function' === typeof target) {
-        method = target;
-        target = null;
-      }
-
-      var actions = actionsFor(obj, eventName),
-          actionIndex = indexOf(actions, target, method);
-
-      if (actionIndex !== -1) {
-        actions[actionIndex+2] |= SUSPENDED; // mark the action as suspended
-      }
-
-      function tryable()   { return callback.call(target); }
-      function finalizer() { if (actionIndex !== -1) { actions[actionIndex+2] &= ~SUSPENDED; } }
-
-      return tryFinally(tryable, finalizer);
-    }
-
-    /**
-      Suspends multiple listeners during a callback.
-
-      @method suspendListeners
-      @for Ember
-
-      @private
-      @param obj
-      @param {Array} eventName Array of event names
-      @param {Object|Function} targetOrMethod A target object or a function
-      @param {Function|String} method A function or the name of a function to be called on `target`
-      @param {Function} callback
-    */
-    function suspendListeners(obj, eventNames, target, method, callback) {
-      if (!method && 'function' === typeof target) {
-        method = target;
-        target = null;
-      }
-
-      var suspendedActions = [],
-          actionsList = [],
-          eventName, actions, i, l;
-
-      for (i=0, l=eventNames.length; i<l; i++) {
-        eventName = eventNames[i];
-        actions = actionsFor(obj, eventName);
-        var actionIndex = indexOf(actions, target, method);
-
-        if (actionIndex !== -1) {
-          actions[actionIndex+2] |= SUSPENDED;
-          suspendedActions.push(actionIndex);
-          actionsList.push(actions);
-        }
-      }
-
-      function tryable() { return callback.call(target); }
-
-      function finalizer() {
-        for (var i = 0, l = suspendedActions.length; i < l; i++) {
-          var actionIndex = suspendedActions[i];
-          actionsList[i][actionIndex+2] &= ~SUSPENDED;
-        }
-      }
-
-      return tryFinally(tryable, finalizer);
-    }
-
-    /**
-      Return a list of currently watched events
-
-      @private
-      @method watchedEvents
-      @for Ember
-      @param obj
-    */
-    function watchedEvents(obj) {
-      var listeners = obj[META_KEY].listeners, ret = [];
-
-      if (listeners) {
-        for(var eventName in listeners) {
-          if (listeners[eventName]) { ret.push(eventName); }
-        }
-      }
-      return ret;
-    }
-
-    /**
-      Send an event. The execution of suspended listeners
-      is skipped, and once listeners are removed. A listener without
-      a target is executed on the passed object. If an array of actions
-      is not passed, the actions stored on the passed object are invoked.
-
-      @method sendEvent
-      @for Ember
-      @param obj
-      @param {String} eventName
-      @param {Array} params Optional parameters for each listener.
-      @param {Array} actions Optional array of actions (listeners).
-      @return true
-    */
-    function sendEvent(obj, eventName, params, actions) {
-      // first give object a chance to handle it
-      if (obj !== Ember && 'function' === typeof obj.sendEvent) {
-        obj.sendEvent(eventName, params);
-      }
-
-      if (!actions) {
-        var meta = obj[META_KEY];
-        actions = meta && meta.listeners && meta.listeners[eventName];
-      }
-
-      if (!actions) { return; }
-
-      for (var i = actions.length - 3; i >= 0; i -= 3) { // looping in reverse for once listeners
-        var target = actions[i], method = actions[i+1], flags = actions[i+2];
-        if (!method) { continue; }
-        if (flags & SUSPENDED) { continue; }
-        if (flags & ONCE) { removeListener(obj, eventName, target, method); }
-        if (!target) { target = obj; }
-        if ('string' === typeof method) {
-          if (params) {
-            applyStr(target, method, params);
-          } else {
-            target[method]();
-          }
-        } else {
-          if (params) {
-            apply(target, method, params);
-          } else {
-            method.call(target);
-          }
-        }
-      }
-      return true;
-    }
-
-    /**
-      @private
-      @method hasListeners
-      @for Ember
-      @param obj
-      @param {String} eventName
-    */
-    function hasListeners(obj, eventName) {
-      var meta = obj[META_KEY],
-          actions = meta && meta.listeners && meta.listeners[eventName];
-
-      return !!(actions && actions.length);
-    }
-
-    /**
-      @private
-      @method listenersFor
-      @for Ember
-      @param obj
-      @param {String} eventName
-    */
-    function listenersFor(obj, eventName) {
-      var ret = [];
-      var meta = obj[META_KEY],
-          actions = meta && meta.listeners && meta.listeners[eventName];
-
-      if (!actions) { return ret; }
-
-      for (var i = 0, l = actions.length; i < l; i += 3) {
-        var target = actions[i],
-            method = actions[i+1];
-        ret.push([target, method]);
-      }
-
-      return ret;
-    }
-
-    /**
-      Define a property as a function that should be executed when
-      a specified event or events are triggered.
-
-
-      ``` javascript
-      var Job = Ember.Object.extend({
-        logCompleted: Ember.on('completed', function(){
-          console.log('Job completed!');
-        })
-      });
-      var job = Job.create();
-      Ember.sendEvent(job, 'completed'); // Logs "Job completed!"
-     ```
-
-      @method on
-      @for Ember
-      @param {String} eventNames*
-      @param {Function} func
-      @return func
-    */
-    function on(){
-      var func = a_slice.call(arguments, -1)[0],
-          events = a_slice.call(arguments, 0, -1);
-      func.__ember_listens__ = events;
-      return func;
-    };
-
-    __exports__.on = on;
-    __exports__.addListener = addListener;
-    __exports__.removeListener = removeListener;
-    __exports__.suspendListener = suspendListener;
-    __exports__.suspendListeners = suspendListeners;
-    __exports__.sendEvent = sendEvent;
-    __exports__.hasListeners = hasListeners;
-    __exports__.watchedEvents = watchedEvents;
-    __exports__.listenersFor = listenersFor;
-    __exports__.listenersDiff = listenersDiff;
-    __exports__.listenersUnion = listenersUnion;
-  });
-define("ember-metal/expand_properties", 
-  ["ember-metal/enumerable_utils","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var EnumerableUtils = __dependency1__["default"];
-
-    /**
-      @module ember-metal
-      */
-
-    var forEach = EnumerableUtils.forEach,
-    BRACE_EXPANSION = /^((?:[^\.]*\.)*)\{(.*)\}$/;
-
-    /**
-      Expands `pattern`, invoking `callback` for each expansion.
-
-      The only pattern supported is brace-expansion, anything else will be passed
-      once to `callback` directly. Brace expansion can only appear at the end of a
-      pattern, for example as the last item in a chain.
-
-      Example
-      ```js
-      function echo(arg){ console.log(arg); }
-
-      Ember.expandProperties('foo.bar', echo);        //=> 'foo.bar'
-      Ember.expandProperties('{foo,bar}', echo);      //=> 'foo', 'bar'
-      Ember.expandProperties('foo.{bar,baz}', echo);  //=> 'foo.bar', 'foo.baz'
-      Ember.expandProperties('{foo,bar}.baz', echo);  //=> '{foo,bar}.baz'
-      ```
-
-      @method
-      @private
-      @param {string} pattern The property pattern to expand.
-      @param {function} callback The callback to invoke.  It is invoked once per
-      expansion, and is passed the expansion.
-      */
-    function expandProperties(pattern, callback) {
-      var match, prefix, list;
-
-      if (match = BRACE_EXPANSION.exec(pattern)) {
-        prefix = match[1];
-        list = match[2];
-
-        forEach(list.split(','), function (suffix) {
-          callback(prefix + suffix);
-        });
-      } else {
-        callback(pattern);
-      }
-    };
-
-    __exports__["default"] = expandProperties;
-  });
-define("ember-metal/get_properties", 
-  ["ember-metal/property_get","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var typeOf = __dependency2__.typeOf;
-
-    /**
-      To get multiple properties at once, call `Ember.getProperties`
-      with an object followed by a list of strings or an array:
-
-      ```javascript
-      Ember.getProperties(record, 'firstName', 'lastName', 'zipCode');
-      // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
-      ```
-
-      is equivalent to:
-
-      ```javascript
-      Ember.getProperties(record, ['firstName', 'lastName', 'zipCode']);
-      // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
-      ```
-
-      @method getProperties
-      @param obj
-      @param {String...|Array} list of keys to get
-      @return {Hash}
-    */
-    function getProperties(obj) {
-      var ret = {},
-          propertyNames = arguments,
-          i = 1;
-
-      if (arguments.length === 2 && typeOf(arguments[1]) === 'array') {
-        i = 0;
-        propertyNames = arguments[1];
-      }
-      for(var len = propertyNames.length; i < len; i++) {
-        ret[propertyNames[i]] = get(obj, propertyNames[i]);
-      }
-      return ret;
-    };
-
-    __exports__["default"] = getProperties;
-  });
-define("ember-metal/instrumentation", 
-  ["ember-metal/core","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var tryCatchFinally = __dependency2__.tryCatchFinally;
-
-    /**
-      The purpose of the Ember Instrumentation module is
-      to provide efficient, general-purpose instrumentation
-      for Ember.
-
-      Subscribe to a listener by using `Ember.subscribe`:
-
-      ```javascript
-      Ember.subscribe("render", {
-        before: function(name, timestamp, payload) {
-
-        },
-
-        after: function(name, timestamp, payload) {
-
-        }
-      });
-      ```
-
-      If you return a value from the `before` callback, that same
-      value will be passed as a fourth parameter to the `after`
-      callback.
-
-      Instrument a block of code by using `Ember.instrument`:
-
-      ```javascript
-      Ember.instrument("render.handlebars", payload, function() {
-        // rendering logic
-      }, binding);
-      ```
-
-      Event names passed to `Ember.instrument` are namespaced
-      by periods, from more general to more specific. Subscribers
-      can listen for events by whatever level of granularity they
-      are interested in.
-
-      In the above example, the event is `render.handlebars`,
-      and the subscriber listened for all events beginning with
-      `render`. It would receive callbacks for events named
-      `render`, `render.handlebars`, `render.container`, or
-      even `render.handlebars.layout`.
-
-      @class Instrumentation
-      @namespace Ember
-      @static
-    */
-    var subscribers = [], cache = {};
-
-    var populateListeners = function(name) {
-      var listeners = [], subscriber;
-
-      for (var i=0, l=subscribers.length; i<l; i++) {
-        subscriber = subscribers[i];
-        if (subscriber.regex.test(name)) {
-          listeners.push(subscriber.object);
-        }
-      }
-
-      cache[name] = listeners;
-      return listeners;
-    };
-
-    var time = (function() {
-      var perf = 'undefined' !== typeof window ? window.performance || {} : {};
-      var fn = perf.now || perf.mozNow || perf.webkitNow || perf.msNow || perf.oNow;
-      // fn.bind will be available in all the browsers that support the advanced window.performance... ;-)
-      return fn ? fn.bind(perf) : function() { return +new Date(); };
-    })();
-
-    /**
-      Notifies event's subscribers, calls `before` and `after` hooks.
-
-      @method instrument
-      @namespace Ember.Instrumentation
-
-      @param {String} [name] Namespaced event name.
-      @param {Object} payload
-      @param {Function} callback Function that you're instrumenting.
-      @param {Object} binding Context that instrument function is called with.
-    */
-    function instrument(name, payload, callback, binding) {
-      var listeners = cache[name], timeName, ret;
-
-      // ES6TODO: Docs. What is this?
-      if (Ember.STRUCTURED_PROFILE) {
-        timeName = name + ": " + payload.object;
-        console.time(timeName);
-      }
-
-      if (!listeners) {
-        listeners = populateListeners(name);
-      }
-
-      if (listeners.length === 0) {
-        ret = callback.call(binding);
-        if (Ember.STRUCTURED_PROFILE) { console.timeEnd(timeName); }
-        return ret;
-      }
-
-      var beforeValues = [], listener, i, l;
-
-      function tryable() {
-        for (i=0, l=listeners.length; i<l; i++) {
-          listener = listeners[i];
-          beforeValues[i] = listener.before(name, time(), payload);
-        }
-
-        return callback.call(binding);
-      }
-
-      function catchable(e) {
-        payload = payload || {};
-        payload.exception = e;
-      }
-
-      function finalizer() {
-        for (i=0, l=listeners.length; i<l; i++) {
-          listener = listeners[i];
-          listener.after(name, time(), payload, beforeValues[i]);
-        }
-
-        if (Ember.STRUCTURED_PROFILE) {
-          console.timeEnd(timeName);
-        }
-      }
-
-      return tryCatchFinally(tryable, catchable, finalizer);
-    };
-
-    /**
-      Subscribes to a particular event or instrumented block of code.
-
-      @method subscribe
-      @namespace Ember.Instrumentation
-
-      @param {String} [pattern] Namespaced event name.
-      @param {Object} [object] Before and After hooks.
-
-      @return {Subscriber}
-    */
-    function subscribe(pattern, object) {
-      var paths = pattern.split("."), path, regex = [];
-
-      for (var i=0, l=paths.length; i<l; i++) {
-        path = paths[i];
-        if (path === "*") {
-          regex.push("[^\\.]*");
-        } else {
-          regex.push(path);
-        }
-      }
-
-      regex = regex.join("\\.");
-      regex = regex + "(\\..*)?";
-
-      var subscriber = {
-        pattern: pattern,
-        regex: new RegExp("^" + regex + "$"),
-        object: object
-      };
-
-      subscribers.push(subscriber);
-      cache = {};
-
-      return subscriber;
-    };
-
-    /**
-      Unsubscribes from a particular event or instrumented block of code.
-
-      @method unsubscribe
-      @namespace Ember.Instrumentation
-
-      @param {Object} [subscriber]
-    */
-    function unsubscribe(subscriber) {
-      var index;
-
-      for (var i=0, l=subscribers.length; i<l; i++) {
-        if (subscribers[i] === subscriber) {
-          index = i;
-        }
-      }
-
-      subscribers.splice(index, 1);
-      cache = {};
-    };
-
-    /**
-      Resets `Ember.Instrumentation` by flushing list of subscribers.
-
-      @method reset
-      @namespace Ember.Instrumentation
-    */
-    function reset() {
-      subscribers = [];
-      cache = {};
-    };
-
-    __exports__.instrument = instrument;
-    __exports__.subscribe = subscribe;
-    __exports__.unsubscribe = unsubscribe;
-    __exports__.reset = reset;
-  });
-define("ember-metal/is_blank", 
-  ["ember-metal/core","ember-metal/is_empty","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // deprecateFunc
-    var isEmpty = __dependency2__["default"];
-
-    /**
-      A value is blank if it is empty or a whitespace string.
-
-      ```javascript
-      Ember.isBlank();                // true
-      Ember.isBlank(null);            // true
-      Ember.isBlank(undefined);       // true
-      Ember.isBlank('');              // true
-      Ember.isBlank([]);              // true
-      Ember.isBlank('\n\t');          // true
-      Ember.isBlank('  ');            // true
-      Ember.isBlank({});              // false
-      Ember.isBlank('\n\t Hello');    // false
-      Ember.isBlank('Hello world');   // false
-      Ember.isBlank([1,2,3]);         // false
-      ```
-
-      @method isBlank
-      @for Ember
-      @param {Object} obj Value to test
-      @return {Boolean}
-      */
-    function isBlank(obj) {
-      return isEmpty(obj) || (typeof obj === 'string' && obj.match(/\S/) === null);
-    };
-
-    __exports__["default"] = isBlank;
-  });
-define("ember-metal/is_empty", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/is_none","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // deprecateFunc
-    var get = __dependency2__.get;
-    var isNone = __dependency3__["default"];
-
-    /**
-      Verifies that a value is `null` or an empty string, empty array,
-      or empty function.
-
-      Constrains the rules on `Ember.isNone` by returning false for empty
-      string and empty arrays.
-
-      ```javascript
-      Ember.isEmpty();                // true
-      Ember.isEmpty(null);            // true
-      Ember.isEmpty(undefined);       // true
-      Ember.isEmpty('');              // true
-      Ember.isEmpty([]);              // true
-      Ember.isEmpty('Adam Hawkins');  // false
-      Ember.isEmpty([0,1,2]);         // false
-      ```
-
-      @method isEmpty
-      @for Ember
-      @param {Object} obj Value to test
-      @return {Boolean}
-    */
-    var isEmpty = function(obj) {
-      return isNone(obj) || (obj.length === 0 && typeof obj !== 'function') || (typeof obj === 'object' && get(obj, 'length') === 0);
-    };
-    var empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.", isEmpty);
-
-    __exports__["default"] = isEmpty;
-    __exports__.isEmpty = isEmpty;
-    __exports__.empty = empty;
-  });
-define("ember-metal/is_none", 
-  ["ember-metal/core","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // deprecateFunc
-
-    /**
-      Returns true if the passed value is null or undefined. This avoids errors
-      from JSLint complaining about use of ==, which can be technically
-      confusing.
-
-      ```javascript
-      Ember.isNone();              // true
-      Ember.isNone(null);          // true
-      Ember.isNone(undefined);     // true
-      Ember.isNone('');            // false
-      Ember.isNone([]);            // false
-      Ember.isNone(function() {});  // false
-      ```
-
-      @method isNone
-      @for Ember
-      @param {Object} obj Value to test
-      @return {Boolean}
-    */
-    var isNone = function(obj) {
-      return obj === null || obj === undefined;
-    };
-    var none = Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.", isNone);
-
-    __exports__["default"] = isNone;
-    __exports__.isNone = isNone;
-    __exports__.none = none;
-  });
-define("ember-metal/libraries", 
-  ["ember-metal/enumerable_utils","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    // Provides a way to register library versions with ember.
-    var EnumerableUtils = __dependency1__["default"];
-
-    var forEach = EnumerableUtils.forEach,
-        indexOf = EnumerableUtils.indexOf;
-
-    var libraries = function() {
-      var _libraries   = [];
-      var coreLibIndex = 0;
-
-      var getLibrary = function(name) {
-        for (var i = 0; i < _libraries.length; i++) {
-          if (_libraries[i].name === name) {
-            return _libraries[i];
-          }
-        }
-      };
-
-      _libraries.register = function(name, version) {
-        if (!getLibrary(name)) {
-          _libraries.push({name: name, version: version});
-        }
-      };
-
-      _libraries.registerCoreLibrary = function(name, version) {
-        if (!getLibrary(name)) {
-          _libraries.splice(coreLibIndex++, 0, {name: name, version: version});
-        }
-      };
-
-      _libraries.deRegister = function(name) {
-        var lib = getLibrary(name);
-        if (lib) _libraries.splice(indexOf(_libraries, lib), 1);
-      };
-
-      _libraries.each = function (callback) {
-        forEach(_libraries, function(lib) {
-          callback(lib.name, lib.version);
-        });
-      };
-
-      return _libraries;
-    }();
-
-    __exports__["default"] = libraries;
-  });
-define("ember-metal/logger", 
-  ["ember-metal/core","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var EmberError = __dependency2__["default"];
-
-    function consoleMethod(name) {
-      var consoleObj, logToConsole;
-      if (Ember.imports.console) {
-        consoleObj = Ember.imports.console;
-      } else if (typeof console !== 'undefined') {
-        consoleObj = console;
-      }
-
-      var method = typeof consoleObj === 'object' ? consoleObj[name] : null;
-
-      if (method) {
-        // Older IE doesn't support apply, but Chrome needs it
-        if (typeof method.apply === 'function') {
-          logToConsole = function() {
-            method.apply(consoleObj, arguments);
-          };
-          logToConsole.displayName = 'console.' + name;
-          return logToConsole;
-        } else {
-          return function() {
-            var message = Array.prototype.join.call(arguments, ', ');
-            method(message);
-          };
-        }
-      }
-    }
-
-    function assertPolyfill(test, message) {
-      if (!test) {
-        try {
-          // attempt to preserve the stack
-          throw new EmberError("assertion failed: " + message);
-        } catch(error) {
-          setTimeout(function() {
-            throw error;
-          }, 0);
-        }
-      }
-    }
-
-    /**
-      Inside Ember-Metal, simply uses the methods from `imports.console`.
-      Override this to provide more robust logging functionality.
-
-      @class Logger
-      @namespace Ember
-    */
-    var Logger = {
-      /**
-       Logs the arguments to the console.
-       You can pass as many arguments as you want and they will be joined together with a space.
-
-        ```javascript
-        var foo = 1;
-        Ember.Logger.log('log value of foo:', foo);
-        // "log value of foo: 1" will be printed to the console
-        ```
-
-       @method log
-       @for Ember.Logger
-       @param {*} arguments
-      */
-      log:   consoleMethod('log')   || Ember.K,
-
-      /**
-       Prints the arguments to the console with a warning icon.
-       You can pass as many arguments as you want and they will be joined together with a space.
-
-        ```javascript
-        Ember.Logger.warn('Something happened!');
-        // "Something happened!" will be printed to the console with a warning icon.
-        ```
-
-       @method warn
-       @for Ember.Logger
-       @param {*} arguments
-      */
-      warn:  consoleMethod('warn')  || Ember.K,
-
-      /**
-       Prints the arguments to the console with an error icon, red text and a stack trace.
-       You can pass as many arguments as you want and they will be joined together with a space.
-
-        ```javascript
-        Ember.Logger.error('Danger! Danger!');
-        // "Danger! Danger!" will be printed to the console in red text.
-        ```
-
-       @method error
-       @for Ember.Logger
-       @param {*} arguments
-      */
-      error: consoleMethod('error') || Ember.K,
-
-      /**
-       Logs the arguments to the console.
-       You can pass as many arguments as you want and they will be joined together with a space.
-
-        ```javascript
-        var foo = 1;
-        Ember.Logger.info('log value of foo:', foo);
-        // "log value of foo: 1" will be printed to the console
-        ```
-
-       @method info
-       @for Ember.Logger
-       @param {*} arguments
-      */
-      info:  consoleMethod('info')  || Ember.K,
-
-      /**
-       Logs the arguments to the console in blue text.
-       You can pass as many arguments as you want and they will be joined together with a space.
-
-        ```javascript
-        var foo = 1;
-        Ember.Logger.debug('log value of foo:', foo);
-        // "log value of foo: 1" will be printed to the console
-        ```
-
-       @method debug
-       @for Ember.Logger
-       @param {*} arguments
-      */
-      debug: consoleMethod('debug') || consoleMethod('info') || Ember.K,
-
-      /**
-       If the value passed into `Ember.Logger.assert` is not truthy it will throw an error with a stack trace.
-
-        ```javascript
-        Ember.Logger.assert(true); // undefined
-        Ember.Logger.assert(true === false); // Throws an Assertion failed error.
-        ```
-
-       @method assert
-       @for Ember.Logger
-       @param {Boolean} bool Value to test
-      */
-      assert: consoleMethod('assert') || assertPolyfill
-    };
-
-    __exports__["default"] = Logger;
-  });
-define("ember-metal", 
-  ["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __exports__) {
-    "use strict";
-    /**
-    Ember Metal
-
-    @module ember
-    @submodule ember-metal
-    */
-
-    // BEGIN EXPORTS
-    var EmberInstrumentation = Ember.Instrumentation = {};
-    EmberInstrumentation.instrument = __dependency3__.instrument;
-    EmberInstrumentation.subscribe = __dependency3__.subscribe;
-    EmberInstrumentation.unsubscribe = __dependency3__.unsubscribe;
-    EmberInstrumentation.reset  = __dependency3__.reset;
-
-    Ember.instrument = __dependency3__.instrument;
-    Ember.subscribe = __dependency3__.subscribe;
-
-    Ember.generateGuid    = __dependency4__.generateGuid;
-    Ember.GUID_KEY        = __dependency4__.GUID_KEY;
-    Ember.GUID_PREFIX     = __dependency4__.GUID_PREFIX;
-    Ember.create          = __dependency7__.create;
-    Ember.platform        = __dependency7__.platform;
-
-    var EmberArrayPolyfills = Ember.ArrayPolyfills = {};
-
-    EmberArrayPolyfills.map = __dependency8__.map;
-    EmberArrayPolyfills.forEach = __dependency8__.forEach;
-    EmberArrayPolyfills.filter = __dependency8__.filter;
-    EmberArrayPolyfills.indexOf = __dependency8__.indexOf;
-
-    Ember.Error           = __dependency5__["default"];
-    Ember.guidFor         = __dependency4__.guidFor;
-    Ember.META_DESC       = __dependency4__.META_DESC;
-    Ember.EMPTY_META      = __dependency4__.EMPTY_META;
-    Ember.meta            = __dependency4__.meta;
-    Ember.getMeta         = __dependency4__.getMeta;
-    Ember.setMeta         = __dependency4__.setMeta;
-    Ember.metaPath        = __dependency4__.metaPath;
-    Ember.inspect         = __dependency4__.inspect;
-    Ember.typeOf          = __dependency4__.typeOf;
-    Ember.tryCatchFinally = __dependency4__.tryCatchFinally;
-    Ember.isArray         = __dependency4__.isArray;
-    Ember.makeArray       = __dependency4__.makeArray;
-    Ember.canInvoke       = __dependency4__.canInvoke;
-    Ember.tryInvoke       = __dependency4__.tryInvoke;
-    Ember.tryFinally      = __dependency4__.tryFinally;
-    Ember.wrap            = __dependency4__.wrap;
-    Ember.apply           = __dependency4__.apply;
-    Ember.applyStr        = __dependency4__.applyStr;
-
-    Ember.Logger = __dependency9__["default"];
-
-    Ember.get            = __dependency10__.get;
-    Ember.getWithDefault = __dependency10__.getWithDefault;
-    Ember.normalizeTuple = __dependency10__.normalizeTuple;
-    Ember._getPath       = __dependency10__._getPath;
-
-    Ember.EnumerableUtils = __dependency6__["default"];
-
-    Ember.on                = __dependency11__.on;
-    Ember.addListener       = __dependency11__.addListener;
-    Ember.removeListener    = __dependency11__.removeListener;
-    Ember._suspendListener  = __dependency11__.suspendListener;
-    Ember._suspendListeners = __dependency11__.suspendListeners;
-    Ember.sendEvent         = __dependency11__.sendEvent;
-    Ember.hasListeners      = __dependency11__.hasListeners;
-    Ember.watchedEvents     = __dependency11__.watchedEvents;
-    Ember.listenersFor      = __dependency11__.listenersFor;
-    Ember.listenersDiff     = __dependency11__.listenersDiff;
-    Ember.listenersUnion    = __dependency11__.listenersUnion;
-
-    Ember._ObserverSet = __dependency12__["default"];
-
-    Ember.propertyWillChange = __dependency13__.propertyWillChange;
-    Ember.propertyDidChange = __dependency13__.propertyDidChange;
-    Ember.overrideChains = __dependency13__.overrideChains;
-    Ember.beginPropertyChanges = __dependency13__.beginPropertyChanges;
-    Ember.endPropertyChanges = __dependency13__.endPropertyChanges;
-    Ember.changeProperties = __dependency13__.changeProperties;
-
-    Ember.Descriptor     = __dependency14__.Descriptor;
-    Ember.defineProperty = __dependency14__.defineProperty;
-
-    Ember.set    = __dependency15__.set;
-    Ember.trySet = __dependency15__.trySet;
-
-    Ember.OrderedSet = __dependency16__.OrderedSet;
-    Ember.Map = __dependency16__.Map;
-    Ember.MapWithDefault = __dependency16__.MapWithDefault;
-
-    Ember.getProperties = __dependency17__["default"];
-    Ember.setProperties = __dependency18__["default"];
-
-    Ember.watchKey   = __dependency19__.watchKey;
-    Ember.unwatchKey = __dependency19__.unwatchKey;
-
-    Ember.flushPendingChains = __dependency20__.flushPendingChains;
-    Ember.removeChainWatcher = __dependency20__.removeChainWatcher;
-    Ember._ChainNode = __dependency20__.ChainNode;
-    Ember.finishChains = __dependency20__.finishChains;
-
-    Ember.watchPath = __dependency21__.watchPath;
-    Ember.unwatchPath = __dependency21__.unwatchPath;
-
-    Ember.watch = __dependency22__.watch;
-    Ember.isWatching = __dependency22__.isWatching;
-    Ember.unwatch = __dependency22__.unwatch;
-    Ember.rewatch = __dependency22__.rewatch;
-    Ember.destroy = __dependency22__.destroy;
-
-    Ember.expandProperties = __dependency23__["default"];
-
-    Ember.ComputedProperty = __dependency24__.ComputedProperty;
-    Ember.computed = __dependency24__.computed;
-    Ember.cacheFor = __dependency24__.cacheFor;
-
-    Ember.addObserver = __dependency25__.addObserver;
-    Ember.observersFor = __dependency25__.observersFor;
-    Ember.removeObserver = __dependency25__.removeObserver;
-    Ember.addBeforeObserver = __dependency25__.addBeforeObserver;
-    Ember._suspendBeforeObserver = __dependency25__._suspendBeforeObserver;
-    Ember._suspendBeforeObservers = __dependency25__._suspendBeforeObservers;
-    Ember._suspendObserver = __dependency25__._suspendObserver;
-    Ember._suspendObservers = __dependency25__._suspendObservers;
-    Ember.beforeObserversFor = __dependency25__.beforeObserversFor;
-    Ember.removeBeforeObserver = __dependency25__.removeBeforeObserver;
-
-    Ember.IS_BINDING = __dependency26__.IS_BINDING;
-    Ember.required = __dependency26__.required;
-    Ember.aliasMethod = __dependency26__.aliasMethod;
-    Ember.observer = __dependency26__.observer;
-    Ember.immediateObserver = __dependency26__.immediateObserver;
-    Ember.beforeObserver = __dependency26__.beforeObserver;
-    Ember.mixin = __dependency26__.mixin;
-    Ember.Mixin = __dependency26__.Mixin;
-
-    Ember.oneWay = __dependency27__.oneWay;
-    Ember.bind = __dependency27__.bind;
-    Ember.Binding = __dependency27__.Binding;
-    Ember.isGlobalPath = __dependency27__.isGlobalPath;
-
-    Ember.run = __dependency28__["default"];
-
-    Ember.libraries = __dependency29__["default"];
-    Ember.libraries.registerCoreLibrary('Ember', Ember.VERSION);
-
-    Ember.isNone = __dependency30__.isNone;
-    Ember.none = __dependency30__.none;
-
-    Ember.isEmpty = __dependency31__.isEmpty;
-    Ember.empty = __dependency31__.empty;
-
-    Ember.isBlank = __dependency32__["default"];
-
-    Ember.merge = __dependency2__["default"];
-
-    /**
-      A function may be assigned to `Ember.onerror` to be called when Ember
-      internals encounter an error. This is useful for specialized error handling
-      and reporting code.
-
-      ```javascript
-      Ember.onerror = function(error) {
-        Em.$.ajax('/report-error', 'POST', {
-          stack: error.stack,
-          otherInformation: 'whatever app state you want to provide'
-        });
-      };
-      ```
-
-      @event onerror
-      @for Ember
-      @param {Exception} error the error object
-    */
-    Ember.onerror = null;
-    // END EXPORTS
-
-    // do this for side-effects of updating Ember.assert, warn, etc when
-    // ember-debug is present
-    if (Ember.__loader.registry['ember-debug']) {
-      requireModule('ember-debug');
-    }
-
-    __exports__["default"] = Ember;
-  });
-define("ember-metal/map", 
-  ["ember-metal/property_set","ember-metal/utils","ember-metal/array","ember-metal/platform","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember-metal
-    */
-
-    /*
-      JavaScript (before ES6) does not have a Map implementation. Objects,
-      which are often used as dictionaries, may only have Strings as keys.
-
-      Because Ember has a way to get a unique identifier for every object
-      via `Ember.guidFor`, we can implement a performant Map with arbitrary
-      keys. Because it is commonly used in low-level bookkeeping, Map is
-      implemented as a pure JavaScript object for performance.
-
-      This implementation follows the current iteration of the ES6 proposal for
-      maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
-      with two exceptions. First, because we need our implementation to be pleasant
-      on older browsers, we do not use the `delete` name (using `remove` instead).
-      Second, as we do not have the luxury of in-VM iteration, we implement a
-      forEach method for iteration.
-
-      Map is mocked out to look like an Ember object, so you can do
-      `Ember.Map.create()` for symmetry with other Ember classes.
-    */
-
-    var set = __dependency1__.set;
-    var guidFor = __dependency2__.guidFor;
-    var indexOf = __dependency3__.indexOf;var create = __dependency4__.create;
-
-    var copy = function(obj) {
-      var output = {};
-
-      for (var prop in obj) {
-        if (obj.hasOwnProperty(prop)) { output[prop] = obj[prop]; }
-      }
-
-      return output;
-    };
-
-    var copyMap = function(original, newObject) {
-      var keys = original.keys.copy(),
-          values = copy(original.values);
-
-      newObject.keys = keys;
-      newObject.values = values;
-      newObject.length = original.length;
-
-      return newObject;
-    };
-
-    /**
-      This class is used internally by Ember and Ember Data.
-      Please do not use it at this time. We plan to clean it up
-      and add many tests soon.
-
-      @class OrderedSet
-      @namespace Ember
-      @constructor
-      @private
-    */
-    function OrderedSet() {
-      this.clear();
-    };
-
-    /**
-      @method create
-      @static
-      @return {Ember.OrderedSet}
-    */
-    OrderedSet.create = function() {
-      return new OrderedSet();
-    };
-
-
-    OrderedSet.prototype = {
-      /**
-        @method clear
-      */
-      clear: function() {
-        this.presenceSet = {};
-        this.list = [];
-      },
-
-      /**
-        @method add
-        @param obj
-      */
-      add: function(obj) {
-        var guid = guidFor(obj),
-            presenceSet = this.presenceSet,
-            list = this.list;
-
-        if (guid in presenceSet) { return; }
-
-        presenceSet[guid] = true;
-        list.push(obj);
-      },
-
-      /**
-        @method remove
-        @param obj
-      */
-      remove: function(obj) {
-        var guid = guidFor(obj),
-            presenceSet = this.presenceSet,
-            list = this.list;
-
-        delete presenceSet[guid];
-
-        var index = indexOf.call(list, obj);
-        if (index > -1) {
-          list.splice(index, 1);
-        }
-      },
-
-      /**
-        @method isEmpty
-        @return {Boolean}
-      */
-      isEmpty: function() {
-        return this.list.length === 0;
-      },
-
-      /**
-        @method has
-        @param obj
-        @return {Boolean}
-      */
-      has: function(obj) {
-        var guid = guidFor(obj),
-            presenceSet = this.presenceSet;
-
-        return guid in presenceSet;
-      },
-
-      /**
-        @method forEach
-        @param {Function} fn
-        @param self
-      */
-      forEach: function(fn, self) {
-        // allow mutation during iteration
-        var list = this.toArray();
-
-        for (var i = 0, j = list.length; i < j; i++) {
-          fn.call(self, list[i]);
-        }
-      },
-
-      /**
-        @method toArray
-        @return {Array}
-      */
-      toArray: function() {
-        return this.list.slice();
-      },
-
-      /**
-        @method copy
-        @return {Ember.OrderedSet}
-      */
-      copy: function() {
-        var set = new OrderedSet();
-
-        set.presenceSet = copy(this.presenceSet);
-        set.list = this.toArray();
-
-        return set;
-      }
-    };
-
-    /**
-      A Map stores values indexed by keys. Unlike JavaScript's
-      default Objects, the keys of a Map can be any JavaScript
-      object.
-
-      Internally, a Map has two data structures:
-
-      1. `keys`: an OrderedSet of all of the existing keys
-      2. `values`: a JavaScript Object indexed by the `Ember.guidFor(key)`
-
-      When a key/value pair is added for the first time, we
-      add the key to the `keys` OrderedSet, and create or
-      replace an entry in `values`. When an entry is deleted,
-      we delete its entry in `keys` and `values`.
-
-      @class Map
-      @namespace Ember
-      @private
-      @constructor
-    */
-    var Map = Ember.Map = function() {
-      this.keys = OrderedSet.create();
-      this.values = {};
-    };
-
-    /**
-      @method create
-      @static
-    */
-    Map.create = function() {
-      return new Map();
-    };
-
-    Map.prototype = {
-      /**
-        This property will change as the number of objects in the map changes.
-       
-        @property length
-        @type number
-        @default 0
-      */
-      length: 0,
-        
-        
-      /**
-        Retrieve the value associated with a given key.
-
-        @method get
-        @param {*} key
-        @return {*} the value associated with the key, or `undefined`
-      */
-      get: function(key) {
-        var values = this.values,
-            guid = guidFor(key);
-
-        return values[guid];
-      },
-
-      /**
-        Adds a value to the map. If a value for the given key has already been
-        provided, the new value will replace the old value.
-
-        @method set
-        @param {*} key
-        @param {*} value
-      */
-      set: function(key, value) {
-        var keys = this.keys,
-            values = this.values,
-            guid = guidFor(key);
-
-        keys.add(key);
-        values[guid] = value;
-        set(this, 'length', keys.list.length);
-      },
-
-      /**
-        Removes a value from the map for an associated key.
-
-        @method remove
-        @param {*} key
-        @return {Boolean} true if an item was removed, false otherwise
-      */
-      remove: function(key) {
-        // don't use ES6 "delete" because it will be annoying
-        // to use in browsers that are not ES6 friendly;
-        var keys = this.keys,
-            values = this.values,
-            guid = guidFor(key);
-
-        if (values.hasOwnProperty(guid)) {
-          keys.remove(key);
-          delete values[guid];
-          set(this, 'length', keys.list.length);
-          return true;
-        } else {
-          return false;
-        }
-      },
-
-      /**
-        Check whether a key is present.
-
-        @method has
-        @param {*} key
-        @return {Boolean} true if the item was present, false otherwise
-      */
-      has: function(key) {
-        var values = this.values,
-            guid = guidFor(key);
-
-        return values.hasOwnProperty(guid);
-      },
-
-      /**
-        Iterate over all the keys and values. Calls the function once
-        for each key, passing in the key and value, in that order.
-
-        The keys are guaranteed to be iterated over in insertion order.
-
-        @method forEach
-        @param {Function} callback
-        @param {*} self if passed, the `this` value inside the
-          callback. By default, `this` is the map.
-      */
-      forEach: function(callback, self) {
-        var keys = this.keys,
-            values = this.values;
-
-        keys.forEach(function(key) {
-          var guid = guidFor(key);
-          callback.call(self, key, values[guid]);
-        });
-      },
-
-      /**
-        @method copy
-        @return {Ember.Map}
-      */
-      copy: function() {
-        return copyMap(this, new Map());
-      }
-    };
-
-    /**
-      @class MapWithDefault
-      @namespace Ember
-      @extends Ember.Map
-      @private
-      @constructor
-      @param [options]
-        @param {*} [options.defaultValue]
-    */
-    function MapWithDefault(options) {
-      Map.call(this);
-      this.defaultValue = options.defaultValue;
-    };
-
-    /**
-      @method create
-      @static
-      @param [options]
-        @param {*} [options.defaultValue]
-      @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
-        `Ember.MapWithDefault` otherwise returns `Ember.Map`
-    */
-    MapWithDefault.create = function(options) {
-      if (options) {
-        return new MapWithDefault(options);
-      } else {
-        return new Map();
-      }
-    };
-
-    MapWithDefault.prototype = create(Map.prototype);
-
-    /**
-      Retrieve the value associated with a given key.
-
-      @method get
-      @param {*} key
-      @return {*} the value associated with the key, or the default value
-    */
-    MapWithDefault.prototype.get = function(key) {
-      var hasValue = this.has(key);
-
-      if (hasValue) {
-        return Map.prototype.get.call(this, key);
-      } else {
-        var defaultValue = this.defaultValue(key);
-        this.set(key, defaultValue);
-        return defaultValue;
-      }
-    };
-
-    /**
-      @method copy
-      @return {Ember.MapWithDefault}
-    */
-    MapWithDefault.prototype.copy = function() {
-      return copyMap(this, new MapWithDefault({
-        defaultValue: this.defaultValue
-      }));
-    };
-
-    __exports__.OrderedSet = OrderedSet;
-    __exports__.Map = Map;
-    __exports__.MapWithDefault = MapWithDefault;
-  });
-define("ember-metal/merge", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-      Merge the contents of two objects together into the first object.
-
-      ```javascript
-      Ember.merge({first: 'Tom'}, {last: 'Dale'}); // {first: 'Tom', last: 'Dale'}
-      var a = {first: 'Yehuda'}, b = {last: 'Katz'};
-      Ember.merge(a, b); // a == {first: 'Yehuda', last: 'Katz'}, b == {last: 'Katz'}
-      ```
-
-      @method merge
-      @for Ember
-      @param {Object} original The object to merge into
-      @param {Object} updates The object to copy properties from
-      @return {Object}
-    */
-    function merge(original, updates) {
-      for (var prop in updates) {
-        if (!updates.hasOwnProperty(prop)) { continue; }
-        original[prop] = updates[prop];
-      }
-      return original;
-    };
-
-    __exports__["default"] = merge;
-  });
-define("ember-metal/mixin", 
-  ["ember-metal/core","ember-metal/merge","ember-metal/array","ember-metal/platform","ember-metal/utils","ember-metal/expand_properties","ember-metal/properties","ember-metal/computed","ember-metal/binding","ember-metal/observer","ember-metal/events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-metal
-    */
-
-    var Ember = __dependency1__["default"];
-    // warn, assert, wrap, et;
-    var merge = __dependency2__["default"];
-    var map = __dependency3__.map;
-    var indexOf = __dependency3__.indexOf;
-    var forEach = __dependency3__.forEach;
-    var create = __dependency4__.create;
-    var guidFor = __dependency5__.guidFor;
-    var meta = __dependency5__.meta;
-    var META_KEY = __dependency5__.META_KEY;
-    var wrap = __dependency5__.wrap;
-    var makeArray = __dependency5__.makeArray;
-    var apply = __dependency5__.apply;
-    var expandProperties = __dependency6__["default"];
-    var Descriptor = __dependency7__.Descriptor;
-    var defineProperty = __dependency7__.defineProperty;
-    var ComputedProperty = __dependency8__.ComputedProperty;
-    var Binding = __dependency9__.Binding;
-    var addObserver = __dependency10__.addObserver;
-    var removeObserver = __dependency10__.removeObserver;
-    var addBeforeObserver = __dependency10__.addBeforeObserver;
-    var removeBeforeObserver = __dependency10__.removeBeforeObserver;
-    var addListener = __dependency11__.addListener;
-    var removeListener = __dependency11__.removeListener;
-
-    var REQUIRED, Alias,
-        a_map = map,
-        a_indexOf = indexOf,
-        a_forEach = forEach,
-        a_slice = [].slice,
-        o_create = create,
-        defineProperty = defineProperty,
-        metaFor = meta;
-
-    function superFunction(){
-      var ret, func = this.__nextSuper;
-      if (func) {
-        this.__nextSuper = null;
-        ret = apply(this, func, arguments);
-        this.__nextSuper = func;
-      }
-      return ret;
-    }
-
-    function mixinsMeta(obj) {
-      var m = metaFor(obj, true), ret = m.mixins;
-      if (!ret) {
-        ret = m.mixins = {};
-      } else if (!m.hasOwnProperty('mixins')) {
-        ret = m.mixins = o_create(ret);
-      }
-      return ret;
-    }
-
-    function initMixin(mixin, args) {
-      if (args && args.length > 0) {
-        mixin.mixins = a_map.call(args, function(x) {
-          if (x instanceof Mixin) { return x; }
-
-          // Note: Manually setup a primitive mixin here. This is the only
-          // way to actually get a primitive mixin. This way normal creation
-          // of mixins will give you combined mixins...
-          var mixin = new Mixin();
-          mixin.properties = x;
-          return mixin;
-        });
-      }
-      return mixin;
-    }
-
-    function isMethod(obj) {
-      return 'function' === typeof obj &&
-             obj.isMethod !== false &&
-             obj !== Boolean && obj !== Object && obj !== Number && obj !== Array && obj !== Date && obj !== String;
-    }
-
-    var CONTINUE = {};
-
-    function mixinProperties(mixinsMeta, mixin) {
-      var guid;
-
-      if (mixin instanceof Mixin) {
-        guid = guidFor(mixin);
-        if (mixinsMeta[guid]) { return CONTINUE; }
-        mixinsMeta[guid] = mixin;
-        return mixin.properties;
-      } else {
-        return mixin; // apply anonymous mixin properties
-      }
-    }
-
-    function concatenatedMixinProperties(concatProp, props, values, base) {
-      var concats;
-
-      // reset before adding each new mixin to pickup concats from previous
-      concats = values[concatProp] || base[concatProp];
-      if (props[concatProp]) {
-        concats = concats ? concats.concat(props[concatProp]) : props[concatProp];
-      }
-
-      return concats;
-    }
-
-    function giveDescriptorSuper(meta, key, property, values, descs) {
-      var superProperty;
-
-      // Computed properties override methods, and do not call super to them
-      if (values[key] === undefined) {
-        // Find the original descriptor in a parent mixin
-        superProperty = descs[key];
-      }
-
-      // If we didn't find the original descriptor in a parent mixin, find
-      // it on the original object.
-      superProperty = superProperty || meta.descs[key];
-
-      if (!superProperty || !(superProperty instanceof ComputedProperty)) {
-        return property;
-      }
-
-      // Since multiple mixins may inherit from the same parent, we need
-      // to clone the computed property so that other mixins do not receive
-      // the wrapped version.
-      property = o_create(property);
-      property.func = wrap(property.func, superProperty.func);
-
-      return property;
-    }
-
-    function giveMethodSuper(obj, key, method, values, descs) {
-      var superMethod;
-
-      // Methods overwrite computed properties, and do not call super to them.
-      if (descs[key] === undefined) {
-        // Find the original method in a parent mixin
-        superMethod = values[key];
-      }
-
-      // If we didn't find the original value in a parent mixin, find it in
-      // the original object
-      superMethod = superMethod || obj[key];
-
-      // Only wrap the new method if the original method was a function
-      if ('function' !== typeof superMethod) {
-        return method;
-      }
-
-      return wrap(method, superMethod);
-    }
-
-    function applyConcatenatedProperties(obj, key, value, values) {
-      var baseValue = values[key] || obj[key];
-
-      if (baseValue) {
-        if ('function' === typeof baseValue.concat) {
-          return baseValue.concat(value);
-        } else {
-          return makeArray(baseValue).concat(value);
-        }
-      } else {
-        return makeArray(value);
-      }
-    }
-
-    function applyMergedProperties(obj, key, value, values) {
-      var baseValue = values[key] || obj[key];
-
-      if (!baseValue) { return value; }
-
-      var newBase = merge({}, baseValue),
-          hasFunction = false;
-
-      for (var prop in value) {
-        if (!value.hasOwnProperty(prop)) { continue; }
-
-        var propValue = value[prop];
-        if (isMethod(propValue)) {
-          // TODO: support for Computed Properties, etc?
-          hasFunction = true;
-          newBase[prop] = giveMethodSuper(obj, prop, propValue, baseValue, {});
-        } else {
-          newBase[prop] = propValue;
-        }
-      }
-
-      if (hasFunction) {
-        newBase._super = superFunction;
-      }
-
-      return newBase;
-    }
-
-    function addNormalizedProperty(base, key, value, meta, descs, values, concats, mergings) {
-      if (value instanceof Descriptor) {
-        if (value === REQUIRED && descs[key]) { return CONTINUE; }
-
-        // Wrap descriptor function to implement
-        // __nextSuper() if needed
-        if (value.func) {
-          value = giveDescriptorSuper(meta, key, value, values, descs);
-        }
-
-        descs[key]  = value;
-        values[key] = undefined;
-      } else {
-        if ((concats && a_indexOf.call(concats, key) >= 0) ||
-                    key === 'concatenatedProperties' ||
-                    key === 'mergedProperties') {
-          value = applyConcatenatedProperties(base, key, value, values);
-        } else if ((mergings && a_indexOf.call(mergings, key) >= 0)) {
-          value = applyMergedProperties(base, key, value, values);
-        } else if (isMethod(value)) {
-          value = giveMethodSuper(base, key, value, values, descs);
-        }
-
-        descs[key] = undefined;
-        values[key] = value;
-      }
-    }
-
-    function mergeMixins(mixins, m, descs, values, base, keys) {
-      var mixin, props, key, concats, mergings, meta;
-
-      function removeKeys(keyName) {
-        delete descs[keyName];
-        delete values[keyName];
-      }
-
-      for(var i=0, l=mixins.length; i<l; i++) {
-        mixin = mixins[i];
-        Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
-                     typeof mixin === 'object' && mixin !== null && Object.prototype.toString.call(mixin) !== '[object Array]');
-
-        props = mixinProperties(m, mixin);
-        if (props === CONTINUE) { continue; }
-
-        if (props) {
-          meta = metaFor(base);
-          if (base.willMergeMixin) { base.willMergeMixin(props); }
-          concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);
-          mergings = concatenatedMixinProperties('mergedProperties', props, values, base);
-
-          for (key in props) {
-            if (!props.hasOwnProperty(key)) { continue; }
-            keys.push(key);
-            addNormalizedProperty(base, key, props[key], meta, descs, values, concats, mergings);
-          }
-
-          // manually copy toString() because some JS engines do not enumerate it
-          if (props.hasOwnProperty('toString')) { base.toString = props.toString; }
-        } else if (mixin.mixins) {
-          mergeMixins(mixin.mixins, m, descs, values, base, keys);
-          if (mixin._without) { a_forEach.call(mixin._without, removeKeys); }
-        }
-      }
-    }
-
-    var IS_BINDING = /^.+Binding$/;
-
-    function detectBinding(obj, key, value, m) {
-      if (IS_BINDING.test(key)) {
-        var bindings = m.bindings;
-        if (!bindings) {
-          bindings = m.bindings = {};
-        } else if (!m.hasOwnProperty('bindings')) {
-          bindings = m.bindings = o_create(m.bindings);
-        }
-        bindings[key] = value;
-      }
-    }
-
-    function connectBindings(obj, m) {
-      // TODO Mixin.apply(instance) should disconnect binding if exists
-      var bindings = m.bindings, key, binding, to;
-      if (bindings) {
-        for (key in bindings) {
-          binding = bindings[key];
-          if (binding) {
-            to = key.slice(0, -7); // strip Binding off end
-            if (binding instanceof Binding) {
-              binding = binding.copy(); // copy prototypes' instance
-              binding.to(to);
-            } else { // binding is string path
-              binding = new Binding(to, binding);
-            }
-            binding.connect(obj);
-            obj[key] = binding;
-          }
-        }
-        // mark as applied
-        m.bindings = {};
-      }
-    }
-
-    function finishPartial(obj, m) {
-      connectBindings(obj, m || metaFor(obj));
-      return obj;
-    }
-
-    function followAlias(obj, desc, m, descs, values) {
-      var altKey = desc.methodName, value;
-      if (descs[altKey] || values[altKey]) {
-        value = values[altKey];
-        desc  = descs[altKey];
-      } else if (m.descs[altKey]) {
-        desc  = m.descs[altKey];
-        value = undefined;
-      } else {
-        desc = undefined;
-        value = obj[altKey];
-      }
-
-      return { desc: desc, value: value };
-    }
-
-    function updateObserversAndListeners(obj, key, observerOrListener, pathsKey, updateMethod) {
-      var paths = observerOrListener[pathsKey];
-
-      if (paths) {
-        for (var i=0, l=paths.length; i<l; i++) {
-          updateMethod(obj, paths[i], null, key);
-        }
-      }
-    }
-
-    function replaceObserversAndListeners(obj, key, observerOrListener) {
-      var prev = obj[key];
-
-      if ('function' === typeof prev) {
-        updateObserversAndListeners(obj, key, prev, '__ember_observesBefore__', removeBeforeObserver);
-        updateObserversAndListeners(obj, key, prev, '__ember_observes__', removeObserver);
-        updateObserversAndListeners(obj, key, prev, '__ember_listens__', removeListener);
-      }
-
-      if ('function' === typeof observerOrListener) {
-        updateObserversAndListeners(obj, key, observerOrListener, '__ember_observesBefore__', addBeforeObserver);
-        updateObserversAndListeners(obj, key, observerOrListener, '__ember_observes__', addObserver);
-        updateObserversAndListeners(obj, key, observerOrListener, '__ember_listens__', addListener);
-      }
-    }
-
-    function applyMixin(obj, mixins, partial) {
-      var descs = {}, values = {}, m = metaFor(obj),
-          key, value, desc, keys = [];
-
-      obj._super = superFunction;
-
-      // Go through all mixins and hashes passed in, and:
-      //
-      // * Handle concatenated properties
-      // * Handle merged properties
-      // * Set up _super wrapping if necessary
-      // * Set up computed property descriptors
-      // * Copying `toString` in broken browsers
-      mergeMixins(mixins, mixinsMeta(obj), descs, values, obj, keys);
-
-      for(var i = 0, l = keys.length; i < l; i++) {
-        key = keys[i];
-        if (key === 'constructor' || !values.hasOwnProperty(key)) { continue; }
-
-        desc = descs[key];
-        value = values[key];
-
-        if (desc === REQUIRED) { continue; }
-
-        while (desc && desc instanceof Alias) {
-          var followed = followAlias(obj, desc, m, descs, values);
-          desc = followed.desc;
-          value = followed.value;
-        }
-
-        if (desc === undefined && value === undefined) { continue; }
-
-        replaceObserversAndListeners(obj, key, value);
-        detectBinding(obj, key, value, m);
-        defineProperty(obj, key, desc, value, m);
-      }
-
-      if (!partial) { // don't apply to prototype
-        finishPartial(obj, m);
-      }
-
-      return obj;
-    }
-
-    /**
-      @method mixin
-      @for Ember
-      @param obj
-      @param mixins*
-      @return obj
-    */
-    function mixin(obj) {
-      var args = a_slice.call(arguments, 1);
-      applyMixin(obj, args, false);
-      return obj;
-    };
-
-    /**
-      The `Ember.Mixin` class allows you to create mixins, whose properties can be
-      added to other classes. For instance,
-
-      ```javascript
-      App.Editable = Ember.Mixin.create({
-        edit: function() {
-          console.log('starting to edit');
-          this.set('isEditing', true);
-        },
-        isEditing: false
-      });
-
-      // Mix mixins into classes by passing them as the first arguments to
-      // .extend.
-      App.CommentView = Ember.View.extend(App.Editable, {
-        template: Ember.Handlebars.compile('{{#if view.isEditing}}...{{else}}...{{/if}}')
-      });
-
-      commentView = App.CommentView.create();
-      commentView.edit(); // outputs 'starting to edit'
-      ```
-
-      Note that Mixins are created with `Ember.Mixin.create`, not
-      `Ember.Mixin.extend`.
-
-      Note that mixins extend a constructor's prototype so arrays and object literals
-      defined as properties will be shared amongst objects that implement the mixin.
-      If you want to define a property in a mixin that is not shared, you can define
-      it either as a computed property or have it be created on initialization of the object.
-
-      ```javascript
-      //filters array will be shared amongst any object implementing mixin
-      App.Filterable = Ember.Mixin.create({
-        filters: Ember.A()
-      });
-
-      //filters will be a separate  array for every object implementing the mixin
-      App.Filterable = Ember.Mixin.create({
-        filters: Ember.computed(function(){return Ember.A();})
-      });
-
-      //filters will be created as a separate array during the object's initialization
-      App.Filterable = Ember.Mixin.create({
-        init: function() {
-          this._super();
-          this.set("filters", Ember.A());
-        }
-      });
-      ```
-
-      @class Mixin
-      @namespace Ember
-    */
-    function Mixin() { return initMixin(this, arguments); };
-
-    Mixin.prototype = {
-      properties: null,
-      mixins: null,
-      ownerConstructor: null
-    };
-
-    Mixin._apply = applyMixin;
-
-    Mixin.applyPartial = function(obj) {
-      var args = a_slice.call(arguments, 1);
-      return applyMixin(obj, args, true);
-    };
-
-    Mixin.finishPartial = finishPartial;
-
-    // ES6TODO: this relies on a global state?
-    Ember.anyUnprocessedMixins = false;
-
-    /**
-      @method create
-      @static
-      @param arguments*
-    */
-    Mixin.create = function() {
-      // ES6TODO: this relies on a global state?
-      Ember.anyUnprocessedMixins = true;
-      var M = this;
-      return initMixin(new M(), arguments);
-    };
-
-    var MixinPrototype = Mixin.prototype;
-
-    /**
-      @method reopen
-      @param arguments*
-    */
-    MixinPrototype.reopen = function() {
-      var mixin, tmp;
-
-      if (this.properties) {
-        mixin = Mixin.create();
-        mixin.properties = this.properties;
-        delete this.properties;
-        this.mixins = [mixin];
-      } else if (!this.mixins) {
-        this.mixins = [];
-      }
-
-      var len = arguments.length, mixins = this.mixins, idx;
-
-      for(idx=0; idx < len; idx++) {
-        mixin = arguments[idx];
-        Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
-                     typeof mixin === 'object' && mixin !== null && Object.prototype.toString.call(mixin) !== '[object Array]');
-
-        if (mixin instanceof Mixin) {
-          mixins.push(mixin);
-        } else {
-          tmp = Mixin.create();
-          tmp.properties = mixin;
-          mixins.push(tmp);
-        }
-      }
-
-      return this;
-    };
-
-    /**
-      @method apply
-      @param obj
-      @return applied object
-    */
-    MixinPrototype.apply = function(obj) {
-      return applyMixin(obj, [this], false);
-    };
-
-    MixinPrototype.applyPartial = function(obj) {
-      return applyMixin(obj, [this], true);
-    };
-
-    function _detect(curMixin, targetMixin, seen) {
-      var guid = guidFor(curMixin);
-
-      if (seen[guid]) { return false; }
-      seen[guid] = true;
-
-      if (curMixin === targetMixin) { return true; }
-      var mixins = curMixin.mixins, loc = mixins ? mixins.length : 0;
-      while (--loc >= 0) {
-        if (_detect(mixins[loc], targetMixin, seen)) { return true; }
-      }
-      return false;
-    }
-
-    /**
-      @method detect
-      @param obj
-      @return {Boolean}
-    */
-    MixinPrototype.detect = function(obj) {
-      if (!obj) { return false; }
-      if (obj instanceof Mixin) { return _detect(obj, this, {}); }
-      var m = obj[META_KEY],
-          mixins = m && m.mixins;
-      if (mixins) {
-        return !!mixins[guidFor(this)];
-      }
-      return false;
-    };
-
-    MixinPrototype.without = function() {
-      var ret = new Mixin(this);
-      ret._without = a_slice.call(arguments);
-      return ret;
-    };
-
-    function _keys(ret, mixin, seen) {
-      if (seen[guidFor(mixin)]) { return; }
-      seen[guidFor(mixin)] = true;
-
-      if (mixin.properties) {
-        var props = mixin.properties;
-        for (var key in props) {
-          if (props.hasOwnProperty(key)) { ret[key] = true; }
-        }
-      } else if (mixin.mixins) {
-        a_forEach.call(mixin.mixins, function(x) { _keys(ret, x, seen); });
-      }
-    }
-
-    MixinPrototype.keys = function() {
-      var keys = {}, seen = {}, ret = [];
-      _keys(keys, this, seen);
-      for(var key in keys) {
-        if (keys.hasOwnProperty(key)) { ret.push(key); }
-      }
-      return ret;
-    };
-
-    // returns the mixins currently applied to the specified object
-    // TODO: Make Ember.mixin
-    Mixin.mixins = function(obj) {
-      var m = obj[META_KEY],
-          mixins = m && m.mixins, ret = [];
-
-      if (!mixins) { return ret; }
-
-      for (var key in mixins) {
-        var mixin = mixins[key];
-
-        // skip primitive mixins since these are always anonymous
-        if (!mixin.properties) { ret.push(mixin); }
-      }
-
-      return ret;
-    };
-
-    REQUIRED = new Descriptor();
-    REQUIRED.toString = function() { return '(Required Property)'; };
-
-    /**
-      Denotes a required property for a mixin
-
-      @method required
-      @for Ember
-    */
-    function required() {
-      return REQUIRED;
-    };
-
-    Alias = function(methodName) {
-      this.methodName = methodName;
-    };
-    Alias.prototype = new Descriptor();
-
-    /**
-      Makes a method available via an additional name.
-
-      ```javascript
-      App.Person = Ember.Object.extend({
-        name: function() {
-          return 'Tomhuda Katzdale';
-        },
-        moniker: Ember.aliasMethod('name')
-      });
-
-      var goodGuy = App.Person.create()
-      ```
-
-      @method aliasMethod
-      @for Ember
-      @param {String} methodName name of the method to alias
-      @return {Ember.Descriptor}
-    */
-    function aliasMethod(methodName) {
-      return new Alias(methodName);
-    };
-
-    // ..........................................................
-    // OBSERVER HELPER
-    //
-
-    /**
-      Specify a method that observes property changes.
-
-      ```javascript
-      Ember.Object.extend({
-        valueObserver: Ember.observer('value', function() {
-          // Executes whenever the "value" property changes
-        })
-      });
-      ```
-
-      In the future this method may become asynchronous. If you want to ensure
-      synchronous behavior, use `immediateObserver`.
-
-      Also available as `Function.prototype.observes` if prototype extensions are
-      enabled.
-
-      @method observer
-      @for Ember
-      @param {String} propertyNames*
-      @param {Function} func
-      @return func
-    */
-    function observer() {
-      var func  = a_slice.call(arguments, -1)[0];
-      var paths;
-
-      var addWatchedProperty = function (path) { paths.push(path); };
-      var _paths = a_slice.call(arguments, 0, -1);
-
-      if (typeof func !== "function") {
-        // revert to old, soft-deprecated argument ordering
-
-        func  = arguments[0];
-        _paths = a_slice.call(arguments, 1);
-      }
-
-      paths = [];
-
-      for (var i=0; i<_paths.length; ++i) {
-        expandProperties(_paths[i], addWatchedProperty);
-      }
-
-      if (typeof func !== "function") {
-        throw new Ember.Error("Ember.observer called without a function");
-      }
-
-      func.__ember_observes__ = paths;
-      return func;
-    };
-
-    /**
-      Specify a method that observes property changes.
-
-      ```javascript
-      Ember.Object.extend({
-        valueObserver: Ember.immediateObserver('value', function() {
-          // Executes whenever the "value" property changes
-        })
-      });
-      ```
-
-      In the future, `Ember.observer` may become asynchronous. In this event,
-      `Ember.immediateObserver` will maintain the synchronous behavior.
-
-      Also available as `Function.prototype.observesImmediately` if prototype extensions are
-      enabled.
-
-      @method immediateObserver
-      @for Ember
-      @param {String} propertyNames*
-      @param {Function} func
-      @return func
-    */
-    function immediateObserver() {
-      for (var i=0, l=arguments.length; i<l; i++) {
-        var arg = arguments[i];
-        Ember.assert("Immediate observers must observe internal properties only, not properties on other objects.", typeof arg !== "string" || arg.indexOf('.') === -1);
-      }
-
-      return observer.apply(this, arguments);
-    };
-
-    /**
-      When observers fire, they are called with the arguments `obj`, `keyName`.
-
-      Note, `@each.property` observer is called per each add or replace of an element
-      and it's not called with a specific enumeration item.
-
-      A `beforeObserver` fires before a property changes.
-
-      A `beforeObserver` is an alternative form of `.observesBefore()`.
-
-      ```javascript
-      App.PersonView = Ember.View.extend({
-
-        friends: [{ name: 'Tom' }, { name: 'Stefan' }, { name: 'Kris' }],
-
-        valueWillChange: Ember.beforeObserver('content.value', function(obj, keyName) {
-          this.changingFrom = obj.get(keyName);
-        }),
-
-        valueDidChange: Ember.observer('content.value', function(obj, keyName) {
-            // only run if updating a value already in the DOM
-            if (this.get('state') === 'inDOM') {
-              var color = obj.get(keyName) > this.changingFrom ? 'green' : 'red';
-              // logic
-            }
-        }),
-
-        friendsDidChange: Ember.observer('friends.@each.name', function(obj, keyName) {
-          // some logic
-          // obj.get(keyName) returns friends array
-        })
-      });
-      ```
-
-      Also available as `Function.prototype.observesBefore` if prototype extensions are
-      enabled.
-
-      @method beforeObserver
-      @for Ember
-      @param {String} propertyNames*
-      @param {Function} func
-      @return func
-    */
-    function beforeObserver() {
-      var func  = a_slice.call(arguments, -1)[0];
-      var paths;
-
-      var addWatchedProperty = function(path) { paths.push(path); };
-
-      var _paths = a_slice.call(arguments, 0, -1);
-
-      if (typeof func !== "function") {
-        // revert to old, soft-deprecated argument ordering
-
-        func  = arguments[0];
-        _paths = a_slice.call(arguments, 1);
-      }
-
-      paths = [];
-
-      for (var i=0; i<_paths.length; ++i) {
-        expandProperties(_paths[i], addWatchedProperty);
-      }
-
-      if (typeof func !== "function") {
-        throw new Ember.Error("Ember.beforeObserver called without a function");
-      }
-
-      func.__ember_observesBefore__ = paths;
-      return func;
-    };
-
-    __exports__.IS_BINDING = IS_BINDING;
-    __exports__.mixin = mixin;
-    __exports__.Mixin = Mixin;
-    __exports__.required = required;
-    __exports__.aliasMethod = aliasMethod;
-    __exports__.observer = observer;
-    __exports__.immediateObserver = immediateObserver;
-    __exports__.beforeObserver = beforeObserver;
-  });
-define("ember-metal/observer", 
-  ["ember-metal/watching","ember-metal/array","ember-metal/events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var watch = __dependency1__.watch;
-    var unwatch = __dependency1__.unwatch;
-    var map = __dependency2__.map;
-    var listenersFor = __dependency3__.listenersFor;
-    var addListener = __dependency3__.addListener;
-    var removeListener = __dependency3__.removeListener;
-    var suspendListeners = __dependency3__.suspendListeners;
-    var suspendListener = __dependency3__.suspendListener;
-    /**
-    @module ember-metal
-    */
-
-    var AFTER_OBSERVERS = ':change',
-        BEFORE_OBSERVERS = ':before';
-
-    function changeEvent(keyName) {
-      return keyName+AFTER_OBSERVERS;
-    }
-
-    function beforeEvent(keyName) {
-      return keyName+BEFORE_OBSERVERS;
-    }
-
-    /**
-      @method addObserver
-      @for Ember
-      @param obj
-      @param {String} path
-      @param {Object|Function} targetOrMethod
-      @param {Function|String} [method]
-    */
-    function addObserver(obj, _path, target, method) {
-      addListener(obj, changeEvent(_path), target, method);
-      watch(obj, _path);
-
-      return this;
-    };
-
-    function observersFor(obj, path) {
-      return listenersFor(obj, changeEvent(path));
-    };
-
-    /**
-      @method removeObserver
-      @for Ember
-      @param obj
-      @param {String} path
-      @param {Object|Function} targetOrMethod
-      @param {Function|String} [method]
-    */
-    function removeObserver(obj, _path, target, method) {
-      unwatch(obj, _path);
-      removeListener(obj, changeEvent(_path), target, method);
-
-      return this;
-    };
-
-    /**
-      @method addBeforeObserver
-      @for Ember
-      @param obj
-      @param {String} path
-      @param {Object|Function} targetOrMethod
-      @param {Function|String} [method]
-    */
-    function addBeforeObserver(obj, _path, target, method) {
-      addListener(obj, beforeEvent(_path), target, method);
-      watch(obj, _path);
-
-      return this;
-    };
-
-    // Suspend observer during callback.
-    //
-    // This should only be used by the target of the observer
-    // while it is setting the observed path.
-    function _suspendBeforeObserver(obj, path, target, method, callback) {
-      return suspendListener(obj, beforeEvent(path), target, method, callback);
-    };
-
-    function _suspendObserver(obj, path, target, method, callback) {
-      return suspendListener(obj, changeEvent(path), target, method, callback);
-    };
-
-    function _suspendBeforeObservers(obj, paths, target, method, callback) {
-      var events = map.call(paths, beforeEvent);
-      return suspendListeners(obj, events, target, method, callback);
-    };
-
-    function _suspendObservers(obj, paths, target, method, callback) {
-      var events = map.call(paths, changeEvent);
-      return suspendListeners(obj, events, target, method, callback);
-    };
-
-    function beforeObserversFor(obj, path) {
-      return listenersFor(obj, beforeEvent(path));
-    };
-
-    /**
-      @method removeBeforeObserver
-      @for Ember
-      @param obj
-      @param {String} path
-      @param {Object|Function} targetOrMethod
-      @param {Function|String} [method]
-    */
-    function removeBeforeObserver(obj, _path, target, method) {
-      unwatch(obj, _path);
-      removeListener(obj, beforeEvent(_path), target, method);
-
-      return this;
-    };
-
-    __exports__.addObserver = addObserver;
-    __exports__.observersFor = observersFor;
-    __exports__.removeObserver = removeObserver;
-    __exports__.addBeforeObserver = addBeforeObserver;
-    __exports__._suspendBeforeObserver = _suspendBeforeObserver;
-    __exports__._suspendObserver = _suspendObserver;
-    __exports__._suspendBeforeObservers = _suspendBeforeObservers;
-    __exports__._suspendObservers = _suspendObservers;
-    __exports__.beforeObserversFor = beforeObserversFor;
-    __exports__.removeBeforeObserver = removeBeforeObserver;
-  });
-define("ember-metal/observer_set", 
-  ["ember-metal/utils","ember-metal/events","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var guidFor = __dependency1__.guidFor;
-    var sendEvent = __dependency2__.sendEvent;
-
-    /*
-      this.observerSet = {
-        [senderGuid]: { // variable name: `keySet`
-          [keyName]: listIndex
-        }
-      },
-      this.observers = [
-        {
-          sender: obj,
-          keyName: keyName,
-          eventName: eventName,
-          listeners: [
-            [target, method, flags]
-          ]
-        },
-        ...
-      ]
-    */
-    function ObserverSet() {
-      this.clear();
-    };
-
-    ObserverSet.prototype.add = function(sender, keyName, eventName) {
-      var observerSet = this.observerSet,
-          observers = this.observers,
-          senderGuid = guidFor(sender),
-          keySet = observerSet[senderGuid],
-          index;
-
-      if (!keySet) {
-        observerSet[senderGuid] = keySet = {};
-      }
-      index = keySet[keyName];
-      if (index === undefined) {
-        index = observers.push({
-          sender: sender,
-          keyName: keyName,
-          eventName: eventName,
-          listeners: []
-        }) - 1;
-        keySet[keyName] = index;
-      }
-      return observers[index].listeners;
-    };
-
-    ObserverSet.prototype.flush = function() {
-      var observers = this.observers, i, len, observer, sender;
-      this.clear();
-      for (i=0, len=observers.length; i < len; ++i) {
-        observer = observers[i];
-        sender = observer.sender;
-        if (sender.isDestroying || sender.isDestroyed) { continue; }
-        sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
-      }
-    };
-
-    ObserverSet.prototype.clear = function() {
-      this.observerSet = {};
-      this.observers = [];
-    };
-
-    __exports__["default"] = ObserverSet;
-  });
-define("ember-metal/platform", 
-  ["ember-metal/core","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    /*globals Node */
-
-    var Ember = __dependency1__["default"];
-
-    /**
-    @module ember-metal
-    */
-
-    /**
-      Platform specific methods and feature detectors needed by the framework.
-
-      @class platform
-      @namespace Ember
-      @static
-    */
-    // TODO remove this
-    var platform = {};
-
-    /**
-      Identical to `Object.create()`. Implements if not available natively.
-
-      @method create
-      @for Ember
-    */
-    var create = Object.create;
-
-    // IE8 has Object.create but it couldn't treat property descriptors.
-    if (create) {
-      if (create({a: 1}, {a: {value: 2}}).a !== 2) {
-        create = null;
-      }
-    }
-
-    // STUB_OBJECT_CREATE allows us to override other libraries that stub
-    // Object.create different than we would prefer
-    if (!create || Ember.ENV.STUB_OBJECT_CREATE) {
-      var K = function() {};
-
-      create = function(obj, props) {
-        K.prototype = obj;
-        obj = new K();
-        if (props) {
-          K.prototype = obj;
-          for (var prop in props) {
-            K.prototype[prop] = props[prop].value;
-          }
-          obj = new K();
-        }
-        K.prototype = null;
-
-        return obj;
-      };
-
-      create.isSimulated = true;
-    }
-
-    var defineProperty = Object.defineProperty;
-    var canRedefineProperties, canDefinePropertyOnDOM;
-
-    // Catch IE8 where Object.defineProperty exists but only works on DOM elements
-    if (defineProperty) {
-      try {
-        defineProperty({}, 'a',{get:function() {}});
-      } catch (e) {
-        defineProperty = null;
-      }
-    }
-
-    if (defineProperty) {
-      // Detects a bug in Android <3.2 where you cannot redefine a property using
-      // Object.defineProperty once accessors have already been set.
-      canRedefineProperties = (function() {
-        var obj = {};
-
-        defineProperty(obj, 'a', {
-          configurable: true,
-          enumerable: true,
-          get: function() { },
-          set: function() { }
-        });
-
-        defineProperty(obj, 'a', {
-          configurable: true,
-          enumerable: true,
-          writable: true,
-          value: true
-        });
-
-        return obj.a === true;
-      })();
-
-      // This is for Safari 5.0, which supports Object.defineProperty, but not
-      // on DOM nodes.
-      canDefinePropertyOnDOM = (function() {
-        try {
-          defineProperty(document.createElement('div'), 'definePropertyOnDOM', {});
-          return true;
-        } catch(e) { }
-
-        return false;
-      })();
-
-      if (!canRedefineProperties) {
-        defineProperty = null;
-      } else if (!canDefinePropertyOnDOM) {
-        defineProperty = function(obj, keyName, desc) {
-          var isNode;
-
-          if (typeof Node === "object") {
-            isNode = obj instanceof Node;
-          } else {
-            isNode = typeof obj === "object" && typeof obj.nodeType === "number" && typeof obj.nodeName === "string";
-          }
-
-          if (isNode) {
-            // TODO: Should we have a warning here?
-            return (obj[keyName] = desc.value);
-          } else {
-            return Object.defineProperty(obj, keyName, desc);
-          }
-        };
-      }
-    }
-
-    /**
-    @class platform
-    @namespace Ember
-    */
-
-    /**
-      Identical to `Object.defineProperty()`. Implements as much functionality
-      as possible if not available natively.
-
-      @method defineProperty
-      @param {Object} obj The object to modify
-      @param {String} keyName property name to modify
-      @param {Object} desc descriptor hash
-      @return {void}
-    */
-    platform.defineProperty = defineProperty;
-
-    /**
-      Set to true if the platform supports native getters and setters.
-
-      @property hasPropertyAccessors
-      @final
-    */
-    platform.hasPropertyAccessors = true;
-
-    if (!platform.defineProperty) {
-      platform.hasPropertyAccessors = false;
-
-      platform.defineProperty = function(obj, keyName, desc) {
-        if (!desc.get) { obj[keyName] = desc.value; }
-      };
-
-      platform.defineProperty.isSimulated = true;
-    }
-
-    if (Ember.ENV.MANDATORY_SETTER && !platform.hasPropertyAccessors) {
-      Ember.ENV.MANDATORY_SETTER = false;
-    }
-
-    __exports__.create = create;
-    __exports__.platform = platform;
-  });
-define("ember-metal/properties", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/platform","ember-metal/property_events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember-metal
-    */
-
-    var Ember = __dependency1__["default"];
-    var META_KEY = __dependency2__.META_KEY;
-    var meta = __dependency2__.meta;
-    var platform = __dependency3__.platform;
-    var overrideChains = __dependency4__.overrideChains;
-    var metaFor = meta,
-        objectDefineProperty = platform.defineProperty;
-
-    var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
-
-    // ..........................................................
-    // DESCRIPTOR
-    //
-
-    /**
-      Objects of this type can implement an interface to respond to requests to
-      get and set. The default implementation handles simple properties.
-
-      You generally won't need to create or subclass this directly.
-
-      @class Descriptor
-      @namespace Ember
-      @private
-      @constructor
-    */
-    function Descriptor() {};
-
-    // ..........................................................
-    // DEFINING PROPERTIES API
-    //
-
-    var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
-      Ember.assert("You must use Ember.set() to access this property (of " + this + ")", false);
-    };
-
-    var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
-      return function() {
-        var meta = this[META_KEY];
-        return meta && meta.values[name];
-      };
-    };
-
-    /**
-      NOTE: This is a low-level method used by other parts of the API. You almost
-      never want to call this method directly. Instead you should use
-      `Ember.mixin()` to define new properties.
-
-      Defines a property on an object. This method works much like the ES5
-      `Object.defineProperty()` method except that it can also accept computed
-      properties and other special descriptors.
-
-      Normally this method takes only three parameters. However if you pass an
-      instance of `Ember.Descriptor` as the third param then you can pass an
-      optional value as the fourth parameter. This is often more efficient than
-      creating new descriptor hashes for each property.
-
-      ## Examples
-
-      ```javascript
-      // ES5 compatible mode
-      Ember.defineProperty(contact, 'firstName', {
-        writable: true,
-        configurable: false,
-        enumerable: true,
-        value: 'Charles'
-      });
-
-      // define a simple property
-      Ember.defineProperty(contact, 'lastName', undefined, 'Jolley');
-
-      // define a computed property
-      Ember.defineProperty(contact, 'fullName', Ember.computed(function() {
-        return this.firstName+' '+this.lastName;
-      }).property('firstName', 'lastName'));
-      ```
-
-      @private
-      @method defineProperty
-      @for Ember
-      @param {Object} obj the object to define this property on. This may be a prototype.
-      @param {String} keyName the name of the property
-      @param {Ember.Descriptor} [desc] an instance of `Ember.Descriptor` (typically a
-        computed property) or an ES5 descriptor.
-        You must provide this or `data` but not both.
-      @param {*} [data] something other than a descriptor, that will
-        become the explicit value of this property.
-    */
-    function defineProperty(obj, keyName, desc, data, meta) {
-      var descs, existingDesc, watching, value;
-
-      if (!meta) meta = metaFor(obj);
-      descs = meta.descs;
-      existingDesc = meta.descs[keyName];
-      watching = meta.watching[keyName] > 0;
-
-      if (existingDesc instanceof Descriptor) {
-        existingDesc.teardown(obj, keyName);
-      }
-
-      if (desc instanceof Descriptor) {
-        value = desc;
-
-        descs[keyName] = desc;
-        if (MANDATORY_SETTER && watching) {
-          objectDefineProperty(obj, keyName, {
-            configurable: true,
-            enumerable: true,
-            writable: true,
-            value: undefined // make enumerable
-          });
-        } else {
-          obj[keyName] = undefined; // make enumerable
-        }
-      } else {
-        descs[keyName] = undefined; // shadow descriptor in proto
-        if (desc == null) {
-          value = data;
-
-          if (MANDATORY_SETTER && watching) {
-            meta.values[keyName] = data;
-            objectDefineProperty(obj, keyName, {
-              configurable: true,
-              enumerable: true,
-              set: MANDATORY_SETTER_FUNCTION,
-              get: DEFAULT_GETTER_FUNCTION(keyName)
-            });
-          } else {
-            obj[keyName] = data;
-          }
-        } else {
-          value = desc;
-
-          // compatibility with ES5
-          objectDefineProperty(obj, keyName, desc);
-        }
-      }
-
-      // if key is being watched, override chains that
-      // were initialized with the prototype
-      if (watching) { overrideChains(obj, keyName, meta); }
-
-      // The `value` passed to the `didDefineProperty` hook is
-      // either the descriptor or data, whichever was passed.
-      if (obj.didDefineProperty) { obj.didDefineProperty(obj, keyName, value); }
-
-      return this;
-    };
-
-    __exports__.Descriptor = Descriptor;
-    __exports__.defineProperty = defineProperty;
-  });
-define("ember-metal/property_events", 
-  ["ember-metal/utils","ember-metal/events","ember-metal/observer_set","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var META_KEY = __dependency1__.META_KEY;
-    var guidFor = __dependency1__.guidFor;
-    var tryFinally = __dependency1__.tryFinally;
-    var sendEvent = __dependency2__.sendEvent;
-    var listenersUnion = __dependency2__.listenersUnion;
-    var listenersDiff = __dependency2__.listenersDiff;
-    var ObserverSet = __dependency3__["default"];
-
-    var beforeObserverSet = new ObserverSet(),
-        observerSet = new ObserverSet(),
-        deferred = 0;
-
-    // ..........................................................
-    // PROPERTY CHANGES
-    //
-
-    /**
-      This function is called just before an object property is about to change.
-      It will notify any before observers and prepare caches among other things.
-
-      Normally you will not need to call this method directly but if for some
-      reason you can't directly watch a property you can invoke this method
-      manually along with `Ember.propertyDidChange()` which you should call just
-      after the property value changes.
-
-      @method propertyWillChange
-      @for Ember
-      @param {Object} obj The object with the property that will change
-      @param {String} keyName The property key (or path) that will change.
-      @return {void}
-    */
-    function propertyWillChange(obj, keyName) {
-      var m = obj[META_KEY],
-          watching = (m && m.watching[keyName] > 0) || keyName === 'length',
-          proto = m && m.proto,
-          desc = m && m.descs[keyName];
-
-      if (!watching) { return; }
-      if (proto === obj) { return; }
-      if (desc && desc.willChange) { desc.willChange(obj, keyName); }
-      dependentKeysWillChange(obj, keyName, m);
-      chainsWillChange(obj, keyName, m);
-      notifyBeforeObservers(obj, keyName);
-    }
-
-    /**
-      This function is called just after an object property has changed.
-      It will notify any observers and clear caches among other things.
-
-      Normally you will not need to call this method directly but if for some
-      reason you can't directly watch a property you can invoke this method
-      manually along with `Ember.propertyWillChange()` which you should call just
-      before the property value changes.
-
-      @method propertyDidChange
-      @for Ember
-      @param {Object} obj The object with the property that will change
-      @param {String} keyName The property key (or path) that will change.
-      @return {void}
-    */
-    function propertyDidChange(obj, keyName) {
-      var m = obj[META_KEY],
-          watching = (m && m.watching[keyName] > 0) || keyName === 'length',
-          proto = m && m.proto,
-          desc = m && m.descs[keyName];
-
-      if (proto === obj) { return; }
-
-      // shouldn't this mean that we're watching this key?
-      if (desc && desc.didChange) { desc.didChange(obj, keyName); }
-      if (!watching && keyName !== 'length') { return; }
-
-      dependentKeysDidChange(obj, keyName, m);
-      chainsDidChange(obj, keyName, m, false);
-      notifyObservers(obj, keyName);
-    }
-
-    var WILL_SEEN, DID_SEEN;
-
-    // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...)
-    function dependentKeysWillChange(obj, depKey, meta) {
-      if (obj.isDestroying) { return; }
-
-      var seen = WILL_SEEN, top = !seen;
-      if (top) { seen = WILL_SEEN = {}; }
-      iterDeps(propertyWillChange, obj, depKey, seen, meta);
-      if (top) { WILL_SEEN = null; }
-    }
-
-    // called whenever a property has just changed to update dependent keys
-    function dependentKeysDidChange(obj, depKey, meta) {
-      if (obj.isDestroying) { return; }
-
-      var seen = DID_SEEN, top = !seen;
-      if (top) { seen = DID_SEEN = {}; }
-      iterDeps(propertyDidChange, obj, depKey, seen, meta);
-      if (top) { DID_SEEN = null; }
-    }
-
-    function iterDeps(method, obj, depKey, seen, meta) {
-      var guid = guidFor(obj);
-      if (!seen[guid]) seen[guid] = {};
-      if (seen[guid][depKey]) return;
-      seen[guid][depKey] = true;
-
-      var deps = meta.deps;
-      deps = deps && deps[depKey];
-      if (deps) {
-        for(var key in deps) {
-          var desc = meta.descs[key];
-          if (desc && desc._suspended === obj) continue;
-          method(obj, key);
-        }
-      }
-    }
-
-    function chainsWillChange(obj, keyName, m) {
-      if (!(m.hasOwnProperty('chainWatchers') &&
-            m.chainWatchers[keyName])) {
-        return;
-      }
-
-      var nodes = m.chainWatchers[keyName],
-          events = [],
-          i, l;
-
-      for(i = 0, l = nodes.length; i < l; i++) {
-        nodes[i].willChange(events);
-      }
-
-      for (i = 0, l = events.length; i < l; i += 2) {
-        propertyWillChange(events[i], events[i+1]);
-      }
-    }
-
-    function chainsDidChange(obj, keyName, m, suppressEvents) {
-      if (!(m && m.hasOwnProperty('chainWatchers') &&
-            m.chainWatchers[keyName])) {
-        return;
-      }
-
-      var nodes = m.chainWatchers[keyName],
-          events = suppressEvents ? null : [],
-          i, l;
-
-      for(i = 0, l = nodes.length; i < l; i++) {
-        nodes[i].didChange(events);
-      }
-
-      if (suppressEvents) {
-        return;
-      }
-
-      for (i = 0, l = events.length; i < l; i += 2) {
-        propertyDidChange(events[i], events[i+1]);
-      }
-    }
-
-    function overrideChains(obj, keyName, m) {
-      chainsDidChange(obj, keyName, m, true);
-    };
-
-    /**
-      @method beginPropertyChanges
-      @chainable
-      @private
-    */
-    function beginPropertyChanges() {
-      deferred++;
-    }
-
-    /**
-      @method endPropertyChanges
-      @private
-    */
-    function endPropertyChanges() {
-      deferred--;
-      if (deferred<=0) {
-        beforeObserverSet.clear();
-        observerSet.flush();
-      }
-    }
-
-    /**
-      Make a series of property changes together in an
-      exception-safe way.
-
-      ```javascript
-      Ember.changeProperties(function() {
-        obj1.set('foo', mayBlowUpWhenSet);
-        obj2.set('bar', baz);
-      });
-      ```
-
-      @method changeProperties
-      @param {Function} callback
-      @param [binding]
-    */
-    function changeProperties(cb, binding) {
-      beginPropertyChanges();
-      tryFinally(cb, endPropertyChanges, binding);
-    };
-
-    function notifyBeforeObservers(obj, keyName) {
-      if (obj.isDestroying) { return; }
-
-      var eventName = keyName + ':before', listeners, diff;
-      if (deferred) {
-        listeners = beforeObserverSet.add(obj, keyName, eventName);
-        diff = listenersDiff(obj, eventName, listeners);
-        sendEvent(obj, eventName, [obj, keyName], diff);
-      } else {
-        sendEvent(obj, eventName, [obj, keyName]);
-      }
-    }
-
-    function notifyObservers(obj, keyName) {
-      if (obj.isDestroying) { return; }
-
-      var eventName = keyName + ':change', listeners;
-      if (deferred) {
-        listeners = observerSet.add(obj, keyName, eventName);
-        listenersUnion(obj, eventName, listeners);
-      } else {
-        sendEvent(obj, eventName, [obj, keyName]);
-      }
-    }
-
-    __exports__.propertyWillChange = propertyWillChange;
-    __exports__.propertyDidChange = propertyDidChange;
-    __exports__.overrideChains = overrideChains;
-    __exports__.beginPropertyChanges = beginPropertyChanges;
-    __exports__.endPropertyChanges = endPropertyChanges;
-    __exports__.changeProperties = changeProperties;
-  });
-define("ember-metal/property_get", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    /**
-    @module ember-metal
-    */
-
-    var Ember = __dependency1__["default"];
-    var META_KEY = __dependency2__.META_KEY;
-    var EmberError = __dependency3__["default"];
-
-    var get;
-
-    var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
-
-    var IS_GLOBAL_PATH = /^([A-Z$]|([0-9][A-Z$])).*[\.\*]/;
-    var HAS_THIS  = /^this[\.\*]/;
-    var FIRST_KEY = /^([^\.\*]+)/;
-
-    // ..........................................................
-    // GET AND SET
-    //
-    // If we are on a platform that supports accessors we can use those.
-    // Otherwise simulate accessors by looking up the property directly on the
-    // object.
-
-    /**
-      Gets the value of a property on an object. If the property is computed,
-      the function will be invoked. If the property is not defined but the
-      object implements the `unknownProperty` method then that will be invoked.
-
-      If you plan to run on IE8 and older browsers then you should use this
-      method anytime you want to retrieve a property on an object that you don't
-      know for sure is private. (Properties beginning with an underscore '_'
-      are considered private.)
-
-      On all newer browsers, you only need to use this method to retrieve
-      properties if the property might not be defined on the object and you want
-      to respect the `unknownProperty` handler. Otherwise you can ignore this
-      method.
-
-      Note that if the object itself is `undefined`, this method will throw
-      an error.
-
-      @method get
-      @for Ember
-      @param {Object} obj The object to retrieve from.
-      @param {String} keyName The property key to retrieve
-      @return {Object} the property value or `null`.
-    */
-    get = function get(obj, keyName) {
-      // Helpers that operate with 'this' within an #each
-      if (keyName === '') {
-        return obj;
-      }
-
-      if (!keyName && 'string'===typeof obj) {
-        keyName = obj;
-        obj = null;
-      }
-
-      Ember.assert("Cannot call get with "+ keyName +" key.", !!keyName);
-      Ember.assert("Cannot call get with '"+ keyName +"' on an undefined object.", obj !== undefined);
-
-      if (obj === null) { return _getPath(obj, keyName);  }
-
-      var meta = obj[META_KEY], desc = meta && meta.descs[keyName], ret;
-
-      if (desc === undefined && keyName.indexOf('.') !== -1) {
-        return _getPath(obj, keyName);
-      }
-
-      if (desc) {
-        return desc.get(obj, keyName);
-      } else {
-        if (MANDATORY_SETTER && meta && meta.watching[keyName] > 0) {
-          ret = meta.values[keyName];
-        } else {
-          ret = obj[keyName];
-        }
-
-        if (ret === undefined &&
-            'object' === typeof obj && !(keyName in obj) && 'function' === typeof obj.unknownProperty) {
-          return obj.unknownProperty(keyName);
-        }
-
-        return ret;
-      }
-    };
-
-    // Currently used only by Ember Data tests
-    if (Ember.config.overrideAccessors) {
-      Ember.get = get;
-      Ember.config.overrideAccessors();
-      get = Ember.get;
-    }
-
-    /**
-      Normalizes a target/path pair to reflect that actual target/path that should
-      be observed, etc. This takes into account passing in global property
-      paths (i.e. a path beginning with a captial letter not defined on the
-      target) and * separators.
-
-      @private
-      @method normalizeTuple
-      @for Ember
-      @param {Object} target The current target. May be `null`.
-      @param {String} path A path on the target or a global property path.
-      @return {Array} a temporary array with the normalized target/path pair.
-    */
-    function normalizeTuple(target, path) {
-      var hasThis  = HAS_THIS.test(path),
-          isGlobal = !hasThis && IS_GLOBAL_PATH.test(path),
-          key;
-
-      if (!target || isGlobal) target = Ember.lookup;
-      if (hasThis) path = path.slice(5);
-
-      if (target === Ember.lookup) {
-        key = path.match(FIRST_KEY)[0];
-        target = get(target, key);
-        path   = path.slice(key.length+1);
-      }
-
-      // must return some kind of path to be valid else other things will break.
-      if (!path || path.length===0) throw new EmberError('Path cannot be empty');
-
-      return [ target, path ];
-    };
-
-    function _getPath(root, path) {
-      var hasThis, parts, tuple, idx, len;
-
-      // If there is no root and path is a key name, return that
-      // property from the global object.
-      // E.g. get('Ember') -> Ember
-      if (root === null && path.indexOf('.') === -1) { return get(Ember.lookup, path); }
-
-      // detect complicated paths and normalize them
-      hasThis  = HAS_THIS.test(path);
-
-      if (!root || hasThis) {
-        tuple = normalizeTuple(root, path);
-        root = tuple[0];
-        path = tuple[1];
-        tuple.length = 0;
-      }
-
-      parts = path.split(".");
-      len = parts.length;
-      for (idx = 0; root != null && idx < len; idx++) {
-        root = get(root, parts[idx], true);
-        if (root && root.isDestroyed) { return undefined; }
-      }
-      return root;
-    };
-
-    function getWithDefault(root, key, defaultValue) {
-      var value = get(root, key);
-
-      if (value === undefined) { return defaultValue; }
-      return value;
-    };
-
-    __exports__["default"] = get;
-    __exports__.get = get;
-    __exports__.getWithDefault = getWithDefault;
-    __exports__.normalizeTuple = normalizeTuple;
-    __exports__._getPath = _getPath;
-  });
-define("ember-metal/property_set", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/property_events","ember-metal/properties","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var getPath = __dependency2__._getPath;
-    var META_KEY = __dependency3__.META_KEY;
-    var propertyWillChange = __dependency4__.propertyWillChange;
-    var propertyDidChange = __dependency4__.propertyDidChange;
-    var defineProperty = __dependency5__.defineProperty;
-    var EmberError = __dependency6__["default"];
-
-    var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
-        IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/;
-
-    /**
-      Sets the value of a property on an object, respecting computed properties
-      and notifying observers and other listeners of the change. If the
-      property is not defined but the object implements the `setUnknownProperty`
-      method then that will be invoked as well.
-
-      @method set
-      @for Ember
-      @param {Object} obj The object to modify.
-      @param {String} keyName The property key to set
-      @param {Object} value The value to set
-      @return {Object} the passed value.
-    */
-    var set = function set(obj, keyName, value, tolerant) {
-      if (typeof obj === 'string') {
-        Ember.assert("Path '" + obj + "' must be global if no obj is given.", IS_GLOBAL.test(obj));
-        value = keyName;
-        keyName = obj;
-        obj = null;
-      }
-
-      Ember.assert("Cannot call set with "+ keyName +" key.", !!keyName);
-
-      if (!obj) {
-        return setPath(obj, keyName, value, tolerant);
-      }
-
-      var meta = obj[META_KEY], desc = meta && meta.descs[keyName],
-          isUnknown, currentValue;
-
-      if (desc === undefined && keyName.indexOf('.') !== -1) {
-        return setPath(obj, keyName, value, tolerant);
-      }
-
-      Ember.assert("You need to provide an object and key to `set`.", !!obj && keyName !== undefined);
-      Ember.assert('calling set on destroyed object', !obj.isDestroyed);
-
-      if (desc !== undefined) {
-        desc.set(obj, keyName, value);
-      } else {
-
-        if (typeof obj === 'object' && obj !== null && obj[keyName] === value) {
-          return value;
-        }
-
-        isUnknown = 'object' === typeof obj && !(keyName in obj);
-
-        // setUnknownProperty is called if `obj` is an object,
-        // the property does not already exist, and the
-        // `setUnknownProperty` method exists on the object
-        if (isUnknown && 'function' === typeof obj.setUnknownProperty) {
-          obj.setUnknownProperty(keyName, value);
-        } else if (meta && meta.watching[keyName] > 0) {
-          if (MANDATORY_SETTER) {
-            currentValue = meta.values[keyName];
-          } else {
-            currentValue = obj[keyName];
-          }
-          // only trigger a change if the value has changed
-          if (value !== currentValue) {
-            propertyWillChange(obj, keyName);
-            if (MANDATORY_SETTER) {
-              if ((currentValue === undefined && !(keyName in obj)) || !obj.propertyIsEnumerable(keyName)) {
-                defineProperty(obj, keyName, null, value); // setup mandatory setter
-              } else {
-                meta.values[keyName] = value;
-              }
-            } else {
-              obj[keyName] = value;
-            }
-            propertyDidChange(obj, keyName);
-          }
-        } else {
-          obj[keyName] = value;
-        }
-      }
-      return value;
-    };
-
-    // Currently used only by Ember Data tests
-    // ES6TODO: Verify still true
-    if (Ember.config.overrideAccessors) {
-      Ember.set = set;
-      Ember.config.overrideAccessors();
-      set = Ember.set;
-    }
-
-    function setPath(root, path, value, tolerant) {
-      var keyName;
-
-      // get the last part of the path
-      keyName = path.slice(path.lastIndexOf('.') + 1);
-
-      // get the first part of the part
-      path    = (path === keyName) ? keyName : path.slice(0, path.length-(keyName.length+1));
-
-      // unless the path is this, look up the first part to
-      // get the root
-      if (path !== 'this') {
-        root = getPath(root, path);
-      }
-
-      if (!keyName || keyName.length === 0) {
-        throw new EmberError('Property set failed: You passed an empty path');
-      }
-
-      if (!root) {
-        if (tolerant) { return; }
-        else { throw new EmberError('Property set failed: object in path "'+path+'" could not be found or was destroyed.'); }
-      }
-
-      return set(root, keyName, value);
-    }
-
-    /**
-      Error-tolerant form of `Ember.set`. Will not blow up if any part of the
-      chain is `undefined`, `null`, or destroyed.
-
-      This is primarily used when syncing bindings, which may try to update after
-      an object has been destroyed.
-
-      @method trySet
-      @for Ember
-      @param {Object} obj The object to modify.
-      @param {String} path The property path to set
-      @param {Object} value The value to set
-    */
-    function trySet(root, path, value) {
-      return set(root, path, value, true);
-    };
-
-    __exports__.set = set;
-    __exports__.trySet = trySet;
-  });
-define("ember-metal/run_loop", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/array","ember-metal/property_events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var apply = __dependency2__.apply;
-    var indexOf = __dependency3__.indexOf;
-    var beginPropertyChanges = __dependency4__.beginPropertyChanges;
-    var endPropertyChanges = __dependency4__.endPropertyChanges;
-
-    var onBegin = function(current) {
-      run.currentRunLoop = current;
-    };
-
-    var onEnd = function(current, next) {
-      run.currentRunLoop = next;
-    };
-
-    // ES6TODO: should Backburner become es6?
-    var Backburner = requireModule('backburner').Backburner,
-        backburner = new Backburner(['sync', 'actions', 'destroy'], {
-          sync: {
-            before: beginPropertyChanges,
-            after: endPropertyChanges
-          },
-          defaultQueue: 'actions',
-          onBegin: onBegin,
-          onEnd: onEnd
-        }),
-        slice = [].slice,
-        concat = [].concat;
-
-    // ..........................................................
-    // run - this is ideally the only public API the dev sees
-    //
-
-    /**
-      Runs the passed target and method inside of a RunLoop, ensuring any
-      deferred actions including bindings and views updates are flushed at the
-      end.
-
-      Normally you should not need to invoke this method yourself. However if
-      you are implementing raw event handlers when interfacing with other
-      libraries or plugins, you should probably wrap all of your code inside this
-      call.
-
-      ```javascript
-      run(function() {
-        // code to be execute within a RunLoop
-      });
-      ```
-
-      @class run
-      @namespace Ember
-      @static
-      @constructor
-      @param {Object} [target] target of method to call
-      @param {Function|String} method Method to invoke.
-        May be a function or a string. If you pass a string
-        then it will be looked up on the passed target.
-      @param {Object} [args*] Any additional arguments you wish to pass to the method.
-      @return {Object} return value from invoking the passed function.
-    */
-    var run = function() {
-      if (Ember.onerror) {
-        return onerror(arguments);
-      } else {
-        return apply(backburner, backburner.run, arguments);
-      }
-    };
-
-    function onerror(args) {
-      try {
-        return apply(backburner, backburner.run, args);
-      } catch(error) {
-        Ember.onerror(error);
-      }
-    }
-    /**
-      If no run-loop is present, it creates a new one. If a run loop is
-      present it will queue itself to run on the existing run-loops action
-      queue.
-
-      Please note: This is not for normal usage, and should be used sparingly.
-
-      If invoked when not within a run loop:
-
-      ```javascript
-      run.join(function() {
-        // creates a new run-loop
-      });
-      ```
-
-      Alternatively, if called within an existing run loop:
-
-      ```javascript
-      run(function() {
-        // creates a new run-loop
-        run.join(function() {
-          // joins with the existing run-loop, and queues for invocation on
-          // the existing run-loops action queue.
-        });
-      });
-      ```
-
-      @method join
-      @namespace Ember
-      @param {Object} [target] target of method to call
-      @param {Function|String} method Method to invoke.
-        May be a function or a string. If you pass a string
-        then it will be looked up on the passed target.
-      @param {Object} [args*] Any additional arguments you wish to pass to the method.
-      @return {Object} Return value from invoking the passed function. Please note,
-      when called within an existing loop, no return value is possible.
-    */
-    run.join = function(target, method /* args */) {
-      if (!run.currentRunLoop) {
-        return apply(Ember, run, arguments);
-      }
-
-      var args = slice.call(arguments);
-      args.unshift('actions');
-      apply(run, run.schedule, args);
-    };
-
-    /**
-      Provides a useful utility for when integrating with non-Ember libraries
-      that provide asynchronous callbacks.
-
-      Ember utilizes a run-loop to batch and coalesce changes. This works by
-      marking the start and end of Ember-related Javascript execution.
-
-      When using events such as a View's click handler, Ember wraps the event
-      handler in a run-loop, but when integrating with non-Ember libraries this
-      can be tedious.
-
-      For example, the following is rather verbose but is the correct way to combine
-      third-party events and Ember code.
-
-      ```javascript
-      var that = this;
-      jQuery(window).on('resize', function(){
-        run(function(){
-          that.handleResize();
-        });
-      });
-      ```
-
-      To reduce the boilerplate, the following can be used to construct a
-      run-loop-wrapped callback handler.
-
-      ```javascript
-      jQuery(window).on('resize', run.bind(this, this.handleResize));
-      ```
-
-      @method bind
-      @namespace run
-      @param {Object} [target] target of method to call
-      @param {Function|String} method Method to invoke.
-        May be a function or a string. If you pass a string
-        then it will be looked up on the passed target.
-      @param {Object} [args*] Any additional arguments you wish to pass to the method.
-      @return {Object} return value from invoking the passed function. Please note,
-      when called within an existing loop, no return value is possible.
-    */
-    run.bind = function(target, method /* args*/) {
-      var args = slice.call(arguments);
-      return function() {
-        return apply(run, run.join, args.concat(slice.call(arguments)));
-      };
-    };
-
-    run.backburner = backburner;
-    run.currentRunLoop = null;
-    run.queues = backburner.queueNames;
-
-    /**
-      Begins a new RunLoop. Any deferred actions invoked after the begin will
-      be buffered until you invoke a matching call to `run.end()`. This is
-      a lower-level way to use a RunLoop instead of using `run()`.
-
-      ```javascript
-      run.begin();
-      // code to be execute within a RunLoop
-      run.end();
-      ```
-
-      @method begin
-      @return {void}
-    */
-    run.begin = function() {
-      backburner.begin();
-    };
-
-    /**
-      Ends a RunLoop. This must be called sometime after you call
-      `run.begin()` to flush any deferred actions. This is a lower-level way
-      to use a RunLoop instead of using `run()`.
-
-      ```javascript
-      run.begin();
-      // code to be execute within a RunLoop
-      run.end();
-      ```
-
-      @method end
-      @return {void}
-    */
-    run.end = function() {
-      backburner.end();
-    };
-
-    /**
-      Array of named queues. This array determines the order in which queues
-      are flushed at the end of the RunLoop. You can define your own queues by
-      simply adding the queue name to this array. Normally you should not need
-      to inspect or modify this property.
-
-      @property queues
-      @type Array
-      @default ['sync', 'actions', 'destroy']
-    */
-
-    /**
-      Adds the passed target/method and any optional arguments to the named
-      queue to be executed at the end of the RunLoop. If you have not already
-      started a RunLoop when calling this method one will be started for you
-      automatically.
-
-      At the end of a RunLoop, any methods scheduled in this way will be invoked.
-      Methods will be invoked in an order matching the named queues defined in
-      the `run.queues` property.
-
-      ```javascript
-      run.schedule('sync', this, function() {
-        // this will be executed in the first RunLoop queue, when bindings are synced
-        console.log("scheduled on sync queue");
-      });
-
-      run.schedule('actions', this, function() {
-        // this will be executed in the 'actions' queue, after bindings have synced.
-        console.log("scheduled on actions queue");
-      });
-
-      // Note the functions will be run in order based on the run queues order.
-      // Output would be:
-      //   scheduled on sync queue
-      //   scheduled on actions queue
-      ```
-
-      @method schedule
-      @param {String} queue The name of the queue to schedule against.
-        Default queues are 'sync' and 'actions'
-      @param {Object} [target] target object to use as the context when invoking a method.
-      @param {String|Function} method The method to invoke. If you pass a string it
-        will be resolved on the target object at the time the scheduled item is
-        invoked allowing you to change the target function.
-      @param {Object} [arguments*] Optional arguments to be passed to the queued method.
-      @return {void}
-    */
-    run.schedule = function(queue, target, method) {
-      checkAutoRun();
-      apply(backburner, backburner.schedule, arguments);
-    };
-
-    // Used by global test teardown
-    run.hasScheduledTimers = function() {
-      return backburner.hasTimers();
-    };
-
-    // Used by global test teardown
-    run.cancelTimers = function () {
-      backburner.cancelTimers();
-    };
-
-    /**
-      Immediately flushes any events scheduled in the 'sync' queue. Bindings
-      use this queue so this method is a useful way to immediately force all
-      bindings in the application to sync.
-
-      You should call this method anytime you need any changed state to propagate
-      throughout the app immediately without repainting the UI (which happens
-      in the later 'render' queue added by the `ember-views` package).
-
-      ```javascript
-      run.sync();
-      ```
-
-      @method sync
-      @return {void}
-    */
-    run.sync = function() {
-      if (backburner.currentInstance) {
-        backburner.currentInstance.queues.sync.flush();
-      }
-    };
-
-    /**
-      Invokes the passed target/method and optional arguments after a specified
-      period if time. The last parameter of this method must always be a number
-      of milliseconds.
-
-      You should use this method whenever you need to run some action after a
-      period of time instead of using `setTimeout()`. This method will ensure that
-      items that expire during the same script execution cycle all execute
-      together, which is often more efficient than using a real setTimeout.
-
-      ```javascript
-      run.later(myContext, function() {
-        // code here will execute within a RunLoop in about 500ms with this == myContext
-      }, 500);
-      ```
-
-      @method later
-      @param {Object} [target] target of method to invoke
-      @param {Function|String} method The method to invoke.
-        If you pass a string it will be resolved on the
-        target at the time the method is invoked.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @param {Number} wait Number of milliseconds to wait.
-      @return {String} a string you can use to cancel the timer in
-        `run.cancel` later.
-    */
-    run.later = function(target, method) {
-      return apply(backburner, backburner.later, arguments);
-    };
-
-    /**
-      Schedule a function to run one time during the current RunLoop. This is equivalent
-      to calling `scheduleOnce` with the "actions" queue.
-
-      @method once
-      @param {Object} [target] The target of the method to invoke.
-      @param {Function|String} method The method to invoke.
-        If you pass a string it will be resolved on the
-        target at the time the method is invoked.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @return {Object} Timer information for use in cancelling, see `run.cancel`.
-    */
-    run.once = function(target, method) {
-      checkAutoRun();
-      var args = slice.call(arguments);
-      args.unshift('actions');
-      return apply(backburner, backburner.scheduleOnce, args);
-    };
-
-    /**
-      Schedules a function to run one time in a given queue of the current RunLoop.
-      Calling this method with the same queue/target/method combination will have
-      no effect (past the initial call).
-
-      Note that although you can pass optional arguments these will not be
-      considered when looking for duplicates. New arguments will replace previous
-      calls.
-
-      ```javascript
-      run(function() {
-        var sayHi = function() { console.log('hi'); }
-        run.scheduleOnce('afterRender', myContext, sayHi);
-        run.scheduleOnce('afterRender', myContext, sayHi);
-        // sayHi will only be executed once, in the afterRender queue of the RunLoop
-      });
-      ```
-
-      Also note that passing an anonymous function to `run.scheduleOnce` will
-      not prevent additional calls with an identical anonymous function from
-      scheduling the items multiple times, e.g.:
-
-      ```javascript
-      function scheduleIt() {
-        run.scheduleOnce('actions', myContext, function() { console.log("Closure"); });
-      }
-      scheduleIt();
-      scheduleIt();
-      // "Closure" will print twice, even though we're using `run.scheduleOnce`,
-      // because the function we pass to it is anonymous and won't match the
-      // previously scheduled operation.
-      ```
-
-      Available queues, and their order, can be found at `run.queues`
-
-      @method scheduleOnce
-      @param {String} [queue] The name of the queue to schedule against. Default queues are 'sync' and 'actions'.
-      @param {Object} [target] The target of the method to invoke.
-      @param {Function|String} method The method to invoke.
-        If you pass a string it will be resolved on the
-        target at the time the method is invoked.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @return {Object} Timer information for use in cancelling, see `run.cancel`.
-    */
-    run.scheduleOnce = function(queue, target, method) {
-      checkAutoRun();
-      return apply(backburner, backburner.scheduleOnce, arguments);
-    };
-
-    /**
-      Schedules an item to run from within a separate run loop, after
-      control has been returned to the system. This is equivalent to calling
-      `run.later` with a wait time of 1ms.
-
-      ```javascript
-      run.next(myContext, function() {
-        // code to be executed in the next run loop,
-        // which will be scheduled after the current one
-      });
-      ```
-
-      Multiple operations scheduled with `run.next` will coalesce
-      into the same later run loop, along with any other operations
-      scheduled by `run.later` that expire right around the same
-      time that `run.next` operations will fire.
-
-      Note that there are often alternatives to using `run.next`.
-      For instance, if you'd like to schedule an operation to happen
-      after all DOM element operations have completed within the current
-      run loop, you can make use of the `afterRender` run loop queue (added
-      by the `ember-views` package, along with the preceding `render` queue
-      where all the DOM element operations happen). Example:
-
-      ```javascript
-      App.MyCollectionView = Ember.CollectionView.extend({
-        didInsertElement: function() {
-          run.scheduleOnce('afterRender', this, 'processChildElements');
-        },
-        processChildElements: function() {
-          // ... do something with collectionView's child view
-          // elements after they've finished rendering, which
-          // can't be done within the CollectionView's
-          // `didInsertElement` hook because that gets run
-          // before the child elements have been added to the DOM.
-        }
-      });
-      ```
-
-      One benefit of the above approach compared to using `run.next` is
-      that you will be able to perform DOM/CSS operations before unprocessed
-      elements are rendered to the screen, which may prevent flickering or
-      other artifacts caused by delaying processing until after rendering.
-
-      The other major benefit to the above approach is that `run.next`
-      introduces an element of non-determinism, which can make things much
-      harder to test, due to its reliance on `setTimeout`; it's much harder
-      to guarantee the order of scheduled operations when they are scheduled
-      outside of the current run loop, i.e. with `run.next`.
-
-      @method next
-      @param {Object} [target] target of method to invoke
-      @param {Function|String} method The method to invoke.
-        If you pass a string it will be resolved on the
-        target at the time the method is invoked.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @return {Object} Timer information for use in cancelling, see `run.cancel`.
-    */
-    run.next = function() {
-      var args = slice.call(arguments);
-      args.push(1);
-      return apply(backburner, backburner.later, args);
-    };
-
-    /**
-      Cancels a scheduled item. Must be a value returned by `run.later()`,
-      `run.once()`, `run.next()`, `run.debounce()`, or
-      `run.throttle()`.
-
-      ```javascript
-      var runNext = run.next(myContext, function() {
-        // will not be executed
-      });
-      run.cancel(runNext);
-
-      var runLater = run.later(myContext, function() {
-        // will not be executed
-      }, 500);
-      run.cancel(runLater);
-
-      var runOnce = run.once(myContext, function() {
-        // will not be executed
-      });
-      run.cancel(runOnce);
-
-      var throttle = run.throttle(myContext, function() {
-        // will not be executed
-      }, 1, false);
-      run.cancel(throttle);
-
-      var debounce = run.debounce(myContext, function() {
-        // will not be executed
-      }, 1);
-      run.cancel(debounce);
-
-      var debounceImmediate = run.debounce(myContext, function() {
-        // will be executed since we passed in true (immediate)
-      }, 100, true);
-      // the 100ms delay until this method can be called again will be cancelled
-      run.cancel(debounceImmediate);
-      ```
-
-      @method cancel
-      @param {Object} timer Timer object to cancel
-      @return {Boolean} true if cancelled or false/undefined if it wasn't found
-    */
-    run.cancel = function(timer) {
-      return backburner.cancel(timer);
-    };
-
-    /**
-      Delay calling the target method until the debounce period has elapsed
-      with no additional debounce calls. If `debounce` is called again before
-      the specified time has elapsed, the timer is reset and the entire period
-      must pass again before the target method is called.
-
-      This method should be used when an event may be called multiple times
-      but the action should only be called once when the event is done firing.
-      A common example is for scroll events where you only want updates to
-      happen once scrolling has ceased.
-
-      ```javascript
-        var myFunc = function() { console.log(this.name + ' ran.'); };
-        var myContext = {name: 'debounce'};
-
-        run.debounce(myContext, myFunc, 150);
-
-        // less than 150ms passes
-
-        run.debounce(myContext, myFunc, 150);
-
-        // 150ms passes
-        // myFunc is invoked with context myContext
-        // console logs 'debounce ran.' one time.
-      ```
-
-      Immediate allows you to run the function immediately, but debounce
-      other calls for this function until the wait time has elapsed. If
-      `debounce` is called again before the specified time has elapsed,
-      the timer is reset and the entire period must pass again before
-      the method can be called again.
-
-      ```javascript
-        var myFunc = function() { console.log(this.name + ' ran.'); };
-        var myContext = {name: 'debounce'};
-
-        run.debounce(myContext, myFunc, 150, true);
-
-        // console logs 'debounce ran.' one time immediately.
-        // 100ms passes
-
-        run.debounce(myContext, myFunc, 150, true);
-
-        // 150ms passes and nothing else is logged to the console and
-        // the debouncee is no longer being watched
-
-        run.debounce(myContext, myFunc, 150, true);
-
-        // console logs 'debounce ran.' one time immediately.
-        // 150ms passes and nothing else is logged tot he console and
-        // the debouncee is no longer being watched
-
-      ```
-
-      @method debounce
-      @param {Object} [target] target of method to invoke
-      @param {Function|String} method The method to invoke.
-        May be a function or a string. If you pass a string
-        then it will be looked up on the passed target.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @param {Number} wait Number of milliseconds to wait.
-      @param {Boolean} immediate Trigger the function on the leading instead
-        of the trailing edge of the wait interval. Defaults to false.
-      @return {Array} Timer information for use in cancelling, see `run.cancel`.
-    */
-    run.debounce = function() {
-      return apply(backburner, backburner.debounce, arguments);
-    };
-
-    /**
-      Ensure that the target method is never called more frequently than
-      the specified spacing period.
-
-      ```javascript
-        var myFunc = function() { console.log(this.name + ' ran.'); };
-        var myContext = {name: 'throttle'};
-
-        run.throttle(myContext, myFunc, 150);
-        // myFunc is invoked with context myContext
-
-        // 50ms passes
-        run.throttle(myContext, myFunc, 150);
-
-        // 50ms passes
-        run.throttle(myContext, myFunc, 150);
-
-        // 150ms passes
-        run.throttle(myContext, myFunc, 150);
-        // myFunc is invoked with context myContext
-        // console logs 'throttle ran.' twice, 250ms apart.
-      ```
-
-      @method throttle
-      @param {Object} [target] target of method to invoke
-      @param {Function|String} method The method to invoke.
-        May be a function or a string. If you pass a string
-        then it will be looked up on the passed target.
-      @param {Object} [args*] Optional arguments to pass to the timeout.
-      @param {Number} spacing Number of milliseconds to space out requests.
-      @return {Array} Timer information for use in cancelling, see `run.cancel`.
-    */
-    run.throttle = function() {
-      return apply(backburner, backburner.throttle, arguments);
-    };
-
-    // Make sure it's not an autorun during testing
-    function checkAutoRun() {
-      if (!run.currentRunLoop) {
-        Ember.assert("You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in an run", !Ember.testing);
-      }
-    }
-
-    /**
-      Add a new named queue after the specified queue.
-
-      The queue to add will only be added once.
-
-      @method _addQueue
-      @param {String} name the name of the queue to add.
-      @param {String} after the name of the queue to add after.
-      @private
-    */
-    run._addQueue = function(name, after) {
-      if (indexOf.call(run.queues, name) === -1) {
-        run.queues.splice(indexOf.call(run.queues, after)+1, 0, name);
-      }
-    }
-
-    __exports__["default"] = run
-  });
-define("ember-metal/set_properties", 
-  ["ember-metal/property_events","ember-metal/property_set","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var changeProperties = __dependency1__.changeProperties;
-    var set = __dependency2__.set;
-
-    /**
-      Set a list of properties on an object. These properties are set inside
-      a single `beginPropertyChanges` and `endPropertyChanges` batch, so
-      observers will be buffered.
-
-      ```javascript
-      anObject.setProperties({
-        firstName: "Stanley",
-        lastName: "Stuart",
-        age: "21"
-      })
-      ```
-
-      @method setProperties
-      @param self
-      @param {Object} hash
-      @return self
-    */
-    function setProperties(self, hash) {
-      changeProperties(function() {
-        for(var prop in hash) {
-          if (hash.hasOwnProperty(prop)) { set(self, prop, hash[prop]); }
-        }
-      });
-      return self;
-    };
-
-    __exports__["default"] = setProperties;
-  });
-define("ember-metal/utils", 
-  ["ember-metal/core","ember-metal/platform","ember-metal/array","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var platform = __dependency2__.platform;
-    var create = __dependency2__.create;
-    var forEach = __dependency3__.forEach;
-
-    /**
-    @module ember-metal
-    */
-
-    /**
-      Prefix used for guids through out Ember.
-      @private
-    */
-    var GUID_PREFIX = 'ember';
-
-
-    var o_defineProperty = platform.defineProperty,
-        o_create = create,
-        // Used for guid generation...
-        numberCache  = [],
-        stringCache  = {},
-        uuid = 0;
-
-    var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
-
-    /**
-      A unique key used to assign guids and other private metadata to objects.
-      If you inspect an object in your browser debugger you will often see these.
-      They can be safely ignored.
-
-      On browsers that support it, these properties are added with enumeration
-      disabled so they won't show up when you iterate over your properties.
-
-      @private
-      @property GUID_KEY
-      @for Ember
-      @type String
-      @final
-    */
-    var GUID_KEY = '__ember' + (+ new Date());
-
-    var GUID_DESC = {
-      writable:    false,
-      configurable: false,
-      enumerable:  false,
-      value: null
-    };
-
-    /**
-      Generates a new guid, optionally saving the guid to the object that you
-      pass in. You will rarely need to use this method. Instead you should
-      call `Ember.guidFor(obj)`, which return an existing guid if available.
-
-      @private
-      @method generateGuid
-      @for Ember
-      @param {Object} [obj] Object the guid will be used for. If passed in, the guid will
-        be saved on the object and reused whenever you pass the same object
-        again.
-
-        If no object is passed, just generate a new guid.
-      @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to
-        separate the guid into separate namespaces.
-      @return {String} the guid
-    */
-    function generateGuid(obj, prefix) {
-      if (!prefix) prefix = GUID_PREFIX;
-      var ret = (prefix + (uuid++));
-      if (obj) {
-        if (obj[GUID_KEY] === null) {
-          obj[GUID_KEY] = ret;
-        } else {
-          GUID_DESC.value = ret;
-          o_defineProperty(obj, GUID_KEY, GUID_DESC);
-        }
-      }
-      return ret;
-    }
-
-    /**
-      Returns a unique id for the object. If the object does not yet have a guid,
-      one will be assigned to it. You can call this on any object,
-      `Ember.Object`-based or not, but be aware that it will add a `_guid`
-      property.
-
-      You can also use this method on DOM Element objects.
-
-      @private
-      @method guidFor
-      @for Ember
-      @param {Object} obj any object, string, number, Element, or primitive
-      @return {String} the unique guid for this instance.
-    */
-    function guidFor(obj) {
-
-      // special cases where we don't want to add a key to object
-      if (obj === undefined) return "(undefined)";
-      if (obj === null) return "(null)";
-
-      var ret;
-      var type = typeof obj;
-
-      // Don't allow prototype changes to String etc. to change the guidFor
-      switch(type) {
-        case 'number':
-          ret = numberCache[obj];
-          if (!ret) ret = numberCache[obj] = 'nu'+obj;
-          return ret;
-
-        case 'string':
-          ret = stringCache[obj];
-          if (!ret) ret = stringCache[obj] = 'st'+(uuid++);
-          return ret;
-
-        case 'boolean':
-          return obj ? '(true)' : '(false)';
-
-        default:
-          if (obj[GUID_KEY]) return obj[GUID_KEY];
-          if (obj === Object) return '(Object)';
-          if (obj === Array)  return '(Array)';
-          ret = 'ember' + (uuid++);
-
-          if (obj[GUID_KEY] === null) {
-            obj[GUID_KEY] = ret;
-          } else {
-            GUID_DESC.value = ret;
-            o_defineProperty(obj, GUID_KEY, GUID_DESC);
-          }
-          return ret;
-      }
-    };
-
-    // ..........................................................
-    // META
-    //
-
-    var META_DESC = {
-      writable:    true,
-      configurable: false,
-      enumerable:  false,
-      value: null
-    };
-
-
-    /**
-      The key used to store meta information on object for property observing.
-
-      @property META_KEY
-      @for Ember
-      @private
-      @final
-      @type String
-    */
-    var META_KEY = '__ember_meta__';
-
-    var isDefinePropertySimulated = platform.defineProperty.isSimulated;
-
-    function Meta(obj) {
-      this.descs = {};
-      this.watching = {};
-      this.cache = {};
-      this.cacheMeta = {};
-      this.source = obj;
-    }
-
-    Meta.prototype = {
-      descs: null,
-      deps: null,
-      watching: null,
-      listeners: null,
-      cache: null,
-      cacheMeta: null,
-      source: null,
-      mixins: null,
-      bindings: null,
-      chains: null,
-      chainWatchers: null,
-      values: null,
-      proto: null
-    };
-
-    if (isDefinePropertySimulated) {
-      // on platforms that don't support enumerable false
-      // make meta fail jQuery.isPlainObject() to hide from
-      // jQuery.extend() by having a property that fails
-      // hasOwnProperty check.
-      Meta.prototype.__preventPlainObject__ = true;
-
-      // Without non-enumerable properties, meta objects will be output in JSON
-      // unless explicitly suppressed
-      Meta.prototype.toJSON = function () { };
-    }
-
-    // Placeholder for non-writable metas.
-    var EMPTY_META = new Meta(null);
-
-    if (MANDATORY_SETTER) { EMPTY_META.values = {}; }
-
-    /**
-      Retrieves the meta hash for an object. If `writable` is true ensures the
-      hash is writable for this object as well.
-
-      The meta object contains information about computed property descriptors as
-      well as any watched properties and other information. You generally will
-      not access this information directly but instead work with higher level
-      methods that manipulate this hash indirectly.
-
-      @method meta
-      @for Ember
-      @private
-
-      @param {Object} obj The object to retrieve meta for
-      @param {Boolean} [writable=true] Pass `false` if you do not intend to modify
-        the meta hash, allowing the method to avoid making an unnecessary copy.
-      @return {Object} the meta hash for an object
-    */
-    function meta(obj, writable) {
-
-      var ret = obj[META_KEY];
-      if (writable===false) return ret || EMPTY_META;
-
-      if (!ret) {
-        if (!isDefinePropertySimulated) o_defineProperty(obj, META_KEY, META_DESC);
-
-        ret = new Meta(obj);
-
-        if (MANDATORY_SETTER) { ret.values = {}; }
-
-        obj[META_KEY] = ret;
-
-        // make sure we don't accidentally try to create constructor like desc
-        ret.descs.constructor = null;
-
-      } else if (ret.source !== obj) {
-        if (!isDefinePropertySimulated) o_defineProperty(obj, META_KEY, META_DESC);
-
-        ret = o_create(ret);
-        ret.descs     = o_create(ret.descs);
-        ret.watching  = o_create(ret.watching);
-        ret.cache     = {};
-        ret.cacheMeta = {};
-        ret.source    = obj;
-
-        if (MANDATORY_SETTER) { ret.values = o_create(ret.values); }
-
-        obj[META_KEY] = ret;
-      }
-      return ret;
-    };
-
-    function getMeta(obj, property) {
-      var _meta = meta(obj, false);
-      return _meta[property];
-    };
-
-    function setMeta(obj, property, value) {
-      var _meta = meta(obj, true);
-      _meta[property] = value;
-      return value;
-    };
-
-    /**
-      @deprecated
-      @private
-
-      In order to store defaults for a class, a prototype may need to create
-      a default meta object, which will be inherited by any objects instantiated
-      from the class's constructor.
-
-      However, the properties of that meta object are only shallow-cloned,
-      so if a property is a hash (like the event system's `listeners` hash),
-      it will by default be shared across all instances of that class.
-
-      This method allows extensions to deeply clone a series of nested hashes or
-      other complex objects. For instance, the event system might pass
-      `['listeners', 'foo:change', 'ember157']` to `prepareMetaPath`, which will
-      walk down the keys provided.
-
-      For each key, if the key does not exist, it is created. If it already
-      exists and it was inherited from its constructor, the constructor's
-      key is cloned.
-
-      You can also pass false for `writable`, which will simply return
-      undefined if `prepareMetaPath` discovers any part of the path that
-      shared or undefined.
-
-      @method metaPath
-      @for Ember
-      @param {Object} obj The object whose meta we are examining
-      @param {Array} path An array of keys to walk down
-      @param {Boolean} writable whether or not to create a new meta
-        (or meta property) if one does not already exist or if it's
-        shared with its constructor
-    */
-    function metaPath(obj, path, writable) {
-      Ember.deprecate("Ember.metaPath is deprecated and will be removed from future releases.");
-      var _meta = meta(obj, writable), keyName, value;
-
-      for (var i=0, l=path.length; i<l; i++) {
-        keyName = path[i];
-        value = _meta[keyName];
-
-        if (!value) {
-          if (!writable) { return undefined; }
-          value = _meta[keyName] = { __ember_source__: obj };
-        } else if (value.__ember_source__ !== obj) {
-          if (!writable) { return undefined; }
-          value = _meta[keyName] = o_create(value);
-          value.__ember_source__ = obj;
-        }
-
-        _meta = value;
-      }
-
-      return value;
-    };
-
-    /**
-      Wraps the passed function so that `this._super` will point to the superFunc
-      when the function is invoked. This is the primitive we use to implement
-      calls to super.
-
-      @private
-      @method wrap
-      @for Ember
-      @param {Function} func The function to call
-      @param {Function} superFunc The super function.
-      @return {Function} wrapped function.
-    */
-    function wrap(func, superFunc) {
-      function superWrapper() {
-        var ret, sup = this.__nextSuper;
-        this.__nextSuper = superFunc;
-        ret = apply(this, func, arguments);
-        this.__nextSuper = sup;
-        return ret;
-      }
-
-      superWrapper.wrappedFunction = func;
-      superWrapper.wrappedFunction.__ember_arity__ = func.length;
-      superWrapper.__ember_observes__ = func.__ember_observes__;
-      superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__;
-      superWrapper.__ember_listens__ = func.__ember_listens__;
-
-      return superWrapper;
-    };
-
-    var EmberArray;
-
-    /**
-      Returns true if the passed object is an array or Array-like.
-
-      Ember Array Protocol:
-
-        - the object has an objectAt property
-        - the object is a native Array
-        - the object is an Object, and has a length property
-
-      Unlike `Ember.typeOf` this method returns true even if the passed object is
-      not formally array but appears to be array-like (i.e. implements `Ember.Array`)
-
-      ```javascript
-      Ember.isArray();                                            // false
-      Ember.isArray([]);                                          // true
-      Ember.isArray( Ember.ArrayProxy.create({ content: [] }) );  // true
-      ```
-
-      @method isArray
-      @for Ember
-      @param {Object} obj The object to test
-      @return {Boolean} true if the passed object is an array or Array-like
-    */
-    // ES6TODO: Move up to runtime? This is only use in ember-metal by concatenatedProperties
-    function isArray(obj) {
-      var modulePath;
-
-      if (typeof EmberArray === "undefined") {
-        modulePath = 'ember-runtime/mixins/array';
-        if (requirejs._eak_seen[modulePath]) {
-          EmberArray = requireModule(modulePath)['default'];
-        }
-      }
-
-      if (!obj || obj.setInterval) { return false; }
-      if (Array.isArray && Array.isArray(obj)) { return true; }
-      if (EmberArray && EmberArray.detect(obj)) { return true; }
-      if ((obj.length !== undefined) && 'object'===typeof obj) { return true; }
-      return false;
-    };
-
-    /**
-      Forces the passed object to be part of an array. If the object is already
-      an array or array-like, returns the object. Otherwise adds the object to
-      an array. If obj is `null` or `undefined`, returns an empty array.
-
-      ```javascript
-      Ember.makeArray();                           // []
-      Ember.makeArray(null);                       // []
-      Ember.makeArray(undefined);                  // []
-      Ember.makeArray('lindsay');                  // ['lindsay']
-      Ember.makeArray([1,2,42]);                   // [1,2,42]
-
-      var controller = Ember.ArrayProxy.create({ content: [] });
-      Ember.makeArray(controller) === controller;  // true
-      ```
-
-      @method makeArray
-      @for Ember
-      @param {Object} obj the object
-      @return {Array}
-    */
-    function makeArray(obj) {
-      if (obj === null || obj === undefined) { return []; }
-      return isArray(obj) ? obj : [obj];
-    };
-
-    /**
-      Checks to see if the `methodName` exists on the `obj`.
-
-      ```javascript
-      var foo = {bar: Ember.K, baz: null};
-      Ember.canInvoke(foo, 'bar'); // true
-      Ember.canInvoke(foo, 'baz'); // false
-      Ember.canInvoke(foo, 'bat'); // false
-      ```
-
-      @method canInvoke
-      @for Ember
-      @param {Object} obj The object to check for the method
-      @param {String} methodName The method name to check for
-      @return {Boolean}
-    */
-    function canInvoke(obj, methodName) {
-      return !!(obj && typeof obj[methodName] === 'function');
-    }
-
-    /**
-      Checks to see if the `methodName` exists on the `obj`,
-      and if it does, invokes it with the arguments passed.
-
-      ```javascript
-      var d = new Date('03/15/2013');
-      Ember.tryInvoke(d, 'getTime'); // 1363320000000
-      Ember.tryInvoke(d, 'setFullYear', [2014]); // 1394856000000
-      Ember.tryInvoke(d, 'noSuchMethod', [2014]); // undefined
-      ```
-
-      @method tryInvoke
-      @for Ember
-      @param {Object} obj The object to check for the method
-      @param {String} methodName The method name to check for
-      @param {Array} [args] The arguments to pass to the method
-      @return {*} the return value of the invoked method or undefined if it cannot be invoked
-    */
-    function tryInvoke(obj, methodName, args) {
-      if (canInvoke(obj, methodName)) {
-        return args ? applyStr(obj, methodName, args) : applyStr(obj, methodName);
-      }
-    };
-
-    // https://github.com/emberjs/ember.js/pull/1617
-    var needsFinallyFix = (function() {
-      var count = 0;
-      try{
-        try { }
-        finally {
-          count++;
-          throw new Error('needsFinallyFixTest');
-        }
-      } catch (e) {}
-
-      return count !== 1;
-    })();
-
-    /**
-      Provides try { } finally { } functionality, while working
-      around Safari's double finally bug.
-
-      ```javascript
-      var tryable = function() {
-        someResource.lock();
-        runCallback(); // May throw error.
-      };
-      var finalizer = function() {
-        someResource.unlock();
-      };
-      Ember.tryFinally(tryable, finalizer);
-      ```
-
-      @method tryFinally
-      @for Ember
-      @param {Function} tryable The function to run the try callback
-      @param {Function} finalizer The function to run the finally callback
-      @param {Object} [binding] The optional calling object. Defaults to 'this'
-      @return {*} The return value is the that of the finalizer,
-      unless that value is undefined, in which case it is the return value
-      of the tryable
-    */
-
-    var tryFinally;
-    if (needsFinallyFix) {
-      tryFinally = function(tryable, finalizer, binding) {
-        var result, finalResult, finalError;
-
-        binding = binding || this;
-
-        try {
-          result = tryable.call(binding);
-        } finally {
-          try {
-            finalResult = finalizer.call(binding);
-          } catch (e) {
-            finalError = e;
-          }
-        }
-
-        if (finalError) { throw finalError; }
-
-        return (finalResult === undefined) ? result : finalResult;
-      };
-    } else {
-      tryFinally = function(tryable, finalizer, binding) {
-        var result, finalResult;
-
-        binding = binding || this;
-
-        try {
-          result = tryable.call(binding);
-        } finally {
-          finalResult = finalizer.call(binding);
-        }
-
-        return (finalResult === undefined) ? result : finalResult;
-      };
-    }
-
-    /**
-      Provides try { } catch finally { } functionality, while working
-      around Safari's double finally bug.
-
-      ```javascript
-      var tryable = function() {
-        for (i=0, l=listeners.length; i<l; i++) {
-          listener = listeners[i];
-          beforeValues[i] = listener.before(name, time(), payload);
-        }
-
-        return callback.call(binding);
-      };
-
-      var catchable = function(e) {
-        payload = payload || {};
-        payload.exception = e;
-      };
-
-      var finalizer = function() {
-        for (i=0, l=listeners.length; i<l; i++) {
-          listener = listeners[i];
-          listener.after(name, time(), payload, beforeValues[i]);
-        }
-      };
-      Ember.tryCatchFinally(tryable, catchable, finalizer);
-      ```
-
-      @method tryCatchFinally
-      @for Ember
-      @param {Function} tryable The function to run the try callback
-      @param {Function} catchable The function to run the catchable callback
-      @param {Function} finalizer The function to run the finally callback
-      @param {Object} [binding] The optional calling object. Defaults to 'this'
-      @return {*} The return value is the that of the finalizer,
-      unless that value is undefined, in which case it is the return value
-      of the tryable.
-    */
-    var tryCatchFinally;
-    if (needsFinallyFix) {
-      tryCatchFinally = function(tryable, catchable, finalizer, binding) {
-        var result, finalResult, finalError;
-
-        binding = binding || this;
-
-        try {
-          result = tryable.call(binding);
-        } catch(error) {
-          result = catchable.call(binding, error);
-        } finally {
-          try {
-            finalResult = finalizer.call(binding);
-          } catch (e) {
-            finalError = e;
-          }
-        }
-
-        if (finalError) { throw finalError; }
-
-        return (finalResult === undefined) ? result : finalResult;
-      };
-    } else {
-      tryCatchFinally = function(tryable, catchable, finalizer, binding) {
-        var result, finalResult;
-
-        binding = binding || this;
-
-        try {
-          result = tryable.call(binding);
-        } catch(error) {
-          result = catchable.call(binding, error);
-        } finally {
-          finalResult = finalizer.call(binding);
-        }
-
-        return (finalResult === undefined) ? result : finalResult;
-      };
-    }
-
-    // ........................................
-    // TYPING & ARRAY MESSAGING
-    //
-
-    var TYPE_MAP = {};
-    var t = "Boolean Number String Function Array Date RegExp Object".split(" ");
-    forEach.call(t, function(name) {
-      TYPE_MAP[ "[object " + name + "]" ] = name.toLowerCase();
-    });
-
-    var toString = Object.prototype.toString;
-
-    var EmberObject;
-
-    /**
-      Returns a consistent type for the passed item.
-
-      Use this instead of the built-in `typeof` to get the type of an item.
-      It will return the same result across all browsers and includes a bit
-      more detail. Here is what will be returned:
-
-          | Return Value  | Meaning                                              |
-          |---------------|------------------------------------------------------|
-          | 'string'      | String primitive or String object.                   |
-          | 'number'      | Number primitive or Number object.                   |
-          | 'boolean'     | Boolean primitive or Boolean object.                 |
-          | 'null'        | Null value                                           |
-          | 'undefined'   | Undefined value                                      |
-          | 'function'    | A function                                           |
-          | 'array'       | An instance of Array                                 |
-          | 'regexp'      | An instance of RegExp                                |
-          | 'date'        | An instance of Date                                  |
-          | 'class'       | An Ember class (created using Ember.Object.extend()) |
-          | 'instance'    | An Ember object instance                             |
-          | 'error'       | An instance of the Error object                      |
-          | 'object'      | A JavaScript object not inheriting from Ember.Object |
-
-      Examples:
-
-      ```javascript
-      Ember.typeOf();                       // 'undefined'
-      Ember.typeOf(null);                   // 'null'
-      Ember.typeOf(undefined);              // 'undefined'
-      Ember.typeOf('michael');              // 'string'
-      Ember.typeOf(new String('michael'));  // 'string'
-      Ember.typeOf(101);                    // 'number'
-      Ember.typeOf(new Number(101));        // 'number'
-      Ember.typeOf(true);                   // 'boolean'
-      Ember.typeOf(new Boolean(true));      // 'boolean'
-      Ember.typeOf(Ember.makeArray);        // 'function'
-      Ember.typeOf([1,2,90]);               // 'array'
-      Ember.typeOf(/abc/);                  // 'regexp'
-      Ember.typeOf(new Date());             // 'date'
-      Ember.typeOf(Ember.Object.extend());  // 'class'
-      Ember.typeOf(Ember.Object.create());  // 'instance'
-      Ember.typeOf(new Error('teamocil'));  // 'error'
-
-      // "normal" JavaScript object
-      Ember.typeOf({a: 'b'});              // 'object'
-      ```
-
-      @method typeOf
-      @for Ember
-      @param {Object} item the item to check
-      @return {String} the type
-    */
-    function typeOf(item) {
-      var ret, modulePath;
-
-      // ES6TODO: Depends on Ember.Object which is defined in runtime.
-      if (typeof EmberObject === "undefined") {
-        modulePath = 'ember-runtime/system/object';
-        if (requirejs._eak_seen[modulePath]) {
-          EmberObject = requireModule(modulePath)['default'];
-        }
-      }
-
-      ret = (item === null || item === undefined) ? String(item) : TYPE_MAP[toString.call(item)] || 'object';
-
-      if (ret === 'function') {
-        if (EmberObject && EmberObject.detect(item)) ret = 'class';
-      } else if (ret === 'object') {
-        if (item instanceof Error) ret = 'error';
-        else if (EmberObject && item instanceof EmberObject) ret = 'instance';
-        else if (item instanceof Date) ret = 'date';
-      }
-
-      return ret;
-    };
-
-    /**
-      Convenience method to inspect an object. This method will attempt to
-      convert the object into a useful string description.
-
-      It is a pretty simple implementation. If you want something more robust,
-      use something like JSDump: https://github.com/NV/jsDump
-
-      @method inspect
-      @for Ember
-      @param {Object} obj The object you want to inspect.
-      @return {String} A description of the object
-    */
-    function inspect(obj) {
-      var type = typeOf(obj);
-      if (type === 'array') {
-        return '[' + obj + ']';
-      }
-      if (type !== 'object') {
-        return obj + '';
-      }
-
-      var v, ret = [];
-      for(var key in obj) {
-        if (obj.hasOwnProperty(key)) {
-          v = obj[key];
-          if (v === 'toString') { continue; } // ignore useless items
-          if (typeOf(v) === 'function') { v = "function() { ... }"; }
-          ret.push(key + ": " + v);
-        }
-      }
-      return "{" + ret.join(", ") + "}";
-    };
-
-    // The following functions are intentionally minified to keep the functions
-    // below Chrome's function body size inlining limit of 600 chars.
-
-    function apply(t /* target */, m /* method */, a /* args */) {
-      var l = a && a.length;
-      if (!a || !l) { return m.call(t); }
-      switch (l) {
-        case 1:  return m.call(t, a[0]);
-        case 2:  return m.call(t, a[0], a[1]);
-        case 3:  return m.call(t, a[0], a[1], a[2]);
-        case 4:  return m.call(t, a[0], a[1], a[2], a[3]);
-        case 5:  return m.call(t, a[0], a[1], a[2], a[3], a[4]);
-        default: return m.apply(t, a);
-      }
-    };
-
-    function applyStr(t /* target */, m /* method */, a /* args */) {
-      var l = a && a.length;
-      if (!a || !l) { return t[m](); }
-      switch (l) {
-        case 1:  return t[m](a[0]);
-        case 2:  return t[m](a[0], a[1]);
-        case 3:  return t[m](a[0], a[1], a[2]);
-        case 4:  return t[m](a[0], a[1], a[2], a[3]);
-        case 5:  return t[m](a[0], a[1], a[2], a[3], a[4]);
-        default: return t[m].apply(t, a);
-      }
-    };
-
-    __exports__.generateGuid = generateGuid;
-    __exports__.GUID_KEY = GUID_KEY;
-    __exports__.GUID_PREFIX = GUID_PREFIX;
-    __exports__.guidFor = guidFor;
-    __exports__.META_DESC = META_DESC;
-    __exports__.EMPTY_META = EMPTY_META;
-    __exports__.META_KEY = META_KEY;
-    __exports__.meta = meta;
-    __exports__.getMeta = getMeta;
-    __exports__.setMeta = setMeta;
-    __exports__.metaPath = metaPath;
-    __exports__.inspect = inspect;
-    __exports__.typeOf = typeOf;
-    __exports__.tryCatchFinally = tryCatchFinally;
-    __exports__.isArray = isArray;
-    __exports__.makeArray = makeArray;
-    __exports__.canInvoke = canInvoke;
-    __exports__.tryInvoke = tryInvoke;
-    __exports__.tryFinally = tryFinally;
-    __exports__.wrap = wrap;
-    __exports__.applyStr = applyStr;
-    __exports__.apply = apply;
-  });
-define("backburner/queue", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    function Queue(daq, name, options) {
-      this.daq = daq;
-      this.name = name;
-      this.options = options;
-      this._queue = [];
-    }
-
-    Queue.prototype = {
-      daq: null,
-      name: null,
-      options: null,
-      _queue: null,
-
-      push: function(target, method, args, stack) {
-        var queue = this._queue;
-        queue.push(target, method, args, stack);
-        return {queue: this, target: target, method: method};
-      },
-
-      pushUnique: function(target, method, args, stack) {
-        var queue = this._queue, currentTarget, currentMethod, i, l;
-
-        for (i = 0, l = queue.length; i < l; i += 4) {
-          currentTarget = queue[i];
-          currentMethod = queue[i+1];
-
-          if (currentTarget === target && currentMethod === method) {
-            queue[i+2] = args; // replace args
-            queue[i+3] = stack; // replace stack
-            return {queue: this, target: target, method: method}; // TODO: test this code path
-          }
-        }
-
-        this._queue.push(target, method, args, stack);
-        return {queue: this, target: target, method: method};
-      },
-
-      // TODO: remove me, only being used for Ember.run.sync
-      flush: function() {
-        var queue = this._queue,
-            options = this.options,
-            before = options && options.before,
-            after = options && options.after,
-            target, method, args, stack, i, l = queue.length;
-
-        if (l && before) { before(); }
-        for (i = 0; i < l; i += 4) {
-          target = queue[i];
-          method = queue[i+1];
-          args   = queue[i+2];
-          stack  = queue[i+3]; // Debugging assistance
-
-          // TODO: error handling
-          if (args && args.length > 0) {
-            method.apply(target, args);
-          } else {
-            method.call(target);
-          }
-        }
-        if (l && after) { after(); }
-
-        // check if new items have been added
-        if (queue.length > l) {
-          this._queue = queue.slice(l);
-          this.flush();
-        } else {
-          this._queue.length = 0;
-        }
-      },
-
-      cancel: function(actionToCancel) {
-        var queue = this._queue, currentTarget, currentMethod, i, l;
-
-        for (i = 0, l = queue.length; i < l; i += 4) {
-          currentTarget = queue[i];
-          currentMethod = queue[i+1];
-
-          if (currentTarget === actionToCancel.target && currentMethod === actionToCancel.method) {
-            queue.splice(i, 4);
-            return true;
-          }
-        }
-
-        // if not found in current queue
-        // could be in the queue that is being flushed
-        queue = this._queueBeingFlushed;
-        if (!queue) {
-          return;
-        }
-        for (i = 0, l = queue.length; i < l; i += 4) {
-          currentTarget = queue[i];
-          currentMethod = queue[i+1];
-
-          if (currentTarget === actionToCancel.target && currentMethod === actionToCancel.method) {
-            // don't mess with array during flush
-            // just nullify the method
-            queue[i+1] = null;
-            return true;
-          }
-        }
-      }
-    };
-
-    __exports__.Queue = Queue;
-  });
-
-define("backburner/deferred_action_queues", 
-  ["backburner/queue","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Queue = __dependency1__.Queue;
-
-    function DeferredActionQueues(queueNames, options) {
-      var queues = this.queues = {};
-      this.queueNames = queueNames = queueNames || [];
-
-      var queueName;
-      for (var i = 0, l = queueNames.length; i < l; i++) {
-        queueName = queueNames[i];
-        queues[queueName] = new Queue(this, queueName, options[queueName]);
-      }
-    }
-
-    DeferredActionQueues.prototype = {
-      queueNames: null,
-      queues: null,
-
-      schedule: function(queueName, target, method, args, onceFlag, stack) {
-        var queues = this.queues,
-            queue = queues[queueName];
-
-        if (!queue) { throw new Error("You attempted to schedule an action in a queue (" + queueName + ") that doesn't exist"); }
-
-        if (onceFlag) {
-          return queue.pushUnique(target, method, args, stack);
-        } else {
-          return queue.push(target, method, args, stack);
-        }
-      },
-
-      flush: function() {
-        var queues = this.queues,
-            queueNames = this.queueNames,
-            queueName, queue, queueItems, priorQueueNameIndex,
-            queueNameIndex = 0, numberOfQueues = queueNames.length;
-
-        outerloop:
-        while (queueNameIndex < numberOfQueues) {
-          queueName = queueNames[queueNameIndex];
-          queue = queues[queueName];
-          queueItems = queue._queueBeingFlushed = queue._queue.slice();
-          queue._queue = [];
-
-          var options = queue.options,
-              before = options && options.before,
-              after = options && options.after,
-              target, method, args, stack,
-              queueIndex = 0, numberOfQueueItems = queueItems.length;
-
-          if (numberOfQueueItems && before) { before(); }
-          while (queueIndex < numberOfQueueItems) {
-            target = queueItems[queueIndex];
-            method = queueItems[queueIndex+1];
-            args   = queueItems[queueIndex+2];
-            stack  = queueItems[queueIndex+3]; // Debugging assistance
-
-            if (typeof method === 'string') { method = target[method]; }
-
-            // method could have been nullified / canceled during flush
-            if (method) {
-              // TODO: error handling
-              if (args && args.length > 0) {
-                method.apply(target, args);
-              } else {
-                method.call(target);
-              }
-            }
-
-            queueIndex += 4;
-          }
-          queue._queueBeingFlushed = null;
-          if (numberOfQueueItems && after) { after(); }
-
-          if ((priorQueueNameIndex = indexOfPriorQueueWithActions(this, queueNameIndex)) !== -1) {
-            queueNameIndex = priorQueueNameIndex;
-            continue outerloop;
-          }
-
-          queueNameIndex++;
-        }
-      }
-    };
-
-    function indexOfPriorQueueWithActions(daq, currentQueueIndex) {
-      var queueName, queue;
-
-      for (var i = 0, l = currentQueueIndex; i <= l; i++) {
-        queueName = daq.queueNames[i];
-        queue = daq.queues[queueName];
-        if (queue._queue.length) { return i; }
-      }
-
-      return -1;
-    }
-
-    __exports__.DeferredActionQueues = DeferredActionQueues;
-  });
-
-define("backburner", 
-  ["backburner/deferred_action_queues","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var DeferredActionQueues = __dependency1__.DeferredActionQueues;
-
-    var slice = [].slice,
-        pop = [].pop,
-        throttlers = [],
-        debouncees = [],
-        timers = [],
-        autorun, laterTimer, laterTimerExpiresAt,
-        global = this,
-        NUMBER = /\d+/;
-
-    function isCoercableNumber(number) {
-      return typeof number === 'number' || NUMBER.test(number);
-    }
-
-    function Backburner(queueNames, options) {
-      this.queueNames = queueNames;
-      this.options = options || {};
-      if (!this.options.defaultQueue) {
-        this.options.defaultQueue = queueNames[0];
-      }
-      this.instanceStack = [];
-    }
-
-    Backburner.prototype = {
-      queueNames: null,
-      options: null,
-      currentInstance: null,
-      instanceStack: null,
-
-      begin: function() {
-        var onBegin = this.options && this.options.onBegin,
-            previousInstance = this.currentInstance;
-
-        if (previousInstance) {
-          this.instanceStack.push(previousInstance);
-        }
-
-        this.currentInstance = new DeferredActionQueues(this.queueNames, this.options);
-        if (onBegin) {
-          onBegin(this.currentInstance, previousInstance);
-        }
-      },
-
-      end: function() {
-        var onEnd = this.options && this.options.onEnd,
-            currentInstance = this.currentInstance,
-            nextInstance = null;
-
-        try {
-          currentInstance.flush();
-        } finally {
-          this.currentInstance = null;
-
-          if (this.instanceStack.length) {
-            nextInstance = this.instanceStack.pop();
-            this.currentInstance = nextInstance;
-          }
-
-          if (onEnd) {
-            onEnd(currentInstance, nextInstance);
-          }
-        }
-      },
-
-      run: function(target, method /*, args */) {
-        var ret;
-        this.begin();
-
-        if (!method) {
-          method = target;
-          target = null;
-        }
-
-        if (typeof method === 'string') {
-          method = target[method];
-        }
-
-        // Prevent Safari double-finally.
-        var finallyAlreadyCalled = false;
-        try {
-          if (arguments.length > 2) {
-            ret = method.apply(target, slice.call(arguments, 2));
-          } else {
-            ret = method.call(target);
-          }
-        } finally {
-          if (!finallyAlreadyCalled) {
-            finallyAlreadyCalled = true;
-            this.end();
-          }
-        }
-        return ret;
-      },
-
-      defer: function(queueName, target, method /* , args */) {
-        if (!method) {
-          method = target;
-          target = null;
-        }
-
-        if (typeof method === 'string') {
-          method = target[method];
-        }
-
-        var stack = this.DEBUG ? new Error() : undefined,
-            args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
-        if (!this.currentInstance) { createAutorun(this); }
-        return this.currentInstance.schedule(queueName, target, method, args, false, stack);
-      },
-
-      deferOnce: function(queueName, target, method /* , args */) {
-        if (!method) {
-          method = target;
-          target = null;
-        }
-
-        if (typeof method === 'string') {
-          method = target[method];
-        }
-
-        var stack = this.DEBUG ? new Error() : undefined,
-            args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
-        if (!this.currentInstance) { createAutorun(this); }
-        return this.currentInstance.schedule(queueName, target, method, args, true, stack);
-      },
-
-      setTimeout: function() {
-        var args = slice.call(arguments);
-        var length = args.length;
-        var method, wait, target;
-        var self = this;
-        var methodOrTarget, methodOrWait, methodOrArgs;
-
-        if (length === 0) {
-          return;
-        } else if (length === 1) {
-          method = args.shift();
-          wait = 0;
-        } else if (length === 2) {
-          methodOrTarget = args[0];
-          methodOrWait = args[1];
-
-          if (typeof methodOrWait === 'function' || typeof  methodOrTarget[methodOrWait] === 'function') {
-            target = args.shift();
-            method = args.shift();
-            wait = 0;
-          } else if (isCoercableNumber(methodOrWait)) {
-            method = args.shift();
-            wait = args.shift();
-          } else {
-            method = args.shift();
-            wait =  0;
-          }
-        } else {
-          var last = args[args.length - 1];
-
-          if (isCoercableNumber(last)) {
-            wait = args.pop();
-          }
-
-          methodOrTarget = args[0];
-          methodOrArgs = args[1];
-
-          if (typeof methodOrArgs === 'function' || (typeof methodOrArgs === 'string' &&
-                                                     methodOrTarget !== null &&
-                                                     methodOrArgs in methodOrTarget)) {
-            target = args.shift();
-            method = args.shift();
-          } else {
-            method = args.shift();
-          }
-        }
-
-        var executeAt = (+new Date()) + parseInt(wait, 10);
-
-        if (typeof method === 'string') {
-          method = target[method];
-        }
-
-        function fn() {
-          method.apply(target, args);
-        }
-
-        // find position to insert - TODO: binary search
-        var i, l;
-        for (i = 0, l = timers.length; i < l; i += 2) {
-          if (executeAt < timers[i]) { break; }
-        }
-
-        timers.splice(i, 0, executeAt, fn);
-
-        updateLaterTimer(self, executeAt, wait);
-
-        return fn;
-      },
-
-      throttle: function(target, method /* , args, wait, [immediate] */) {
-        var self = this,
-            args = arguments,
-            immediate = pop.call(args),
-            wait,
-            throttler,
-            index,
-            timer;
-
-        if (typeof immediate === "number" || typeof immediate === "string") {
-          wait = immediate;
-          immediate = true;
-        } else {
-          wait = pop.call(args);
-        }
-
-        wait = parseInt(wait, 10);
-
-        index = findThrottler(target, method);
-        if (index > -1) { return throttlers[index]; } // throttled
-
-        timer = global.setTimeout(function() {
-          if (!immediate) {
-            self.run.apply(self, args);
-          }
-          var index = findThrottler(target, method);
-          if (index > -1) { throttlers.splice(index, 1); }
-        }, wait);
-
-        if (immediate) {
-          self.run.apply(self, args);
-        }
-
-        throttler = [target, method, timer];
-
-        throttlers.push(throttler);
-
-        return throttler;
-      },
-
-      debounce: function(target, method /* , args, wait, [immediate] */) {
-        var self = this,
-            args = arguments,
-            immediate = pop.call(args),
-            wait,
-            index,
-            debouncee,
-            timer;
-
-        if (typeof immediate === "number" || typeof immediate === "string") {
-          wait = immediate;
-          immediate = false;
-        } else {
-          wait = pop.call(args);
-        }
-
-        wait = parseInt(wait, 10);
-        // Remove debouncee
-        index = findDebouncee(target, method);
-
-        if (index > -1) {
-          debouncee = debouncees[index];
-          debouncees.splice(index, 1);
-          clearTimeout(debouncee[2]);
-        }
-
-        timer = global.setTimeout(function() {
-          if (!immediate) {
-            self.run.apply(self, args);
-          }
-          var index = findDebouncee(target, method);
-          if (index > -1) {
-            debouncees.splice(index, 1);
-          }
-        }, wait);
-
-        if (immediate && index === -1) {
-          self.run.apply(self, args);
-        }
-
-        debouncee = [target, method, timer];
-
-        debouncees.push(debouncee);
-
-        return debouncee;
-      },
-
-      cancelTimers: function() {
-        var i, len;
-
-        for (i = 0, len = throttlers.length; i < len; i++) {
-          clearTimeout(throttlers[i][2]);
-        }
-        throttlers = [];
-
-        for (i = 0, len = debouncees.length; i < len; i++) {
-          clearTimeout(debouncees[i][2]);
-        }
-        debouncees = [];
-
-        if (laterTimer) {
-          clearTimeout(laterTimer);
-          laterTimer = null;
-        }
-        timers = [];
-
-        if (autorun) {
-          clearTimeout(autorun);
-          autorun = null;
-        }
-      },
-
-      hasTimers: function() {
-        return !!timers.length || autorun;
-      },
-
-      cancel: function(timer) {
-        var timerType = typeof timer;
-
-        if (timer && timerType === 'object' && timer.queue && timer.method) { // we're cancelling a deferOnce
-          return timer.queue.cancel(timer);
-        } else if (timerType === 'function') { // we're cancelling a setTimeout
-          for (var i = 0, l = timers.length; i < l; i += 2) {
-            if (timers[i + 1] === timer) {
-              timers.splice(i, 2); // remove the two elements
-              return true;
-            }
-          }
-        } else if (Object.prototype.toString.call(timer) === "[object Array]"){ // we're cancelling a throttle or debounce
-          return this._cancelItem(findThrottler, throttlers, timer) ||
-                   this._cancelItem(findDebouncee, debouncees, timer);
-        } else {
-          return; // timer was null or not a timer
-        }
-      },
-
-      _cancelItem: function(findMethod, array, timer){
-        var item,
-            index;
-
-        if (timer.length < 3) { return false; }
-
-        index = findMethod(timer[0], timer[1]);
-
-        if(index > -1) {
-
-          item = array[index];
-
-          if(item[2] === timer[2]){
-            array.splice(index, 1);
-            clearTimeout(timer[2]);
-            return true;
-          }
-        }
-
-        return false;
-      }
-
-    };
-
-    Backburner.prototype.schedule = Backburner.prototype.defer;
-    Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
-    Backburner.prototype.later = Backburner.prototype.setTimeout;
-
-    function createAutorun(backburner) {
-      backburner.begin();
-      autorun = global.setTimeout(function() {
-        autorun = null;
-        backburner.end();
-      });
-    }
-
-    function updateLaterTimer(self, executeAt, wait) {
-      if (!laterTimer || executeAt < laterTimerExpiresAt) {
-        if (laterTimer) {
-          clearTimeout(laterTimer);
-        }
-        laterTimer = global.setTimeout(function() {
-          laterTimer = null;
-          laterTimerExpiresAt = null;
-          executeTimers(self);
-        }, wait);
-        laterTimerExpiresAt = executeAt;
-      }
-    }
-
-    function executeTimers(self) {
-      var now = +new Date(),
-          time, fns, i, l;
-
-      self.run(function() {
-        // TODO: binary search
-        for (i = 0, l = timers.length; i < l; i += 2) {
-          time = timers[i];
-          if (time > now) { break; }
-        }
-
-        fns = timers.splice(0, i);
-
-        for (i = 1, l = fns.length; i < l; i += 2) {
-          self.schedule(self.options.defaultQueue, null, fns[i]);
-        }
-      });
-
-      if (timers.length) {
-        updateLaterTimer(self, timers[0], timers[0] - now);
-      }
-    }
-
-    function findDebouncee(target, method) {
-      var debouncee,
-          index = -1;
-
-      for (var i = 0, l = debouncees.length; i < l; i++) {
-        debouncee = debouncees[i];
-        if (debouncee[0] === target && debouncee[1] === method) {
-          index = i;
-          break;
-        }
-      }
-
-      return index;
-    }
-
-    function findThrottler(target, method) {
-      var throttler,
-          index = -1;
-
-      for (var i = 0, l = throttlers.length; i < l; i++) {
-        throttler = throttlers[i];
-        if (throttler[0] === target && throttler[1] === method) {
-          index = i;
-          break;
-        }
-      }
-
-      return index;
-    }
-
-    __exports__.Backburner = Backburner;
-  });
-
-define("ember-metal/watch_key", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/platform","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var meta = __dependency2__.meta;
-    var typeOf = __dependency2__.typeOf;
-    var platform = __dependency3__.platform;
-
-    var metaFor = meta, // utils.js
-        MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
-        o_defineProperty = platform.defineProperty;
-
-    function watchKey(obj, keyName, meta) {
-      // can't watch length on Array - it is special...
-      if (keyName === 'length' && typeOf(obj) === 'array') { return; }
-
-      var m = meta || metaFor(obj), watching = m.watching;
-
-      // activate watching first time
-      if (!watching[keyName]) {
-        watching[keyName] = 1;
-
-        if ('function' === typeof obj.willWatchProperty) {
-          obj.willWatchProperty(keyName);
-        }
-
-        if (MANDATORY_SETTER && keyName in obj) {
-          m.values[keyName] = obj[keyName];
-          o_defineProperty(obj, keyName, {
-            configurable: true,
-            enumerable: obj.propertyIsEnumerable(keyName),
-            set: Ember.MANDATORY_SETTER_FUNCTION,
-            get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
-          });
-        }
-      } else {
-        watching[keyName] = (watching[keyName] || 0) + 1;
-      }
-    };
-
-    function unwatchKey(obj, keyName, meta) {
-      var m = meta || metaFor(obj), watching = m.watching;
-
-      if (watching[keyName] === 1) {
-        watching[keyName] = 0;
-
-        if ('function' === typeof obj.didUnwatchProperty) {
-          obj.didUnwatchProperty(keyName);
-        }
-
-        if (MANDATORY_SETTER && keyName in obj) {
-          o_defineProperty(obj, keyName, {
-            configurable: true,
-            enumerable: obj.propertyIsEnumerable(keyName),
-            set: function(val) {
-              // redefine to set as enumerable
-              o_defineProperty(obj, keyName, {
-                configurable: true,
-                writable: true,
-                enumerable: true,
-                value: val
-              });
-              delete m.values[keyName];
-            },
-            get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
-          });
-        }
-      } else if (watching[keyName] > 1) {
-        watching[keyName]--;
-      }
-    };
-
-    __exports__.watchKey = watchKey;
-    __exports__.unwatchKey = unwatchKey;
-  });
-define("ember-metal/watch_path", 
-  ["ember-metal/utils","ember-metal/chains","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var meta = __dependency1__.meta;
-    var typeOf = __dependency1__.typeOf;
-    var ChainNode = __dependency2__.ChainNode;
-
-    var metaFor = meta;
-
-    // get the chains for the current object. If the current object has
-    // chains inherited from the proto they will be cloned and reconfigured for
-    // the current object.
-    function chainsFor(obj, meta) {
-      var m = meta || metaFor(obj), ret = m.chains;
-      if (!ret) {
-        ret = m.chains = new ChainNode(null, null, obj);
-      } else if (ret.value() !== obj) {
-        ret = m.chains = ret.copy(obj);
-      }
-      return ret;
-    }
-
-    function watchPath(obj, keyPath, meta) {
-      // can't watch length on Array - it is special...
-      if (keyPath === 'length' && typeOf(obj) === 'array') { return; }
-
-      var m = meta || metaFor(obj), watching = m.watching;
-
-      if (!watching[keyPath]) { // activate watching first time
-        watching[keyPath] = 1;
-        chainsFor(obj, m).add(keyPath);
-      } else {
-        watching[keyPath] = (watching[keyPath] || 0) + 1;
-      }
-    };
-
-    function unwatchPath(obj, keyPath, meta) {
-      var m = meta || metaFor(obj), watching = m.watching;
-
-      if (watching[keyPath] === 1) {
-        watching[keyPath] = 0;
-        chainsFor(obj, m).remove(keyPath);
-      } else if (watching[keyPath] > 1) {
-        watching[keyPath]--;
-      }
-    };
-
-    __exports__.watchPath = watchPath;
-    __exports__.unwatchPath = unwatchPath;
-  });
-define("ember-metal/watching", 
-  ["ember-metal/utils","ember-metal/chains","ember-metal/watch_key","ember-metal/watch_path","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember-metal
-    */
-
-    var meta = __dependency1__.meta;
-    var META_KEY = __dependency1__.META_KEY;
-    var GUID_KEY = __dependency1__.GUID_KEY;
-    var typeOf = __dependency1__.typeOf;
-    var generateGuid = __dependency1__.generateGuid;
-    var removeChainWatcher = __dependency2__.removeChainWatcher;
-    var flushPendingChains = __dependency2__.flushPendingChains;
-    var watchKey = __dependency3__.watchKey;
-    var unwatchKey = __dependency3__.unwatchKey;
-    var watchPath = __dependency4__.watchPath;
-    var unwatchPath = __dependency4__.unwatchPath;
-
-    var metaFor = meta, // utils.js
-        IS_PATH = /[\.\*]/;
-
-    // returns true if the passed path is just a keyName
-    function isKeyName(path) {
-      return path==='*' || !IS_PATH.test(path);
-    }
-
-    /**
-      Starts watching a property on an object. Whenever the property changes,
-      invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
-      primitive used by observers and dependent keys; usually you will never call
-      this method directly but instead use higher level methods like
-      `Ember.addObserver()`
-
-      @private
-      @method watch
-      @for Ember
-      @param obj
-      @param {String} keyName
-    */
-    function watch(obj, _keyPath, m) {
-      // can't watch length on Array - it is special...
-      if (_keyPath === 'length' && typeOf(obj) === 'array') { return; }
-
-      if (isKeyName(_keyPath)) {
-        watchKey(obj, _keyPath, m);
-      } else {
-        watchPath(obj, _keyPath, m);
-      }
-    };
-
-    function isWatching(obj, key) {
-      var meta = obj[META_KEY];
-      return (meta && meta.watching[key]) > 0;
-    };
-
-    watch.flushPending = flushPendingChains;
-
-    function unwatch(obj, _keyPath, m) {
-      // can't watch length on Array - it is special...
-      if (_keyPath === 'length' && typeOf(obj) === 'array') { return; }
-
-      if (isKeyName(_keyPath)) {
-        unwatchKey(obj, _keyPath, m);
-      } else {
-        unwatchPath(obj, _keyPath, m);
-      }
-    };
-
-    /**
-      Call on an object when you first beget it from another object. This will
-      setup any chained watchers on the object instance as needed. This method is
-      safe to call multiple times.
-
-      @private
-      @method rewatch
-      @for Ember
-      @param obj
-    */
-    function rewatch(obj) {
-      var m = obj[META_KEY], chains = m && m.chains;
-
-      // make sure the object has its own guid.
-      if (GUID_KEY in obj && !obj.hasOwnProperty(GUID_KEY)) {
-        generateGuid(obj);
-      }
-
-      // make sure any chained watchers update.
-      if (chains && chains.value() !== obj) {
-        m.chains = chains.copy(obj);
-      }
-    };
-
-    var NODE_STACK = [];
-
-    /**
-      Tears down the meta on an object so that it can be garbage collected.
-      Multiple calls will have no effect.
-
-      @method destroy
-      @for Ember
-      @param {Object} obj  the object to destroy
-      @return {void}
-    */
-    function destroy(obj) {
-      var meta = obj[META_KEY], node, nodes, key, nodeObject;
-      if (meta) {
-        obj[META_KEY] = null;
-        // remove chainWatchers to remove circular references that would prevent GC
-        node = meta.chains;
-        if (node) {
-          NODE_STACK.push(node);
-          // process tree
-          while (NODE_STACK.length > 0) {
-            node = NODE_STACK.pop();
-            // push children
-            nodes = node._chains;
-            if (nodes) {
-              for (key in nodes) {
-                if (nodes.hasOwnProperty(key)) {
-                  NODE_STACK.push(nodes[key]);
-                }
-              }
-            }
-            // remove chainWatcher in node object
-            if (node._watching) {
-              nodeObject = node._object;
-              if (nodeObject) {
-                removeChainWatcher(nodeObject, node._key, node);
-              }
-            }
-          }
-        }
-      }
-    };
-
-    __exports__.watch = watch;
-    __exports__.isWatching = isWatching;
-    __exports__.unwatch = unwatch;
-    __exports__.rewatch = rewatch;
-    __exports__.destroy = destroy;
-  });
-})();
-
-(function() {
-/**
-  @class RSVP
-  @module RSVP
-  */
-define("rsvp/all", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    /**
-      This is a convenient alias for `RSVP.Promise.all`.
-
-      @method all
-      @for RSVP
-      @param {Array} array Array of promises.
-      @param {String} label An optional label. This is useful
-      for tooling.
-      @static
-    */
-    __exports__["default"] = function all(array, label) {
-      return Promise.all(array, label);
-    };
-  });
-define("rsvp/all_settled", 
-  ["./promise","./utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-    var isArray = __dependency2__.isArray;
-    var isNonThenable = __dependency2__.isNonThenable;
-
-    /**
-      `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing
-      a fail-fast method, it waits until all the promises have returned and
-      shows you all the results. This is useful if you want to handle multiple
-      promises' failure states together as a set.
-
-      Returns a promise that is fulfilled when all the given promises have been
-      settled. The return promise is fulfilled with an array of the states of
-      the promises passed into the `promises` array argument.
-
-      Each state object will either indicate fulfillment or rejection, and
-      provide the corresponding value or reason. The states will take one of
-      the following formats:
-
-      ```javascript
-      { state: 'fulfilled', value: value }
-        or
-      { state: 'rejected', reason: reason }
-      ```
-
-      Example:
-
-      ```javascript
-      var promise1 = RSVP.Promise.resolve(1);
-      var promise2 = RSVP.Promise.reject(new Error('2'));
-      var promise3 = RSVP.Promise.reject(new Error('3'));
-      var promises = [ promise1, promise2, promise3 ];
-
-      RSVP.allSettled(promises).then(function(array){
-        // array == [
-        //   { state: 'fulfilled', value: 1 },
-        //   { state: 'rejected', reason: Error },
-        //   { state: 'rejected', reason: Error }
-        // ]
-        // Note that for the second item, reason.message will be "2", and for the
-        // third item, reason.message will be "3".
-      }, function(error) {
-        // Not run. (This block would only be called if allSettled had failed,
-        // for instance if passed an incorrect argument type.)
-      });
-      ```
-
-      @method allSettled
-      @for RSVP
-      @param {Array} promises
-      @param {String} label - optional string that describes the promise.
-      Useful for tooling.
-      @return {Promise} promise that is fulfilled with an array of the settled
-      states of the constituent promises.
-      @static
-    */
-
-    __exports__["default"] = function allSettled(entries, label) {
-      return new Promise(function(resolve, reject) {
-        if (!isArray(entries)) {
-          throw new TypeError('You must pass an array to allSettled.');
-        }
-
-        var remaining = entries.length;
-        var entry;
-
-        if (remaining === 0) {
-          resolve([]);
-          return;
-        }
-
-        var results = new Array(remaining);
-
-        function fulfilledResolver(index) {
-          return function(value) {
-            resolveAll(index, fulfilled(value));
-          };
-        }
-
-        function rejectedResolver(index) {
-          return function(reason) {
-            resolveAll(index, rejected(reason));
-          };
-        }
-
-        function resolveAll(index, value) {
-          results[index] = value;
-          if (--remaining === 0) {
-            resolve(results);
-          }
-        }
-
-        for (var index = 0; index < entries.length; index++) {
-          entry = entries[index];
-
-          if (isNonThenable(entry)) {
-            resolveAll(index, fulfilled(entry));
-          } else {
-            Promise.cast(entry).then(fulfilledResolver(index), rejectedResolver(index));
-          }
-        }
-      }, label);
-    };
-
-    function fulfilled(value) {
-      return { state: 'fulfilled', value: value };
-    }
-
-    function rejected(reason) {
-      return { state: 'rejected', reason: reason };
-    }
-  });
-define("rsvp/config", 
-  ["./events","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var EventTarget = __dependency1__["default"];
-
-    var config = {
-      instrument: false
-    };
-
-    EventTarget.mixin(config);
-
-    function configure(name, value) {
-      if (name === 'onerror') {
-        // handle for legacy users that expect the actual
-        // error to be passed to their function added via
-        // `RSVP.configure('onerror', someFunctionHere);`
-        config.on('error', value);
-        return;
-      }
-
-      if (arguments.length === 2) {
-        config[name] = value;
-      } else {
-        return config[name];
-      }
-    }
-
-    __exports__.config = config;
-    __exports__.configure = configure;
-  });
-define("rsvp/defer", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    /**
-      `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.
-      `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s
-      interface. New code should use the `RSVP.Promise` constructor instead.
-
-      The object returned from `RSVP.defer` is a plain object with three properties:
-
-      * promise - an `RSVP.Promise`.
-      * reject - a function that causes the `promise` property on this object to
-        become rejected
-      * resolve - a function that causes the `promise` property on this object to
-        become fulfilled.
-
-      Example:
-
-       ```javascript
-       var deferred = RSVP.defer();
-
-       deferred.resolve("Success!");
-
-       deferred.promise.then(function(value){
-         // value here is "Success!"
-       });
-       ```
-
-      @method defer
-      @for RSVP
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Object}
-     */
-
-    __exports__["default"] = function defer(label) {
-      var deferred = { };
-
-      deferred.promise = new Promise(function(resolve, reject) {
-        deferred.resolve = resolve;
-        deferred.reject = reject;
-      }, label);
-
-      return deferred;
-    };
-  });
-define("rsvp/events", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    var indexOf = function(callbacks, callback) {
-      for (var i=0, l=callbacks.length; i<l; i++) {
-        if (callbacks[i] === callback) { return i; }
-      }
-
-      return -1;
-    };
-
-    var callbacksFor = function(object) {
-      var callbacks = object._promiseCallbacks;
-
-      if (!callbacks) {
-        callbacks = object._promiseCallbacks = {};
-      }
-
-      return callbacks;
-    };
-
-    /**
-      @class RSVP.EventTarget
-    */
-    __exports__["default"] = {
-
-      /**
-        `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For
-        Example:
-
-        ```javascript
-        var object = {};
-
-        RSVP.EventTarget.mixin(object);
-
-        object.on("finished", function(event) {
-          // handle event
-        });
-
-        object.trigger("finished", { detail: value });
-        ```
-
-        `EventTarget.mixin` also works with prototypes:
-
-        ```javascript
-        var Person = function() {};
-        RSVP.EventTarget.mixin(Person.prototype);
-
-        var yehuda = new Person();
-        var tom = new Person();
-
-        yehuda.on("poke", function(event) {
-          console.log("Yehuda says OW");
-        });
-
-        tom.on("poke", function(event) {
-          console.log("Tom says OW");
-        });
-
-        yehuda.trigger("poke");
-        tom.trigger("poke");
-        ```
-
-        @method mixin
-        @param {Object} object object to extend with EventTarget methods
-        @private
-      */
-      mixin: function(object) {
-        object.on = this.on;
-        object.off = this.off;
-        object.trigger = this.trigger;
-        object._promiseCallbacks = undefined;
-        return object;
-      },
-
-      /**
-        Registers a callback to be executed when `eventName` is triggered
-
-        ```javascript
-        object.on('event', function(eventInfo){
-          // handle the event
-        });
-
-        object.trigger('event');
-        ```
-
-        @method on
-        @param {String} eventName name of the event to listen for
-        @param {Function} callback function to be called when the event is triggered.
-        @private
-      */
-      on: function(eventName, callback) {
-        var allCallbacks = callbacksFor(this), callbacks;
-
-        callbacks = allCallbacks[eventName];
-
-        if (!callbacks) {
-          callbacks = allCallbacks[eventName] = [];
-        }
-
-        if (indexOf(callbacks, callback) === -1) {
-          callbacks.push(callback);
-        }
-      },
-
-      /**
-        You can use `off` to stop firing a particular callback for an event:
-
-        ```javascript
-        function doStuff() { // do stuff! }
-        object.on('stuff', doStuff);
-
-        object.trigger('stuff'); // doStuff will be called
-
-        // Unregister ONLY the doStuff callback
-        object.off('stuff', doStuff);
-        object.trigger('stuff'); // doStuff will NOT be called
-        ```
-
-        If you don't pass a `callback` argument to `off`, ALL callbacks for the
-        event will not be executed when the event fires. For example:
-
-        ```javascript
-        var callback1 = function(){};
-        var callback2 = function(){};
-
-        object.on('stuff', callback1);
-        object.on('stuff', callback2);
-
-        object.trigger('stuff'); // callback1 and callback2 will be executed.
-
-        object.off('stuff');
-        object.trigger('stuff'); // callback1 and callback2 will not be executed!
-        ```
-
-        @method off
-        @param {String} eventName event to stop listening to
-        @param {Function} callback optional argument. If given, only the function
-        given will be removed from the event's callback queue. If no `callback`
-        argument is given, all callbacks will be removed from the event's callback
-        queue.
-        @private
-
-      */
-      off: function(eventName, callback) {
-        var allCallbacks = callbacksFor(this), callbacks, index;
-
-        if (!callback) {
-          allCallbacks[eventName] = [];
-          return;
-        }
-
-        callbacks = allCallbacks[eventName];
-
-        index = indexOf(callbacks, callback);
-
-        if (index !== -1) { callbacks.splice(index, 1); }
-      },
-
-      /**
-        Use `trigger` to fire custom events. For example:
-
-        ```javascript
-        object.on('foo', function(){
-          console.log('foo event happened!');
-        });
-        object.trigger('foo');
-        // 'foo event happened!' logged to the console
-        ```
-
-        You can also pass a value as a second argument to `trigger` that will be
-        passed as an argument to all event listeners for the event:
-
-        ```javascript
-        object.on('foo', function(value){
-          console.log(value.name);
-        });
-
-        object.trigger('foo', { name: 'bar' });
-        // 'bar' logged to the console
-        ```
-
-        @method trigger
-        @param {String} eventName name of the event to be triggered
-        @param {Any} options optional value to be passed to any event handlers for
-        the given `eventName`
-        @private
-      */
-      trigger: function(eventName, options) {
-        var allCallbacks = callbacksFor(this),
-            callbacks, callbackTuple, callback, binding;
-
-        if (callbacks = allCallbacks[eventName]) {
-          // Don't cache the callbacks.length since it may grow
-          for (var i=0; i<callbacks.length; i++) {
-            callback = callbacks[i];
-
-            callback(options);
-          }
-        }
-      }
-    };
-  });
-define("rsvp/filter", 
-  ["./all","./map","./utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var all = __dependency1__["default"];
-    var map = __dependency2__["default"];
-    var isFunction = __dependency3__.isFunction;
-    var isArray = __dependency3__.isArray;
-
-    /**
-     `RSVP.filter` is similar to JavaScript's native `filter` method, except that it
-      waits for all promises to become fulfilled before running the `filterFn` on
-      each item in given to `promises`. `RSVP.filter` returns a promise that will
-      become fulfilled with the result of running `filterFn` on the values the
-      promises become fulfilled with.
-
-      For example:
-
-      ```javascript
-
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.resolve(2);
-      var promise3 = RSVP.resolve(3);
-
-      var filterFn = function(item){
-        return item > 1;
-      };
-
-      RSVP.filter(promises, filterFn).then(function(result){
-        // result is [ 2, 3 ]
-      });
-      ```
-
-      If any of the `promises` given to `RSVP.filter` are rejected, the first promise
-      that is rejected will be given as an argument to the returned promise's
-      rejection handler. For example:
-
-      ```javascript
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.reject(new Error("2"));
-      var promise3 = RSVP.reject(new Error("3"));
-      var promises = [ promise1, promise2, promise3 ];
-
-      var filterFn = function(item){
-        return item > 1;
-      };
-
-      RSVP.filter(promises, filterFn).then(function(array){
-        // Code here never runs because there are rejected promises!
-      }, function(reason) {
-        // reason.message === "2"
-      });
-      ```
-
-      `RSVP.filter` will also wait for any promises returned from `filterFn`.
-      For instance, you may want to fetch a list of users then return a subset
-      of those users based on some asynchronous operation:
-
-      ```javascript
-
-      var alice = { name: 'alice' };
-      var bob   = { name: 'bob' };
-      var users = [ alice, bob ];
-
-      var promises = users.map(function(user){
-        return RSVP.resolve(user);
-      });
-
-      var filterFn = function(user){
-        // Here, Alice has permissions to create a blog post, but Bob does not.
-        return getPrivilegesForUser(user).then(function(privs){
-          return privs.can_create_blog_post === true;
-        });
-      };
-      RSVP.filter(promises, filterFn).then(function(users){
-        // true, because the server told us only Alice can create a blog post.
-        users.length === 1;
-        // false, because Alice is the only user present in `users`
-        users[0] === bob;
-      });
-      ```
-
-      @method filter
-      @for RSVP
-      @param {Array} promises
-      @param {Function} filterFn - function to be called on each resolved value to
-      filter the final results.
-      @param {String} label optional string describing the promise. Useful for
-      tooling.
-      @return {Promise}
-    */
-    function filter(promises, filterFn, label) {
-      return all(promises, label).then(function(values){
-        if (!isArray(promises)) {
-          throw new TypeError('You must pass an array to filter.');
-        }
-
-        if (!isFunction(filterFn)){
-          throw new TypeError("You must pass a function to filter's second argument.");
-        }
-
-        return map(promises, filterFn, label).then(function(filterResults){
-           var i,
-               valuesLen = values.length,
-               filtered = [];
-
-           for (i = 0; i < valuesLen; i++){
-             if(filterResults[i]) filtered.push(values[i]);
-           }
-           return filtered;
-        });
-      });
-    }
-
-    __exports__["default"] = filter;
-  });
-define("rsvp/hash", 
-  ["./promise","./utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-    var isNonThenable = __dependency2__.isNonThenable;
-    var keysOf = __dependency2__.keysOf;
-
-    /**
-      `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array
-      for its `promises` argument.
-
-      Returns a promise that is fulfilled when all the given promises have been
-      fulfilled, or rejected if any of them become rejected. The returned promise
-      is fulfilled with a hash that has the same key names as the `promises` object
-      argument. If any of the values in the object are not promises, they will
-      simply be copied over to the fulfilled object.
-
-      Example:
-
-      ```javascript
-      var promises = {
-        myPromise: RSVP.resolve(1),
-        yourPromise: RSVP.resolve(2),
-        theirPromise: RSVP.resolve(3),
-        notAPromise: 4
-      };
-
-      RSVP.hash(promises).then(function(hash){
-        // hash here is an object that looks like:
-        // {
-        //   myPromise: 1,
-        //   yourPromise: 2,
-        //   theirPromise: 3,
-        //   notAPromise: 4
-        // }
-      });
-      ````
-
-      If any of the `promises` given to `RSVP.hash` are rejected, the first promise
-      that is rejected will be given as the reason to the rejection handler.
-
-      Example:
-
-      ```javascript
-      var promises = {
-        myPromise: RSVP.resolve(1),
-        rejectedPromise: RSVP.reject(new Error("rejectedPromise")),
-        anotherRejectedPromise: RSVP.reject(new Error("anotherRejectedPromise")),
-      };
-
-      RSVP.hash(promises).then(function(hash){
-        // Code here never runs because there are rejected promises!
-      }, function(reason) {
-        // reason.message === "rejectedPromise"
-      });
-      ```
-
-      An important note: `RSVP.hash` is intended for plain JavaScript objects that
-      are just a set of keys and values. `RSVP.hash` will NOT preserve prototype
-      chains.
-
-      Example:
-
-      ```javascript
-      function MyConstructor(){
-        this.example = RSVP.resolve("Example");
-      }
-
-      MyConstructor.prototype = {
-        protoProperty: RSVP.resolve("Proto Property")
-      };
-
-      var myObject = new MyConstructor();
-
-      RSVP.hash(myObject).then(function(hash){
-        // protoProperty will not be present, instead you will just have an
-        // object that looks like:
-        // {
-        //   example: "Example"
-        // }
-        //
-        // hash.hasOwnProperty('protoProperty'); // false
-        // 'undefined' === typeof hash.protoProperty
-      });
-      ```
-
-      @method hash
-      @for RSVP
-      @param {Object} promises
-      @param {String} label optional string that describes the promise.
-      Useful for tooling.
-      @return {Promise} promise that is fulfilled when all properties of `promises`
-      have been fulfilled, or rejected if any of them become rejected.
-      @static
-    */
-    __exports__["default"] = function hash(object, label) {
-      return new Promise(function(resolve, reject){
-        var results = {};
-        var keys = keysOf(object);
-        var remaining = keys.length;
-        var entry, property;
-
-        if (remaining === 0) {
-          resolve(results);
-          return;
-        }
-
-       function fulfilledTo(property) {
-          return function(value) {
-            results[property] = value;
-            if (--remaining === 0) {
-              resolve(results);
-            }
-          };
-        }
-
-        function onRejection(reason) {
-          remaining = 0;
-          reject(reason);
-        }
-
-        for (var i = 0; i < keys.length; i++) {
-          property = keys[i];
-          entry = object[property];
-
-          if (isNonThenable(entry)) {
-            results[property] = entry;
-            if (--remaining === 0) {
-              resolve(results);
-            }
-          } else {
-            Promise.cast(entry).then(fulfilledTo(property), onRejection);
-          }
-        }
-      });
-    };
-  });
-define("rsvp/instrument", 
-  ["./config","./utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var config = __dependency1__.config;
-    var now = __dependency2__.now;
-
-    __exports__["default"] = function instrument(eventName, promise, child) {
-      // instrumentation should not disrupt normal usage.
-      try {
-        config.trigger(eventName, {
-          guid: promise._guidKey + promise._id,
-          eventName: eventName,
-          detail: promise._detail,
-          childGuid: child && promise._guidKey + child._id,
-          label: promise._label,
-          timeStamp: now(),
-          stack: new Error(promise._label).stack
-        });
-      } catch(error) {
-        setTimeout(function(){
-          throw error;
-        }, 0);
-      }
-    };
-  });
-define("rsvp/map", 
-  ["./promise","./all","./utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-    var all = __dependency2__["default"];
-    var isArray = __dependency3__.isArray;
-    var isFunction = __dependency3__.isFunction;
-
-    /**
-     `RSVP.map` is similar to JavaScript's native `map` method, except that it
-      waits for all promises to become fulfilled before running the `mapFn` on
-      each item in given to `promises`. `RSVP.map` returns a promise that will
-      become fulfilled with the result of running `mapFn` on the values the promises
-      become fulfilled with.
-
-      For example:
-
-      ```javascript
-
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.resolve(2);
-      var promise3 = RSVP.resolve(3);
-      var promises = [ promise1, promise2, promise3 ];
-
-      var mapFn = function(item){
-        return item + 1;
-      };
-
-      RSVP.map(promises, mapFn).then(function(result){
-        // result is [ 2, 3, 4 ]
-      });
-      ```
-
-      If any of the `promises` given to `RSVP.map` are rejected, the first promise
-      that is rejected will be given as an argument to the returned promise's
-      rejection handler. For example:
-
-      ```javascript
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.reject(new Error("2"));
-      var promise3 = RSVP.reject(new Error("3"));
-      var promises = [ promise1, promise2, promise3 ];
-
-      var mapFn = function(item){
-        return item + 1;
-      };
-
-      RSVP.map(promises, mapFn).then(function(array){
-        // Code here never runs because there are rejected promises!
-      }, function(reason) {
-        // reason.message === "2"
-      });
-      ```
-
-      `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,
-      say you want to get all comments from a set of blog posts, but you need
-      the blog posts first becuase they contain a url to those comments.
-
-      ```javscript
-
-      var mapFn = function(blogPost){
-        // getComments does some ajax and returns an RSVP.Promise that is fulfilled
-        // with some comments data
-        return getComments(blogPost.comments_url);
-      };
-
-      // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled
-      // with some blog post data
-      RSVP.map(getBlogPosts(), mapFn).then(function(comments){
-        // comments is the result of asking the server for the comments
-        // of all blog posts returned from getBlogPosts()
-      });
-      ```
-
-      @method map
-      @for RSVP
-      @param {Array} promises
-      @param {Function} mapFn function to be called on each fulfilled promise.
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise} promise that is fulfilled with the result of calling
-      `mapFn` on each fulfilled promise or value when they become fulfilled.
-       The promise will be rejected if any of the given `promises` become rejected.
-      @static
-    */
-    __exports__["default"] = function map(promises, mapFn, label) {
-      return all(promises, label).then(function(results){
-        if (!isArray(promises)) {
-          throw new TypeError('You must pass an array to map.');
-        }
-
-        if (!isFunction(mapFn)){
-          throw new TypeError("You must pass a function to map's second argument.");
-        }
-
-
-        var resultLen = results.length,
-            mappedResults = [],
-            i;
-
-        for (i = 0; i < resultLen; i++){
-          mappedResults.push(mapFn(results[i]));
-        }
-
-        return all(mappedResults, label);
-      });
-    };
-  });
-define("rsvp/node", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    var slice = Array.prototype.slice;
-
-    function makeNodeCallbackFor(resolve, reject) {
-      return function (error, value) {
-        if (error) {
-          reject(error);
-        } else if (arguments.length > 2) {
-          resolve(slice.call(arguments, 1));
-        } else {
-          resolve(value);
-        }
-      };
-    }
-
-    /**
-      `RSVP.denodeify` takes a "node-style" function and returns a function that
-      will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the
-      browser when you'd prefer to use promises over using callbacks. For example,
-      `denodeify` transforms the following:
-
-      ```javascript
-      var fs = require('fs');
-
-      fs.readFile('myfile.txt', function(err, data){
-        if (err) return handleError(err);
-        handleData(data);
-      });
-      ```
-
-      into:
-
-      ```javascript
-      var fs = require('fs');
-
-      var readFile = RSVP.denodeify(fs.readFile);
-
-      readFile('myfile.txt').then(handleData, handleError);
-      ```
-
-      Using `denodeify` makes it easier to compose asynchronous operations instead
-      of using callbacks. For example, instead of:
-
-      ```javascript
-      var fs = require('fs');
-      var log = require('some-async-logger');
-
-      fs.readFile('myfile.txt', function(err, data){
-        if (err) return handleError(err);
-        fs.writeFile('myfile2.txt', data, function(err){
-          if (err) throw err;
-          log('success', function(err) {
-            if (err) throw err;
-          });
-        });
-      });
-      ```
-
-      You can chain the operations together using `then` from the returned promise:
-
-      ```javascript
-      var fs = require('fs');
-      var denodeify = RSVP.denodeify;
-      var readFile = denodeify(fs.readFile);
-      var writeFile = denodeify(fs.writeFile);
-      var log = denodeify(require('some-async-logger'));
-
-      readFile('myfile.txt').then(function(data){
-        return writeFile('myfile2.txt', data);
-      }).then(function(){
-        return log('SUCCESS');
-      }).then(function(){
-        // success handler
-      }, function(reason){
-        // rejection handler
-      });
-      ```
-
-      @method denodeify
-      @for RSVP
-      @param {Function} nodeFunc a "node-style" function that takes a callback as
-      its last argument. The callback expects an error to be passed as its first
-      argument (if an error occurred, otherwise null), and the value from the
-      operation as its second argument ("function(err, value){ }").
-      @param {Any} binding optional argument for binding the "this" value when
-      calling the `nodeFunc` function.
-      @return {Function} a function that wraps `nodeFunc` to return an
-      `RSVP.Promise`
-      @static
-    */
-    __exports__["default"] = function denodeify(nodeFunc, binding) {
-      return function()  {
-        var nodeArgs = slice.call(arguments), resolve, reject;
-        var thisArg = this || binding;
-
-        return new Promise(function(resolve, reject) {
-          Promise.all(nodeArgs).then(function(nodeArgs) {
-            try {
-              nodeArgs.push(makeNodeCallbackFor(resolve, reject));
-              nodeFunc.apply(thisArg, nodeArgs);
-            } catch(e) {
-              reject(e);
-            }
-          });
-        });
-      };
-    };
-  });
-define("rsvp/promise", 
-  ["./config","./events","./instrument","./utils","./promise/cast","./promise/all","./promise/race","./promise/resolve","./promise/reject","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
-    "use strict";
-    var config = __dependency1__.config;
-    var EventTarget = __dependency2__["default"];
-    var instrument = __dependency3__["default"];
-    var objectOrFunction = __dependency4__.objectOrFunction;
-    var isFunction = __dependency4__.isFunction;
-    var now = __dependency4__.now;
-    var cast = __dependency5__["default"];
-    var all = __dependency6__["default"];
-    var race = __dependency7__["default"];
-    var Resolve = __dependency8__["default"];
-    var Reject = __dependency9__["default"];
-
-    var guidKey = 'rsvp_' + now() + '-';
-    var counter = 0;
-
-    function noop() {}
-
-    __exports__["default"] = Promise;
-
-
-    /**
-      Promise objects represent the eventual result of an asynchronous operation. The
-      primary way of interacting with a promise is through its `then` method, which
-      registers callbacks to receive either a promise’s eventual value or the reason
-      why the promise cannot be fulfilled.
-
-      Terminology
-      -----------
-
-      - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-      - `thenable` is an object or function that defines a `then` method.
-      - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-      - `exception` is a value that is thrown using the throw statement.
-      - `reason` is a value that indicates why a promise was rejected.
-      - `settled` the final resting state of a promise, fulfilled or rejected.
-
-      A promise can be in one of three states: pending, fulfilled, or rejected.
-
-      Promises that are fulfilled have a fulfillment value and are in the fulfilled
-      state.  Promises that are rejected have a rejection reason and are in the
-      rejected state.  A fulfillment value is never a thenable.  Similarly, a
-      rejection reason is never a thenable.
-
-      Promises can also be said to *resolve* a value.  If this value is also a
-      promise, then the original promise's settled state will match the value's
-      settled state.  So a promise that *resolves* a promise that rejects will
-      itself reject, and a promise that *resolves* a promise that fulfills will
-      itself fulfill.
-
-
-      Basic Usage:
-      ------------
-
-      ```js
-      var promise = new Promise(function(resolve, reject) {
-        // on success
-        resolve(value);
-
-        // on failure
-        reject(reason);
-      });
-
-      promise.then(function(value) {
-        // on fulfillment
-      }, function(reason) {
-        // on rejection
-      });
-      ```
-
-      Advanced Usage:
-      ---------------
-
-      Promises shine when abstracting away asynchronous interactions such as
-      `XMLHttpRequest`s.
-
-      ```js
-      function getJSON(url) {
-        return new Promise(function(resolve, reject){
-          var xhr = new XMLHttpRequest();
-
-          xhr.open('GET', url);
-          xhr.onreadystatechange = handler;
-          xhr.responseType = 'json';
-          xhr.setRequestHeader('Accept', 'application/json');
-          xhr.send();
-
-          function handler() {
-            if (this.readyState === this.DONE) {
-              if (this.status === 200) {
-                resolve(this.response);
-              } else {
-                reject(new Error("getJSON: `" + url + "` failed with status: [" + this.status + "]");
-              }
-            }
-          };
-        });
-      }
-
-      getJSON('/posts.json').then(function(json) {
-        // on fulfillment
-      }, function(reason) {
-        // on rejection
-      });
-      ```
-
-      Unlike callbacks, promises are great composable primitives.
-
-      ```js
-      Promise.all([
-        getJSON('/posts'),
-        getJSON('/comments')
-      ]).then(function(values){
-        values[0] // => postsJSON
-        values[1] // => commentsJSON
-
-        return values;
-      });
-      ```
-
-      @class RSVP.Promise
-      @param {function}
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @constructor
-    */
-    function Promise(resolver, label) {
-      if (!isFunction(resolver)) {
-        throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-      }
-
-      if (!(this instanceof Promise)) {
-        throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-      }
-
-      this._id = counter++;
-      this._label = label;
-      this._subscribers = [];
-
-      if (config.instrument) {
-        instrument('created', this);
-      }
-
-      if (noop !== resolver) {
-        invokeResolver(resolver, this);
-      }
-    }
-
-    function invokeResolver(resolver, promise) {
-      function resolvePromise(value) {
-        resolve(promise, value);
-      }
-
-      function rejectPromise(reason) {
-        reject(promise, reason);
-      }
-
-      try {
-        resolver(resolvePromise, rejectPromise);
-      } catch(e) {
-        rejectPromise(e);
-      }
-    }
-
-    Promise.cast = cast;
-    Promise.all = all;
-    Promise.race = race;
-    Promise.resolve = Resolve;
-    Promise.reject = Reject;
-
-    var PENDING   = void 0;
-    var SEALED    = 0;
-    var FULFILLED = 1;
-    var REJECTED  = 2;
-
-    function subscribe(parent, child, onFulfillment, onRejection) {
-      var subscribers = parent._subscribers;
-      var length = subscribers.length;
-
-      subscribers[length] = child;
-      subscribers[length + FULFILLED] = onFulfillment;
-      subscribers[length + REJECTED]  = onRejection;
-    }
-
-    function publish(promise, settled) {
-      var child, callback, subscribers = promise._subscribers, detail = promise._detail;
-
-      if (config.instrument) {
-        instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);
-      }
-
-      for (var i = 0; i < subscribers.length; i += 3) {
-        child = subscribers[i];
-        callback = subscribers[i + settled];
-
-        invokeCallback(settled, child, callback, detail);
-      }
-
-      promise._subscribers = null;
-    }
-
-    Promise.prototype = {
-      constructor: Promise,
-
-      _id: undefined,
-      _guidKey: guidKey,
-      _label: undefined,
-
-      _state: undefined,
-      _detail: undefined,
-      _subscribers: undefined,
-
-      _onerror: function (reason) {
-        config.trigger('error', reason);
-      },
-
-    /**
-      The primary way of interacting with a promise is through its `then` method,
-      which registers callbacks to receive either a promise's eventual value or the
-      reason why the promise cannot be fulfilled.
-
-      ```js
-      findUser().then(function(user){
-        // user is available
-      }, function(reason){
-        // user is unavailable, and you are given the reason why
-      });
-      ```
-
-      Chaining
-      --------
-
-      The return value of `then` is itself a promise.  This second, "downstream"
-      promise is resolved with the return value of the first promise's fulfillment
-      or rejection handler, or rejected if the handler throws an exception.
-
-      ```js
-      findUser().then(function (user) {
-        return user.name;
-      }, function (reason) {
-        return "default name";
-      }).then(function (userName) {
-        // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-        // will be `"default name"`
-      });
-
-      findUser().then(function (user) {
-        throw new Error("Found user, but still unhappy");
-      }, function (reason) {
-        throw new Error("`findUser` rejected and we're unhappy");
-      }).then(function (value) {
-        // never reached
-      }, function (reason) {
-        // if `findUser` fulfilled, `reason` will be "Found user, but still unhappy".
-        // If `findUser` rejected, `reason` will be "`findUser` rejected and we're unhappy".
-      });
-      ```
-      If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-
-      ```js
-      findUser().then(function (user) {
-        throw new PedagogicalException("Upstream error");
-      }).then(function (value) {
-        // never reached
-      }).then(function (value) {
-        // never reached
-      }, function (reason) {
-        // The `PedgagocialException` is propagated all the way down to here
-      });
-      ```
-
-      Assimilation
-      ------------
-
-      Sometimes the value you want to propagate to a downstream promise can only be
-      retrieved asynchronously. This can be achieved by returning a promise in the
-      fulfillment or rejection handler. The downstream promise will then be pending
-      until the returned promise is settled. This is called *assimilation*.
-
-      ```js
-      findUser().then(function (user) {
-        return findCommentsByAuthor(user);
-      }).then(function (comments) {
-        // The user's comments are now available
-      });
-      ```
-
-      If the assimliated promise rejects, then the downstream promise will also reject.
-
-      ```js
-      findUser().then(function (user) {
-        return findCommentsByAuthor(user);
-      }).then(function (comments) {
-        // If `findCommentsByAuthor` fulfills, we'll have the value here
-      }, function (reason) {
-        // If `findCommentsByAuthor` rejects, we'll have the reason here
-      });
-      ```
-
-      Simple Example
-      --------------
-
-      Synchronous Example
-
-      ```javascript
-      var result;
-
-      try {
-        result = findResult();
-        // success
-      } catch(reason) {
-        // failure
-      }
-      ```
-
-      Errback Example
-
-      ```js
-      findResult(function(result, err){
-        if (err) {
-          // failure
-        } else {
-          // success
-        }
-      });
-      ```
-
-      Promise Example;
-
-      ```javascript
-      findResult().then(function(result){
-        // success
-      }, function(reason){
-        // failure
-      });
-      ```
-
-      Advanced Example
-      --------------
-
-      Synchronous Example
-
-      ```javascript
-      var author, books;
-
-      try {
-        author = findAuthor();
-        books  = findBooksByAuthor(author);
-        // success
-      } catch(reason) {
-        // failure
-      }
-      ```
-
-      Errback Example
-
-      ```js
-
-      function foundBooks(books) {
-
-      }
-
-      function failure(reason) {
-
-      }
-
-      findAuthor(function(author, err){
-        if (err) {
-          failure(err);
-          // failure
-        } else {
-          try {
-            findBoooksByAuthor(author, function(books, err) {
-              if (err) {
-                failure(err);
-              } else {
-                try {
-                  foundBooks(books);
-                } catch(reason) {
-                  failure(reason);
-                }
-              }
-            });
-          } catch(error) {
-            failure(err);
-          }
-          // success
-        }
-      });
-      ```
-
-      Promise Example;
-
-      ```javascript
-      findAuthor().
-        then(findBooksByAuthor).
-        then(function(books){
-          // found books
-      }).catch(function(reason){
-        // something went wrong
-      });
-      ```
-
-      @method then
-      @param {Function} onFulfilled
-      @param {Function} onRejected
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise}
-    */
-      then: function(onFulfillment, onRejection, label) {
-        var promise = this;
-        this._onerror = null;
-
-        var thenPromise = new this.constructor(noop, label);
-
-        if (this._state) {
-          var callbacks = arguments;
-          config.async(function invokePromiseCallback() {
-            invokeCallback(promise._state, thenPromise, callbacks[promise._state - 1], promise._detail);
-          });
-        } else {
-          subscribe(this, thenPromise, onFulfillment, onRejection);
-        }
-
-        if (config.instrument) {
-          instrument('chained', promise, thenPromise);
-        }
-
-        return thenPromise;
-      },
-
-    /**
-      `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-      as the catch block of a try/catch statement.
-
-      ```js
-      function findAuthor(){
-        throw new Error("couldn't find that author");
-      }
-
-      // synchronous
-      try {
-        findAuthor();
-      } catch(reason) {
-        // something went wrong
-      }
-
-      // async with promises
-      findAuthor().catch(function(reason){
-        // something went wrong
-      });
-      ```
-
-      @method catch
-      @param {Function} onRejection
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise}
-    */
-      'catch': function(onRejection, label) {
-        return this.then(null, onRejection, label);
-      },
-
-    /**
-      `finally` will be invoked regardless of the promise's fate just as native
-      try/catch/finally behaves
-
-      Synchronous example:
-
-      ```js
-      findAuthor() {
-        if (Math.random() > 0.5) {
-          throw new Error();
-        }
-        return new Author();
-      }
-
-      try {
-        return findAuthor(); // succeed or fail
-      } catch(error) {
-        return findOtherAuther();
-      } finally {
-        // always runs
-        // doesn't affect the return value
-      }
-      ```
-
-      Asynchronous example:
-
-      ```js
-      findAuthor().catch(function(reason){
-        return findOtherAuther();
-      }).finally(function(){
-        // author was either found, or not
-      });
-      ```
-
-      @method finally
-      @param {Function} callback
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise}
-    */
-      'finally': function(callback, label) {
-        var constructor = this.constructor;
-
-        return this.then(function(value) {
-          return constructor.cast(callback()).then(function(){
-            return value;
-          });
-        }, function(reason) {
-          return constructor.cast(callback()).then(function(){
-            throw reason;
-          });
-        }, label);
-      }
-    };
-
-    function invokeCallback(settled, promise, callback, detail) {
-      var hasCallback = isFunction(callback),
-          value, error, succeeded, failed;
-
-      if (hasCallback) {
-        try {
-          value = callback(detail);
-          succeeded = true;
-        } catch(e) {
-          failed = true;
-          error = e;
-        }
-      } else {
-        value = detail;
-        succeeded = true;
-      }
-
-      if (handleThenable(promise, value)) {
-        return;
-      } else if (hasCallback && succeeded) {
-        resolve(promise, value);
-      } else if (failed) {
-        reject(promise, error);
-      } else if (settled === FULFILLED) {
-        resolve(promise, value);
-      } else if (settled === REJECTED) {
-        reject(promise, value);
-      }
-    }
-
-    function handleThenable(promise, value) {
-      var then = null,
-      resolved;
-
-      try {
-        if (promise === value) {
-          throw new TypeError("A promises callback cannot return that same promise.");
-        }
-
-        if (objectOrFunction(value)) {
-          then = value.then;
-
-          if (isFunction(then)) {
-            then.call(value, function(val) {
-              if (resolved) { return true; }
-              resolved = true;
-
-              if (value !== val) {
-                resolve(promise, val);
-              } else {
-                fulfill(promise, val);
-              }
-            }, function(val) {
-              if (resolved) { return true; }
-              resolved = true;
-
-              reject(promise, val);
-            }, 'derived from: ' + (promise._label || ' unknown promise'));
-
-            return true;
-          }
-        }
-      } catch (error) {
-        if (resolved) { return true; }
-        reject(promise, error);
-        return true;
-      }
-
-      return false;
-    }
-
-    function resolve(promise, value) {
-      if (promise === value) {
-        fulfill(promise, value);
-      } else if (!handleThenable(promise, value)) {
-        fulfill(promise, value);
-      }
-    }
-
-    function fulfill(promise, value) {
-      if (promise._state !== PENDING) { return; }
-      promise._state = SEALED;
-      promise._detail = value;
-
-      config.async(publishFulfillment, promise);
-    }
-
-    function reject(promise, reason) {
-      if (promise._state !== PENDING) { return; }
-      promise._state = SEALED;
-      promise._detail = reason;
-
-      config.async(publishRejection, promise);
-    }
-
-    function publishFulfillment(promise) {
-      publish(promise, promise._state = FULFILLED);
-    }
-
-    function publishRejection(promise) {
-      if (promise._onerror) {
-        promise._onerror(promise._detail);
-      }
-
-      publish(promise, promise._state = REJECTED);
-    }
-  });
-define("rsvp/promise/all", 
-  ["../utils","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var isArray = __dependency1__.isArray;
-    var isNonThenable = __dependency1__.isNonThenable;
-
-    /**
-      `RSVP.Promise.all` accepts an array of promises, and returns a new promise which
-      is fulfilled with an array of fulfillment values for the passed promises, or
-      rejected with the reason of the first passed promise to be rejected. It casts all
-      elements of the passed iterable to promises as it runs this algorithm.
-
-      Example:
-
-      ```javascript
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.resolve(2);
-      var promise3 = RSVP.resolve(3);
-      var promises = [ promise1, promise2, promise3 ];
-
-      RSVP.Promise.all(promises).then(function(array){
-        // The array here would be [ 1, 2, 3 ];
-      });
-      ```
-
-      If any of the `promises` given to `RSVP.all` are rejected, the first promise
-      that is rejected will be given as an argument to the returned promises's
-      rejection handler. For example:
-
-      Example:
-
-      ```javascript
-      var promise1 = RSVP.resolve(1);
-      var promise2 = RSVP.reject(new Error("2"));
-      var promise3 = RSVP.reject(new Error("3"));
-      var promises = [ promise1, promise2, promise3 ];
-
-      RSVP.Promise.all(promises).then(function(array){
-        // Code here never runs because there are rejected promises!
-      }, function(error) {
-        // error.message === "2"
-      });
-      ```
-
-      @method all
-      @for Ember.RSVP.Promise
-      @param {Array} entries array of promises
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise} promise that is fulfilled when all `promises` have been
-      fulfilled, or rejected if any of them become rejected.
-      @static
-    */
-    __exports__["default"] = function all(entries, label) {
-
-      /*jshint validthis:true */
-      var Constructor = this;
-
-      return new Constructor(function(resolve, reject) {
-        if (!isArray(entries)) {
-          throw new TypeError('You must pass an array to all.');
-        }
-
-        var remaining = entries.length;
-        var results = new Array(remaining);
-        var entry, pending = true;
-
-        if (remaining === 0) {
-          resolve(results);
-          return;
-        }
-
-        function fulfillmentAt(index) {
-          return function(value) {
-            results[index] = value;
-            if (--remaining === 0) {
-              resolve(results);
-            }
-          };
-        }
-
-        function onRejection(reason) {
-          remaining = 0;
-          reject(reason);
-        }
-
-        for (var index = 0; index < entries.length; index++) {
-          entry = entries[index];
-          if (isNonThenable(entry)) {
-            results[index] = entry;
-            if (--remaining === 0) {
-              resolve(results);
-            }
-          } else {
-            Constructor.cast(entry).then(fulfillmentAt(index), onRejection);
-          }
-        }
-      }, label);
-    };
-  });
-define("rsvp/promise/cast", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-      `RSVP.Promise.cast` coerces its argument to a promise, or returns the
-      argument if it is already a promise which shares a constructor with the caster.
-
-      Example:
-
-      ```javascript
-      var promise = RSVP.Promise.resolve(1);
-      var casted = RSVP.Promise.cast(promise);
-
-      console.log(promise === casted); // true
-      ```
-
-      In the case of a promise whose constructor does not match, it is assimilated.
-      The resulting promise will fulfill or reject based on the outcome of the
-      promise being casted.
-
-      Example:
-
-      ```javascript
-      var thennable = $.getJSON('/api/foo');
-      var casted = RSVP.Promise.cast(thennable);
-
-      console.log(thennable === casted); // false
-      console.log(casted instanceof RSVP.Promise) // true
-
-      casted.then(function(data) {
-        // data is the value getJSON fulfills with
-      });
-      ```
-
-      In the case of a non-promise, a promise which will fulfill with that value is
-      returned.
-
-      Example:
-
-      ```javascript
-      var value = 1; // could be a number, boolean, string, undefined...
-      var casted = RSVP.Promise.cast(value);
-
-      console.log(value === casted); // false
-      console.log(casted instanceof RSVP.Promise) // true
-
-      casted.then(function(val) {
-        val === value // => true
-      });
-      ```
-
-      `RSVP.Promise.cast` is similar to `RSVP.Promise.resolve`, but `RSVP.Promise.cast` differs in the
-      following ways:
-
-      * `RSVP.Promise.cast` serves as a memory-efficient way of getting a promise, when you
-      have something that could either be a promise or a value. RSVP.resolve
-      will have the same effect but will create a new promise wrapper if the
-      argument is a promise.
-      * `RSVP.Promise.cast` is a way of casting incoming thenables or promise subclasses to
-      promises of the exact class specified, so that the resulting object's `then` is
-      ensured to have the behavior of the constructor you are calling cast on (i.e., RSVP.Promise).
-
-      @method cast
-      @param {Object} object to be casted
-      @param {String} label optional string for labeling the promise.
-      Useful for tooling.
-      @return {Promise} promise
-      @static
-    */
-
-    __exports__["default"] = function cast(object, label) {
-      /*jshint validthis:true */
-      var Constructor = this;
-
-      if (object && typeof object === 'object' && object.constructor === Constructor) {
-        return object;
-      }
-
-      return new Constructor(function(resolve) {
-        resolve(object);
-      }, label);
-    };
-  });
-define("rsvp/promise/race", 
-  ["../utils","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    /* global toString */
-
-    var isArray = __dependency1__.isArray;
-    var isFunction = __dependency1__.isFunction;
-    var isNonThenable = __dependency1__.isNonThenable;
-
-    /**
-      `RSVP.Promise.race` returns a new promise which is settled in the same way as the
-      first passed promise to settle.
-
-      Example:
-
-      ```javascript
-      var promise1 = new RSVP.Promise(function(resolve, reject){
-        setTimeout(function(){
-          resolve("promise 1");
-        }, 200);
-      });
-
-      var promise2 = new RSVP.Promise(function(resolve, reject){
-        setTimeout(function(){
-          resolve("promise 2");
-        }, 100);
-      });
-
-      RSVP.Promise.race([promise1, promise2]).then(function(result){
-        // result === "promise 2" because it was resolved before promise1
-        // was resolved.
-      });
-      ```
-
-      `RSVP.Promise.race` is deterministic in that only the state of the first
-      settled promise matters. For example, even if other promises given to the
-      `promises` array argument are resolved, but the first settled promise has
-      become rejected before the other promises became fulfilled, the returned
-      promise will become rejected:
-
-      ```javascript
-      var promise1 = new RSVP.Promise(function(resolve, reject){
-        setTimeout(function(){
-          resolve("promise 1");
-        }, 200);
-      });
-
-      var promise2 = new RSVP.Promise(function(resolve, reject){
-        setTimeout(function(){
-          reject(new Error("promise 2"));
-        }, 100);
-      });
-
-      RSVP.Promise.race([promise1, promise2]).then(function(result){
-        // Code here never runs
-      }, function(reason){
-        // reason.message === "promise2" because promise 2 became rejected before
-        // promise 1 became fulfilled
-      });
-      ```
-
-      An example real-world use case is implementing timeouts:
-
-      ```javascript
-      RSVP.Promise.race([ajax('foo.json'), timeout(5000)])
-      ```
-
-      @method race
-      @param {Array} promises array of promises to observe
-      @param {String} label optional string for describing the promise returned.
-      Useful for tooling.
-      @return {Promise} a promise which settles in the same way as the first passed
-      promise to settle.
-      @static
-    */
-    __exports__["default"] = function race(entries, label) {
-      /*jshint validthis:true */
-      var Constructor = this, entry;
-
-      return new Constructor(function(resolve, reject) {
-        if (!isArray(entries)) {
-          throw new TypeError('You must pass an array to race.');
-        }
-
-        var pending = true;
-
-        function onFulfillment(value) { if (pending) { pending = false; resolve(value); } }
-        function onRejection(reason)  { if (pending) { pending = false; reject(reason); } }
-
-        for (var i = 0; i < entries.length; i++) {
-          entry = entries[i];
-          if (isNonThenable(entry)) {
-            pending = false;
-            resolve(entry);
-            return;
-          } else {
-            Constructor.cast(entry).then(onFulfillment, onRejection);
-          }
-        }
-      }, label);
-    };
-  });
-define("rsvp/promise/reject", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-      `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.
-      It is shorthand for the following:
-
-      ```javascript
-      var promise = new RSVP.Promise(function(resolve, reject){
-        reject(new Error('WHOOPS'));
-      });
-
-      promise.then(function(value){
-        // Code here doesn't run because the promise is rejected!
-      }, function(reason){
-        // reason.message === 'WHOOPS'
-      });
-      ```
-
-      Instead of writing the above, your code now simply becomes the following:
-
-      ```javascript
-      var promise = RSVP.Promise.reject(new Error('WHOOPS'));
-
-      promise.then(function(value){
-        // Code here doesn't run because the promise is rejected!
-      }, function(reason){
-        // reason.message === 'WHOOPS'
-      });
-      ```
-
-      @method reject
-      @param {Any} reason value that the returned promise will be rejected with.
-      @param {String} label optional string for identifying the returned promise.
-      Useful for tooling.
-      @return {Promise} a promise rejected with the given `reason`.
-      @static
-    */
-    __exports__["default"] = function reject(reason, label) {
-      /*jshint validthis:true */
-      var Constructor = this;
-
-      return new Constructor(function (resolve, reject) {
-        reject(reason);
-      }, label);
-    };
-  });
-define("rsvp/promise/resolve", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-      `RSVP.Promise.resolve` returns a promise that will become resolved with the
-      passed `value`. It is shorthand for the following:
-
-      ```javascript
-      var promise = new RSVP.Promise(function(resolve, reject){
-        resolve(1);
-      });
-
-      promise.then(function(value){
-        // value === 1
-      });
-      ```
-
-      Instead of writing the above, your code now simply becomes the following:
-
-      ```javascript
-      var promise = RSVP.Promise.resolve(1);
-
-      promise.then(function(value){
-        // value === 1
-      });
-      ```
-
-      @method resolve
-      @param {Any} value value that the returned promise will be resolved with
-      @param {String} label optional string for identifying the returned promise.
-      Useful for tooling.
-      @return {Promise} a promise that will become fulfilled with the given
-      `value`
-      @static
-    */
-    __exports__["default"] = function resolve(value, label) {
-      /*jshint validthis:true */
-      var Constructor = this;
-
-      return new Constructor(function(resolve, reject) {
-        resolve(value);
-      }, label);
-    };
-  });
-define("rsvp/race", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    /**
-      This is a convenient alias for `RSVP.Promise.race`.
-
-      @method race
-      @param {Array} array Array of promises.
-      @param {String} label An optional label. This is useful
-      for tooling.
-      @static
-    */
-    __exports__["default"] = function race(array, label) {
-      return Promise.race(array, label);
-    };
-  });
-define("rsvp/reject", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    /**
-      This is a convenient alias for `RSVP.Promise.reject`.
-
-      @method reject
-      @for RSVP
-      @param {Any} reason value that the returned promise will be rejected with.
-      @param {String} label optional string for identifying the returned promise.
-      Useful for tooling.
-      @return {Promise} a promise rejected with the given `reason`.
-      @static
-    */
-    __exports__["default"] = function reject(reason, label) {
-      return Promise.reject(reason, label);
-    };
-  });
-define("rsvp/resolve", 
-  ["./promise","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-
-    /**
-      This is a convenient alias for `RSVP.Promise.resolve`.
-
-      @method resolve
-      @for RSVP
-      @param {Any} value value that the returned promise will be resolved with
-      @param {String} label optional string for identifying the returned promise.
-      Useful for tooling.
-      @return {Promise} a promise that will become fulfilled with the given
-      `value`
-      @static
-    */
-    __exports__["default"] = function resolve(value, label) {
-      return Promise.resolve(value, label);
-    };
-  });
-define("rsvp/rethrow", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-      `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event
-      loop in order to aid debugging.
-
-      Promises A+ specifies that any exceptions that occur with a promise must be
-      caught by the promises implementation and bubbled to the last handler. For
-      this reason, it is recommended that you always specify a second rejection
-      handler function to `then`. However, `RSVP.rethrow` will throw the exception
-      outside of the promise, so it bubbles up to your console if in the browser,
-      or domain/cause uncaught exception in Node. `rethrow` will also throw the
-      error again so the error can be handled by the promise per the spec.
-
-      ```javascript
-      function throws(){
-        throw new Error('Whoops!');
-      }
-
-      var promise = new RSVP.Promise(function(resolve, reject){
-        throws();
-      });
-
-      promise.catch(RSVP.rethrow).then(function(){
-        // Code here doesn't run because the promise became rejected due to an
-        // error!
-      }, function (err){
-        // handle the error here
-      });
-      ```
-
-      The 'Whoops' error will be thrown on the next turn of the event loop
-      and you can watch for it in your console. You can also handle it using a
-      rejection handler given to `.then` or `.catch` on the returned promise.
-
-      @method rethrow
-      @for RSVP
-      @param {Error} reason reason the promise became rejected.
-      @throws Error
-      @static
-    */
-    __exports__["default"] = function rethrow(reason) {
-      setTimeout(function() {
-        throw reason;
-      });
-      throw reason;
-    };
-  });
-define("rsvp/utils", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    function objectOrFunction(x) {
-      return typeof x === "function" || (typeof x === "object" && x !== null);
-    }
-
-    __exports__.objectOrFunction = objectOrFunction;function isFunction(x) {
-      return typeof x === "function";
-    }
-
-    __exports__.isFunction = isFunction;function isNonThenable(x) {
-      return !objectOrFunction(x);
-    }
-
-    __exports__.isNonThenable = isNonThenable;function isArray(x) {
-      return Object.prototype.toString.call(x) === "[object Array]";
-    }
-
-    __exports__.isArray = isArray;// Date.now is not available in browsers < IE9
-    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility
-    var now = Date.now || function() { return new Date().getTime(); };
-    __exports__.now = now;
-    var keysOf = Object.keys || function(object) {
-      var result = [];
-
-      for (var prop in object) {
-        result.push(prop);
-      }
-
-      return result;
-    };
-    __exports__.keysOf = keysOf;
-  });
-define("rsvp", 
-  ["./rsvp/promise","./rsvp/events","./rsvp/node","./rsvp/all","./rsvp/all_settled","./rsvp/race","./rsvp/hash","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/map","./rsvp/resolve","./rsvp/reject","./rsvp/filter","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-    var EventTarget = __dependency2__["default"];
-    var denodeify = __dependency3__["default"];
-    var all = __dependency4__["default"];
-    var allSettled = __dependency5__["default"];
-    var race = __dependency6__["default"];
-    var hash = __dependency7__["default"];
-    var rethrow = __dependency8__["default"];
-    var defer = __dependency9__["default"];
-    var config = __dependency10__.config;
-    var configure = __dependency10__.configure;
-    var map = __dependency11__["default"];
-    var resolve = __dependency12__["default"];
-    var reject = __dependency13__["default"];
-    var filter = __dependency14__["default"];
-
-    function async(callback, arg) {
-      config.async(callback, arg);
-    }
-
-    function on() {
-      config.on.apply(config, arguments);
-    }
-
-    function off() {
-      config.off.apply(config, arguments);
-    }
-
-    // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
-    if (typeof window !== 'undefined' && typeof window.__PROMISE_INSTRUMENTATION__ === 'object') {
-      var callbacks = window.__PROMISE_INSTRUMENTATION__;
-      configure('instrument', true);
-      for (var eventName in callbacks) {
-        if (callbacks.hasOwnProperty(eventName)) {
-          on(eventName, callbacks[eventName]);
-        }
-      }
-    }
-
-    __exports__.Promise = Promise;
-    __exports__.EventTarget = EventTarget;
-    __exports__.all = all;
-    __exports__.allSettled = allSettled;
-    __exports__.race = race;
-    __exports__.hash = hash;
-    __exports__.rethrow = rethrow;
-    __exports__.defer = defer;
-    __exports__.denodeify = denodeify;
-    __exports__.configure = configure;
-    __exports__.on = on;
-    __exports__.off = off;
-    __exports__.resolve = resolve;
-    __exports__.reject = reject;
-    __exports__.async = async;
-    __exports__.map = map;
-    __exports__.filter = filter;
-  });
-
-})();
-
-(function() {
-define("container/container", 
-  ["container/inheriting_dict","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var InheritingDict = __dependency1__["default"];
-
-    // A lightweight container that helps to assemble and decouple components.
-    // Public api for the container is still in flux.
-    // The public api, specified on the application namespace should be considered the stable api.
-    function Container(parent) {
-      this.parent = parent;
-      this.children = [];
-
-      this.resolver = parent && parent.resolver || function() {};
-
-      this.registry = new InheritingDict(parent && parent.registry);
-      this.cache = new InheritingDict(parent && parent.cache);
-      this.factoryCache = new InheritingDict(parent && parent.factoryCache);
-      this.resolveCache = new InheritingDict(parent && parent.resolveCache);
-      this.typeInjections = new InheritingDict(parent && parent.typeInjections);
-      this.injections = {};
-
-      this.factoryTypeInjections = new InheritingDict(parent && parent.factoryTypeInjections);
-      this.factoryInjections = {};
-
-      this._options = new InheritingDict(parent && parent._options);
-      this._typeOptions = new InheritingDict(parent && parent._typeOptions);
-    }
-
-    Container.prototype = {
-
-      /**
-        @property parent
-        @type Container
-        @default null
-      */
-      parent: null,
-
-      /**
-        @property children
-        @type Array
-        @default []
-      */
-      children: null,
-
-      /**
-        @property resolver
-        @type function
-      */
-      resolver: null,
-
-      /**
-        @property registry
-        @type InheritingDict
-      */
-      registry: null,
-
-      /**
-        @property cache
-        @type InheritingDict
-      */
-      cache: null,
-
-      /**
-        @property typeInjections
-        @type InheritingDict
-      */
-      typeInjections: null,
-
-      /**
-        @property injections
-        @type Object
-        @default {}
-      */
-      injections: null,
-
-      /**
-        @private
-
-        @property _options
-        @type InheritingDict
-        @default null
-      */
-      _options: null,
-
-      /**
-        @private
-
-        @property _typeOptions
-        @type InheritingDict
-      */
-      _typeOptions: null,
-
-      /**
-        Returns a new child of the current container. These children are configured
-        to correctly inherit from the current container.
-
-        @method child
-        @return {Container}
-      */
-      child: function() {
-        var container = new Container(this);
-        this.children.push(container);
-        return container;
-      },
-
-      /**
-        Sets a key-value pair on the current container. If a parent container,
-        has the same key, once set on a child, the parent and child will diverge
-        as expected.
-
-        @method set
-        @param {Object} object
-        @param {String} key
-        @param {any} value
-      */
-      set: function(object, key, value) {
-        object[key] = value;
-      },
-
-      /**
-        Registers a factory for later injection.
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('model:user', Person, {singleton: false });
-        container.register('fruit:favorite', Orange);
-        container.register('communication:main', Email, {singleton: false});
-        ```
-
-        @method register
-        @param {String} fullName
-        @param {Function} factory
-        @param {Object} options
-      */
-      register: function(fullName, factory, options) {
-        validateFullName(fullName);
-
-        if (factory === undefined) {
-          throw new TypeError('Attempting to register an unknown factory: `' + fullName + '`');
-        }
-
-        var normalizedName = this.normalize(fullName);
-
-        if (this.cache.has(normalizedName)) {
-          throw new Error('Cannot re-register: `' + fullName +'`, as it has already been looked up.');
-        }
-
-        this.registry.set(normalizedName, factory);
-        this._options.set(normalizedName, options || {});
-      },
-
-      /**
-        Unregister a fullName
-
-        ```javascript
-        var container = new Container();
-        container.register('model:user', User);
-
-        container.lookup('model:user') instanceof User //=> true
-
-        container.unregister('model:user')
-        container.lookup('model:user') === undefined //=> true
-        ```
-
-        @method unregister
-        @param {String} fullName
-       */
-      unregister: function(fullName) {
-        validateFullName(fullName);
-
-        var normalizedName = this.normalize(fullName);
-
-        this.registry.remove(normalizedName);
-        this.cache.remove(normalizedName);
-        this.factoryCache.remove(normalizedName);
-        this.resolveCache.remove(normalizedName);
-        this._options.remove(normalizedName);
-      },
-
-      /**
-        Given a fullName return the corresponding factory.
-
-        By default `resolve` will retrieve the factory from
-        its container's registry.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        container.resolve('api:twitter') // => Twitter
-        ```
-
-        Optionally the container can be provided with a custom resolver.
-        If provided, `resolve` will first provide the custom resolver
-        the oppertunity to resolve the fullName, otherwise it will fallback
-        to the registry.
-
-        ```javascript
-        var container = new Container();
-        container.resolver = function(fullName) {
-          // lookup via the module system of choice
-        };
-
-        // the twitter factory is added to the module system
-        container.resolve('api:twitter') // => Twitter
-        ```
-
-        @method resolve
-        @param {String} fullName
-        @return {Function} fullName's factory
-      */
-      resolve: function(fullName) {
-        validateFullName(fullName);
-
-        var normalizedName = this.normalize(fullName);
-        var cached = this.resolveCache.get(normalizedName);
-
-        if (cached) { return cached; }
-
-        var resolved = this.resolver(normalizedName) || this.registry.get(normalizedName);
-
-        this.resolveCache.set(normalizedName, resolved);
-
-        return resolved;
-      },
-
-      /**
-        A hook that can be used to describe how the resolver will
-        attempt to find the factory.
-
-        For example, the default Ember `.describe` returns the full
-        class name (including namespace) where Ember's resolver expects
-        to find the `fullName`.
-
-        @method describe
-        @param {String} fullName
-        @return {string} described fullName
-      */
-      describe: function(fullName) {
-        return fullName;
-      },
-
-      /**
-        A hook to enable custom fullName normalization behaviour
-
-        @method normalize
-        @param {String} fullName
-        @return {string} normalized fullName
-      */
-      normalize: function(fullName) {
-        return fullName;
-      },
-
-      /**
-        @method makeToString
-
-        @param {any} factory
-        @param {string} fullName
-        @return {function} toString function
-      */
-      makeToString: function(factory, fullName) {
-        return factory.toString();
-      },
-
-      /**
-        Given a fullName return a corresponding instance.
-
-        The default behaviour is for lookup to return a singleton instance.
-        The singleton is scoped to the container, allowing multiple containers
-        to all have their own locally scoped singletons.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        var twitter = container.lookup('api:twitter');
-
-        twitter instanceof Twitter; // => true
-
-        // by default the container will return singletons
-        var twitter2 = container.lookup('api:twitter');
-        twitter instanceof Twitter; // => true
-
-        twitter === twitter2; //=> true
-        ```
-
-        If singletons are not wanted an optional flag can be provided at lookup.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        var twitter = container.lookup('api:twitter', { singleton: false });
-        var twitter2 = container.lookup('api:twitter', { singleton: false });
-
-        twitter === twitter2; //=> false
-        ```
-
-        @method lookup
-        @param {String} fullName
-        @param {Object} options
-        @return {any}
-      */
-      lookup: function(fullName, options) {
-        validateFullName(fullName);
-        return lookup(this, this.normalize(fullName), options);
-      },
-
-      /**
-        Given a fullName return the corresponding factory.
-
-        @method lookupFactory
-        @param {String} fullName
-        @return {any}
-      */
-      lookupFactory: function(fullName) {
-        validateFullName(fullName);
-        return factoryFor(this, this.normalize(fullName));
-      },
-
-      /**
-        Given a fullName check if the container is aware of its factory
-        or singleton instance.
-
-        @method has
-        @param {String} fullName
-        @return {Boolean}
-      */
-      has: function(fullName) {
-        validateFullName(fullName);
-        return has(this, this.normalize(fullName));
-      },
-
-      /**
-        Allow registering options for all factories of a type.
-
-        ```javascript
-        var container = new Container();
-
-        // if all of type `connection` must not be singletons
-        container.optionsForType('connection', { singleton: false });
-
-        container.register('connection:twitter', TwitterConnection);
-        container.register('connection:facebook', FacebookConnection);
-
-        var twitter = container.lookup('connection:twitter');
-        var twitter2 = container.lookup('connection:twitter');
-
-        twitter === twitter2; // => false
-
-        var facebook = container.lookup('connection:facebook');
-        var facebook2 = container.lookup('connection:facebook');
-
-        facebook === facebook2; // => false
-        ```
-
-        @method optionsForType
-        @param {String} type
-        @param {Object} options
-      */
-      optionsForType: function(type, options) {
-        if (this.parent) { illegalChildOperation('optionsForType'); }
-
-        this._typeOptions.set(type, options);
-      },
-
-      /**
-        @method options
-        @param {String} type
-        @param {Object} options
-      */
-      options: function(type, options) {
-        this.optionsForType(type, options);
-      },
-
-      /**
-        Used only via `injection`.
-
-        Provides a specialized form of injection, specifically enabling
-        all objects of one type to be injected with a reference to another
-        object.
-
-        For example, provided each object of type `controller` needed a `router`.
-        one would do the following:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('router:main', Router);
-        container.register('controller:user', UserController);
-        container.register('controller:post', PostController);
-
-        container.typeInjection('controller', 'router', 'router:main');
-
-        var user = container.lookup('controller:user');
-        var post = container.lookup('controller:post');
-
-        user.router instanceof Router; //=> true
-        post.router instanceof Router; //=> true
-
-        // both controllers share the same router
-        user.router === post.router; //=> true
-        ```
-
-        @private
-        @method typeInjection
-        @param {String} type
-        @param {String} property
-        @param {String} fullName
-      */
-      typeInjection: function(type, property, fullName) {
-        validateFullName(fullName);
-        if (this.parent) { illegalChildOperation('typeInjection'); }
-
-        var fullNameType = fullName.split(':')[0];        
-        if(fullNameType === type) {
-          throw new Error('Cannot inject a `' + fullName + '` on other ' + type + '(s). Register the `' + fullName + '` as a different type and perform the typeInjection.');
-        }
-        addTypeInjection(this.typeInjections, type, property, fullName);
-      },
-
-      /**
-        Defines injection rules.
-
-        These rules are used to inject dependencies onto objects when they
-        are instantiated.
-
-        Two forms of injections are possible:
-
-        * Injecting one fullName on another fullName
-        * Injecting one fullName on a type
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('source:main', Source);
-        container.register('model:user', User);
-        container.register('model:post', Post);
-
-        // injecting one fullName on another fullName
-        // eg. each user model gets a post model
-        container.injection('model:user', 'post', 'model:post');
-
-        // injecting one fullName on another type
-        container.injection('model', 'source', 'source:main');
-
-        var user = container.lookup('model:user');
-        var post = container.lookup('model:post');
-
-        user.source instanceof Source; //=> true
-        post.source instanceof Source; //=> true
-
-        user.post instanceof Post; //=> true
-
-        // and both models share the same source
-        user.source === post.source; //=> true
-        ```
-
-        @method injection
-        @param {String} factoryName
-        @param {String} property
-        @param {String} injectionName
-      */
-      injection: function(fullName, property, injectionName) {
-        if (this.parent) { illegalChildOperation('injection'); }
-
-        validateFullName(injectionName);
-        var normalizedInjectionName = this.normalize(injectionName);
-
-        if (fullName.indexOf(':') === -1) {
-          return this.typeInjection(fullName, property, normalizedInjectionName);
-        }
-
-        validateFullName(fullName);
-        var normalizedName = this.normalize(fullName);
-
-        addInjection(this.injections, normalizedName, property, normalizedInjectionName);
-      },
-
-
-      /**
-        Used only via `factoryInjection`.
-
-        Provides a specialized form of injection, specifically enabling
-        all factory of one type to be injected with a reference to another
-        object.
-
-        For example, provided each factory of type `model` needed a `store`.
-        one would do the following:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('store:main', SomeStore);
-
-        container.factoryTypeInjection('model', 'store', 'store:main');
-
-        var store = container.lookup('store:main');
-        var UserFactory = container.lookupFactory('model:user');
-
-        UserFactory.store instanceof SomeStore; //=> true
-        ```
-
-        @private
-        @method factoryTypeInjection
-        @param {String} type
-        @param {String} property
-        @param {String} fullName
-      */
-      factoryTypeInjection: function(type, property, fullName) {
-        if (this.parent) { illegalChildOperation('factoryTypeInjection'); }
-
-        addTypeInjection(this.factoryTypeInjections, type, property, this.normalize(fullName));
-      },
-
-      /**
-        Defines factory injection rules.
-
-        Similar to regular injection rules, but are run against factories, via
-        `Container#lookupFactory`.
-
-        These rules are used to inject objects onto factories when they
-        are looked up.
-
-        Two forms of injections are possible:
-
-      * Injecting one fullName on another fullName
-      * Injecting one fullName on a type
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('store:main', Store);
-        container.register('store:secondary', OtherStore);
-        container.register('model:user', User);
-        container.register('model:post', Post);
-
-        // injecting one fullName on another type
-        container.factoryInjection('model', 'store', 'store:main');
-
-        // injecting one fullName on another fullName
-        container.factoryInjection('model:post', 'secondaryStore', 'store:secondary');
-
-        var UserFactory = container.lookupFactory('model:user');
-        var PostFactory = container.lookupFactory('model:post');
-        var store = container.lookup('store:main');
-
-        UserFactory.store instanceof Store; //=> true
-        UserFactory.secondaryStore instanceof OtherStore; //=> false
-
-        PostFactory.store instanceof Store; //=> true
-        PostFactory.secondaryStore instanceof OtherStore; //=> true
-
-        // and both models share the same source instance
-        UserFactory.store === PostFactory.store; //=> true
-        ```
-
-        @method factoryInjection
-        @param {String} factoryName
-        @param {String} property
-        @param {String} injectionName
-      */
-      factoryInjection: function(fullName, property, injectionName) {
-        if (this.parent) { illegalChildOperation('injection'); }
-
-        var normalizedName = this.normalize(fullName);
-        var normalizedInjectionName = this.normalize(injectionName);
-
-        validateFullName(injectionName);
-
-        if (fullName.indexOf(':') === -1) {
-          return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName);
-        }
-
-        validateFullName(fullName);
-
-        addInjection(this.factoryInjections, normalizedName, property, normalizedInjectionName);
-      },
-
-      /**
-        A depth first traversal, destroying the container, its descendant containers and all
-        their managed objects.
-
-        @method destroy
-      */
-      destroy: function() {
-        for (var i=0, l=this.children.length; i<l; i++) {
-          this.children[i].destroy();
-        }
-
-        this.children = [];
-
-        eachDestroyable(this, function(item) {
-          item.destroy();
-        });
-
-        this.parent = undefined;
-        this.isDestroyed = true;
-      },
-
-      /**
-        @method reset
-      */
-      reset: function() {
-        for (var i=0, l=this.children.length; i<l; i++) {
-          resetCache(this.children[i]);
-        }
-        resetCache(this);
-      }
-    };
-
-    function has(container, fullName){
-      if (container.cache.has(fullName)) {
-        return true;
-      }
-
-      return !!container.resolve(fullName);
-    }
-
-    function lookup(container, fullName, options) {
-      options = options || {};
-
-      if (container.cache.has(fullName) && options.singleton !== false) {
-        return container.cache.get(fullName);
-      }
-
-      var value = instantiate(container, fullName);
-
-      if (value === undefined) { return; }
-
-      if (isSingleton(container, fullName) && options.singleton !== false) {
-        container.cache.set(fullName, value);
-      }
-
-      return value;
-    }
-
-    function illegalChildOperation(operation) {
-      throw new Error(operation + " is not currently supported on child containers");
-    }
-
-    function isSingleton(container, fullName) {
-      var singleton = option(container, fullName, 'singleton');
-
-      return singleton !== false;
-    }
-
-    function buildInjections(container, injections) {
-      var hash = {};
-
-      if (!injections) { return hash; }
-
-      var injection, injectable;
-
-      for (var i=0, l=injections.length; i<l; i++) {
-        injection = injections[i];
-        injectable = lookup(container, injection.fullName);
-
-        if (injectable !== undefined) {
-          hash[injection.property] = injectable;
-        } else {
-          throw new Error('Attempting to inject an unknown injection: `' + injection.fullName + '`');
-        }
-      }
-
-      return hash;
-    }
-
-    function option(container, fullName, optionName) {
-      var options = container._options.get(fullName);
-
-      if (options && options[optionName] !== undefined) {
-        return options[optionName];
-      }
-
-      var type = fullName.split(":")[0];
-      options = container._typeOptions.get(type);
-
-      if (options) {
-        return options[optionName];
-      }
-    }
-
-    function factoryFor(container, fullName) {
-      var name = fullName;
-      var factory = container.resolve(name);
-      var injectedFactory;
-      var cache = container.factoryCache;
-      var type = fullName.split(":")[0];
-
-      if (factory === undefined) { return; }
-
-      if (cache.has(fullName)) {
-        return cache.get(fullName);
-      }
-
-      if (!factory || typeof factory.extend !== 'function' || (!Ember.MODEL_FACTORY_INJECTIONS && type === 'model')) {
-        // TODO: think about a 'safe' merge style extension
-        // for now just fallback to create time injection
-        return factory;
-      } else {
-
-        var injections        = injectionsFor(container, fullName);
-        var factoryInjections = factoryInjectionsFor(container, fullName);
-
-        factoryInjections._toString = container.makeToString(factory, fullName);
-
-        injectedFactory = factory.extend(injections);
-        injectedFactory.reopenClass(factoryInjections);
-
-        cache.set(fullName, injectedFactory);
-
-        return injectedFactory;
-      }
-    }
-
-    function injectionsFor(container, fullName) {
-      var splitName = fullName.split(":"),
-        type = splitName[0],
-        injections = [];
-
-      injections = injections.concat(container.typeInjections.get(type) || []);
-      injections = injections.concat(container.injections[fullName] || []);
-
-      injections = buildInjections(container, injections);
-      injections._debugContainerKey = fullName;
-      injections.container = container;
-
-      return injections;
-    }
-
-    function factoryInjectionsFor(container, fullName) {
-      var splitName = fullName.split(":"),
-        type = splitName[0],
-        factoryInjections = [];
-
-      factoryInjections = factoryInjections.concat(container.factoryTypeInjections.get(type) || []);
-      factoryInjections = factoryInjections.concat(container.factoryInjections[fullName] || []);
-
-      factoryInjections = buildInjections(container, factoryInjections);
-      factoryInjections._debugContainerKey = fullName;
-
-      return factoryInjections;
-    }
-
-    function instantiate(container, fullName) {
-      var factory = factoryFor(container, fullName);
-
-      if (option(container, fullName, 'instantiate') === false) {
-        return factory;
-      }
-
-      if (factory) {
-        if (typeof factory.extend === 'function') {
-          // assume the factory was extendable and is already injected
-          return factory.create();
-        } else {
-          // assume the factory was extendable
-          // to create time injections
-          // TODO: support new'ing for instantiation and merge injections for pure JS Functions
-          return factory.create(injectionsFor(container, fullName));
-        }
-      }
-    }
-
-    function eachDestroyable(container, callback) {
-      container.cache.eachLocal(function(key, value) {
-        if (option(container, key, 'instantiate') === false) { return; }
-        callback(value);
-      });
-    }
-
-    function resetCache(container) {
-      container.cache.eachLocal(function(key, value) {
-        if (option(container, key, 'instantiate') === false) { return; }
-        value.destroy();
-      });
-      container.cache.dict = {};
-    }
-
-    function addTypeInjection(rules, type, property, fullName) {
-      var injections = rules.get(type);
-
-      if (!injections) {
-        injections = [];
-        rules.set(type, injections);
-      }
-
-      injections.push({
-        property: property,
-        fullName: fullName
-      });
-    }
-
-    var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
-    function validateFullName(fullName) {
-      if (!VALID_FULL_NAME_REGEXP.test(fullName)) {
-        throw new TypeError('Invalid Fullname, expected: `type:name` got: ' + fullName);
-      }
-    }
-
-    function addInjection(rules, factoryName, property, injectionName) {
-      var injections = rules[factoryName] = rules[factoryName] || [];
-      injections.push({ property: property, fullName: injectionName });
-    }
-
-    __exports__["default"] = Container;
-  });
-define("container/inheriting_dict", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    // A safe and simple inheriting object.
-    function InheritingDict(parent) {
-      this.parent = parent;
-      this.dict = {};
-    }
-
-    InheritingDict.prototype = {
-
-      /**
-        @property parent
-        @type InheritingDict
-        @default null
-      */
-
-      parent: null,
-
-      /**
-        Object used to store the current nodes data.
-
-        @property dict
-        @type Object
-        @default Object
-      */
-      dict: null,
-
-      /**
-        Retrieve the value given a key, if the value is present at the current
-        level use it, otherwise walk up the parent hierarchy and try again. If
-        no matching key is found, return undefined.
-
-        @method get
-        @param {String} key
-        @return {any}
-      */
-      get: function(key) {
-        var dict = this.dict;
-
-        if (dict.hasOwnProperty(key)) {
-          return dict[key];
-        }
-
-        if (this.parent) {
-          return this.parent.get(key);
-        }
-      },
-
-      /**
-        Set the given value for the given key, at the current level.
-
-        @method set
-        @param {String} key
-        @param {Any} value
-      */
-      set: function(key, value) {
-        this.dict[key] = value;
-      },
-
-      /**
-        Delete the given key
-
-        @method remove
-        @param {String} key
-      */
-      remove: function(key) {
-        delete this.dict[key];
-      },
-
-      /**
-        Check for the existence of given a key, if the key is present at the current
-        level return true, otherwise walk up the parent hierarchy and try again. If
-        no matching key is found, return false.
-
-        @method has
-        @param {String} key
-        @return {Boolean}
-      */
-      has: function(key) {
-        var dict = this.dict;
-
-        if (dict.hasOwnProperty(key)) {
-          return true;
-        }
-
-        if (this.parent) {
-          return this.parent.has(key);
-        }
-
-        return false;
-      },
-
-      /**
-        Iterate and invoke a callback for each local key-value pair.
-
-        @method eachLocal
-        @param {Function} callback
-        @param {Object} binding
-      */
-      eachLocal: function(callback, binding) {
-        var dict = this.dict;
-
-        for (var prop in dict) {
-          if (dict.hasOwnProperty(prop)) {
-            callback.call(binding, prop, dict[prop]);
-          }
-        }
-      }
-    };
-
-    __exports__["default"] = InheritingDict;
-  });
-define("container", 
-  ["container/container","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    /**
-    Public api for the container is still in flux.
-    The public api, specified on the application namespace should be considered the stable api.
-    // @module container
-      @private
-    */
-
-    /*
-     Flag to enable/disable model factory injections (disabled by default)
-     If model factory injections are enabled, models should not be
-     accessed globally (only through `container.lookupFactory('model:modelName'))`);
-    */
-    Ember.MODEL_FACTORY_INJECTIONS = false;
-
-    if (Ember.ENV && typeof Ember.ENV.MODEL_FACTORY_INJECTIONS !== 'undefined') {
-      Ember.MODEL_FACTORY_INJECTIONS = !!Ember.ENV.MODEL_FACTORY_INJECTIONS;
-    }
-
-
-    var Container = __dependency1__["default"];
-
-    __exports__["default"] = Container;
-  });
-})();
-
-(function() {
-define("ember-runtime/compare", 
-  ["ember-metal/core","ember-metal/utils","ember-runtime/mixins/comparable","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-     // for Ember.ORDER_DEFINITION
-    var typeOf = __dependency2__.typeOf;
-    var Comparable = __dependency3__["default"];
-
-    // Used by Ember.compare
-    Ember.ORDER_DEFINITION = Ember.ENV.ORDER_DEFINITION || [
-      'undefined',
-      'null',
-      'boolean',
-      'number',
-      'string',
-      'array',
-      'object',
-      'instance',
-      'function',
-      'class',
-      'date'
-    ];
-
-    /**
-     This will compare two javascript values of possibly different types.
-     It will tell you which one is greater than the other by returning:
-
-      - -1 if the first is smaller than the second,
-      - 0 if both are equal,
-      - 1 if the first is greater than the second.
-
-     The order is calculated based on `Ember.ORDER_DEFINITION`, if types are different.
-     In case they have the same type an appropriate comparison for this type is made.
-
-      ```javascript
-      Ember.compare('hello', 'hello');  // 0
-      Ember.compare('abc', 'dfg');      // -1
-      Ember.compare(2, 1);              // 1
-      ```
-
-     @method compare
-     @for Ember
-     @param {Object} v First value to compare
-     @param {Object} w Second value to compare
-     @return {Number} -1 if v < w, 0 if v = w and 1 if v > w.
-    */
-    function compare(v, w) {
-      if (v === w) { return 0; }
-
-      var type1 = typeOf(v);
-      var type2 = typeOf(w);
-
-      if (Comparable) {
-        if (type1==='instance' && Comparable.detect(v.constructor)) {
-          return v.constructor.compare(v, w);
-        }
-
-        if (type2 === 'instance' && Comparable.detect(w.constructor)) {
-          return 1-w.constructor.compare(w, v);
-        }
-      }
-
-      // If we haven't yet generated a reverse-mapping of Ember.ORDER_DEFINITION,
-      // do so now.
-      var mapping = Ember.ORDER_DEFINITION_MAPPING;
-      if (!mapping) {
-        var order = Ember.ORDER_DEFINITION;
-        mapping = Ember.ORDER_DEFINITION_MAPPING = {};
-        var idx, len;
-        for (idx = 0, len = order.length; idx < len;  ++idx) {
-          mapping[order[idx]] = idx;
-        }
-
-        // We no longer need Ember.ORDER_DEFINITION.
-        delete Ember.ORDER_DEFINITION;
-      }
-
-      var type1Index = mapping[type1];
-      var type2Index = mapping[type2];
-
-      if (type1Index < type2Index) { return -1; }
-      if (type1Index > type2Index) { return 1; }
-
-      // types are equal - so we have to check values now
-      switch (type1) {
-        case 'boolean':
-        case 'number':
-          if (v < w) { return -1; }
-          if (v > w) { return 1; }
-          return 0;
-
-        case 'string':
-          var comp = v.localeCompare(w);
-          if (comp < 0) { return -1; }
-          if (comp > 0) { return 1; }
-          return 0;
-
-        case 'array':
-          var vLen = v.length;
-          var wLen = w.length;
-          var l = Math.min(vLen, wLen);
-          var r = 0;
-          var i = 0;
-          while (r === 0 && i < l) {
-            r = compare(v[i],w[i]);
-            i++;
-          }
-          if (r !== 0) { return r; }
-
-          // all elements are equal now
-          // shorter array should be ordered first
-          if (vLen < wLen) { return -1; }
-          if (vLen > wLen) { return 1; }
-          // arrays are equal now
-          return 0;
-
-        case 'instance':
-          if (Comparable && Comparable.detect(v)) {
-            return v.compare(v, w);
-          }
-          return 0;
-
-        case 'date':
-          var vNum = v.getTime();
-          var wNum = w.getTime();
-          if (vNum < wNum) { return -1; }
-          if (vNum > wNum) { return 1; }
-          return 0;
-
-        default:
-          return 0;
-      }
-    };
-
-    __exports__["default"] = compare;
-  });
-define("ember-runtime/computed/array_computed", 
-  ["ember-metal/core","ember-runtime/computed/reduce_computed","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/observer","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var reduceComputed = __dependency2__.reduceComputed;
-    var ReduceComputedProperty = __dependency2__.ReduceComputedProperty;
-    var EnumerableUtils = __dependency3__["default"];
-    var create = __dependency4__.create;
-    var addObserver = __dependency5__.addObserver;
-    var EmberError = __dependency6__["default"];
-
-    var a_slice = [].slice,
-        o_create = create,
-        forEach = EnumerableUtils.forEach;
-
-    function ArrayComputedProperty() {
-      var cp = this;
-
-      ReduceComputedProperty.apply(this, arguments);
-
-      this.func = (function(reduceFunc) {
-        return function (propertyName) {
-          if (!cp._hasInstanceMeta(this, propertyName)) {
-            // When we recompute an array computed property, we need already
-            // retrieved arrays to be updated; we can't simply empty the cache and
-            // hope the array is re-retrieved.
-            forEach(cp._dependentKeys, function(dependentKey) {
-              addObserver(this, dependentKey, function() {
-                cp.recomputeOnce.call(this, propertyName);
-              });
-            }, this);
-          }
-
-          return reduceFunc.apply(this, arguments);
-        };
-      })(this.func);
-
-      return this;
-    }
-
-    ArrayComputedProperty.prototype = o_create(ReduceComputedProperty.prototype);
-    ArrayComputedProperty.prototype.initialValue = function () {
-      return Ember.A();
-    };
-    ArrayComputedProperty.prototype.resetValue = function (array) {
-      array.clear();
-      return array;
-    };
-
-    // This is a stopgap to keep the reference counts correct with lazy CPs.
-    ArrayComputedProperty.prototype.didChange = function (obj, keyName) {
-      return;
-    };
-
-    /**
-      Creates a computed property which operates on dependent arrays and
-      is updated with "one at a time" semantics. When items are added or
-      removed from the dependent array(s) an array computed only operates
-      on the change instead of re-evaluating the entire array. This should
-      return an array, if you'd like to use "one at a time" semantics and
-      compute some value other then an array look at
-      `Ember.reduceComputed`.
-
-      If there are more than one arguments the first arguments are
-      considered to be dependent property keys. The last argument is
-      required to be an options object. The options object can have the
-      following three properties.
-
-      `initialize` - An optional initialize function. Typically this will be used
-      to set up state on the instanceMeta object.
-
-      `removedItem` - A function that is called each time an element is
-      removed from the array.
-
-      `addedItem` - A function that is called each time an element is
-      added to the array.
-
-
-      The `initialize` function has the following signature:
-
-      ```javascript
-       function (array, changeMeta, instanceMeta)
-      ```
-
-      `array` - The initial value of the arrayComputed, an empty array.
-
-      `changeMeta` - An object which contains meta information about the
-      computed. It contains the following properties:
-
-         - `property` the computed property
-         - `propertyName` the name of the property on the object
-
-      `instanceMeta` - An object that can be used to store meta
-      information needed for calculating your computed. For example a
-      unique computed might use this to store the number of times a given
-      element is found in the dependent array.
-
-
-      The `removedItem` and `addedItem` functions both have the following signature:
-
-      ```javascript
-      function (accumulatedValue, item, changeMeta, instanceMeta)
-      ```
-
-      `accumulatedValue` - The value returned from the last time
-      `removedItem` or `addedItem` was called or an empty array.
-
-      `item` - the element added or removed from the array
-
-      `changeMeta` - An object which contains meta information about the
-      change. It contains the following properties:
-
-        - `property` the computed property
-        - `propertyName` the name of the property on the object
-        - `index` the index of the added or removed item
-        - `item` the added or removed item: this is exactly the same as
-          the second arg
-        - `arrayChanged` the array that triggered the change. Can be
-          useful when depending on multiple arrays.
-
-      For property changes triggered on an item property change (when
-      depKey is something like `someArray.@each.someProperty`),
-      `changeMeta` will also contain the following property:
-
-        - `previousValues` an object whose keys are the properties that changed on
-        the item, and whose values are the item's previous values.
-
-      `previousValues` is important Ember coalesces item property changes via
-      Ember.run.once. This means that by the time removedItem gets called, item has
-      the new values, but you may need the previous value (eg for sorting &
-      filtering).
-
-      `instanceMeta` - An object that can be used to store meta
-      information needed for calculating your computed. For example a
-      unique computed might use this to store the number of times a given
-      element is found in the dependent array.
-
-      The `removedItem` and `addedItem` functions should return the accumulated
-      value. It is acceptable to not return anything (ie return undefined)
-      to invalidate the computation. This is generally not a good idea for
-      arrayComputed but it's used in eg max and min.
-
-      Example
-
-      ```javascript
-      Ember.computed.map = function(dependentKey, callback) {
-        var options = {
-          addedItem: function(array, item, changeMeta, instanceMeta) {
-            var mapped = callback(item);
-            array.insertAt(changeMeta.index, mapped);
-            return array;
-          },
-          removedItem: function(array, item, changeMeta, instanceMeta) {
-            array.removeAt(changeMeta.index, 1);
-            return array;
-          }
-        };
-
-        return Ember.arrayComputed(dependentKey, options);
-      };
-      ```
-
-      @method arrayComputed
-      @for Ember
-      @param {String} [dependentKeys*]
-      @param {Object} options
-      @return {Ember.ComputedProperty}
-    */
-    function arrayComputed (options) {
-      var args;
-
-      if (arguments.length > 1) {
-        args = a_slice.call(arguments, 0, -1);
-        options = a_slice.call(arguments, -1)[0];
-      }
-
-      if (typeof options !== "object") {
-        throw new EmberError("Array Computed Property declared without an options hash");
-      }
-
-      var cp = new ArrayComputedProperty(options);
-
-      if (args) {
-        cp.property.apply(cp, args);
-      }
-
-      return cp;
-    };
-
-    __exports__.arrayComputed = arrayComputed;
-    __exports__.ArrayComputedProperty = ArrayComputedProperty;
-  });
-define("ember-runtime/computed/reduce_computed", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/property_events","ember-metal/expand_properties","ember-metal/observer","ember-metal/computed","ember-metal/platform","ember-metal/enumerable_utils","ember-runtime/system/tracked_array","ember-runtime/mixins/array","ember-metal/run_loop","ember-runtime/system/set","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var e_get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var guidFor = __dependency4__.guidFor;
-    var metaFor = __dependency4__.meta;
-    var EmberError = __dependency5__["default"];
-    var propertyWillChange = __dependency6__.propertyWillChange;
-    var propertyDidChange = __dependency6__.propertyDidChange;
-    var expandProperties = __dependency7__["default"];
-    var addObserver = __dependency8__.addObserver;
-    var observersFor = __dependency8__.observersFor;
-    var removeObserver = __dependency8__.removeObserver;
-    var addBeforeObserver = __dependency8__.addBeforeObserver;
-    var removeBeforeObserver = __dependency8__.removeBeforeObserver;
-    var ComputedProperty = __dependency9__.ComputedProperty;
-    var cacheFor = __dependency9__.cacheFor;
-    var create = __dependency10__.create;
-    var EnumerableUtils = __dependency11__["default"];
-    var TrackedArray = __dependency12__["default"];
-    var EmberArray = __dependency13__["default"];
-    var run = __dependency14__["default"];
-    var Set = __dependency15__["default"];
-    var isArray = __dependency4__.isArray;
-
-    var cacheSet = cacheFor.set,
-        cacheGet = cacheFor.get,
-        cacheRemove = cacheFor.remove,
-        a_slice = [].slice,
-        o_create = create,
-        forEach = EnumerableUtils.forEach,
-        // Here we explicitly don't allow `@each.foo`; it would require some special
-        // testing, but there's no particular reason why it should be disallowed.
-        eachPropertyPattern = /^(.*)\.@each\.(.*)/,
-        doubleEachPropertyPattern = /(.*\.@each){2,}/,
-        arrayBracketPattern = /\.\[\]$/;
-
-    function get(obj, key) {
-      if (key === '@this') {
-        return obj;
-      }
-
-      return e_get(obj, key);
-    }
-
-    /*
-      Tracks changes to dependent arrays, as well as to properties of items in
-      dependent arrays.
-
-      @class DependentArraysObserver
-    */
-    function DependentArraysObserver(callbacks, cp, instanceMeta, context, propertyName, sugarMeta) {
-      // user specified callbacks for `addedItem` and `removedItem`
-      this.callbacks = callbacks;
-
-      // the computed property: remember these are shared across instances
-      this.cp = cp;
-
-      // the ReduceComputedPropertyInstanceMeta this DependentArraysObserver is
-      // associated with
-      this.instanceMeta = instanceMeta;
-
-      // A map of array guids to dependentKeys, for the given context.  We track
-      // this because we want to set up the computed property potentially before the
-      // dependent array even exists, but when the array observer fires, we lack
-      // enough context to know what to update: we can recover that context by
-      // getting the dependentKey.
-      this.dependentKeysByGuid = {};
-
-      // a map of dependent array guids -> TrackedArray instances.  We use
-      // this to lazily recompute indexes for item property observers.
-      this.trackedArraysByGuid = {};
-
-      // We suspend observers to ignore replacements from `reset` when totally
-      // recomputing.  Unfortunately we cannot properly suspend the observers
-      // because we only have the key; instead we make the observers no-ops
-      this.suspended = false;
-
-      // This is used to coalesce item changes from property observers.
-      this.changedItems = {};
-    }
-
-    function ItemPropertyObserverContext (dependentArray, index, trackedArray) {
-      Ember.assert("Internal error: trackedArray is null or undefined", trackedArray);
-
-      this.dependentArray = dependentArray;
-      this.index = index;
-      this.item = dependentArray.objectAt(index);
-      this.trackedArray = trackedArray;
-      this.beforeObserver = null;
-      this.observer = null;
-
-      this.destroyed = false;
-    }
-
-    DependentArraysObserver.prototype = {
-      setValue: function (newValue) {
-        this.instanceMeta.setValue(newValue, true);
-      },
-      getValue: function () {
-        return this.instanceMeta.getValue();
-      },
-
-      setupObservers: function (dependentArray, dependentKey) {
-        this.dependentKeysByGuid[guidFor(dependentArray)] = dependentKey;
-
-        dependentArray.addArrayObserver(this, {
-          willChange: 'dependentArrayWillChange',
-          didChange: 'dependentArrayDidChange'
-        });
-
-        if (this.cp._itemPropertyKeys[dependentKey]) {
-          this.setupPropertyObservers(dependentKey, this.cp._itemPropertyKeys[dependentKey]);
-        }
-      },
-
-      teardownObservers: function (dependentArray, dependentKey) {
-        var itemPropertyKeys = this.cp._itemPropertyKeys[dependentKey] || [];
-
-        delete this.dependentKeysByGuid[guidFor(dependentArray)];
-
-        this.teardownPropertyObservers(dependentKey, itemPropertyKeys);
-
-        dependentArray.removeArrayObserver(this, {
-          willChange: 'dependentArrayWillChange',
-          didChange: 'dependentArrayDidChange'
-        });
-      },
-
-      suspendArrayObservers: function (callback, binding) {
-        var oldSuspended = this.suspended;
-        this.suspended = true;
-        callback.call(binding);
-        this.suspended = oldSuspended;
-      },
-
-      setupPropertyObservers: function (dependentKey, itemPropertyKeys) {
-        var dependentArray = get(this.instanceMeta.context, dependentKey),
-            length = get(dependentArray, 'length'),
-            observerContexts = new Array(length);
-
-        this.resetTransformations(dependentKey, observerContexts);
-
-        forEach(dependentArray, function (item, index) {
-          var observerContext = this.createPropertyObserverContext(dependentArray, index, this.trackedArraysByGuid[dependentKey]);
-          observerContexts[index] = observerContext;
-
-          forEach(itemPropertyKeys, function (propertyKey) {
-            addBeforeObserver(item, propertyKey, this, observerContext.beforeObserver);
-            addObserver(item, propertyKey, this, observerContext.observer);
-          }, this);
-        }, this);
-      },
-
-      teardownPropertyObservers: function (dependentKey, itemPropertyKeys) {
-        var dependentArrayObserver = this,
-            trackedArray = this.trackedArraysByGuid[dependentKey],
-            beforeObserver,
-            observer,
-            item;
-
-        if (!trackedArray) { return; }
-
-        trackedArray.apply(function (observerContexts, offset, operation) {
-          if (operation === TrackedArray.DELETE) { return; }
-
-          forEach(observerContexts, function (observerContext) {
-            observerContext.destroyed = true;
-            beforeObserver = observerContext.beforeObserver;
-            observer = observerContext.observer;
-            item = observerContext.item;
-
-            forEach(itemPropertyKeys, function (propertyKey) {
-              removeBeforeObserver(item, propertyKey, dependentArrayObserver, beforeObserver);
-              removeObserver(item, propertyKey, dependentArrayObserver, observer);
-            });
-          });
-        });
-      },
-
-      createPropertyObserverContext: function (dependentArray, index, trackedArray) {
-        var observerContext = new ItemPropertyObserverContext(dependentArray, index, trackedArray);
-
-        this.createPropertyObserver(observerContext);
-
-        return observerContext;
-      },
-
-      createPropertyObserver: function (observerContext) {
-        var dependentArrayObserver = this;
-
-        observerContext.beforeObserver = function (obj, keyName) {
-          return dependentArrayObserver.itemPropertyWillChange(obj, keyName, observerContext.dependentArray, observerContext);
-        };
-        observerContext.observer = function (obj, keyName) {
-          return dependentArrayObserver.itemPropertyDidChange(obj, keyName, observerContext.dependentArray, observerContext);
-        };
-      },
-
-      resetTransformations: function (dependentKey, observerContexts) {
-        this.trackedArraysByGuid[dependentKey] = new TrackedArray(observerContexts);
-      },
-
-      trackAdd: function (dependentKey, index, newItems) {
-        var trackedArray = this.trackedArraysByGuid[dependentKey];
-        if (trackedArray) {
-          trackedArray.addItems(index, newItems);
-        }
-      },
-
-      trackRemove: function (dependentKey, index, removedCount) {
-        var trackedArray = this.trackedArraysByGuid[dependentKey];
-
-        if (trackedArray) {
-          return trackedArray.removeItems(index, removedCount);
-        }
-
-        return [];
-      },
-
-      updateIndexes: function (trackedArray, array) {
-        var length = get(array, 'length');
-        // OPTIMIZE: we could stop updating once we hit the object whose observer
-        // fired; ie partially apply the transformations
-        trackedArray.apply(function (observerContexts, offset, operation) {
-          // we don't even have observer contexts for removed items, even if we did,
-          // they no longer have any index in the array
-          if (operation === TrackedArray.DELETE) { return; }
-          if (operation === TrackedArray.RETAIN && observerContexts.length === length && offset === 0) {
-            // If we update many items we don't want to walk the array each time: we
-            // only need to update the indexes at most once per run loop.
-            return;
-          }
-
-          forEach(observerContexts, function (context, index) {
-            context.index = index + offset;
-          });
-        });
-      },
-
-      dependentArrayWillChange: function (dependentArray, index, removedCount, addedCount) {
-        if (this.suspended) { return; }
-
-        var removedItem = this.callbacks.removedItem,
-            changeMeta,
-            guid = guidFor(dependentArray),
-            dependentKey = this.dependentKeysByGuid[guid],
-            itemPropertyKeys = this.cp._itemPropertyKeys[dependentKey] || [],
-            length = get(dependentArray, 'length'),
-            normalizedIndex = normalizeIndex(index, length, 0),
-            normalizedRemoveCount = normalizeRemoveCount(normalizedIndex, length, removedCount),
-            item,
-            itemIndex,
-            sliceIndex,
-            observerContexts;
-
-        observerContexts = this.trackRemove(dependentKey, normalizedIndex, normalizedRemoveCount);
-
-        function removeObservers(propertyKey) {
-          observerContexts[sliceIndex].destroyed = true;
-          removeBeforeObserver(item, propertyKey, this, observerContexts[sliceIndex].beforeObserver);
-          removeObserver(item, propertyKey, this, observerContexts[sliceIndex].observer);
-        }
-
-        for (sliceIndex = normalizedRemoveCount - 1; sliceIndex >= 0; --sliceIndex) {
-          itemIndex = normalizedIndex + sliceIndex;
-          if (itemIndex >= length) { break; }
-
-          item = dependentArray.objectAt(itemIndex);
-
-          forEach(itemPropertyKeys, removeObservers, this);
-
-          changeMeta = createChangeMeta(dependentArray, item, itemIndex, this.instanceMeta.propertyName, this.cp);
-          this.setValue( removedItem.call(
-            this.instanceMeta.context, this.getValue(), item, changeMeta, this.instanceMeta.sugarMeta));
-        }
-      },
-
-      dependentArrayDidChange: function (dependentArray, index, removedCount, addedCount) {
-        if (this.suspended) { return; }
-
-        var addedItem = this.callbacks.addedItem,
-            guid = guidFor(dependentArray),
-            dependentKey = this.dependentKeysByGuid[guid],
-            observerContexts = new Array(addedCount),
-            itemPropertyKeys = this.cp._itemPropertyKeys[dependentKey],
-            length = get(dependentArray, 'length'),
-            normalizedIndex = normalizeIndex(index, length, addedCount),
-            changeMeta,
-            observerContext;
-
-        forEach(dependentArray.slice(normalizedIndex, normalizedIndex + addedCount), function (item, sliceIndex) {
-          if (itemPropertyKeys) {
-            observerContext =
-              observerContexts[sliceIndex] =
-              this.createPropertyObserverContext(dependentArray, normalizedIndex + sliceIndex, this.trackedArraysByGuid[dependentKey]);
-            forEach(itemPropertyKeys, function (propertyKey) {
-              addBeforeObserver(item, propertyKey, this, observerContext.beforeObserver);
-              addObserver(item, propertyKey, this, observerContext.observer);
-            }, this);
-          }
-
-          changeMeta = createChangeMeta(dependentArray, item, normalizedIndex + sliceIndex, this.instanceMeta.propertyName, this.cp);
-          this.setValue( addedItem.call(
-            this.instanceMeta.context, this.getValue(), item, changeMeta, this.instanceMeta.sugarMeta));
-        }, this);
-
-        this.trackAdd(dependentKey, normalizedIndex, observerContexts);
-      },
-
-      itemPropertyWillChange: function (obj, keyName, array, observerContext) {
-        var guid = guidFor(obj);
-
-        if (!this.changedItems[guid]) {
-          this.changedItems[guid] = {
-            array:            array,
-            observerContext:  observerContext,
-            obj:              obj,
-            previousValues:   {}
-          };
-        }
-
-        this.changedItems[guid].previousValues[keyName] = get(obj, keyName);
-      },
-
-      itemPropertyDidChange: function(obj, keyName, array, observerContext) {
-        this.flushChanges();
-      },
-
-      flushChanges: function() {
-        var changedItems = this.changedItems, key, c, changeMeta;
-
-        for (key in changedItems) {
-          c = changedItems[key];
-          if (c.observerContext.destroyed) { continue; }
-
-          this.updateIndexes(c.observerContext.trackedArray, c.observerContext.dependentArray);
-
-          changeMeta = createChangeMeta(c.array, c.obj, c.observerContext.index, this.instanceMeta.propertyName, this.cp, c.previousValues);
-          this.setValue(
-            this.callbacks.removedItem.call(this.instanceMeta.context, this.getValue(), c.obj, changeMeta, this.instanceMeta.sugarMeta));
-          this.setValue(
-            this.callbacks.addedItem.call(this.instanceMeta.context, this.getValue(), c.obj, changeMeta, this.instanceMeta.sugarMeta));
-        }
-        this.changedItems = {};
-      }
-    };
-
-    function normalizeIndex(index, length, newItemsOffset) {
-      if (index < 0) {
-        return Math.max(0, length + index);
-      } else if (index < length) {
-        return index;
-      } else /* index > length */ {
-        return Math.min(length - newItemsOffset, index);
-      }
-    }
-
-    function normalizeRemoveCount(index, length, removedCount) {
-      return Math.min(removedCount, length - index);
-    }
-
-    function createChangeMeta(dependentArray, item, index, propertyName, property, previousValues) {
-      var meta = {
-        arrayChanged: dependentArray,
-        index: index,
-        item: item,
-        propertyName: propertyName,
-        property: property
-      };
-
-      if (previousValues) {
-        // previous values only available for item property changes
-        meta.previousValues = previousValues;
-      }
-
-      return meta;
-    }
-
-    function addItems (dependentArray, callbacks, cp, propertyName, meta) {
-      forEach(dependentArray, function (item, index) {
-        meta.setValue( callbacks.addedItem.call(
-          this, meta.getValue(), item, createChangeMeta(dependentArray, item, index, propertyName, cp), meta.sugarMeta));
-      }, this);
-    }
-
-    function reset(cp, propertyName) {
-      var callbacks = cp._callbacks(),
-          meta;
-
-      if (cp._hasInstanceMeta(this, propertyName)) {
-        meta = cp._instanceMeta(this, propertyName);
-        meta.setValue(cp.resetValue(meta.getValue()));
-      } else {
-        meta = cp._instanceMeta(this, propertyName);
-      }
-
-      if (cp.options.initialize) {
-        cp.options.initialize.call(this, meta.getValue(), { property: cp, propertyName: propertyName }, meta.sugarMeta);
-      }
-    }
-
-    function partiallyRecomputeFor(obj, dependentKey) {
-      if (arrayBracketPattern.test(dependentKey)) {
-        return false;
-      }
-
-      var value = get(obj, dependentKey);
-      return EmberArray.detect(value);
-    }
-
-    function ReduceComputedPropertyInstanceMeta(context, propertyName, initialValue) {
-      this.context = context;
-      this.propertyName = propertyName;
-      this.cache = metaFor(context).cache;
-
-      this.dependentArrays = {};
-      this.sugarMeta = {};
-
-      this.initialValue = initialValue;
-    }
-
-    ReduceComputedPropertyInstanceMeta.prototype = {
-      getValue: function () {
-        var value = cacheGet(this.cache, this.propertyName);
-        if (value !== undefined) {
-          return value;
-        } else {
-          return this.initialValue;
-        }
-      },
-
-      setValue: function(newValue, triggerObservers) {
-        // This lets sugars force a recomputation, handy for very simple
-        // implementations of eg max.
-        if (newValue === cacheGet(this.cache, this.propertyName)) {
-          return;
-        }
-
-        if (triggerObservers) {
-          propertyWillChange(this.context, this.propertyName);
-        }
-
-        if (newValue === undefined) {
-          cacheRemove(this.cache, this.propertyName);
-        } else {
-          cacheSet(this.cache, this.propertyName, newValue);
-        }
-
-        if (triggerObservers) {
-          propertyDidChange(this.context, this.propertyName);
-        }
-      }
-    };
-
-    /**
-      A computed property whose dependent keys are arrays and which is updated with
-      "one at a time" semantics.
-
-      @class ReduceComputedProperty
-      @namespace Ember
-      @extends Ember.ComputedProperty
-      @constructor
-    */
-    function ReduceComputedProperty(options) {
-      var cp = this;
-
-      this.options = options;
-
-      this._dependentKeys = null;
-      // A map of dependentKey -> [itemProperty, ...] that tracks what properties of
-      // items in the array we must track to update this property.
-      this._itemPropertyKeys = {};
-      this._previousItemPropertyKeys = {};
-
-      this.readOnly();
-      this.cacheable();
-
-      this.recomputeOnce = function(propertyName) {
-        // TODO: Coalesce recomputation by <this, propertyName, cp>.
-        recompute.call(this, propertyName);
-      };
-
-      var recompute = function(propertyName) {
-        var dependentKeys = cp._dependentKeys,
-            meta = cp._instanceMeta(this, propertyName),
-            callbacks = cp._callbacks();
-
-        reset.call(this, cp, propertyName);
-
-        meta.dependentArraysObserver.suspendArrayObservers(function () {
-          forEach(cp._dependentKeys, function (dependentKey) {
-            Ember.assert(
-              "dependent array " + dependentKey + " must be an `Ember.Array`.  " +
-              "If you are not extending arrays, you will need to wrap native arrays with `Ember.A`",
-              !(isArray(get(this, dependentKey)) && !EmberArray.detect(get(this, dependentKey))));
-
-            if (!partiallyRecomputeFor(this, dependentKey)) { return; }
-
-            var dependentArray = get(this, dependentKey),
-                previousDependentArray = meta.dependentArrays[dependentKey];
-
-            if (dependentArray === previousDependentArray) {
-              // The array may be the same, but our item property keys may have
-              // changed, so we set them up again.  We can't easily tell if they've
-              // changed: the array may be the same object, but with different
-              // contents.
-              if (cp._previousItemPropertyKeys[dependentKey]) {
-                delete cp._previousItemPropertyKeys[dependentKey];
-                meta.dependentArraysObserver.setupPropertyObservers(dependentKey, cp._itemPropertyKeys[dependentKey]);
-              }
-            } else {
-              meta.dependentArrays[dependentKey] = dependentArray;
-
-              if (previousDependentArray) {
-                meta.dependentArraysObserver.teardownObservers(previousDependentArray, dependentKey);
-              }
-
-              if (dependentArray) {
-                meta.dependentArraysObserver.setupObservers(dependentArray, dependentKey);
-              }
-            }
-          }, this);
-        }, this);
-
-        forEach(cp._dependentKeys, function(dependentKey) {
-          if (!partiallyRecomputeFor(this, dependentKey)) { return; }
-
-          var dependentArray = get(this, dependentKey);
-          if (dependentArray) {
-            addItems.call(this, dependentArray, callbacks, cp, propertyName, meta);
-          }
-        }, this);
-      };
-
-
-      this.func = function (propertyName) {
-        Ember.assert("Computed reduce values require at least one dependent key", cp._dependentKeys);
-
-        recompute.call(this, propertyName);
-
-        return cp._instanceMeta(this, propertyName).getValue();
-      };
-    }
-
-    ReduceComputedProperty.prototype = o_create(ComputedProperty.prototype);
-
-    function defaultCallback(computedValue) {
-      return computedValue;
-    }
-
-    ReduceComputedProperty.prototype._callbacks = function () {
-      if (!this.callbacks) {
-        var options = this.options;
-        this.callbacks = {
-          removedItem: options.removedItem || defaultCallback,
-          addedItem: options.addedItem || defaultCallback
-        };
-      }
-      return this.callbacks;
-    };
-
-    ReduceComputedProperty.prototype._hasInstanceMeta = function (context, propertyName) {
-      return !!metaFor(context).cacheMeta[propertyName];
-    };
-
-    ReduceComputedProperty.prototype._instanceMeta = function (context, propertyName) {
-      var cacheMeta = metaFor(context).cacheMeta,
-          meta = cacheMeta[propertyName];
-
-      if (!meta) {
-        meta = cacheMeta[propertyName] = new ReduceComputedPropertyInstanceMeta(context, propertyName, this.initialValue());
-        meta.dependentArraysObserver = new DependentArraysObserver(this._callbacks(), this, meta, context, propertyName, meta.sugarMeta);
-      }
-
-      return meta;
-    };
-
-    ReduceComputedProperty.prototype.initialValue = function () {
-      if (typeof this.options.initialValue === 'function') {
-        return this.options.initialValue();
-      }
-      else {
-        return this.options.initialValue;
-      }
-    };
-
-    ReduceComputedProperty.prototype.resetValue = function (value) {
-      return this.initialValue();
-    };
-
-    ReduceComputedProperty.prototype.itemPropertyKey = function (dependentArrayKey, itemPropertyKey) {
-      this._itemPropertyKeys[dependentArrayKey] = this._itemPropertyKeys[dependentArrayKey] || [];
-      this._itemPropertyKeys[dependentArrayKey].push(itemPropertyKey);
-    };
-
-    ReduceComputedProperty.prototype.clearItemPropertyKeys = function (dependentArrayKey) {
-      if (this._itemPropertyKeys[dependentArrayKey]) {
-        this._previousItemPropertyKeys[dependentArrayKey] = this._itemPropertyKeys[dependentArrayKey];
-        this._itemPropertyKeys[dependentArrayKey] = [];
-      }
-    };
-
-    ReduceComputedProperty.prototype.property = function () {
-      var cp = this,
-          args = a_slice.call(arguments),
-          propertyArgs = new Set(),
-          match,
-          dependentArrayKey,
-          itemPropertyKey;
-
-      forEach(args, function (dependentKey) {
-        if (doubleEachPropertyPattern.test(dependentKey)) {
-          throw new EmberError("Nested @each properties not supported: " + dependentKey);
-        } else if (match = eachPropertyPattern.exec(dependentKey)) {
-          dependentArrayKey = match[1];
-
-          var itemPropertyKeyPattern = match[2],
-              addItemPropertyKey = function (itemPropertyKey) {
-                cp.itemPropertyKey(dependentArrayKey, itemPropertyKey);
-              };
-
-          expandProperties(itemPropertyKeyPattern, addItemPropertyKey);
-          propertyArgs.add(dependentArrayKey);
-        } else {
-          propertyArgs.add(dependentKey);
-        }
-      });
-
-      return ComputedProperty.prototype.property.apply(this, propertyArgs.toArray());
-
-    };
-
-    /**
-      Creates a computed property which operates on dependent arrays and
-      is updated with "one at a time" semantics. When items are added or
-      removed from the dependent array(s) a reduce computed only operates
-      on the change instead of re-evaluating the entire array.
-
-      If there are more than one arguments the first arguments are
-      considered to be dependent property keys. The last argument is
-      required to be an options object. The options object can have the
-      following four properties:
-
-      `initialValue` - A value or function that will be used as the initial
-      value for the computed. If this property is a function the result of calling
-      the function will be used as the initial value. This property is required.
-
-      `initialize` - An optional initialize function. Typically this will be used
-      to set up state on the instanceMeta object.
-
-      `removedItem` - A function that is called each time an element is removed
-      from the array.
-
-      `addedItem` - A function that is called each time an element is added to
-      the array.
-
-
-      The `initialize` function has the following signature:
-
-      ```javascript
-       function (initialValue, changeMeta, instanceMeta)
-      ```
-
-      `initialValue` - The value of the `initialValue` property from the
-      options object.
-
-      `changeMeta` - An object which contains meta information about the
-      computed. It contains the following properties:
-
-         - `property` the computed property
-         - `propertyName` the name of the property on the object
-
-      `instanceMeta` - An object that can be used to store meta
-      information needed for calculating your computed. For example a
-      unique computed might use this to store the number of times a given
-      element is found in the dependent array.
-
-
-      The `removedItem` and `addedItem` functions both have the following signature:
-
-      ```javascript
-      function (accumulatedValue, item, changeMeta, instanceMeta)
-      ```
-
-      `accumulatedValue` - The value returned from the last time
-      `removedItem` or `addedItem` was called or `initialValue`.
-
-      `item` - the element added or removed from the array
-
-      `changeMeta` - An object which contains meta information about the
-      change. It contains the following properties:
-
-        - `property` the computed property
-        - `propertyName` the name of the property on the object
-        - `index` the index of the added or removed item
-        - `item` the added or removed item: this is exactly the same as
-          the second arg
-        - `arrayChanged` the array that triggered the change. Can be
-          useful when depending on multiple arrays.
-
-      For property changes triggered on an item property change (when
-      depKey is something like `someArray.@each.someProperty`),
-      `changeMeta` will also contain the following property:
-
-        - `previousValues` an object whose keys are the properties that changed on
-        the item, and whose values are the item's previous values.
-
-      `previousValues` is important Ember coalesces item property changes via
-      Ember.run.once. This means that by the time removedItem gets called, item has
-      the new values, but you may need the previous value (eg for sorting &
-      filtering).
-
-      `instanceMeta` - An object that can be used to store meta
-      information needed for calculating your computed. For example a
-      unique computed might use this to store the number of times a given
-      element is found in the dependent array.
-
-      The `removedItem` and `addedItem` functions should return the accumulated
-      value. It is acceptable to not return anything (ie return undefined)
-      to invalidate the computation. This is generally not a good idea for
-      arrayComputed but it's used in eg max and min.
-
-      Note that observers will be fired if either of these functions return a value
-      that differs from the accumulated value.  When returning an object that
-      mutates in response to array changes, for example an array that maps
-      everything from some other array (see `Ember.computed.map`), it is usually
-      important that the *same* array be returned to avoid accidentally triggering observers.
-
-      Example
-
-      ```javascript
-      Ember.computed.max = function (dependentKey) {
-        return Ember.reduceComputed(dependentKey, {
-          initialValue: -Infinity,
-
-          addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-            return Math.max(accumulatedValue, item);
-          },
-
-          removedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-            if (item < accumulatedValue) {
-              return accumulatedValue;
-            }
-          }
-        });
-      };
-      ```
-
-      Dependent keys may refer to `@this` to observe changes to the object itself,
-      which must be array-like, rather than a property of the object.  This is
-      mostly useful for array proxies, to ensure objects are retrieved via
-      `objectAtContent`.  This is how you could sort items by properties defined on an item controller.
-
-      Example
-
-      ```javascript
-      App.PeopleController = Ember.ArrayController.extend({
-        itemController: 'person',
-
-        sortedPeople: Ember.computed.sort('@this.@each.reversedName', function(personA, personB) {
-          // `reversedName` isn't defined on Person, but we have access to it via
-          // the item controller App.PersonController.  If we'd used
-          // `content.@each.reversedName` above, we would be getting the objects
-          // directly and not have access to `reversedName`.
-          //
-          var reversedNameA = get(personA, 'reversedName'),
-              reversedNameB = get(personB, 'reversedName');
-
-          return Ember.compare(reversedNameA, reversedNameB);
-        })
-      });
-
-      App.PersonController = Ember.ObjectController.extend({
-        reversedName: function () {
-          return reverse(get(this, 'name'));
-        }.property('name')
-      })
-      ```
-
-      Dependent keys whose values are not arrays are treated as regular
-      dependencies: when they change, the computed property is completely
-      recalculated.  It is sometimes useful to have dependent arrays with similar
-      semantics.  Dependent keys which end in `.[]` do not use "one at a time"
-      semantics.  When an item is added or removed from such a dependency, the
-      computed property is completely recomputed.
-
-      Example
-
-      ```javascript
-      Ember.Object.extend({
-        // When `string` is changed, `computed` is completely recomputed.
-        string: 'a string',
-
-        // When an item is added to `array`, `addedItem` is called.
-        array: [],
-
-        // When an item is added to `anotherArray`, `computed` is completely
-        // recomputed.
-        anotherArray: [],
-
-        computed: Ember.reduceComputed('string', 'array', 'anotherArray.[]', {
-          addedItem: addedItemCallback,
-          removedItem: removedItemCallback
-        })
-      });
-      ```
-
-      @method reduceComputed
-      @for Ember
-      @param {String} [dependentKeys*]
-      @param {Object} options
-      @return {Ember.ComputedProperty}
-    */
-    function reduceComputed(options) {
-      var args;
-
-      if (arguments.length > 1) {
-        args = a_slice.call(arguments, 0, -1);
-        options = a_slice.call(arguments, -1)[0];
-      }
-
-      if (typeof options !== "object") {
-        throw new EmberError("Reduce Computed Property declared without an options hash");
-      }
-
-      if (!('initialValue' in options)) {
-        throw new EmberError("Reduce Computed Property declared without an initial value");
-      }
-
-      var cp = new ReduceComputedProperty(options);
-
-      if (args) {
-        cp.property.apply(cp, args);
-      }
-
-      return cp;
-    };
-
-    __exports__.reduceComputed = reduceComputed;
-    __exports__.ReduceComputedProperty = ReduceComputedProperty;
-  });
-define("ember-runtime/computed/reduce_computed_macros", 
-  ["ember-metal/core","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/run_loop","ember-metal/observer","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/system/object_proxy","ember-runtime/system/subarray","ember-runtime/keys","ember-runtime/compare","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var merge = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var isArray = __dependency5__.isArray;
-    var guidFor = __dependency5__.guidFor;
-    var EmberError = __dependency6__["default"];
-    var EnumerableUtils = __dependency7__["default"];
-    var run = __dependency8__["default"];
-    var addObserver = __dependency9__.addObserver;
-    var arrayComputed = __dependency10__.arrayComputed;
-    var reduceComputed = __dependency11__.reduceComputed;
-    var ObjectProxy = __dependency12__["default"];
-    var SubArray = __dependency13__["default"];
-    var keys = __dependency14__["default"];
-    var compare = __dependency15__["default"];
-
-    var a_slice = [].slice,
-        forEach = EnumerableUtils.forEach,
-        SearchProxy;
-
-    /**
-     A computed property that returns the sum of the value
-     in the dependent array.
-
-     @method computed.sum
-     @for Ember
-     @param {String} dependentKey
-     @return {Ember.ComputedProperty} computes the sum of all values in the dependentKey's array
-    */
-
-    function sum(dependentKey){
-      return reduceComputed(dependentKey, {
-        initialValue: 0,
-
-        addedItem: function(accumulatedValue, item, changeMeta, instanceMeta){
-          return accumulatedValue + item;
-        },
-
-        removedItem: function(accumulatedValue, item, changeMeta, instanceMeta){
-          return accumulatedValue - item;
-        }
-      });
-    };
-
-    /**
-      A computed property that calculates the maximum value in the
-      dependent array. This will return `-Infinity` when the dependent
-      array is empty.
-
-      ```javascript
-      App.Person = Ember.Object.extend({
-        childAges: Ember.computed.mapBy('children', 'age'),
-        maxChildAge: Ember.computed.max('childAges')
-      });
-
-      var lordByron = App.Person.create({children: []});
-      lordByron.get('maxChildAge'); // -Infinity
-      lordByron.get('children').pushObject({
-        name: 'Augusta Ada Byron', age: 7
-      });
-      lordByron.get('maxChildAge'); // 7
-      lordByron.get('children').pushObjects([{
-        name: 'Allegra Byron',
-        age: 5
-      }, {
-        name: 'Elizabeth Medora Leigh',
-        age: 8
-      }]);
-      lordByron.get('maxChildAge'); // 8
-      ```
-
-      @method computed.max
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computes the largest value in the dependentKey's array
-    */
-    function max (dependentKey) {
-      return reduceComputed(dependentKey, {
-        initialValue: -Infinity,
-
-        addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-          return Math.max(accumulatedValue, item);
-        },
-
-        removedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-          if (item < accumulatedValue) {
-            return accumulatedValue;
-          }
-        }
-      });
-    };
-
-    /**
-      A computed property that calculates the minimum value in the
-      dependent array. This will return `Infinity` when the dependent
-      array is empty.
-
-      ```javascript
-      App.Person = Ember.Object.extend({
-        childAges: Ember.computed.mapBy('children', 'age'),
-        minChildAge: Ember.computed.min('childAges')
-      });
-
-      var lordByron = App.Person.create({children: []});
-      lordByron.get('minChildAge'); // Infinity
-      lordByron.get('children').pushObject({
-        name: 'Augusta Ada Byron', age: 7
-      });
-      lordByron.get('minChildAge'); // 7
-      lordByron.get('children').pushObjects([{
-        name: 'Allegra Byron',
-        age: 5
-      }, {
-        name: 'Elizabeth Medora Leigh',
-        age: 8
-      }]);
-      lordByron.get('minChildAge'); // 5
-      ```
-
-      @method computed.min
-      @for Ember
-      @param {String} dependentKey
-      @return {Ember.ComputedProperty} computes the smallest value in the dependentKey's array
-    */
-    function min(dependentKey) {
-      return reduceComputed(dependentKey, {
-        initialValue: Infinity,
-
-        addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-          return Math.min(accumulatedValue, item);
-        },
-
-        removedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
-          if (item > accumulatedValue) {
-            return accumulatedValue;
-          }
-        }
-      });
-    };
-
-    /**
-      Returns an array mapped via the callback
-
-      The callback method you provide should have the following signature.
-      `item` is the current item in the iteration.
-
-      ```javascript
-      function(item);
-      ```
-
-      Example
-
-      ```javascript
-      App.Hamster = Ember.Object.extend({
-        excitingChores: Ember.computed.map('chores', function(chore) {
-          return chore.toUpperCase() + '!';
-        })
-      });
-
-      var hamster = App.Hamster.create({
-        chores: ['clean', 'write more unit tests']
-      });
-      hamster.get('excitingChores'); // ['CLEAN!', 'WRITE MORE UNIT TESTS!']
-      ```
-
-      @method computed.map
-      @for Ember
-      @param {String} dependentKey
-      @param {Function} callback
-      @return {Ember.ComputedProperty} an array mapped via the callback
-    */
-    function map(dependentKey, callback) {
-      var options = {
-        addedItem: function(array, item, changeMeta, instanceMeta) {
-          var mapped = callback.call(this, item);
-          array.insertAt(changeMeta.index, mapped);
-          return array;
-        },
-        removedItem: function(array, item, changeMeta, instanceMeta) {
-          array.removeAt(changeMeta.index, 1);
-          return array;
-        }
-      };
-
-      return arrayComputed(dependentKey, options);
-    };
-
-    /**
-      Returns an array mapped to the specified key.
-
-      ```javascript
-      App.Person = Ember.Object.extend({
-        childAges: Ember.computed.mapBy('children', 'age')
-      });
-
-      var lordByron = App.Person.create({children: []});
-      lordByron.get('childAges'); // []
-      lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
-      lordByron.get('childAges'); // [7]
-      lordByron.get('children').pushObjects([{
-        name: 'Allegra Byron',
-        age: 5
-      }, {
-        name: 'Elizabeth Medora Leigh',
-        age: 8
-      }]);
-      lordByron.get('childAges'); // [7, 5, 8]
-      ```
-
-      @method computed.mapBy
-      @for Ember
-      @param {String} dependentKey
-      @param {String} propertyKey
-      @return {Ember.ComputedProperty} an array mapped to the specified key
-    */
-    function mapBy (dependentKey, propertyKey) {
-      var callback = function(item) { return get(item, propertyKey); };
-      return map(dependentKey + '.@each.' + propertyKey, callback);
-    };
-
-    /**
-      @method computed.mapProperty
-      @for Ember
-      @deprecated Use `Ember.computed.mapBy` instead
-      @param dependentKey
-      @param propertyKey
-    */
-    var mapProperty = mapBy;
-
-    /**
-      Filters the array by the callback.
-
-      The callback method you provide should have the following signature.
-      `item` is the current item in the iteration.
-
-      ```javascript
-      function(item);
-      ```
-
-      ```javascript
-      App.Hamster = Ember.Object.extend({
-        remainingChores: Ember.computed.filter('chores', function(chore) {
-          return !chore.done;
-        })
-      });
-
-      var hamster = App.Hamster.create({chores: [
-        {name: 'cook', done: true},
-        {name: 'clean', done: true},
-        {name: 'write more unit tests', done: false}
-      ]});
-      hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
-      ```
-
-      @method computed.filter
-      @for Ember
-      @param {String} dependentKey
-      @param {Function} callback
-      @return {Ember.ComputedProperty} the filtered array
-    */
-    function filter(dependentKey, callback) {
-      var options = {
-        initialize: function (array, changeMeta, instanceMeta) {
-          instanceMeta.filteredArrayIndexes = new SubArray();
-        },
-
-        addedItem: function(array, item, changeMeta, instanceMeta) {
-          var match = !!callback.call(this, item),
-              filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);
-
-          if (match) {
-            array.insertAt(filterIndex, item);
-          }
-
-          return array;
-        },
-
-        removedItem: function(array, item, changeMeta, instanceMeta) {
-          var filterIndex = instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);
-
-          if (filterIndex > -1) {
-            array.removeAt(filterIndex);
-          }
-
-          return array;
-        }
-      };
-
-      return arrayComputed(dependentKey, options);
-    };
-
-    /**
-      Filters the array by the property and value
-
-      ```javascript
-      App.Hamster = Ember.Object.extend({
-        remainingChores: Ember.computed.filterBy('chores', 'done', false)
-      });
-
-      var hamster = App.Hamster.create({chores: [
-        {name: 'cook', done: true},
-        {name: 'clean', done: true},
-        {name: 'write more unit tests', done: false}
-      ]});
-      hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
-      ```
-
-      @method computed.filterBy
-      @for Ember
-      @param {String} dependentKey
-      @param {String} propertyKey
-      @param {*} value
-      @return {Ember.ComputedProperty} the filtered array
-    */
-    function filterBy (dependentKey, propertyKey, value) {
-      var callback;
-
-      if (arguments.length === 2) {
-        callback = function(item) {
-          return get(item, propertyKey);
-        };
-      } else {
-        callback = function(item) {
-          return get(item, propertyKey) === value;
-        };
-      }
-
-      return filter(dependentKey + '.@each.' + propertyKey, callback);
-    };
-
-    /**
-      @method computed.filterProperty
-      @for Ember
-      @param dependentKey
-      @param propertyKey
-      @param value
-      @deprecated Use `Ember.computed.filterBy` instead
-    */
-    var filterProperty = filterBy;
-
-    /**
-      A computed property which returns a new array with all the unique
-      elements from one or more dependent arrays.
-
-      Example
-
-      ```javascript
-      App.Hamster = Ember.Object.extend({
-        uniqueFruits: Ember.computed.uniq('fruits')
-      });
-
-      var hamster = App.Hamster.create({fruits: [
-        'banana',
-        'grape',
-        'kale',
-        'banana'
-      ]});
-      hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale']
-      ```
-
-      @method computed.uniq
-      @for Ember
-      @param {String} propertyKey*
-      @return {Ember.ComputedProperty} computes a new array with all the
-      unique elements from the dependent array
-    */
-    function uniq() {
-      var args = a_slice.call(arguments);
-      args.push({
-        initialize: function(array, changeMeta, instanceMeta) {
-          instanceMeta.itemCounts = {};
-        },
-
-        addedItem: function(array, item, changeMeta, instanceMeta) {
-          var guid = guidFor(item);
-
-          if (!instanceMeta.itemCounts[guid]) {
-            instanceMeta.itemCounts[guid] = 1;
-          } else {
-            ++instanceMeta.itemCounts[guid];
-          }
-          array.addObject(item);
-          return array;
-        },
-        removedItem: function(array, item, _, instanceMeta) {
-          var guid = guidFor(item),
-              itemCounts = instanceMeta.itemCounts;
-
-          if (--itemCounts[guid] === 0) {
-            array.removeObject(item);
-          }
-          return array;
-        }
-      });
-      return arrayComputed.apply(null, args);
-    };
-
-    /**
-      Alias for [Ember.computed.uniq](/api/#method_computed_uniq).
-
-      @method computed.union
-      @for Ember
-      @param {String} propertyKey*
-      @return {Ember.ComputedProperty} computes a new array with all the
-      unique elements from the dependent array
-    */
-    var union = uniq;
-
-    /**
-      A computed property which returns a new array with all the duplicated
-      elements from two or more dependent arrays.
-
-      Example
-
-      ```javascript
-      var obj = Ember.Object.createWithMixins({
-        adaFriends: ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],
-        charlesFriends: ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock'],
-        friendsInCommon: Ember.computed.intersect('adaFriends', 'charlesFriends')
-      });
-
-      obj.get('friendsInCommon'); // ['William King', 'Mary Somerville']
-      ```
-
-      @method computed.intersect
-      @for Ember
-      @param {String} propertyKey*
-      @return {Ember.ComputedProperty} computes a new array with all the
-      duplicated elements from the dependent arrays
-    */
-    function intersect() {
-      var getDependentKeyGuids = function (changeMeta) {
-        return EnumerableUtils.map(changeMeta.property._dependentKeys, function (dependentKey) {
-          return guidFor(dependentKey);
-        });
-      };
-
-      var args = a_slice.call(arguments);
-      args.push({
-        initialize: function (array, changeMeta, instanceMeta) {
-          instanceMeta.itemCounts = {};
-        },
-
-        addedItem: function(array, item, changeMeta, instanceMeta) {
-          var itemGuid = guidFor(item),
-              dependentGuids = getDependentKeyGuids(changeMeta),
-              dependentGuid = guidFor(changeMeta.arrayChanged),
-              numberOfDependentArrays = changeMeta.property._dependentKeys.length,
-              itemCounts = instanceMeta.itemCounts;
-
-          if (!itemCounts[itemGuid]) { itemCounts[itemGuid] = {}; }
-          if (itemCounts[itemGuid][dependentGuid] === undefined) { itemCounts[itemGuid][dependentGuid] = 0; }
-
-          if (++itemCounts[itemGuid][dependentGuid] === 1 &&
-              numberOfDependentArrays === keys(itemCounts[itemGuid]).length) {
-
-            array.addObject(item);
-          }
-          return array;
-        },
-        removedItem: function(array, item, changeMeta, instanceMeta) {
-          var itemGuid = guidFor(item),
-              dependentGuids = getDependentKeyGuids(changeMeta),
-              dependentGuid = guidFor(changeMeta.arrayChanged),
-              numberOfDependentArrays = changeMeta.property._dependentKeys.length,
-              numberOfArraysItemAppearsIn,
-              itemCounts = instanceMeta.itemCounts;
-
-          if (itemCounts[itemGuid][dependentGuid] === undefined) { itemCounts[itemGuid][dependentGuid] = 0; }
-          if (--itemCounts[itemGuid][dependentGuid] === 0) {
-            delete itemCounts[itemGuid][dependentGuid];
-            numberOfArraysItemAppearsIn = keys(itemCounts[itemGuid]).length;
-
-            if (numberOfArraysItemAppearsIn === 0) {
-              delete itemCounts[itemGuid];
-            }
-            array.removeObject(item);
-          }
-          return array;
-        }
-      });
-      return arrayComputed.apply(null, args);
-    };
-
-    /**
-      A computed property which returns a new array with all the
-      properties from the first dependent array that are not in the second
-      dependent array.
-
-      Example
-
-      ```javascript
-      App.Hamster = Ember.Object.extend({
-        likes: ['banana', 'grape', 'kale'],
-        wants: Ember.computed.setDiff('likes', 'fruits')
-      });
-
-      var hamster = App.Hamster.create({fruits: [
-        'grape',
-        'kale',
-      ]});
-      hamster.get('wants'); // ['banana']
-      ```
-
-      @method computed.setDiff
-      @for Ember
-      @param {String} setAProperty
-      @param {String} setBProperty
-      @return {Ember.ComputedProperty} computes a new array with all the
-      items from the first dependent array that are not in the second
-      dependent array
-    */
-    function setDiff(setAProperty, setBProperty) {
-      if (arguments.length !== 2) {
-        throw new EmberError("setDiff requires exactly two dependent arrays.");
-      }
-      return arrayComputed(setAProperty, setBProperty, {
-        addedItem: function (array, item, changeMeta, instanceMeta) {
-          var setA = get(this, setAProperty),
-              setB = get(this, setBProperty);
-
-          if (changeMeta.arrayChanged === setA) {
-            if (!setB.contains(item)) {
-              array.addObject(item);
-            }
-          } else {
-            array.removeObject(item);
-          }
-          return array;
-        },
-
-        removedItem: function (array, item, changeMeta, instanceMeta) {
-          var setA = get(this, setAProperty),
-              setB = get(this, setBProperty);
-
-          if (changeMeta.arrayChanged === setB) {
-            if (setA.contains(item)) {
-              array.addObject(item);
-            }
-          } else {
-            array.removeObject(item);
-          }
-          return array;
-        }
-      });
-    };
-
-    function binarySearch(array, item, low, high) {
-      var mid, midItem, res, guidMid, guidItem;
-
-      if (arguments.length < 4) { high = get(array, 'length'); }
-      if (arguments.length < 3) { low = 0; }
-
-      if (low === high) {
-        return low;
-      }
-
-      mid = low + Math.floor((high - low) / 2);
-      midItem = array.objectAt(mid);
-
-      guidMid = _guidFor(midItem);
-      guidItem = _guidFor(item);
-
-      if (guidMid === guidItem) {
-        return mid;
-      }
-
-      res = this.order(midItem, item);
-      if (res === 0) {
-        res = guidMid < guidItem ? -1 : 1;
-      }
-
-
-      if (res < 0) {
-        return this.binarySearch(array, item, mid+1, high);
-      } else if (res > 0) {
-        return this.binarySearch(array, item, low, mid);
-      }
-
-      return mid;
-
-      function _guidFor(item) {
-        if (SearchProxy.detectInstance(item)) {
-          return guidFor(get(item, 'content'));
-        }
-        return guidFor(item);
-      }
-    }
-
-
-    var SearchProxy = ObjectProxy.extend();
-
-    /**
-      A computed property which returns a new array with all the
-      properties from the first dependent array sorted based on a property
-      or sort function.
-
-      The callback method you provide should have the following signature:
-
-      ```javascript
-      function(itemA, itemB);
-      ```
-
-      - `itemA` the first item to compare.
-      - `itemB` the second item to compare.
-
-      This function should return negative number (e.g. `-1`) when `itemA` should come before
-      `itemB`. It should return positive number (e.g. `1`) when `itemA` should come after
-      `itemB`. If the `itemA` and `itemB` are equal this function should return `0`.
-
-      Therefore, if this function is comparing some numeric values, simple `itemA - itemB` or
-      `itemA.get( 'foo' ) - itemB.get( 'foo' )` can be used instead of series of `if`.
-
-      Example
-
-      ```javascript
-      var ToDoList = Ember.Object.extend({
-        // using standard ascending sort
-        todosSorting: ['name'],
-        sortedTodos: Ember.computed.sort('todos', 'todosSorting'),
-
-        // using descending sort
-        todosSortingDesc: ['name:desc'],
-        sortedTodosDesc: Ember.computed.sort('todos', 'todosSortingDesc'),
-
-        // using a custom sort function
-        priorityTodos: Ember.computed.sort('todos', function(a, b){
-          if (a.priority > b.priority) {
-            return 1;
-          } else if (a.priority < b.priority) {
-            return -1;
-          }
-          return 0;
-        }),
-      });
-      var todoList = ToDoList.create({todos: [
-        {name: 'Unit Test', priority: 2},
-        {name: 'Documentation', priority: 3},
-        {name: 'Release', priority: 1}
-      ]});
-
-      todoList.get('sortedTodos'); // [{name:'Documentation', priority:3}, {name:'Release', priority:1}, {name:'Unit Test', priority:2}]
-      todoList.get('sortedTodosDesc'); // [{name:'Unit Test', priority:2}, {name:'Release', priority:1}, {name:'Documentation', priority:3}]
-      todoList.get('priorityTodos'); // [{name:'Release', priority:1}, {name:'Unit Test', priority:2}, {name:'Documentation', priority:3}]
-      ```
-
-      @method computed.sort
-      @for Ember
-      @param {String} dependentKey
-      @param {String or Function} sortDefinition a dependent key to an
-      array of sort properties (add `:desc` to the arrays sort properties to sort descending) or a function to use when sorting
-      @return {Ember.ComputedProperty} computes a new sorted array based
-      on the sort property array or callback function
-    */
-    function sort(itemsKey, sortDefinition) {
-      Ember.assert("Ember.computed.sort requires two arguments: an array key to sort and either a sort properties key or sort function", arguments.length === 2);
-
-      var initFn, sortPropertiesKey;
-
-      if (typeof sortDefinition === 'function') {
-        initFn = function (array, changeMeta, instanceMeta) {
-          instanceMeta.order = sortDefinition;
-          instanceMeta.binarySearch = binarySearch;
-        };
-      } else {
-        sortPropertiesKey = sortDefinition;
-        initFn = function (array, changeMeta, instanceMeta) {
-          function setupSortProperties() {
-            var sortPropertyDefinitions = get(this, sortPropertiesKey),
-                sortProperty,
-                sortProperties = instanceMeta.sortProperties = [],
-                sortPropertyAscending = instanceMeta.sortPropertyAscending = {},
-                idx,
-                asc;
-
-            Ember.assert("Cannot sort: '" + sortPropertiesKey + "' is not an array.", isArray(sortPropertyDefinitions));
-
-            changeMeta.property.clearItemPropertyKeys(itemsKey);
-
-            forEach(sortPropertyDefinitions, function (sortPropertyDefinition) {
-              if ((idx = sortPropertyDefinition.indexOf(':')) !== -1) {
-                sortProperty = sortPropertyDefinition.substring(0, idx);
-                asc = sortPropertyDefinition.substring(idx+1).toLowerCase() !== 'desc';
-              } else {
-                sortProperty = sortPropertyDefinition;
-                asc = true;
-              }
-
-              sortProperties.push(sortProperty);
-              sortPropertyAscending[sortProperty] = asc;
-              changeMeta.property.itemPropertyKey(itemsKey, sortProperty);
-            });
-
-            sortPropertyDefinitions.addObserver('@each', this, updateSortPropertiesOnce);
-          }
-
-          function updateSortPropertiesOnce() {
-            run.once(this, updateSortProperties, changeMeta.propertyName);
-          }
-
-          function updateSortProperties(propertyName) {
-            setupSortProperties.call(this);
-            changeMeta.property.recomputeOnce.call(this, propertyName);
-          }
-
-          addObserver(this, sortPropertiesKey, updateSortPropertiesOnce);
-
-          setupSortProperties.call(this);
-
-
-          instanceMeta.order = function (itemA, itemB) {
-            var isProxy = itemB instanceof SearchProxy,
-                sortProperty, result, asc;
-
-            for (var i = 0; i < this.sortProperties.length; ++i) {
-              sortProperty = this.sortProperties[i];
-              result = compare(get(itemA, sortProperty), isProxy ? itemB[sortProperty] : get(itemB, sortProperty));
-
-              if (result !== 0) {
-                asc = this.sortPropertyAscending[sortProperty];
-                return asc ? result : (-1 * result);
-              }
-            }
-
-            return 0;
-          };
-
-          instanceMeta.binarySearch = binarySearch;
-        };
-      }
-
-      return arrayComputed(itemsKey, {
-        initialize: initFn,
-
-        addedItem: function (array, item, changeMeta, instanceMeta) {
-          var index = instanceMeta.binarySearch(array, item);
-          array.insertAt(index, item);
-          return array;
-        },
-
-        removedItem: function (array, item, changeMeta, instanceMeta) {
-          var proxyProperties, index, searchItem;
-
-          if (changeMeta.previousValues) {
-            proxyProperties = merge({ content: item }, changeMeta.previousValues);
-
-            searchItem = SearchProxy.create(proxyProperties);
-          } else {
-            searchItem = item;
-          }
-
-          index = instanceMeta.binarySearch(array, searchItem);
-          array.removeAt(index);
-          return array;
-        }
-      });
-    };
-
-
-    __exports__.sum = sum;
-    __exports__.min = min;
-    __exports__.max = max;
-    __exports__.map = map;
-    __exports__.sort = sort;
-    __exports__.setDiff = setDiff;
-    __exports__.mapBy = mapBy;
-    __exports__.mapProperty = mapProperty;
-    __exports__.filter = filter;
-    __exports__.filterBy = filterBy;
-    __exports__.filterProperty = filterProperty;
-    __exports__.uniq = uniq;
-    __exports__.union = union;
-    __exports__.intersect = intersect;
-  });
-define("ember-runtime/controllers/array_controller", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-runtime/system/array_proxy","ember-runtime/mixins/sortable","ember-runtime/controllers/controller","ember-metal/computed","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var EnumerableUtils = __dependency4__["default"];
-    var ArrayProxy = __dependency5__["default"];
-    var SortableMixin = __dependency6__["default"];
-    var ControllerMixin = __dependency7__.ControllerMixin;
-    var computed = __dependency8__.computed;
-    var EmberError = __dependency9__["default"];
-
-    var forEach = EnumerableUtils.forEach,
-        replace = EnumerableUtils.replace;
-
-    /**
-      `Ember.ArrayController` provides a way for you to publish a collection of
-      objects so that you can easily bind to the collection from a Handlebars
-      `#each` helper, an `Ember.CollectionView`, or other controllers.
-
-      The advantage of using an `ArrayController` is that you only have to set up
-      your view bindings once; to change what's displayed, simply swap out the
-      `content` property on the controller.
-
-      For example, imagine you wanted to display a list of items fetched via an XHR
-      request. Create an `Ember.ArrayController` and set its `content` property:
-
-      ```javascript
-      MyApp.listController = Ember.ArrayController.create();
-
-      $.get('people.json', function(data) {
-        MyApp.listController.set('content', data);
-      });
-      ```
-
-      Then, create a view that binds to your new controller:
-
-      ```handlebars
-      {{#each MyApp.listController}}
-        {{firstName}} {{lastName}}
-      {{/each}}
-      ```
-
-      Although you are binding to the controller, the behavior of this controller
-      is to pass through any methods or properties to the underlying array. This
-      capability comes from `Ember.ArrayProxy`, which this class inherits from.
-
-      Sometimes you want to display computed properties within the body of an
-      `#each` helper that depend on the underlying items in `content`, but are not
-      present on those items.   To do this, set `itemController` to the name of a
-      controller (probably an `ObjectController`) that will wrap each individual item.
-
-      For example:
-
-      ```handlebars
-        {{#each post in controller}}
-          <li>{{title}} ({{titleLength}} characters)</li>
-        {{/each}}
-      ```
-
-      ```javascript
-      App.PostsController = Ember.ArrayController.extend({
-        itemController: 'post'
-      });
-
-      App.PostController = Ember.ObjectController.extend({
-        // the `title` property will be proxied to the underlying post.
-
-        titleLength: function() {
-          return this.get('title').length;
-        }.property('title')
-      });
-      ```
-
-      In some cases it is helpful to return a different `itemController` depending
-      on the particular item.  Subclasses can do this by overriding
-      `lookupItemController`.
-
-      For example:
-
-      ```javascript
-      App.MyArrayController = Ember.ArrayController.extend({
-        lookupItemController: function( object ) {
-          if (object.get('isSpecial')) {
-            return "special"; // use App.SpecialController
-          } else {
-            return "regular"; // use App.RegularController
-          }
-        }
-      });
-      ```
-
-      The itemController instances will have a `parentController` property set to
-      the `ArrayController` instance.
-
-      @class ArrayController
-      @namespace Ember
-      @extends Ember.ArrayProxy
-      @uses Ember.SortableMixin
-      @uses Ember.ControllerMixin
-    */
-
-    var ArrayController = ArrayProxy.extend(ControllerMixin, SortableMixin, {
-
-      /**
-        The controller used to wrap items, if any.
-
-        @property itemController
-        @type String
-        @default null
-      */
-      itemController: null,
-
-      /**
-        Return the name of the controller to wrap items, or `null` if items should
-        be returned directly.  The default implementation simply returns the
-        `itemController` property, but subclasses can override this method to return
-        different controllers for different objects.
-
-        For example:
-
-        ```javascript
-        App.MyArrayController = Ember.ArrayController.extend({
-          lookupItemController: function( object ) {
-            if (object.get('isSpecial')) {
-              return "special"; // use App.SpecialController
-            } else {
-              return "regular"; // use App.RegularController
-            }
-          }
-        });
-        ```
-
-        @method lookupItemController
-        @param {Object} object
-        @return {String}
-      */
-      lookupItemController: function(object) {
-        return get(this, 'itemController');
-      },
-
-      objectAtContent: function(idx) {
-        var length = get(this, 'length'),
-            arrangedContent = get(this,'arrangedContent'),
-            object = arrangedContent && arrangedContent.objectAt(idx);
-
-        if (idx >= 0 && idx < length) {
-          var controllerClass = this.lookupItemController(object);
-          if (controllerClass) {
-            return this.controllerAt(idx, object, controllerClass);
-          }
-        }
-
-        // When `controllerClass` is falsy, we have not opted in to using item
-        // controllers, so return the object directly.
-
-        // When the index is out of range, we want to return the "out of range"
-        // value, whatever that might be.  Rather than make assumptions
-        // (e.g. guessing `null` or `undefined`) we defer this to `arrangedContent`.
-        return object;
-      },
-
-      arrangedContentDidChange: function() {
-        this._super();
-        this._resetSubControllers();
-      },
-
-      arrayContentDidChange: function(idx, removedCnt, addedCnt) {
-        var subControllers = get(this, '_subControllers'),
-            subControllersToRemove = subControllers.slice(idx, idx+removedCnt);
-
-        forEach(subControllersToRemove, function(subController) {
-          if (subController) { subController.destroy(); }
-        });
-
-        replace(subControllers, idx, removedCnt, new Array(addedCnt));
-
-        // The shadow array of subcontrollers must be updated before we trigger
-        // observers, otherwise observers will get the wrong subcontainer when
-        // calling `objectAt`
-        this._super(idx, removedCnt, addedCnt);
-      },
-
-      init: function() {
-        this._super();
-
-        this.set('_subControllers', Ember.A());
-      },
-
-      content: computed(function () {
-        return Ember.A();
-      }),
-
-      /**
-       * Flag to mark as being "virtual". Used to keep this instance
-       * from participating in the parentController hierarchy.
-       *
-       * @private
-       * @type Boolean
-       */
-      _isVirtual: false,
-
-      controllerAt: function(idx, object, controllerClass) {
-        var container = get(this, 'container'),
-            subControllers = get(this, '_subControllers'),
-            subController = subControllers[idx],
-            fullName;
-
-        if (subController) { return subController; }
-
-        fullName = "controller:" + controllerClass;
-
-        if (!container.has(fullName)) {
-          throw new EmberError('Could not resolve itemController: "' + controllerClass + '"');
-        }
-        var parentController;
-        if (this._isVirtual) {
-          parentController = get(this, 'parentController');
-        }
-        parentController = parentController || this;
-        subController = container.lookupFactory(fullName).create({
-          target: this,
-          parentController: parentController,
-          content: object
-        });
-
-        subControllers[idx] = subController;
-
-        return subController;
-      },
-
-      _subControllers: null,
-
-      _resetSubControllers: function() {
-        var subControllers = get(this, '_subControllers');
-        if (subControllers) {
-          forEach(subControllers, function(subController) {
-            if (subController) { subController.destroy(); }
-          });
-        }
-
-        this.set('_subControllers', Ember.A());
-      }
-    });
-
-    __exports__["default"] = ArrayController;
-  });
-define("ember-runtime/controllers/controller", 
-  ["ember-metal/core","ember-metal/property_get","ember-runtime/system/object","ember-metal/mixin","ember-metal/computed","ember-runtime/mixins/action_handler","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.deprecate
-    var get = __dependency2__.get;
-    var EmberObject = __dependency3__["default"];
-    var Mixin = __dependency4__.Mixin;
-    var computed = __dependency5__.computed;
-    var ActionHandler = __dependency6__["default"];
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    /**
-      `Ember.ControllerMixin` provides a standard interface for all classes that
-      compose Ember's controller layer: `Ember.Controller`,
-      `Ember.ArrayController`, and `Ember.ObjectController`.
-
-      @class ControllerMixin
-      @namespace Ember
-      @uses Ember.ActionHandler
-    */
-    var ControllerMixin = Mixin.create(ActionHandler, {
-      /* ducktype as a controller */
-      isController: true,
-
-      /**
-        The object to which actions from the view should be sent.
-
-        For example, when a Handlebars template uses the `{{action}}` helper,
-        it will attempt to send the action to the view's controller's `target`.
-
-        By default, a controller's `target` is set to the router after it is
-        instantiated by `Ember.Application#initialize`.
-
-        @property target
-        @default null
-      */
-      target: null,
-
-      container: null,
-
-      parentController: null,
-
-      store: null,
-
-      model: computed.alias('content'),
-
-      deprecatedSendHandles: function(actionName) {
-        return !!this[actionName];
-      },
-
-      deprecatedSend: function(actionName) {
-        var args = [].slice.call(arguments, 1);
-        Ember.assert('' + this + " has the action " + actionName + " but it is not a function", typeof this[actionName] === 'function');
-        Ember.deprecate('Action handlers implemented directly on controllers are deprecated in favor of action handlers on an `actions` object ( action: `' + actionName + '` on ' + this + ')', false);
-        this[actionName].apply(this, args);
-        return;
-      }
-    });
-
-    /**
-      @class Controller
-      @namespace Ember
-      @extends Ember.Object
-      @uses Ember.ControllerMixin
-    */
-    var Controller = EmberObject.extend(ControllerMixin);
-
-    __exports__.Controller = Controller;
-    __exports__.ControllerMixin = ControllerMixin;
-  });
-define("ember-runtime/controllers/object_controller", 
-  ["ember-runtime/controllers/controller","ember-runtime/system/object_proxy","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var ControllerMixin = __dependency1__.ControllerMixin;
-    var ObjectProxy = __dependency2__["default"];
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    /**
-      `Ember.ObjectController` is part of Ember's Controller layer. It is intended
-      to wrap a single object, proxying unhandled attempts to `get` and `set` to the underlying
-      content object, and to forward unhandled action attempts to its `target`.
-
-      `Ember.ObjectController` derives this functionality from its superclass
-      `Ember.ObjectProxy` and the `Ember.ControllerMixin` mixin.
-
-      @class ObjectController
-      @namespace Ember
-      @extends Ember.ObjectProxy
-      @uses Ember.ControllerMixin
-    **/
-    var ObjectController = ObjectProxy.extend(ControllerMixin);
-    __exports__["default"] = ObjectController;
-  });
-define("ember-runtime/copy", 
-  ["ember-metal/enumerable_utils","ember-metal/utils","ember-runtime/system/object","ember-runtime/mixins/copyable","ember-metal/platform","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var EnumerableUtils = __dependency1__["default"];
-    var typeOf = __dependency2__.typeOf;
-    var EmberObject = __dependency3__["default"];
-    var Copyable = __dependency4__["default"];
-    var create = __dependency5__.create;
-
-    var indexOf = EnumerableUtils.indexOf;
-
-    function _copy(obj, deep, seen, copies) {
-      var ret, loc, key;
-
-      // primitive data types are immutable, just return them.
-      if ('object' !== typeof obj || obj===null) return obj;
-
-      // avoid cyclical loops
-      if (deep && (loc=indexOf(seen, obj))>=0) return copies[loc];
-
-      Ember.assert('Cannot clone an Ember.Object that does not implement Ember.Copyable', !(obj instanceof EmberObject) || (Copyable && Copyable.detect(obj)));
-
-      // IMPORTANT: this specific test will detect a native array only. Any other
-      // object will need to implement Copyable.
-      if (typeOf(obj) === 'array') {
-        ret = obj.slice();
-        if (deep) {
-          loc = ret.length;
-          while(--loc>=0) ret[loc] = _copy(ret[loc], deep, seen, copies);
-        }
-      } else if (Copyable && Copyable.detect(obj)) {
-        ret = obj.copy(deep, seen, copies);
-      } else if (obj instanceof Date) {
-        ret = new Date(obj.getTime());
-      } else {
-        ret = {};
-        for(key in obj) {
-          if (!obj.hasOwnProperty(key)) continue;
-
-          // Prevents browsers that don't respect non-enumerability from
-          // copying internal Ember properties
-          if (key.substring(0,2) === '__') continue;
-
-          ret[key] = deep ? _copy(obj[key], deep, seen, copies) : obj[key];
-        }
-      }
-
-      if (deep) {
-        seen.push(obj);
-        copies.push(ret);
-      }
-
-      return ret;
-    }
-
-    /**
-      Creates a clone of the passed object. This function can take just about
-      any type of object and create a clone of it, including primitive values
-      (which are not actually cloned because they are immutable).
-
-      If the passed object implements the `clone()` method, then this function
-      will simply call that method and return the result.
-
-      @method copy
-      @for Ember
-      @param {Object} obj The object to clone
-      @param {Boolean} deep If true, a deep copy of the object is made
-      @return {Object} The cloned object
-    */
-    function copy(obj, deep) {
-      // fast paths
-      if ('object' !== typeof obj || obj===null) return obj; // can't copy primitives
-      if (Copyable && Copyable.detect(obj)) return obj.copy(deep);
-      return _copy(obj, deep, deep ? [] : null, deep ? [] : null);
-    };
-
-    __exports__["default"] = copy;
-  });
-define("ember-runtime/core", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    /**
-      Compares two objects, returning true if they are logically equal. This is
-      a deeper comparison than a simple triple equal. For sets it will compare the
-      internal objects. For any other object that implements `isEqual()` it will
-      respect that method.
-
-      ```javascript
-      Ember.isEqual('hello', 'hello');  // true
-      Ember.isEqual(1, 2);              // false
-      Ember.isEqual([4,2], [4,2]);      // false
-      ```
-
-      @method isEqual
-      @for Ember
-      @param {Object} a first object to compare
-      @param {Object} b second object to compare
-      @return {Boolean}
-    */
-    function isEqual(a, b) {
-      if (a && 'function'===typeof a.isEqual) return a.isEqual(b);
-      return a === b;
-    };
-
-    __exports__.isEqual = isEqual;
-  });
-define("ember-runtime/ext/function", 
-  ["ember-metal/core","ember-metal/expand_properties","ember-metal/computed"],
-  function(__dependency1__, __dependency2__, __dependency3__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.EXTEND_PROTOTYPES, Ember.assert
-    var expandProperties = __dependency2__["default"];
-    var computed = __dependency3__.computed;
-
-    var a_slice = Array.prototype.slice;
-    var FunctionPrototype = Function.prototype;
-
-    if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
-
-      /**
-        The `property` extension of Javascript's Function prototype is available
-        when `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Function` is
-        `true`, which is the default.
-
-        Computed properties allow you to treat a function like a property:
-
-        ```javascript
-        MyApp.President = Ember.Object.extend({
-          firstName: '',
-          lastName:  '',
-
-          fullName: function() {
-            return this.get('firstName') + ' ' + this.get('lastName');
-
-            // Call this flag to mark the function as a property
-          }.property()
-        });
-
-        var president = MyApp.President.create({
-          firstName: "Barack",
-          lastName: "Obama"
-        });
-
-        president.get('fullName');    // "Barack Obama"
-        ```
-
-        Treating a function like a property is useful because they can work with
-        bindings, just like any other property.
-
-        Many computed properties have dependencies on other properties. For
-        example, in the above example, the `fullName` property depends on
-        `firstName` and `lastName` to determine its value. You can tell Ember
-        about these dependencies like this:
-
-        ```javascript
-        MyApp.President = Ember.Object.extend({
-          firstName: '',
-          lastName:  '',
-
-          fullName: function() {
-            return this.get('firstName') + ' ' + this.get('lastName');
-
-            // Tell Ember.js that this computed property depends on firstName
-            // and lastName
-          }.property('firstName', 'lastName')
-        });
-        ```
-
-        Make sure you list these dependencies so Ember knows when to update
-        bindings that connect to a computed property. Changing a dependency
-        will not immediately trigger an update of the computed property, but
-        will instead clear the cache so that it is updated when the next `get`
-        is called on the property.
-
-        See [Ember.ComputedProperty](/api/classes/Ember.ComputedProperty.html), [Ember.computed](/api/#method_computed).
-
-        @method property
-        @for Function
-      */
-      FunctionPrototype.property = function() {
-        var ret = computed(this);
-        // ComputedProperty.prototype.property expands properties; no need for us to
-        // do so here.
-        return ret.property.apply(ret, arguments);
-      };
-
-      /**
-        The `observes` extension of Javascript's Function prototype is available
-        when `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Function` is
-        true, which is the default.
-
-        You can observe property changes simply by adding the `observes`
-        call to the end of your method declarations in classes that you write.
-        For example:
-
-        ```javascript
-        Ember.Object.extend({
-          valueObserver: function() {
-            // Executes whenever the "value" property changes
-          }.observes('value')
-        });
-        ```
-
-        In the future this method may become asynchronous. If you want to ensure
-        synchronous behavior, use `observesImmediately`.
-
-        See `Ember.observer`.
-
-        @method observes
-        @for Function
-      */
-      FunctionPrototype.observes = function() {
-        var addWatchedProperty = function (obs) { watched.push(obs); };
-        var watched = [];
-
-        for (var i=0; i<arguments.length; ++i) {
-          expandProperties(arguments[i], addWatchedProperty);
-        }
-
-        this.__ember_observes__ = watched;
-
-        return this;
-      };
-
-      /**
-        The `observesImmediately` extension of Javascript's Function prototype is
-        available when `Ember.EXTEND_PROTOTYPES` or
-        `Ember.EXTEND_PROTOTYPES.Function` is true, which is the default.
-
-        You can observe property changes simply by adding the `observesImmediately`
-        call to the end of your method declarations in classes that you write.
-        For example:
-
-        ```javascript
-        Ember.Object.extend({
-          valueObserver: function() {
-            // Executes immediately after the "value" property changes
-          }.observesImmediately('value')
-        });
-        ```
-
-        In the future, `observes` may become asynchronous. In this event,
-        `observesImmediately` will maintain the synchronous behavior.
-
-        See `Ember.immediateObserver`.
-
-        @method observesImmediately
-        @for Function
-      */
-      FunctionPrototype.observesImmediately = function() {
-        for (var i=0, l=arguments.length; i<l; i++) {
-          var arg = arguments[i];
-          Ember.assert("Immediate observers must observe internal properties only, not properties on other objects.", arg.indexOf('.') === -1);
-        }
-
-        // observes handles property expansion
-        return this.observes.apply(this, arguments);
-      };
-
-      /**
-        The `observesBefore` extension of Javascript's Function prototype is
-        available when `Ember.EXTEND_PROTOTYPES` or
-        `Ember.EXTEND_PROTOTYPES.Function` is true, which is the default.
-
-        You can get notified when a property change is about to happen by
-        by adding the `observesBefore` call to the end of your method
-        declarations in classes that you write. For example:
-
-        ```javascript
-        Ember.Object.extend({
-          valueObserver: function() {
-            // Executes whenever the "value" property is about to change
-          }.observesBefore('value')
-        });
-        ```
-
-        See `Ember.beforeObserver`.
-
-        @method observesBefore
-        @for Function
-      */
-      FunctionPrototype.observesBefore = function() {
-        var addWatchedProperty = function (obs) { watched.push(obs); };
-        var watched = [];
-
-        for (var i=0; i<arguments.length; ++i) {
-          expandProperties(arguments[i], addWatchedProperty);
-        }
-
-        this.__ember_observesBefore__ = watched;
-
-        return this;
-      };
-
-      /**
-        The `on` extension of Javascript's Function prototype is available
-        when `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Function` is
-        true, which is the default.
-
-        You can listen for events simply by adding the `on` call to the end of
-        your method declarations in classes or mixins that you write. For example:
-
-        ```javascript
-        Ember.Mixin.create({
-          doSomethingWithElement: function() {
-            // Executes whenever the "didInsertElement" event fires
-          }.on('didInsertElement')
-        });
-        ```
-
-        See `Ember.on`.
-
-        @method on
-        @for Function
-      */
-      FunctionPrototype.on = function() {
-        var events = a_slice.call(arguments);
-        this.__ember_listens__ = events;
-        return this;
-      };
-    }
-  });
-define("ember-runtime/ext/rsvp", 
-  ["ember-metal/core","ember-metal/logger","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var Logger = __dependency2__["default"];
-
-    var RSVP = requireModule("rsvp");
-    var Test, testModuleName = 'ember-testing/test';
-
-    RSVP.onerrorDefault = function(error) {
-      if (error instanceof Error) {
-        if (Ember.testing) {
-          // ES6TODO: remove when possible
-          if (!Test && Ember.__loader.registry[testModuleName]) {
-            Test = requireModule(testModuleName)['default'];
-          }
-
-          if (Test && Test.adapter) {
-            Test.adapter.exception(error);
-          } else {
-            throw error;
-          }
-        } else {
-          Logger.error(error.stack);
-          Ember.assert(error, false);
-        }
-      }
-    };
-
-    RSVP.on('error', RSVP.onerrorDefault);
-
-    __exports__["default"] = RSVP;
-  });
-define("ember-runtime/ext/string", 
-  ["ember-metal/core","ember-runtime/system/string"],
-  function(__dependency1__, __dependency2__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.EXTEND_PROTOTYPES, Ember.assert, Ember.FEATURES
-    var fmt = __dependency2__.fmt;
-    var w = __dependency2__.w;
-    var loc = __dependency2__.loc;
-    var camelize = __dependency2__.camelize;
-    var decamelize = __dependency2__.decamelize;
-    var dasherize = __dependency2__.dasherize;
-    var underscore = __dependency2__.underscore;
-    var capitalize = __dependency2__.capitalize;
-    var classify = __dependency2__.classify;
-    var StringPrototype = String.prototype;
-
-    if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
-
-      /**
-        See [Ember.String.fmt](/api/classes/Ember.String.html#method_fmt).
-
-        @method fmt
-        @for String
-      */
-      StringPrototype.fmt = function() {
-        return fmt(this, arguments);
-      };
-
-      /**
-        See [Ember.String.w](/api/classes/Ember.String.html#method_w).
-
-        @method w
-        @for String
-      */
-      StringPrototype.w = function() {
-        return w(this);
-      };
-
-      /**
-        See [Ember.String.loc](/api/classes/Ember.String.html#method_loc).
-
-        @method loc
-        @for String
-      */
-      StringPrototype.loc = function() {
-        return loc(this, arguments);
-      };
-
-      /**
-        See [Ember.String.camelize](/api/classes/Ember.String.html#method_camelize).
-
-        @method camelize
-        @for String
-      */
-      StringPrototype.camelize = function() {
-        return camelize(this);
-      };
-
-      /**
-        See [Ember.String.decamelize](/api/classes/Ember.String.html#method_decamelize).
-
-        @method decamelize
-        @for String
-      */
-      StringPrototype.decamelize = function() {
-        return decamelize(this);
-      };
-
-      /**
-        See [Ember.String.dasherize](/api/classes/Ember.String.html#method_dasherize).
-
-        @method dasherize
-        @for String
-      */
-      StringPrototype.dasherize = function() {
-        return dasherize(this);
-      };
-
-      /**
-        See [Ember.String.underscore](/api/classes/Ember.String.html#method_underscore).
-
-        @method underscore
-        @for String
-      */
-      StringPrototype.underscore = function() {
-        return underscore(this);
-      };
-
-      /**
-        See [Ember.String.classify](/api/classes/Ember.String.html#method_classify).
-
-        @method classify
-        @for String
-      */
-      StringPrototype.classify = function() {
-        return classify(this);
-      };
-
-      /**
-        See [Ember.String.capitalize](/api/classes/Ember.String.html#method_capitalize).
-
-        @method capitalize
-        @for String
-      */
-      StringPrototype.capitalize = function() {
-        return capitalize(this);
-      };
-    }
-  });
-define("ember-runtime/keys", 
-  ["ember-metal/enumerable_utils","ember-metal/platform","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var EnumerableUtils = __dependency1__["default"];
-    var create = __dependency2__.create;
-
-    /**
-      Returns all of the keys defined on an object or hash. This is useful
-      when inspecting objects for debugging. On browsers that support it, this
-      uses the native `Object.keys` implementation.
-
-      @method keys
-      @for Ember
-      @param {Object} obj
-      @return {Array} Array containing keys of obj
-    */
-    var keys = Object.keys;
-    if (keys || create.isSimulated) {
-      var prototypeProperties = [
-        'constructor',
-        'hasOwnProperty',
-        'isPrototypeOf',
-        'propertyIsEnumerable',
-        'valueOf',
-        'toLocaleString',
-        'toString'
-      ],
-      pushPropertyName = function(obj, array, key) {
-        // Prevents browsers that don't respect non-enumerability from
-        // copying internal Ember properties
-        if (key.substring(0,2) === '__') return;
-        if (key === '_super') return;
-        if (EnumerableUtils.indexOf(array, key) >= 0) return;
-        if (typeof obj.hasOwnProperty === 'function' && !obj.hasOwnProperty(key)) return;
-
-        array.push(key);
-      };
-
-      keys = function keys(obj) {
-        var ret = [], key;
-        for (key in obj) {
-          pushPropertyName(obj, ret, key);
-        }
-
-        // IE8 doesn't enumerate property that named the same as prototype properties.
-        for (var i = 0, l = prototypeProperties.length; i < l; i++) {
-          key = prototypeProperties[i];
-
-          pushPropertyName(obj, ret, key);
-        }
-
-        return ret;
-      };
-    }
-
-    __exports__["default"] = keys;
-  });
-define("ember-runtime", 
-  ["ember-metal","ember-runtime/core","ember-runtime/keys","ember-runtime/compare","ember-runtime/copy","ember-runtime/system/namespace","ember-runtime/system/object","ember-runtime/system/tracked_array","ember-runtime/system/subarray","ember-runtime/system/container","ember-runtime/system/application","ember-runtime/system/array_proxy","ember-runtime/system/object_proxy","ember-runtime/system/core_object","ember-runtime/system/each_proxy","ember-runtime/system/native_array","ember-runtime/system/set","ember-runtime/system/string","ember-runtime/system/deferred","ember-runtime/system/lazy_load","ember-runtime/mixins/array","ember-runtime/mixins/comparable","ember-runtime/mixins/copyable","ember-runtime/mixins/enumerable","ember-runtime/mixins/freezable","ember-runtime/mixins/observable","ember-runtime/mixins/action_handler","ember-runtime/mixins/deferred","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/mutable_array","ember-runtime/mixins/target_action_support","ember-runtime/mixins/evented","ember-runtime/mixins/promise_proxy","ember-runtime/mixins/sortable","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/computed/reduce_computed_macros","ember-runtime/controllers/array_controller","ember-runtime/controllers/object_controller","ember-runtime/controllers/controller","ember-runtime/ext/rsvp","ember-runtime/ext/string","ember-runtime/ext/function","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __dependency33__, __dependency34__, __dependency35__, __dependency36__, __dependency37__, __dependency38__, __dependency39__, __dependency40__, __dependency41__, __dependency42__, __dependency43__, __exports__) {
-    "use strict";
-    /**
-    Ember Runtime
-
-    @module ember
-    @submodule ember-runtime
-    @requires ember-metal
-    */
-
-
-    // BEGIN EXPORTS
-    Ember.compare = __dependency4__["default"];
-    Ember.copy = __dependency5__["default"];
-    Ember.isEqual = __dependency2__.isEqual;
-    Ember.keys = __dependency3__["default"];
-
-    Ember.Array = __dependency21__["default"];
-
-    Ember.Comparable = __dependency22__["default"];
-    Ember.Copyable = __dependency23__["default"];
-
-    Ember.SortableMixin = __dependency34__["default"];
-
-    Ember.Freezable = __dependency25__.Freezable;
-    Ember.FROZEN_ERROR = __dependency25__.FROZEN_ERROR;
-
-    Ember.DeferredMixin = __dependency28__["default"];
-
-    Ember.MutableEnumerable = __dependency29__["default"];
-    Ember.MutableArray = __dependency30__["default"];
-
-    Ember.TargetActionSupport = __dependency31__["default"];
-    Ember.Evented = __dependency32__["default"];
-
-    Ember.PromiseProxyMixin = __dependency33__["default"];
-
-    Ember.Observable = __dependency26__["default"];
-
-    Ember.arrayComputed = __dependency35__.arrayComputed;
-    Ember.ArrayComputedProperty = __dependency35__.ArrayComputedProperty;
-    Ember.reduceComputed = __dependency36__.reduceComputed;
-    Ember.ReduceComputedProperty = __dependency36__.ReduceComputedProperty;
-
-    // ES6TODO: this seems a less than ideal way/place to add properties to Ember.computed
-    var EmComputed = Ember.computed;
-
-    EmComputed.sum = __dependency37__.sum;
-    EmComputed.min = __dependency37__.min;
-    EmComputed.max = __dependency37__.max;
-    EmComputed.map = __dependency37__.map;
-    EmComputed.sort = __dependency37__.sort;
-    EmComputed.setDiff = __dependency37__.setDiff;
-    EmComputed.mapBy = __dependency37__.mapBy;
-    EmComputed.mapProperty = __dependency37__.mapProperty;
-    EmComputed.filter = __dependency37__.filter;
-    EmComputed.filterBy = __dependency37__.filterBy;
-    EmComputed.filterProperty = __dependency37__.filterProperty;
-    EmComputed.uniq = __dependency37__.uniq;
-    EmComputed.union = __dependency37__.union;
-    EmComputed.intersect = __dependency37__.intersect;
-
-    Ember.String = __dependency18__["default"];
-    Ember.Object = __dependency7__["default"];
-    Ember.TrackedArray = __dependency8__["default"];
-    Ember.SubArray = __dependency9__["default"];
-    Ember.Container = __dependency10__["default"];
-    Ember.Namespace = __dependency6__["default"];
-    Ember.Application = __dependency11__["default"];
-    Ember.Enumerable = __dependency24__["default"];
-    Ember.ArrayProxy = __dependency12__["default"];
-    Ember.ObjectProxy = __dependency13__["default"];
-    Ember.ActionHandler = __dependency27__["default"];
-    Ember.CoreObject = __dependency14__["default"];
-    Ember.EachArray = __dependency15__.EachArray;
-    Ember.EachProxy = __dependency15__.EachProxy;
-    Ember.NativeArray = __dependency16__["default"];
-    // ES6TODO: Currently we must rely on the global from ember-metal/core to avoid circular deps
-    // Ember.A = A;
-    Ember.Set = __dependency17__["default"];
-    Ember.Deferred = __dependency19__["default"];
-    Ember.onLoad = __dependency20__.onLoad;
-    Ember.runLoadHooks = __dependency20__.runLoadHooks;
-
-    Ember.ArrayController = __dependency38__["default"];
-    Ember.ObjectController = __dependency39__["default"];
-    Ember.Controller = __dependency40__.Controller;
-    Ember.ControllerMixin = __dependency40__.ControllerMixin;
-
-    Ember.RSVP = __dependency41__["default"];
-    // END EXPORTS
-
-    __exports__["default"] = Ember;
-  });
-define("ember-runtime/mixins/action_handler", 
-  ["ember-metal/merge","ember-metal/mixin","ember-metal/property_get","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var merge = __dependency1__["default"];
-    var Mixin = __dependency2__.Mixin;
-    var get = __dependency3__.get;
-    var typeOf = __dependency4__.typeOf;
-
-    /**
-      The `Ember.ActionHandler` mixin implements support for moving an `actions`
-      property to an `_actions` property at extend time, and adding `_actions`
-      to the object's mergedProperties list.
-
-      `Ember.ActionHandler` is available on some familiar classes including
-      `Ember.Route`, `Ember.View`, `Ember.Component`, and controllers such as
-      `Ember.Controller` and `Ember.ObjectController`.
-      (Internally the mixin is used by `Ember.CoreView`, `Ember.ControllerMixin`,
-      and `Ember.Route` and available to the above classes through
-      inheritance.)
-
-      @class ActionHandler
-      @namespace Ember
-    */
-    var ActionHandler = Mixin.create({
-      mergedProperties: ['_actions'],
-
-      /**
-        The collection of functions, keyed by name, available on this
-        `ActionHandler` as action targets.
-
-        These functions will be invoked when a matching `{{action}}` is triggered
-        from within a template and the application's current route is this route.
-
-        Actions can also be invoked from other parts of your application
-        via `ActionHandler#send`.
-
-        The `actions` hash will inherit action handlers from
-        the `actions` hash defined on extended parent classes
-        or mixins rather than just replace the entire hash, e.g.:
-
-        ```js
-        App.CanDisplayBanner = Ember.Mixin.create({
-          actions: {
-            displayBanner: function(msg) {
-              // ...
-            }
-          }
-        });
-
-        App.WelcomeRoute = Ember.Route.extend(App.CanDisplayBanner, {
-          actions: {
-            playMusic: function() {
-              // ...
-            }
-          }
-        });
-
-        // `WelcomeRoute`, when active, will be able to respond
-        // to both actions, since the actions hash is merged rather
-        // then replaced when extending mixins / parent classes.
-        this.send('displayBanner');
-        this.send('playMusic');
-        ```
-
-        Within a Controller, Route, View or Component's action handler,
-        the value of the `this` context is the Controller, Route, View or
-        Component object:
-
-        ```js
-        App.SongRoute = Ember.Route.extend({
-          actions: {
-            myAction: function() {
-              this.controllerFor("song");
-              this.transitionTo("other.route");
-              ...
-            }
-          }
-        });
-        ```
-
-        It is also possible to call `this._super()` from within an
-        action handler if it overrides a handler defined on a parent
-        class or mixin:
-
-        Take for example the following routes:
-
-        ```js
-        App.DebugRoute = Ember.Mixin.create({
-          actions: {
-            debugRouteInformation: function() {
-              console.debug("trololo");
-            }
-          }
-        });
-
-        App.AnnoyingDebugRoute = Ember.Route.extend(App.DebugRoute, {
-          actions: {
-            debugRouteInformation: function() {
-              // also call the debugRouteInformation of mixed in App.DebugRoute
-              this._super();
-
-              // show additional annoyance
-              window.alert(...);
-            }
-          }
-        });
-        ```
-
-        ## Bubbling
-
-        By default, an action will stop bubbling once a handler defined
-        on the `actions` hash handles it. To continue bubbling the action,
-        you must return `true` from the handler:
-
-        ```js
-        App.Router.map(function() {
-          this.resource("album", function() {
-            this.route("song");
-          });
-        });
-
-        App.AlbumRoute = Ember.Route.extend({
-          actions: {
-            startPlaying: function() {
-            }
-          }
-        });
-
-        App.AlbumSongRoute = Ember.Route.extend({
-          actions: {
-            startPlaying: function() {
-              // ...
-
-              if (actionShouldAlsoBeTriggeredOnParentRoute) {
-                return true;
-              }
-            }
-          }
-        });
-        ```
-
-        @property actions
-        @type Hash
-        @default null
-      */
-
-      /**
-        Moves `actions` to `_actions` at extend time. Note that this currently
-        modifies the mixin themselves, which is technically dubious but
-        is practically of little consequence. This may change in the future.
-
-        @private
-        @method willMergeMixin
-      */
-      willMergeMixin: function(props) {
-        var hashName;
-
-        if (!props._actions) {
-          Ember.assert("'actions' should not be a function", typeof(props.actions) !== 'function');
-
-          if (typeOf(props.actions) === 'object') {
-            hashName = 'actions';
-          } else if (typeOf(props.events) === 'object') {
-            Ember.deprecate('Action handlers contained in an `events` object are deprecated in favor of putting them in an `actions` object', false);
-            hashName = 'events';
-          }
-
-          if (hashName) {
-            props._actions = merge(props._actions || {}, props[hashName]);
-          }
-
-          delete props[hashName];
-        }
-      },
-
-      /**
-        Triggers a named action on the `ActionHandler`. Any parameters
-        supplied after the `actionName` string will be passed as arguments
-        to the action target function.
-
-        If the `ActionHandler` has its `target` property set, actions may
-        bubble to the `target`. Bubbling happens when an `actionName` can
-        not be found in the `ActionHandler`'s `actions` hash or if the
-        action target function returns `true`.
-
-        Example
-
-        ```js
-        App.WelcomeRoute = Ember.Route.extend({
-          actions: {
-            playTheme: function() {
-               this.send('playMusic', 'theme.mp3');
-            },
-            playMusic: function(track) {
-              // ...
-            }
-          }
-        });
-        ```
-
-        @method send
-        @param {String} actionName The action to trigger
-        @param {*} context a context to send with the action
-      */
-      send: function(actionName) {
-        var args = [].slice.call(arguments, 1), target;
-
-        if (this._actions && this._actions[actionName]) {
-          if (this._actions[actionName].apply(this, args) === true) {
-            // handler returned true, so this action will bubble
-          } else {
-            return;
-          }
-        } else if (!Ember.FEATURES.isEnabled('ember-routing-drop-deprecated-action-style') && this.deprecatedSend && this.deprecatedSendHandles && this.deprecatedSendHandles(actionName)) {
-          Ember.warn("The current default is deprecated but will prefer to handle actions directly on the controller instead of a similarly named action in the actions hash. To turn off this deprecated feature set: Ember.FEATURES['ember-routing-drop-deprecated-action-style'] = true");
-          if (this.deprecatedSend.apply(this, [].slice.call(arguments)) === true) {
-            // handler return true, so this action will bubble
-          } else {
-            return;
-          }
-        }
-
-        if (target = get(this, 'target')) {
-          Ember.assert("The `target` for " + this + " (" + target + ") does not have a `send` method", typeof target.send === 'function');
-          target.send.apply(target, arguments);
-        }
-      }
-    });
-
-    __exports__["default"] = ActionHandler;
-  });
-define("ember-runtime/mixins/array", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/is_none","ember-runtime/mixins/enumerable","ember-metal/enumerable_utils","ember-metal/mixin","ember-metal/property_events","ember-metal/events","ember-metal/watching","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    // ..........................................................
-    // HELPERS
-    //
-    var Ember = __dependency1__["default"];
-    // ES6TODO: Ember.A
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var computed = __dependency4__.computed;
-    var cacheFor = __dependency4__.cacheFor;
-    var isNone = __dependency5__.isNone;
-    var none = __dependency5__.none;
-    var Enumerable = __dependency6__["default"];
-    var EnumerableUtils = __dependency7__["default"];
-    var Mixin = __dependency8__.Mixin;
-    var required = __dependency8__.required;
-    var propertyWillChange = __dependency9__.propertyWillChange;
-    var propertyDidChange = __dependency9__.propertyDidChange;
-    var addListener = __dependency10__.addListener;
-    var removeListener = __dependency10__.removeListener;
-    var sendEvent = __dependency10__.sendEvent;
-    var hasListeners = __dependency10__.hasListeners;
-    var isWatching = __dependency11__.isWatching;
-
-    var map = EnumerableUtils.map;
-
-    // ..........................................................
-    // ARRAY
-    //
-    /**
-      This mixin implements Observer-friendly Array-like behavior. It is not a
-      concrete implementation, but it can be used up by other classes that want
-      to appear like arrays.
-
-      For example, ArrayProxy and ArrayController are both concrete classes that can
-      be instantiated to implement array-like behavior. Both of these classes use
-      the Array Mixin by way of the MutableArray mixin, which allows observable
-      changes to be made to the underlying array.
-
-      Unlike `Ember.Enumerable,` this mixin defines methods specifically for
-      collections that provide index-ordered access to their contents. When you
-      are designing code that needs to accept any kind of Array-like object, you
-      should use these methods instead of Array primitives because these will
-      properly notify observers of changes to the array.
-
-      Although these methods are efficient, they do add a layer of indirection to
-      your application so it is a good idea to use them only when you need the
-      flexibility of using both true JavaScript arrays and "virtual" arrays such
-      as controllers and collections.
-
-      You can use the methods defined in this module to access and modify array
-      contents in a KVO-friendly way. You can also be notified whenever the
-      membership of an array changes by using `.observes('myArray.[]')`.
-
-      To support `Ember.Array` in your own class, you must override two
-      primitives to use it: `replace()` and `objectAt()`.
-
-      Note that the Ember.Array mixin also incorporates the `Ember.Enumerable`
-      mixin. All `Ember.Array`-like objects are also enumerable.
-
-      @class Array
-      @namespace Ember
-      @uses Ember.Enumerable
-      @since Ember 0.9.0
-    */
-    var EmberArray = Mixin.create(Enumerable, {
-
-      /**
-        Your array must support the `length` property. Your replace methods should
-        set this property whenever it changes.
-
-        @property {Number} length
-      */
-      length: required(),
-
-      /**
-        Returns the object at the given `index`. If the given `index` is negative
-        or is greater or equal than the array length, returns `undefined`.
-
-        This is one of the primitives you must implement to support `Ember.Array`.
-        If your object supports retrieving the value of an array item using `get()`
-        (i.e. `myArray.get(0)`), then you do not need to implement this method
-        yourself.
-
-        ```javascript
-        var arr = ['a', 'b', 'c', 'd'];
-        arr.objectAt(0);   // "a"
-        arr.objectAt(3);   // "d"
-        arr.objectAt(-1);  // undefined
-        arr.objectAt(4);   // undefined
-        arr.objectAt(5);   // undefined
-        ```
-
-        @method objectAt
-        @param {Number} idx The index of the item to return.
-        @return {*} item at index or undefined
-      */
-      objectAt: function(idx) {
-        if ((idx < 0) || (idx>=get(this, 'length'))) return undefined ;
-        return get(this, idx);
-      },
-
-      /**
-        This returns the objects at the specified indexes, using `objectAt`.
-
-        ```javascript
-        var arr = ['a', 'b', 'c', 'd'];
-        arr.objectsAt([0, 1, 2]);  // ["a", "b", "c"]
-        arr.objectsAt([2, 3, 4]);  // ["c", "d", undefined]
-        ```
-
-        @method objectsAt
-        @param {Array} indexes An array of indexes of items to return.
-        @return {Array}
-       */
-      objectsAt: function(indexes) {
-        var self = this;
-        return map(indexes, function(idx) { return self.objectAt(idx); });
-      },
-
-      // overrides Ember.Enumerable version
-      nextObject: function(idx) {
-        return this.objectAt(idx);
-      },
-
-      /**
-        This is the handler for the special array content property. If you get
-        this property, it will return this. If you set this property it a new
-        array, it will replace the current content.
-
-        This property overrides the default property defined in `Ember.Enumerable`.
-
-        @property []
-        @return this
-      */
-      '[]': computed(function(key, value) {
-        if (value !== undefined) this.replace(0, get(this, 'length'), value) ;
-        return this ;
-      }),
-
-      firstObject: computed(function() {
-        return this.objectAt(0);
-      }),
-
-      lastObject: computed(function() {
-        return this.objectAt(get(this, 'length')-1);
-      }),
-
-      // optimized version from Enumerable
-      contains: function(obj) {
-        return this.indexOf(obj) >= 0;
-      },
-
-      // Add any extra methods to Ember.Array that are native to the built-in Array.
-      /**
-        Returns a new array that is a slice of the receiver. This implementation
-        uses the observable array methods to retrieve the objects for the new
-        slice.
-
-        ```javascript
-        var arr = ['red', 'green', 'blue'];
-        arr.slice(0);       // ['red', 'green', 'blue']
-        arr.slice(0, 2);    // ['red', 'green']
-        arr.slice(1, 100);  // ['green', 'blue']
-        ```
-
-        @method slice
-        @param {Integer} beginIndex (Optional) index to begin slicing from.
-        @param {Integer} endIndex (Optional) index to end the slice at (but not included).
-        @return {Array} New array with specified slice
-      */
-      slice: function(beginIndex, endIndex) {
-        var ret = Ember.A();
-        var length = get(this, 'length') ;
-        if (isNone(beginIndex)) beginIndex = 0 ;
-        if (isNone(endIndex) || (endIndex > length)) endIndex = length ;
-
-        if (beginIndex < 0) beginIndex = length + beginIndex;
-        if (endIndex < 0) endIndex = length + endIndex;
-
-        while(beginIndex < endIndex) {
-          ret[ret.length] = this.objectAt(beginIndex++) ;
-        }
-        return ret ;
-      },
-
-      /**
-        Returns the index of the given object's first occurrence.
-        If no `startAt` argument is given, the starting location to
-        search is 0. If it's negative, will count backward from
-        the end of the array. Returns -1 if no match is found.
-
-        ```javascript
-        var arr = ["a", "b", "c", "d", "a"];
-        arr.indexOf("a");       //  0
-        arr.indexOf("z");       // -1
-        arr.indexOf("a", 2);    //  4
-        arr.indexOf("a", -1);   //  4
-        arr.indexOf("b", 3);    // -1
-        arr.indexOf("a", 100);  // -1
-        ```
-
-        @method indexOf
-        @param {Object} object the item to search for
-        @param {Number} startAt optional starting location to search, default 0
-        @return {Number} index or -1 if not found
-      */
-      indexOf: function(object, startAt) {
-        var idx, len = get(this, 'length');
-
-        if (startAt === undefined) startAt = 0;
-        if (startAt < 0) startAt += len;
-
-        for(idx=startAt;idx<len;idx++) {
-          if (this.objectAt(idx) === object) return idx ;
-        }
-        return -1;
-      },
-
-      /**
-        Returns the index of the given object's last occurrence.
-        If no `startAt` argument is given, the search starts from
-        the last position. If it's negative, will count backward
-        from the end of the array. Returns -1 if no match is found.
-
-        ```javascript
-        var arr = ["a", "b", "c", "d", "a"];
-        arr.lastIndexOf("a");       //  4
-        arr.lastIndexOf("z");       // -1
-        arr.lastIndexOf("a", 2);    //  0
-        arr.lastIndexOf("a", -1);   //  4
-        arr.lastIndexOf("b", 3);    //  1
-        arr.lastIndexOf("a", 100);  //  4
-        ```
-
-        @method lastIndexOf
-        @param {Object} object the item to search for
-        @param {Number} startAt optional starting location to search, default 0
-        @return {Number} index or -1 if not found
-      */
-      lastIndexOf: function(object, startAt) {
-        var idx, len = get(this, 'length');
-
-        if (startAt === undefined || startAt >= len) startAt = len-1;
-        if (startAt < 0) startAt += len;
-
-        for(idx=startAt;idx>=0;idx--) {
-          if (this.objectAt(idx) === object) return idx ;
-        }
-        return -1;
-      },
-
-      // ..........................................................
-      // ARRAY OBSERVERS
-      //
-
-      /**
-        Adds an array observer to the receiving array. The array observer object
-        normally must implement two methods:
-
-        * `arrayWillChange(observedObj, start, removeCount, addCount)` - This method will be
-          called just before the array is modified.
-        * `arrayDidChange(observedObj, start, removeCount, addCount)` - This method will be
-          called just after the array is modified.
-
-        Both callbacks will be passed the observed object, starting index of the
-        change as well a a count of the items to be removed and added. You can use
-        these callbacks to optionally inspect the array during the change, clear
-        caches, or do any other bookkeeping necessary.
-
-        In addition to passing a target, you can also include an options hash
-        which you can use to override the method names that will be invoked on the
-        target.
-
-        @method addArrayObserver
-        @param {Object} target The observer object.
-        @param {Hash} opts Optional hash of configuration options including
-          `willChange` and `didChange` option.
-        @return {Ember.Array} receiver
-      */
-      addArrayObserver: function(target, opts) {
-        var willChange = (opts && opts.willChange) || 'arrayWillChange',
-            didChange  = (opts && opts.didChange) || 'arrayDidChange';
-
-        var hasObservers = get(this, 'hasArrayObservers');
-        if (!hasObservers) propertyWillChange(this, 'hasArrayObservers');
-        addListener(this, '@array:before', target, willChange);
-        addListener(this, '@array:change', target, didChange);
-        if (!hasObservers) propertyDidChange(this, 'hasArrayObservers');
-        return this;
-      },
-
-      /**
-        Removes an array observer from the object if the observer is current
-        registered. Calling this method multiple times with the same object will
-        have no effect.
-
-        @method removeArrayObserver
-        @param {Object} target The object observing the array.
-        @param {Hash} opts Optional hash of configuration options including
-          `willChange` and `didChange` option.
-        @return {Ember.Array} receiver
-      */
-      removeArrayObserver: function(target, opts) {
-        var willChange = (opts && opts.willChange) || 'arrayWillChange',
-            didChange  = (opts && opts.didChange) || 'arrayDidChange';
-
-        var hasObservers = get(this, 'hasArrayObservers');
-        if (hasObservers) propertyWillChange(this, 'hasArrayObservers');
-        removeListener(this, '@array:before', target, willChange);
-        removeListener(this, '@array:change', target, didChange);
-        if (hasObservers) propertyDidChange(this, 'hasArrayObservers');
-        return this;
-      },
-
-      /**
-        Becomes true whenever the array currently has observers watching changes
-        on the array.
-
-        @property {Boolean} hasArrayObservers
-      */
-      hasArrayObservers: computed(function() {
-        return hasListeners(this, '@array:change') || hasListeners(this, '@array:before');
-      }),
-
-      /**
-        If you are implementing an object that supports `Ember.Array`, call this
-        method just before the array content changes to notify any observers and
-        invalidate any related properties. Pass the starting index of the change
-        as well as a delta of the amounts to change.
-
-        @method arrayContentWillChange
-        @param {Number} startIdx The starting index in the array that will change.
-        @param {Number} removeAmt The number of items that will be removed. If you
-          pass `null` assumes 0
-        @param {Number} addAmt The number of items that will be added. If you
-          pass `null` assumes 0.
-        @return {Ember.Array} receiver
-      */
-      arrayContentWillChange: function(startIdx, removeAmt, addAmt) {
-
-        // if no args are passed assume everything changes
-        if (startIdx===undefined) {
-          startIdx = 0;
-          removeAmt = addAmt = -1;
-        } else {
-          if (removeAmt === undefined) removeAmt=-1;
-          if (addAmt    === undefined) addAmt=-1;
-        }
-
-        // Make sure the @each proxy is set up if anyone is observing @each
-        if (isWatching(this, '@each')) { get(this, '@each'); }
-
-        sendEvent(this, '@array:before', [this, startIdx, removeAmt, addAmt]);
-
-        var removing, lim;
-        if (startIdx>=0 && removeAmt>=0 && get(this, 'hasEnumerableObservers')) {
-          removing = [];
-          lim = startIdx+removeAmt;
-          for(var idx=startIdx;idx<lim;idx++) removing.push(this.objectAt(idx));
-        } else {
-          removing = removeAmt;
-        }
-
-        this.enumerableContentWillChange(removing, addAmt);
-
-        return this;
-      },
-
-      /**
-        If you are implementing an object that supports `Ember.Array`, call this
-        method just after the array content changes to notify any observers and
-        invalidate any related properties. Pass the starting index of the change
-        as well as a delta of the amounts to change.
-
-        @method arrayContentDidChange
-        @param {Number} startIdx The starting index in the array that did change.
-        @param {Number} removeAmt The number of items that were removed. If you
-          pass `null` assumes 0
-        @param {Number} addAmt The number of items that were added. If you
-          pass `null` assumes 0.
-        @return {Ember.Array} receiver
-      */
-      arrayContentDidChange: function(startIdx, removeAmt, addAmt) {
-
-        // if no args are passed assume everything changes
-        if (startIdx===undefined) {
-          startIdx = 0;
-          removeAmt = addAmt = -1;
-        } else {
-          if (removeAmt === undefined) removeAmt=-1;
-          if (addAmt    === undefined) addAmt=-1;
-        }
-
-        var adding, lim;
-        if (startIdx>=0 && addAmt>=0 && get(this, 'hasEnumerableObservers')) {
-          adding = [];
-          lim = startIdx+addAmt;
-          for(var idx=startIdx;idx<lim;idx++) adding.push(this.objectAt(idx));
-        } else {
-          adding = addAmt;
-        }
-
-        this.enumerableContentDidChange(removeAmt, adding);
-        sendEvent(this, '@array:change', [this, startIdx, removeAmt, addAmt]);
-
-        var length      = get(this, 'length'),
-            cachedFirst = cacheFor(this, 'firstObject'),
-            cachedLast  = cacheFor(this, 'lastObject');
-        if (this.objectAt(0) !== cachedFirst) {
-          propertyWillChange(this, 'firstObject');
-          propertyDidChange(this, 'firstObject');
-        }
-        if (this.objectAt(length-1) !== cachedLast) {
-          propertyWillChange(this, 'lastObject');
-          propertyDidChange(this, 'lastObject');
-        }
-
-        return this;
-      },
-
-      // ..........................................................
-      // ENUMERATED PROPERTIES
-      //
-
-      /**
-        Returns a special object that can be used to observe individual properties
-        on the array. Just get an equivalent property on this object and it will
-        return an enumerable that maps automatically to the named key on the
-        member objects.
-
-        If you merely want to watch for any items being added or removed to the array,
-        use the `[]` property instead of `@each`.
-
-        @property @each
-      */
-      '@each': computed(function() {
-        if (!this.__each) {
-          // ES6TODO: GRRRRR
-          var EachProxy = requireModule('ember-runtime/system/each_proxy')['EachProxy'];
-
-          this.__each = new EachProxy(this);
-        }
-
-        return this.__each;
-      })
-
-    });
-
-    __exports__["default"] = EmberArray;
-  });
-define("ember-runtime/mixins/comparable", 
-  ["ember-metal/mixin","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Mixin = __dependency1__.Mixin;
-    var required = __dependency1__.required;
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-
-    /**
-      Implements some standard methods for comparing objects. Add this mixin to
-      any class you create that can compare its instances.
-
-      You should implement the `compare()` method.
-
-      @class Comparable
-      @namespace Ember
-      @since Ember 0.9
-    */
-    var Comparable = Mixin.create({
-
-      /**
-        Override to return the result of the comparison of the two parameters. The
-        compare method should return:
-
-        - `-1` if `a < b`
-        - `0` if `a == b`
-        - `1` if `a > b`
-
-        Default implementation raises an exception.
-
-        @method compare
-        @param a {Object} the first object to compare
-        @param b {Object} the second object to compare
-        @return {Integer} the result of the comparison
-      */
-      compare: required(Function)
-
-    });
-
-    __exports__["default"] = Comparable;
-  });
-define("ember-runtime/mixins/copyable", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-runtime/mixins/freezable","ember-runtime/system/string","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var required = __dependency3__.required;
-    var Freezable = __dependency4__.Freezable;
-    var Mixin = __dependency3__.Mixin;
-    var fmt = __dependency5__.fmt;
-    var EmberError = __dependency6__["default"];
-
-
-    /**
-      Implements some standard methods for copying an object. Add this mixin to
-      any object you create that can create a copy of itself. This mixin is
-      added automatically to the built-in array.
-
-      You should generally implement the `copy()` method to return a copy of the
-      receiver.
-
-      Note that `frozenCopy()` will only work if you also implement
-      `Ember.Freezable`.
-
-      @class Copyable
-      @namespace Ember
-      @since Ember 0.9
-    */
-    var Copyable = Mixin.create({
-
-      /**
-        Override to return a copy of the receiver. Default implementation raises
-        an exception.
-
-        @method copy
-        @param {Boolean} deep if `true`, a deep copy of the object should be made
-        @return {Object} copy of receiver
-      */
-      copy: required(Function),
-
-      /**
-        If the object implements `Ember.Freezable`, then this will return a new
-        copy if the object is not frozen and the receiver if the object is frozen.
-
-        Raises an exception if you try to call this method on a object that does
-        not support freezing.
-
-        You should use this method whenever you want a copy of a freezable object
-        since a freezable object can simply return itself without actually
-        consuming more memory.
-
-        @method frozenCopy
-        @return {Object} copy of receiver or receiver
-      */
-      frozenCopy: function() {
-        if (Freezable && Freezable.detect(this)) {
-          return get(this, 'isFrozen') ? this : this.copy().freeze();
-        } else {
-          throw new EmberError(fmt("%@ does not support freezing", [this]));
-        }
-      }
-    });
-
-    __exports__["default"] = Copyable;
-  });
-define("ember-runtime/mixins/deferred", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/mixin","ember-metal/computed","ember-metal/run_loop","ember-runtime/ext/rsvp","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.FEATURES, Ember.Test
-    var get = __dependency2__.get;
-    var Mixin = __dependency3__.Mixin;
-    var computed = __dependency4__.computed;
-    var run = __dependency5__["default"];
-    var RSVP = __dependency6__["default"];
-
-    if (Ember.FEATURES['ember-runtime-test-friendly-promises']) {
-
-      var asyncStart = function() {
-        if (Ember.Test && Ember.Test.adapter) {
-          Ember.Test.adapter.asyncStart();
-        }
-      };
-
-      var asyncEnd = function() {
-        if (Ember.Test && Ember.Test.adapter) {
-          Ember.Test.adapter.asyncEnd();
-        }
-      };
-
-      RSVP.configure('async', function(callback, promise) {
-        var async = !run.currentRunLoop;
-
-        if (Ember.testing && async) { asyncStart(); }
-
-        run.backburner.schedule('actions', function(){
-          if (Ember.testing && async) { asyncEnd(); }
-          callback(promise);
-        });
-      });
-    } else {
-      RSVP.configure('async', function(callback, promise) {
-        run.backburner.schedule('actions', function(){
-          callback(promise);
-        });
-      });
-    }
-
-    RSVP.Promise.prototype.fail = function(callback, label){
-      Ember.deprecate('RSVP.Promise.fail has been renamed as RSVP.Promise.catch');
-      return this['catch'](callback, label);
-    };
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-
-    /**
-      @class Deferred
-      @namespace Ember
-     */
-    var DeferredMixin = Mixin.create({
-      /**
-        Add handlers to be called when the Deferred object is resolved or rejected.
-
-        @method then
-        @param {Function} resolve a callback function to be called when done
-        @param {Function} reject  a callback function to be called when failed
-      */
-      then: function(resolve, reject, label) {
-        var deferred, promise, entity;
-
-        entity = this;
-        deferred = get(this, '_deferred');
-        promise = deferred.promise;
-
-        function fulfillmentHandler(fulfillment) {
-          if (fulfillment === promise) {
-            return resolve(entity);
-          } else {
-            return resolve(fulfillment);
-          }
-        }
-
-        return promise.then(resolve && fulfillmentHandler, reject, label);
-      },
-
-      /**
-        Resolve a Deferred object and call any `doneCallbacks` with the given args.
-
-        @method resolve
-      */
-      resolve: function(value) {
-        var deferred, promise;
-
-        deferred = get(this, '_deferred');
-        promise = deferred.promise;
-
-        if (value === this) {
-          deferred.resolve(promise);
-        } else {
-          deferred.resolve(value);
-        }
-      },
-
-      /**
-        Reject a Deferred object and call any `failCallbacks` with the given args.
-
-        @method reject
-      */
-      reject: function(value) {
-        get(this, '_deferred').reject(value);
-      },
-
-      _deferred: computed(function() {
-        return RSVP.defer('Ember: DeferredMixin - ' + this);
-      })
-    });
-
-    __exports__["default"] = DeferredMixin;
-  });
-define("ember-runtime/mixins/enumerable", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/mixin","ember-metal/enumerable_utils","ember-metal/computed","ember-metal/property_events","ember-metal/events","ember-runtime/compare","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    // ..........................................................
-    // HELPERS
-    //
-
-    var Ember = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var apply = __dependency4__.apply;
-    var Mixin = __dependency5__.Mixin;
-    var required = __dependency5__.required;
-    var aliasMethod = __dependency5__.aliasMethod;
-    var EnumerableUtils = __dependency6__["default"];
-    var computed = __dependency7__.computed;
-    var propertyWillChange = __dependency8__.propertyWillChange;
-    var propertyDidChange = __dependency8__.propertyDidChange;
-    var addListener = __dependency9__.addListener;
-    var removeListener = __dependency9__.removeListener;
-    var sendEvent = __dependency9__.sendEvent;
-    var hasListeners = __dependency9__.hasListeners;
-    var compare = __dependency10__["default"];
-
-    var a_slice = Array.prototype.slice;
-    var a_indexOf = EnumerableUtils.indexOf;
-
-    var contexts = [];
-
-    function popCtx() {
-      return contexts.length===0 ? {} : contexts.pop();
-    }
-
-    function pushCtx(ctx) {
-      contexts.push(ctx);
-      return null;
-    }
-
-    function iter(key, value) {
-      var valueProvided = arguments.length === 2;
-
-      function i(item) {
-        var cur = get(item, key);
-        return valueProvided ? value===cur : !!cur;
-      }
-      return i ;
-    }
-
-    /**
-      This mixin defines the common interface implemented by enumerable objects
-      in Ember. Most of these methods follow the standard Array iteration
-      API defined up to JavaScript 1.8 (excluding language-specific features that
-      cannot be emulated in older versions of JavaScript).
-
-      This mixin is applied automatically to the Array class on page load, so you
-      can use any of these methods on simple arrays. If Array already implements
-      one of these methods, the mixin will not override them.
-
-      ## Writing Your Own Enumerable
-
-      To make your own custom class enumerable, you need two items:
-
-      1. You must have a length property. This property should change whenever
-         the number of items in your enumerable object changes. If you use this
-         with an `Ember.Object` subclass, you should be sure to change the length
-         property using `set().`
-
-      2. You must implement `nextObject().` See documentation.
-
-      Once you have these two methods implemented, apply the `Ember.Enumerable` mixin
-      to your class and you will be able to enumerate the contents of your object
-      like any other collection.
-
-      ## Using Ember Enumeration with Other Libraries
-
-      Many other libraries provide some kind of iterator or enumeration like
-      facility. This is often where the most common API conflicts occur.
-      Ember's API is designed to be as friendly as possible with other
-      libraries by implementing only methods that mostly correspond to the
-      JavaScript 1.8 API.
-
-      @class Enumerable
-      @namespace Ember
-      @since Ember 0.9
-    */
-    var Enumerable = Mixin.create({
-
-      /**
-        Implement this method to make your class enumerable.
-
-        This method will be call repeatedly during enumeration. The index value
-        will always begin with 0 and increment monotonically. You don't have to
-        rely on the index value to determine what object to return, but you should
-        always check the value and start from the beginning when you see the
-        requested index is 0.
-
-        The `previousObject` is the object that was returned from the last call
-        to `nextObject` for the current iteration. This is a useful way to
-        manage iteration if you are tracing a linked list, for example.
-
-        Finally the context parameter will always contain a hash you can use as
-        a "scratchpad" to maintain any other state you need in order to iterate
-        properly. The context object is reused and is not reset between
-        iterations so make sure you setup the context with a fresh state whenever
-        the index parameter is 0.
-
-        Generally iterators will continue to call `nextObject` until the index
-        reaches the your current length-1. If you run out of data before this
-        time for some reason, you should simply return undefined.
-
-        The default implementation of this method simply looks up the index.
-        This works great on any Array-like objects.
-
-        @method nextObject
-        @param {Number} index the current index of the iteration
-        @param {Object} previousObject the value returned by the last call to
-          `nextObject`.
-        @param {Object} context a context object you can use to maintain state.
-        @return {Object} the next object in the iteration or undefined
-      */
-      nextObject: required(Function),
-
-      /**
-        Helper method returns the first object from a collection. This is usually
-        used by bindings and other parts of the framework to extract a single
-        object if the enumerable contains only one item.
-
-        If you override this method, you should implement it so that it will
-        always return the same value each time it is called. If your enumerable
-        contains only one object, this method should always return that object.
-        If your enumerable is empty, this method should return `undefined`.
-
-        ```javascript
-        var arr = ["a", "b", "c"];
-        arr.get('firstObject');  // "a"
-
-        var arr = [];
-        arr.get('firstObject');  // undefined
-        ```
-
-        @property firstObject
-        @return {Object} the object or undefined
-      */
-      firstObject: computed(function() {
-        if (get(this, 'length')===0) return undefined ;
-
-        // handle generic enumerables
-        var context = popCtx(), ret;
-        ret = this.nextObject(0, null, context);
-        pushCtx(context);
-        return ret ;
-      }).property('[]'),
-
-      /**
-        Helper method returns the last object from a collection. If your enumerable
-        contains only one object, this method should always return that object.
-        If your enumerable is empty, this method should return `undefined`.
-
-        ```javascript
-        var arr = ["a", "b", "c"];
-        arr.get('lastObject');  // "c"
-
-        var arr = [];
-        arr.get('lastObject');  // undefined
-        ```
-
-        @property lastObject
-        @return {Object} the last object or undefined
-      */
-      lastObject: computed(function() {
-        var len = get(this, 'length');
-        if (len===0) return undefined ;
-        var context = popCtx(), idx=0, cur, last = null;
-        do {
-          last = cur;
-          cur = this.nextObject(idx++, last, context);
-        } while (cur !== undefined);
-        pushCtx(context);
-        return last;
-      }).property('[]'),
-
-      /**
-        Returns `true` if the passed object can be found in the receiver. The
-        default version will iterate through the enumerable until the object
-        is found. You may want to override this with a more efficient version.
-
-        ```javascript
-        var arr = ["a", "b", "c"];
-        arr.contains("a"); // true
-        arr.contains("z"); // false
-        ```
-
-        @method contains
-        @param {Object} obj The object to search for.
-        @return {Boolean} `true` if object is found in enumerable.
-      */
-      contains: function(obj) {
-        return this.find(function(item) { return item===obj; }) !== undefined;
-      },
-
-      /**
-        Iterates through the enumerable, calling the passed function on each
-        item. This method corresponds to the `forEach()` method defined in
-        JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        @method forEach
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Object} receiver
-      */
-      forEach: function(callback, target) {
-        if (typeof callback !== "function") throw new TypeError() ;
-        var len = get(this, 'length'), last = null, context = popCtx();
-
-        if (target === undefined) target = null;
-
-        for(var idx=0;idx<len;idx++) {
-          var next = this.nextObject(idx, last, context) ;
-          callback.call(target, next, idx, this);
-          last = next ;
-        }
-        last = null ;
-        context = pushCtx(context);
-        return this ;
-      },
-
-      /**
-        Alias for `mapBy`
-
-        @method getEach
-        @param {String} key name of the property
-        @return {Array} The mapped array.
-      */
-      getEach: function(key) {
-        return this.mapBy(key);
-      },
-
-      /**
-        Sets the value on the named property for each member. This is more
-        efficient than using other methods defined on this helper. If the object
-        implements Ember.Observable, the value will be changed to `set(),` otherwise
-        it will be set directly. `null` objects are skipped.
-
-        @method setEach
-        @param {String} key The key to set
-        @param {Object} value The object to set
-        @return {Object} receiver
-      */
-      setEach: function(key, value) {
-        return this.forEach(function(item) {
-          set(item, key, value);
-        });
-      },
-
-      /**
-        Maps all of the items in the enumeration to another value, returning
-        a new array. This method corresponds to `map()` defined in JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the mapped value.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        @method map
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Array} The mapped array.
-      */
-      map: function(callback, target) {
-        var ret = Ember.A();
-        this.forEach(function(x, idx, i) {
-          ret[idx] = callback.call(target, x, idx,i);
-        });
-        return ret ;
-      },
-
-      /**
-        Similar to map, this specialized function returns the value of the named
-        property on all items in the enumeration.
-
-        @method mapBy
-        @param {String} key name of the property
-        @return {Array} The mapped array.
-      */
-      mapBy: function(key) {
-        return this.map(function(next) {
-          return get(next, key);
-        });
-      },
-
-      /**
-        Similar to map, this specialized function returns the value of the named
-        property on all items in the enumeration.
-
-        @method mapProperty
-        @param {String} key name of the property
-        @return {Array} The mapped array.
-        @deprecated Use `mapBy` instead
-      */
-
-      mapProperty: aliasMethod('mapBy'),
-
-      /**
-        Returns an array with all of the items in the enumeration that the passed
-        function returns true for. This method corresponds to `filter()` defined in
-        JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the `true` to include the item in the results, `false`
-        otherwise.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        @method filter
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Array} A filtered array.
-      */
-      filter: function(callback, target) {
-        var ret = Ember.A();
-        this.forEach(function(x, idx, i) {
-          if (callback.call(target, x, idx, i)) ret.push(x);
-        });
-        return ret ;
-      },
-
-      /**
-        Returns an array with all of the items in the enumeration where the passed
-        function returns false for. This method is the inverse of filter().
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - *item* is the current item in the iteration.
-        - *index* is the current index in the iteration
-        - *enumerable* is the enumerable object itself.
-
-        It should return the a falsey value to include the item in the results.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as "this" on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        @method reject
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Array} A rejected array.
-       */
-      reject: function(callback, target) {
-        return this.filter(function() {
-          return !(apply(target, callback, arguments));
-        });
-      },
-
-      /**
-        Returns an array with just the items with the matched property. You
-        can pass an optional second argument with the target value. Otherwise
-        this will match any property that evaluates to `true`.
-
-        @method filterBy
-        @param {String} key the property to test
-        @param {*} [value] optional value to test against.
-        @return {Array} filtered array
-      */
-      filterBy: function(key, value) {
-        return this.filter(apply(this, iter, arguments));
-      },
-
-      /**
-        Returns an array with just the items with the matched property. You
-        can pass an optional second argument with the target value. Otherwise
-        this will match any property that evaluates to `true`.
-
-        @method filterProperty
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Array} filtered array
-        @deprecated Use `filterBy` instead
-      */
-      filterProperty: aliasMethod('filterBy'),
-
-      /**
-        Returns an array with the items that do not have truthy values for
-        key.  You can pass an optional second argument with the target value.  Otherwise
-        this will match any property that evaluates to false.
-
-        @method rejectBy
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Array} rejected array
-      */
-      rejectBy: function(key, value) {
-        var exactValue = function(item) { return get(item, key) === value; },
-            hasValue = function(item) { return !!get(item, key); },
-            use = (arguments.length === 2 ? exactValue : hasValue);
-
-        return this.reject(use);
-      },
-
-      /**
-        Returns an array with the items that do not have truthy values for
-        key.  You can pass an optional second argument with the target value.  Otherwise
-        this will match any property that evaluates to false.
-
-        @method rejectProperty
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Array} rejected array
-        @deprecated Use `rejectBy` instead
-      */
-      rejectProperty: aliasMethod('rejectBy'),
-
-      /**
-        Returns the first item in the array for which the callback returns true.
-        This method works similar to the `filter()` method defined in JavaScript 1.6
-        except that it will stop working on the array once a match is found.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the `true` to include the item in the results, `false`
-        otherwise.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        @method find
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Object} Found item or `undefined`.
-      */
-      find: function(callback, target) {
-        var len = get(this, 'length') ;
-        if (target === undefined) target = null;
-
-        var last = null, next, found = false, ret ;
-        var context = popCtx();
-        for(var idx=0;idx<len && !found;idx++) {
-          next = this.nextObject(idx, last, context) ;
-          if (found = callback.call(target, next, idx, this)) ret = next ;
-          last = next ;
-        }
-        next = last = null ;
-        context = pushCtx(context);
-        return ret ;
-      },
-
-      /**
-        Returns the first item with a property matching the passed value. You
-        can pass an optional second argument with the target value. Otherwise
-        this will match any property that evaluates to `true`.
-
-        This method works much like the more generic `find()` method.
-
-        @method findBy
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Object} found item or `undefined`
-      */
-      findBy: function(key, value) {
-        return this.find(apply(this, iter, arguments));
-      },
-
-      /**
-        Returns the first item with a property matching the passed value. You
-        can pass an optional second argument with the target value. Otherwise
-        this will match any property that evaluates to `true`.
-
-        This method works much like the more generic `find()` method.
-
-        @method findProperty
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Object} found item or `undefined`
-        @deprecated Use `findBy` instead
-      */
-      findProperty: aliasMethod('findBy'),
-
-      /**
-        Returns `true` if the passed function returns true for every item in the
-        enumeration. This corresponds with the `every()` method in JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the `true` or `false`.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        Example Usage:
-
-        ```javascript
-        if (people.every(isEngineer)) { Paychecks.addBigBonus(); }
-        ```
-
-        @method every
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Boolean}
-      */
-      every: function(callback, target) {
-        return !this.find(function(x, idx, i) {
-          return !callback.call(target, x, idx, i);
-        });
-      },
-
-      /**
-        @method everyBy
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @deprecated Use `isEvery` instead
-        @return {Boolean}
-      */
-      everyBy: aliasMethod('isEvery'),
-
-      /**
-        @method everyProperty
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @deprecated Use `isEvery` instead
-        @return {Boolean}
-      */
-      everyProperty: aliasMethod('isEvery'),
-
-      /**
-        Returns `true` if the passed property resolves to `true` for all items in
-        the enumerable. This method is often simpler/faster than using a callback.
-
-        @method isEvery
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Boolean}
-      */
-      isEvery: function(key, value) {
-        return this.every(apply(this, iter, arguments));
-      },
-
-      /**
-        Returns `true` if the passed function returns true for any item in the
-        enumeration. This corresponds with the `some()` method in JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the `true` to include the item in the results, `false`
-        otherwise.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        Usage Example:
-
-        ```javascript
-        if (people.any(isManager)) { Paychecks.addBiggerBonus(); }
-        ```
-
-        @method any
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Boolean} `true` if the passed function returns `true` for any item
-      */
-      any: function(callback, target) {
-        var len     = get(this, 'length'),
-            context = popCtx(),
-            found   = false,
-            last    = null,
-            next, idx;
-
-        if (target === undefined) { target = null; }
-
-        for (idx = 0; idx < len && !found; idx++) {
-          next  = this.nextObject(idx, last, context);
-          found = callback.call(target, next, idx, this);
-          last  = next;
-        }
-
-        next = last = null;
-        context = pushCtx(context);
-        return found;
-      },
-
-      /**
-        Returns `true` if the passed function returns true for any item in the
-        enumeration. This corresponds with the `some()` method in JavaScript 1.6.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(item, index, enumerable);
-        ```
-
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        It should return the `true` to include the item in the results, `false`
-        otherwise.
-
-        Note that in addition to a callback, you can also pass an optional target
-        object that will be set as `this` on the context. This is a good way
-        to give your iterator function access to the current object.
-
-        Usage Example:
-
-        ```javascript
-        if (people.some(isManager)) { Paychecks.addBiggerBonus(); }
-        ```
-
-        @method some
-        @param {Function} callback The callback to execute
-        @param {Object} [target] The target object to use
-        @return {Boolean} `true` if the passed function returns `true` for any item
-        @deprecated Use `any` instead
-      */
-      some: aliasMethod('any'),
-
-      /**
-        Returns `true` if the passed property resolves to `true` for any item in
-        the enumerable. This method is often simpler/faster than using a callback.
-
-        @method isAny
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Boolean} `true` if the passed function returns `true` for any item
-      */
-      isAny: function(key, value) {
-        return this.any(apply(this, iter, arguments));
-      },
-
-      /**
-        @method anyBy
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Boolean} `true` if the passed function returns `true` for any item
-        @deprecated Use `isAny` instead
-      */
-      anyBy: aliasMethod('isAny'),
-
-      /**
-        @method someProperty
-        @param {String} key the property to test
-        @param {String} [value] optional value to test against.
-        @return {Boolean} `true` if the passed function returns `true` for any item
-        @deprecated Use `isAny` instead
-      */
-      someProperty: aliasMethod('isAny'),
-
-      /**
-        This will combine the values of the enumerator into a single value. It
-        is a useful way to collect a summary value from an enumeration. This
-        corresponds to the `reduce()` method defined in JavaScript 1.8.
-
-        The callback method you provide should have the following signature (all
-        parameters are optional):
-
-        ```javascript
-        function(previousValue, item, index, enumerable);
-        ```
-
-        - `previousValue` is the value returned by the last call to the iterator.
-        - `item` is the current item in the iteration.
-        - `index` is the current index in the iteration.
-        - `enumerable` is the enumerable object itself.
-
-        Return the new cumulative value.
-
-        In addition to the callback you can also pass an `initialValue`. An error
-        will be raised if you do not pass an initial value and the enumerator is
-        empty.
-
-        Note that unlike the other methods, this method does not allow you to
-        pass a target object to set as this for the callback. It's part of the
-        spec. Sorry.
-
-        @method reduce
-        @param {Function} callback The callback to execute
-        @param {Object} initialValue Initial value for the reduce
-        @param {String} reducerProperty internal use only.
-        @return {Object} The reduced value.
-      */
-      reduce: function(callback, initialValue, reducerProperty) {
-        if (typeof callback !== "function") { throw new TypeError(); }
-
-        var ret = initialValue;
-
-        this.forEach(function(item, i) {
-          ret = callback(ret, item, i, this, reducerProperty);
-        }, this);
-
-        return ret;
-      },
-
-      /**
-        Invokes the named method on every object in the receiver that
-        implements it. This method corresponds to the implementation in
-        Prototype 1.6.
-
-        @method invoke
-        @param {String} methodName the name of the method
-        @param {Object...} args optional arguments to pass as well.
-        @return {Array} return values from calling invoke.
-      */
-      invoke: function(methodName) {
-        var args, ret = Ember.A();
-        if (arguments.length>1) args = a_slice.call(arguments, 1);
-
-        this.forEach(function(x, idx) {
-          var method = x && x[methodName];
-          if ('function' === typeof method) {
-            ret[idx] = args ? apply(x, method, args) : x[methodName]();
-          }
-        }, this);
-
-        return ret;
-      },
-
-      /**
-        Simply converts the enumerable into a genuine array. The order is not
-        guaranteed. Corresponds to the method implemented by Prototype.
-
-        @method toArray
-        @return {Array} the enumerable as an array.
-      */
-      toArray: function() {
-        var ret = Ember.A();
-        this.forEach(function(o, idx) { ret[idx] = o; });
-        return ret ;
-      },
-
-      /**
-        Returns a copy of the array with all null and undefined elements removed.
-
-        ```javascript
-        var arr = ["a", null, "c", undefined];
-        arr.compact();  // ["a", "c"]
-        ```
-
-        @method compact
-        @return {Array} the array without null and undefined elements.
-      */
-      compact: function() {
-        return this.filter(function(value) { return value != null; });
-      },
-
-      /**
-        Returns a new enumerable that excludes the passed value. The default
-        implementation returns an array regardless of the receiver type unless
-        the receiver does not contain the value.
-
-        ```javascript
-        var arr = ["a", "b", "a", "c"];
-        arr.without("a");  // ["b", "c"]
-        ```
-
-        @method without
-        @param {Object} value
-        @return {Ember.Enumerable}
-      */
-      without: function(value) {
-        if (!this.contains(value)) return this; // nothing to do
-        var ret = Ember.A();
-        this.forEach(function(k) {
-          if (k !== value) ret[ret.length] = k;
-        }) ;
-        return ret ;
-      },
-
-      /**
-        Returns a new enumerable that contains only unique values. The default
-        implementation returns an array regardless of the receiver type.
-
-        ```javascript
-        var arr = ["a", "a", "b", "b"];
-        arr.uniq();  // ["a", "b"]
-        ```
-
-        @method uniq
-        @return {Ember.Enumerable}
-      */
-      uniq: function() {
-        var ret = Ember.A();
-        this.forEach(function(k) {
-          if (a_indexOf(ret, k)<0) ret.push(k);
-        });
-        return ret;
-      },
-
-      /**
-        This property will trigger anytime the enumerable's content changes.
-        You can observe this property to be notified of changes to the enumerables
-        content.
-
-        For plain enumerables, this property is read only. `Array` overrides
-        this method.
-
-        @property []
-        @type Array
-        @return this
-      */
-      '[]': computed(function(key, value) {
-        return this;
-      }),
-
-      // ..........................................................
-      // ENUMERABLE OBSERVERS
-      //
-
-      /**
-        Registers an enumerable observer. Must implement `Ember.EnumerableObserver`
-        mixin.
-
-        @method addEnumerableObserver
-        @param {Object} target
-        @param {Hash} [opts]
-        @return this
-      */
-      addEnumerableObserver: function(target, opts) {
-        var willChange = (opts && opts.willChange) || 'enumerableWillChange',
-            didChange  = (opts && opts.didChange) || 'enumerableDidChange';
-
-        var hasObservers = get(this, 'hasEnumerableObservers');
-        if (!hasObservers) propertyWillChange(this, 'hasEnumerableObservers');
-        addListener(this, '@enumerable:before', target, willChange);
-        addListener(this, '@enumerable:change', target, didChange);
-        if (!hasObservers) propertyDidChange(this, 'hasEnumerableObservers');
-        return this;
-      },
-
-      /**
-        Removes a registered enumerable observer.
-
-        @method removeEnumerableObserver
-        @param {Object} target
-        @param {Hash} [opts]
-        @return this
-      */
-      removeEnumerableObserver: function(target, opts) {
-        var willChange = (opts && opts.willChange) || 'enumerableWillChange',
-            didChange  = (opts && opts.didChange) || 'enumerableDidChange';
-
-        var hasObservers = get(this, 'hasEnumerableObservers');
-        if (hasObservers) propertyWillChange(this, 'hasEnumerableObservers');
-        removeListener(this, '@enumerable:before', target, willChange);
-        removeListener(this, '@enumerable:change', target, didChange);
-        if (hasObservers) propertyDidChange(this, 'hasEnumerableObservers');
-        return this;
-      },
-
-      /**
-        Becomes true whenever the array currently has observers watching changes
-        on the array.
-
-        @property hasEnumerableObservers
-        @type Boolean
-      */
-      hasEnumerableObservers: computed(function() {
-        return hasListeners(this, '@enumerable:change') || hasListeners(this, '@enumerable:before');
-      }),
-
-
-      /**
-        Invoke this method just before the contents of your enumerable will
-        change. You can either omit the parameters completely or pass the objects
-        to be removed or added if available or just a count.
-
-        @method enumerableContentWillChange
-        @param {Ember.Enumerable|Number} removing An enumerable of the objects to
-          be removed or the number of items to be removed.
-        @param {Ember.Enumerable|Number} adding An enumerable of the objects to be
-          added or the number of items to be added.
-        @chainable
-      */
-      enumerableContentWillChange: function(removing, adding) {
-
-        var removeCnt, addCnt, hasDelta;
-
-        if ('number' === typeof removing) removeCnt = removing;
-        else if (removing) removeCnt = get(removing, 'length');
-        else removeCnt = removing = -1;
-
-        if ('number' === typeof adding) addCnt = adding;
-        else if (adding) addCnt = get(adding,'length');
-        else addCnt = adding = -1;
-
-        hasDelta = addCnt<0 || removeCnt<0 || addCnt-removeCnt!==0;
-
-        if (removing === -1) removing = null;
-        if (adding   === -1) adding   = null;
-
-        propertyWillChange(this, '[]');
-        if (hasDelta) propertyWillChange(this, 'length');
-        sendEvent(this, '@enumerable:before', [this, removing, adding]);
-
-        return this;
-      },
-
-      /**
-        Invoke this method when the contents of your enumerable has changed.
-        This will notify any observers watching for content changes. If your are
-        implementing an ordered enumerable (such as an array), also pass the
-        start and end values where the content changed so that it can be used to
-        notify range observers.
-
-        @method enumerableContentDidChange
-        @param {Ember.Enumerable|Number} removing An enumerable of the objects to
-          be removed or the number of items to be removed.
-        @param {Ember.Enumerable|Number} adding  An enumerable of the objects to
-          be added or the number of items to be added.
-        @chainable
-      */
-      enumerableContentDidChange: function(removing, adding) {
-        var removeCnt, addCnt, hasDelta;
-
-        if ('number' === typeof removing) removeCnt = removing;
-        else if (removing) removeCnt = get(removing, 'length');
-        else removeCnt = removing = -1;
-
-        if ('number' === typeof adding) addCnt = adding;
-        else if (adding) addCnt = get(adding, 'length');
-        else addCnt = adding = -1;
-
-        hasDelta = addCnt<0 || removeCnt<0 || addCnt-removeCnt!==0;
-
-        if (removing === -1) removing = null;
-        if (adding   === -1) adding   = null;
-
-        sendEvent(this, '@enumerable:change', [this, removing, adding]);
-        if (hasDelta) propertyDidChange(this, 'length');
-        propertyDidChange(this, '[]');
-
-        return this ;
-      },
-
-      /**
-        Converts the enumerable into an array and sorts by the keys
-        specified in the argument.
-
-        You may provide multiple arguments to sort by multiple properties.
-
-        @method sortBy
-        @param {String} property name(s) to sort on
-        @return {Array} The sorted array.
-        */
-      sortBy: function() {
-        var sortKeys = arguments;
-        return this.toArray().sort(function(a, b){
-          for(var i = 0; i < sortKeys.length; i++) {
-            var key = sortKeys[i],
-            propA = get(a, key),
-            propB = get(b, key);
-            // return 1 or -1 else continue to the next sortKey
-            var compareValue = compare(propA, propB);
-            if (compareValue) { return compareValue; }
-          }
-          return 0;
-        });
-      }
-    });
-
-    __exports__["default"] = Enumerable;
-  });
-define("ember-runtime/mixins/evented", 
-  ["ember-metal/mixin","ember-metal/events","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Mixin = __dependency1__.Mixin;
-    var addListener = __dependency2__.addListener;
-    var removeListener = __dependency2__.removeListener;
-    var hasListeners = __dependency2__.hasListeners;
-    var sendEvent = __dependency2__.sendEvent;
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    /**
-      This mixin allows for Ember objects to subscribe to and emit events.
-
-      ```javascript
-      App.Person = Ember.Object.extend(Ember.Evented, {
-        greet: function() {
-          // ...
-          this.trigger('greet');
-        }
-      });
-
-      var person = App.Person.create();
-
-      person.on('greet', function() {
-        console.log('Our person has greeted');
-      });
-
-      person.greet();
-
-      // outputs: 'Our person has greeted'
-      ```
-
-      You can also chain multiple event subscriptions:
-
-      ```javascript
-      person.on('greet', function() {
-        console.log('Our person has greeted');
-      }).one('greet', function() {
-        console.log('Offer one-time special');
-      }).off('event', this, forgetThis);
-      ```
-
-      @class Evented
-      @namespace Ember
-     */
-    var Evented = Mixin.create({
-
-      /**
-       Subscribes to a named event with given function.
-
-       ```javascript
-       person.on('didLoad', function() {
-         // fired once the person has loaded
-       });
-       ```
-
-       An optional target can be passed in as the 2nd argument that will
-       be set as the "this" for the callback. This is a good way to give your
-       function access to the object triggering the event. When the target
-       parameter is used the callback becomes the third argument.
-
-       @method on
-       @param {String} name The name of the event
-       @param {Object} [target] The "this" binding for the callback
-       @param {Function} method The callback to execute
-       @return this
-      */
-      on: function(name, target, method) {
-        addListener(this, name, target, method);
-        return this;
-      },
-
-      /**
-        Subscribes a function to a named event and then cancels the subscription
-        after the first time the event is triggered. It is good to use ``one`` when
-        you only care about the first time an event has taken place.
-
-        This function takes an optional 2nd argument that will become the "this"
-        value for the callback. If this argument is passed then the 3rd argument
-        becomes the function.
-
-        @method one
-        @param {String} name The name of the event
-        @param {Object} [target] The "this" binding for the callback
-        @param {Function} method The callback to execute
-        @return this
-      */
-      one: function(name, target, method) {
-        if (!method) {
-          method = target;
-          target = null;
-        }
-
-        addListener(this, name, target, method, true);
-        return this;
-      },
-
-      /**
-        Triggers a named event for the object. Any additional arguments
-        will be passed as parameters to the functions that are subscribed to the
-        event.
-
-        ```javascript
-        person.on('didEat', function(food) {
-          console.log('person ate some ' + food);
-        });
-
-        person.trigger('didEat', 'broccoli');
-
-        // outputs: person ate some broccoli
-        ```
-        @method trigger
-        @param {String} name The name of the event
-        @param {Object...} args Optional arguments to pass on
-      */
-      trigger: function(name) {
-        var args = [], i, l;
-        for (i = 1, l = arguments.length; i < l; i++) {
-          args.push(arguments[i]);
-        }
-        sendEvent(this, name, args);
-      },
-
-      /**
-        Cancels subscription for given name, target, and method.
-
-        @method off
-        @param {String} name The name of the event
-        @param {Object} target The target of the subscription
-        @param {Function} method The function of the subscription
-        @return this
-      */
-      off: function(name, target, method) {
-        removeListener(this, name, target, method);
-        return this;
-      },
-
-      /**
-        Checks to see if object has any subscriptions for named event.
-
-        @method has
-        @param {String} name The name of the event
-        @return {Boolean} does the object have a subscription for event
-       */
-      has: function(name) {
-        return hasListeners(this, name);
-      }
-    });
-
-    __exports__["default"] = Evented;
-  });
-define("ember-runtime/mixins/freezable", 
-  ["ember-metal/mixin","ember-metal/property_get","ember-metal/property_set","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Mixin = __dependency1__.Mixin;
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-
-    /**
-      The `Ember.Freezable` mixin implements some basic methods for marking an
-      object as frozen. Once an object is frozen it should be read only. No changes
-      may be made the internal state of the object.
-
-      ## Enforcement
-
-      To fully support freezing in your subclass, you must include this mixin and
-      override any method that might alter any property on the object to instead
-      raise an exception. You can check the state of an object by checking the
-      `isFrozen` property.
-
-      Although future versions of JavaScript may support language-level freezing
-      object objects, that is not the case today. Even if an object is freezable,
-      it is still technically possible to modify the object, even though it could
-      break other parts of your application that do not expect a frozen object to
-      change. It is, therefore, very important that you always respect the
-      `isFrozen` property on all freezable objects.
-
-      ## Example Usage
-
-      The example below shows a simple object that implement the `Ember.Freezable`
-      protocol.
-
-      ```javascript
-      Contact = Ember.Object.extend(Ember.Freezable, {
-        firstName: null,
-        lastName: null,
-
-        // swaps the names
-        swapNames: function() {
-          if (this.get('isFrozen')) throw Ember.FROZEN_ERROR;
-          var tmp = this.get('firstName');
-          this.set('firstName', this.get('lastName'));
-          this.set('lastName', tmp);
-          return this;
-        }
-
-      });
-
-      c = Contact.create({ firstName: "John", lastName: "Doe" });
-      c.swapNames();  // returns c
-      c.freeze();
-      c.swapNames();  // EXCEPTION
-      ```
-
-      ## Copying
-
-      Usually the `Ember.Freezable` protocol is implemented in cooperation with the
-      `Ember.Copyable` protocol, which defines a `frozenCopy()` method that will
-      return a frozen object, if the object implements this method as well.
-
-      @class Freezable
-      @namespace Ember
-      @since Ember 0.9
-    */
-    var Freezable = Mixin.create({
-
-      /**
-        Set to `true` when the object is frozen. Use this property to detect
-        whether your object is frozen or not.
-
-        @property isFrozen
-        @type Boolean
-      */
-      isFrozen: false,
-
-      /**
-        Freezes the object. Once this method has been called the object should
-        no longer allow any properties to be edited.
-
-        @method freeze
-        @return {Object} receiver
-      */
-      freeze: function() {
-        if (get(this, 'isFrozen')) return this;
-        set(this, 'isFrozen', true);
-        return this;
-      }
-
-    });
-
-    var FROZEN_ERROR = "Frozen object cannot be modified.";
-
-    __exports__.Freezable = Freezable;
-    __exports__.FROZEN_ERROR = FROZEN_ERROR;
-  });
-define("ember-runtime/mixins/mutable_array", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/mixin","ember-runtime/mixins/array","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/enumerable","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-
-    // require('ember-runtime/mixins/array');
-    // require('ember-runtime/mixins/mutable_enumerable');
-
-    // ..........................................................
-    // CONSTANTS
-    //
-
-    var OUT_OF_RANGE_EXCEPTION = "Index out of range";
-    var EMPTY = [];
-
-    // ..........................................................
-    // HELPERS
-    //
-
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var isArray = __dependency3__.isArray;
-    var EmberError = __dependency4__["default"];
-    var Mixin = __dependency5__.Mixin;
-    var required = __dependency5__.required;
-    var EmberArray = __dependency6__["default"];
-    var MutableEnumerable = __dependency7__["default"];
-    var Enumerable = __dependency8__["default"];
-    /**
-      This mixin defines the API for modifying array-like objects. These methods
-      can be applied only to a collection that keeps its items in an ordered set.
-      It builds upon the Array mixin and adds methods to modify the array.
-      Concrete implementations of this class include ArrayProxy and ArrayController.
-
-      It is important to use the methods in this class to modify arrays so that
-      changes are observable. This allows the binding system in Ember to function
-      correctly.
-
-
-      Note that an Array can change even if it does not implement this mixin.
-      For example, one might implement a SparseArray that cannot be directly
-      modified, but if its underlying enumerable changes, it will change also.
-
-      @class MutableArray
-      @namespace Ember
-      @uses Ember.Array
-      @uses Ember.MutableEnumerable
-    */
-    var MutableArray = Mixin.create(EmberArray, MutableEnumerable, {
-
-      /**
-        __Required.__ You must implement this method to apply this mixin.
-
-        This is one of the primitives you must implement to support `Ember.Array`.
-        You should replace amt objects started at idx with the objects in the
-        passed array. You should also call `this.enumerableContentDidChange()`
-
-        @method replace
-        @param {Number} idx Starting index in the array to replace. If
-          idx >= length, then append to the end of the array.
-        @param {Number} amt Number of elements that should be removed from
-          the array, starting at *idx*.
-        @param {Array} objects An array of zero or more objects that should be
-          inserted into the array at *idx*
-      */
-      replace: required(),
-
-      /**
-        Remove all elements from the array. This is useful if you
-        want to reuse an existing array without having to recreate it.
-
-        ```javascript
-        var colors = ["red", "green", "blue"];
-        color.length();   //  3
-        colors.clear();   //  []
-        colors.length();  //  0
-        ```
-
-        @method clear
-        @return {Ember.Array} An empty Array.
-      */
-      clear: function () {
-        var len = get(this, 'length');
-        if (len === 0) return this;
-        this.replace(0, len, EMPTY);
-        return this;
-      },
-
-      /**
-        This will use the primitive `replace()` method to insert an object at the
-        specified index.
-
-        ```javascript
-        var colors = ["red", "green", "blue"];
-        colors.insertAt(2, "yellow");  // ["red", "green", "yellow", "blue"]
-        colors.insertAt(5, "orange");  // Error: Index out of range
-        ```
-
-        @method insertAt
-        @param {Number} idx index of insert the object at.
-        @param {Object} object object to insert
-        @return {Ember.Array} receiver
-      */
-      insertAt: function(idx, object) {
-        if (idx > get(this, 'length')) throw new EmberError(OUT_OF_RANGE_EXCEPTION);
-        this.replace(idx, 0, [object]);
-        return this;
-      },
-
-      /**
-        Remove an object at the specified index using the `replace()` primitive
-        method. You can pass either a single index, or a start and a length.
-
-        If you pass a start and length that is beyond the
-        length this method will throw an `OUT_OF_RANGE_EXCEPTION`.
-
-        ```javascript
-        var colors = ["red", "green", "blue", "yellow", "orange"];
-        colors.removeAt(0);     // ["green", "blue", "yellow", "orange"]
-        colors.removeAt(2, 2);  // ["green", "blue"]
-        colors.removeAt(4, 2);  // Error: Index out of range
-        ```
-
-        @method removeAt
-        @param {Number} start index, start of range
-        @param {Number} len length of passing range
-        @return {Ember.Array} receiver
-      */
-      removeAt: function(start, len) {
-        if ('number' === typeof start) {
-
-          if ((start < 0) || (start >= get(this, 'length'))) {
-            throw new EmberError(OUT_OF_RANGE_EXCEPTION);
-          }
-
-          // fast case
-          if (len === undefined) len = 1;
-          this.replace(start, len, EMPTY);
-        }
-
-        return this;
-      },
-
-      /**
-        Push the object onto the end of the array. Works just like `push()` but it
-        is KVO-compliant.
-
-        ```javascript
-        var colors = ["red", "green"];
-        colors.pushObject("black");     // ["red", "green", "black"]
-        colors.pushObject(["yellow"]);  // ["red", "green", ["yellow"]]
-        ```
-
-        @method pushObject
-        @param {*} obj object to push
-        @return object same object passed as a param
-      */
-      pushObject: function(obj) {
-        this.insertAt(get(this, 'length'), obj);
-        return obj;
-      },
-
-      /**
-        Add the objects in the passed numerable to the end of the array. Defers
-        notifying observers of the change until all objects are added.
-
-        ```javascript
-        var colors = ["red"];
-        colors.pushObjects(["yellow", "orange"]);  // ["red", "yellow", "orange"]
-        ```
-
-        @method pushObjects
-        @param {Ember.Enumerable} objects the objects to add
-        @return {Ember.Array} receiver
-      */
-      pushObjects: function(objects) {
-        if (!(Enumerable.detect(objects) || isArray(objects))) {
-          throw new TypeError("Must pass Ember.Enumerable to Ember.MutableArray#pushObjects");
-        }
-        this.replace(get(this, 'length'), 0, objects);
-        return this;
-      },
-
-      /**
-        Pop object from array or nil if none are left. Works just like `pop()` but
-        it is KVO-compliant.
-
-        ```javascript
-        var colors = ["red", "green", "blue"];
-        colors.popObject();   // "blue"
-        console.log(colors);  // ["red", "green"]
-        ```
-
-        @method popObject
-        @return object
-      */
-      popObject: function() {
-        var len = get(this, 'length');
-        if (len === 0) return null;
-
-        var ret = this.objectAt(len-1);
-        this.removeAt(len-1, 1);
-        return ret;
-      },
-
-      /**
-        Shift an object from start of array or nil if none are left. Works just
-        like `shift()` but it is KVO-compliant.
-
-        ```javascript
-        var colors = ["red", "green", "blue"];
-        colors.shiftObject();  // "red"
-        console.log(colors);   // ["green", "blue"]
-        ```
-
-        @method shiftObject
-        @return object
-      */
-      shiftObject: function() {
-        if (get(this, 'length') === 0) return null;
-        var ret = this.objectAt(0);
-        this.removeAt(0);
-        return ret;
-      },
-
-      /**
-        Unshift an object to start of array. Works just like `unshift()` but it is
-        KVO-compliant.
-
-        ```javascript
-        var colors = ["red"];
-        colors.unshiftObject("yellow");    // ["yellow", "red"]
-        colors.unshiftObject(["black"]);   // [["black"], "yellow", "red"]
-        ```
-
-        @method unshiftObject
-        @param {*} obj object to unshift
-        @return object same object passed as a param
-      */
-      unshiftObject: function(obj) {
-        this.insertAt(0, obj);
-        return obj;
-      },
-
-      /**
-        Adds the named objects to the beginning of the array. Defers notifying
-        observers until all objects have been added.
-
-        ```javascript
-        var colors = ["red"];
-        colors.unshiftObjects(["black", "white"]);   // ["black", "white", "red"]
-        colors.unshiftObjects("yellow"); // Type Error: 'undefined' is not a function
-        ```
-
-        @method unshiftObjects
-        @param {Ember.Enumerable} objects the objects to add
-        @return {Ember.Array} receiver
-      */
-      unshiftObjects: function(objects) {
-        this.replace(0, 0, objects);
-        return this;
-      },
-
-      /**
-        Reverse objects in the array. Works just like `reverse()` but it is
-        KVO-compliant.
-
-        @method reverseObjects
-        @return {Ember.Array} receiver
-       */
-      reverseObjects: function() {
-        var len = get(this, 'length');
-        if (len === 0) return this;
-        var objects = this.toArray().reverse();
-        this.replace(0, len, objects);
-        return this;
-      },
-
-      /**
-        Replace all the the receiver's content with content of the argument.
-        If argument is an empty array receiver will be cleared.
-
-        ```javascript
-        var colors = ["red", "green", "blue"];
-        colors.setObjects(["black", "white"]);  // ["black", "white"]
-        colors.setObjects([]);                  // []
-        ```
-
-        @method setObjects
-        @param {Ember.Array} objects array whose content will be used for replacing
-            the content of the receiver
-        @return {Ember.Array} receiver with the new content
-       */
-      setObjects: function(objects) {
-        if (objects.length === 0) return this.clear();
-
-        var len = get(this, 'length');
-        this.replace(0, len, objects);
-        return this;
-      },
-
-      // ..........................................................
-      // IMPLEMENT Ember.MutableEnumerable
-      //
-
-      /**
-        Remove all occurances of an object in the array.
-
-        ```javascript
-        var cities = ["Chicago", "Berlin", "Lima", "Chicago"];
-        cities.removeObject("Chicago");  // ["Berlin", "Lima"]
-        cities.removeObject("Lima");     // ["Berlin"]
-        cities.removeObject("Tokyo")     // ["Berlin"]
-        ```
-
-        @method removeObject
-        @param {*} obj object to remove
-        @return {Ember.Array} receiver
-      */
-      removeObject: function(obj) {
-        var loc = get(this, 'length') || 0;
-        while(--loc >= 0) {
-          var curObject = this.objectAt(loc);
-          if (curObject === obj) this.removeAt(loc);
-        }
-        return this;
-      },
-
-      /**
-        Push the object onto the end of the array if it is not already
-        present in the array.
-
-        ```javascript
-        var cities = ["Chicago", "Berlin"];
-        cities.addObject("Lima");    // ["Chicago", "Berlin", "Lima"]
-        cities.addObject("Berlin");  // ["Chicago", "Berlin", "Lima"]
-        ```
-
-        @method addObject
-        @param {*} obj object to add, if not already present
-        @return {Ember.Array} receiver
-      */
-      addObject: function(obj) {
-        if (!this.contains(obj)) this.pushObject(obj);
-        return this;
-      }
-
-    });
-
-    __exports__["default"] = MutableArray;
-  });
-define("ember-runtime/mixins/mutable_enumerable", 
-  ["ember-metal/enumerable_utils","ember-runtime/mixins/enumerable","ember-metal/mixin","ember-metal/property_events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var EnumerableUtils = __dependency1__["default"];
-    var Enumerable = __dependency2__["default"];
-    var Mixin = __dependency3__.Mixin;
-    var required = __dependency3__.required;
-    var beginPropertyChanges = __dependency4__.beginPropertyChanges;
-    var endPropertyChanges = __dependency4__.endPropertyChanges;
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var forEach = EnumerableUtils.forEach;
-
-    /**
-      This mixin defines the API for modifying generic enumerables. These methods
-      can be applied to an object regardless of whether it is ordered or
-      unordered.
-
-      Note that an Enumerable can change even if it does not implement this mixin.
-      For example, a MappedEnumerable cannot be directly modified but if its
-      underlying enumerable changes, it will change also.
-
-      ## Adding Objects
-
-      To add an object to an enumerable, use the `addObject()` method. This
-      method will only add the object to the enumerable if the object is not
-      already present and is of a type supported by the enumerable.
-
-      ```javascript
-      set.addObject(contact);
-      ```
-
-      ## Removing Objects
-
-      To remove an object from an enumerable, use the `removeObject()` method. This
-      will only remove the object if it is present in the enumerable, otherwise
-      this method has no effect.
-
-      ```javascript
-      set.removeObject(contact);
-      ```
-
-      ## Implementing In Your Own Code
-
-      If you are implementing an object and want to support this API, just include
-      this mixin in your class and implement the required methods. In your unit
-      tests, be sure to apply the Ember.MutableEnumerableTests to your object.
-
-      @class MutableEnumerable
-      @namespace Ember
-      @uses Ember.Enumerable
-    */
-    var MutableEnumerable = Mixin.create(Enumerable, {
-
-      /**
-        __Required.__ You must implement this method to apply this mixin.
-
-        Attempts to add the passed object to the receiver if the object is not
-        already present in the collection. If the object is present, this method
-        has no effect.
-
-        If the passed object is of a type not supported by the receiver,
-        then this method should raise an exception.
-
-        @method addObject
-        @param {Object} object The object to add to the enumerable.
-        @return {Object} the passed object
-      */
-      addObject: required(Function),
-
-      /**
-        Adds each object in the passed enumerable to the receiver.
-
-        @method addObjects
-        @param {Ember.Enumerable} objects the objects to add.
-        @return {Object} receiver
-      */
-      addObjects: function(objects) {
-        beginPropertyChanges(this);
-        forEach(objects, function(obj) { this.addObject(obj); }, this);
-        endPropertyChanges(this);
-        return this;
-      },
-
-      /**
-        __Required.__ You must implement this method to apply this mixin.
-
-        Attempts to remove the passed object from the receiver collection if the
-        object is present in the collection. If the object is not present,
-        this method has no effect.
-
-        If the passed object is of a type not supported by the receiver,
-        then this method should raise an exception.
-
-        @method removeObject
-        @param {Object} object The object to remove from the enumerable.
-        @return {Object} the passed object
-      */
-      removeObject: required(Function),
-
-
-      /**
-        Removes each object in the passed enumerable from the receiver.
-
-        @method removeObjects
-        @param {Ember.Enumerable} objects the objects to remove
-        @return {Object} receiver
-      */
-      removeObjects: function(objects) {
-        beginPropertyChanges(this);
-        forEach(objects, function(obj) { this.removeObject(obj); }, this);
-        endPropertyChanges(this);
-        return this;
-      }
-    });
-
-    __exports__["default"] = MutableEnumerable;
-  });
-define("ember-runtime/mixins/observable", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/get_properties","ember-metal/set_properties","ember-metal/mixin","ember-metal/events","ember-metal/property_events","ember-metal/observer","ember-metal/computed","ember-metal/is_none","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-
-    var get = __dependency2__.get;
-    var getWithDefault = __dependency2__.getWithDefault;
-    var set = __dependency3__.set;
-    var apply = __dependency4__.apply;
-    var getProperties = __dependency5__["default"];
-    var setProperties = __dependency6__["default"];
-    var Mixin = __dependency7__.Mixin;
-    var hasListeners = __dependency8__.hasListeners;
-    var beginPropertyChanges = __dependency9__.beginPropertyChanges;
-    var propertyWillChange = __dependency9__.propertyWillChange;
-    var propertyDidChange = __dependency9__.propertyDidChange;
-    var endPropertyChanges = __dependency9__.endPropertyChanges;
-    var addObserver = __dependency10__.addObserver;
-    var addBeforeObserver = __dependency10__.addBeforeObserver;
-    var removeObserver = __dependency10__.removeObserver;
-    var observersFor = __dependency10__.observersFor;
-    var cacheFor = __dependency11__.cacheFor;
-    var isNone = __dependency12__.isNone;
-
-
-    var slice = Array.prototype.slice;
-    /**
-      ## Overview
-
-      This mixin provides properties and property observing functionality, core
-      features of the Ember object model.
-
-      Properties and observers allow one object to observe changes to a
-      property on another object. This is one of the fundamental ways that
-      models, controllers and views communicate with each other in an Ember
-      application.
-
-      Any object that has this mixin applied can be used in observer
-      operations. That includes `Ember.Object` and most objects you will
-      interact with as you write your Ember application.
-
-      Note that you will not generally apply this mixin to classes yourself,
-      but you will use the features provided by this module frequently, so it
-      is important to understand how to use it.
-
-      ## Using `get()` and `set()`
-
-      Because of Ember's support for bindings and observers, you will always
-      access properties using the get method, and set properties using the
-      set method. This allows the observing objects to be notified and
-      computed properties to be handled properly.
-
-      More documentation about `get` and `set` are below.
-
-      ## Observing Property Changes
-
-      You typically observe property changes simply by adding the `observes`
-      call to the end of your method declarations in classes that you write.
-      For example:
-
-      ```javascript
-      Ember.Object.extend({
-        valueObserver: function() {
-          // Executes whenever the "value" property changes
-        }.observes('value')
-      });
-      ```
-
-      Although this is the most common way to add an observer, this capability
-      is actually built into the `Ember.Object` class on top of two methods
-      defined in this mixin: `addObserver` and `removeObserver`. You can use
-      these two methods to add and remove observers yourself if you need to
-      do so at runtime.
-
-      To add an observer for a property, call:
-
-      ```javascript
-      object.addObserver('propertyKey', targetObject, targetAction)
-      ```
-
-      This will call the `targetAction` method on the `targetObject` whenever
-      the value of the `propertyKey` changes.
-
-      Note that if `propertyKey` is a computed property, the observer will be
-      called when any of the property dependencies are changed, even if the
-      resulting value of the computed property is unchanged. This is necessary
-      because computed properties are not computed until `get` is called.
-
-      @class Observable
-      @namespace Ember
-    */
-    var Observable = Mixin.create({
-
-      /**
-        Retrieves the value of a property from the object.
-
-        This method is usually similar to using `object[keyName]` or `object.keyName`,
-        however it supports both computed properties and the unknownProperty
-        handler.
-
-        Because `get` unifies the syntax for accessing all these kinds
-        of properties, it can make many refactorings easier, such as replacing a
-        simple property with a computed property, or vice versa.
-
-        ### Computed Properties
-
-        Computed properties are methods defined with the `property` modifier
-        declared at the end, such as:
-
-        ```javascript
-        fullName: function() {
-          return this.get('firstName') + ' ' + this.get('lastName');
-        }.property('firstName', 'lastName')
-        ```
-
-        When you call `get` on a computed property, the function will be
-        called and the return value will be returned instead of the function
-        itself.
-
-        ### Unknown Properties
-
-        Likewise, if you try to call `get` on a property whose value is
-        `undefined`, the `unknownProperty()` method will be called on the object.
-        If this method returns any value other than `undefined`, it will be returned
-        instead. This allows you to implement "virtual" properties that are
-        not defined upfront.
-
-        @method get
-        @param {String} keyName The property to retrieve
-        @return {Object} The property value or undefined.
-      */
-      get: function(keyName) {
-        return get(this, keyName);
-      },
-
-      /**
-        To get multiple properties at once, call `getProperties`
-        with a list of strings or an array:
-
-        ```javascript
-        record.getProperties('firstName', 'lastName', 'zipCode');  // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
-        ```
-
-        is equivalent to:
-
-        ```javascript
-        record.getProperties(['firstName', 'lastName', 'zipCode']);  // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
-        ```
-
-        @method getProperties
-        @param {String...|Array} list of keys to get
-        @return {Hash}
-      */
-      getProperties: function() {
-        return apply(null, getProperties, [this].concat(slice.call(arguments)));
-      },
-
-      /**
-        Sets the provided key or path to the value.
-
-        This method is generally very similar to calling `object[key] = value` or
-        `object.key = value`, except that it provides support for computed
-        properties, the `setUnknownProperty()` method and property observers.
-
-        ### Computed Properties
-
-        If you try to set a value on a key that has a computed property handler
-        defined (see the `get()` method for an example), then `set()` will call
-        that method, passing both the value and key instead of simply changing
-        the value itself. This is useful for those times when you need to
-        implement a property that is composed of one or more member
-        properties.
-
-        ### Unknown Properties
-
-        If you try to set a value on a key that is undefined in the target
-        object, then the `setUnknownProperty()` handler will be called instead. This
-        gives you an opportunity to implement complex "virtual" properties that
-        are not predefined on the object. If `setUnknownProperty()` returns
-        undefined, then `set()` will simply set the value on the object.
-
-        ### Property Observers
-
-        In addition to changing the property, `set()` will also register a property
-        change with the object. Unless you have placed this call inside of a
-        `beginPropertyChanges()` and `endPropertyChanges(),` any "local" observers
-        (i.e. observer methods declared on the same object), will be called
-        immediately. Any "remote" observers (i.e. observer methods declared on
-        another object) will be placed in a queue and called at a later time in a
-        coalesced manner.
-
-        ### Chaining
-
-        In addition to property changes, `set()` returns the value of the object
-        itself so you can do chaining like this:
-
-        ```javascript
-        record.set('firstName', 'Charles').set('lastName', 'Jolley');
-        ```
-
-        @method set
-        @param {String} keyName The property to set
-        @param {Object} value The value to set or `null`.
-        @return {Ember.Observable}
-      */
-      set: function(keyName, value) {
-        set(this, keyName, value);
-        return this;
-      },
-
-
-      /**
-        Sets a list of properties at once. These properties are set inside
-        a single `beginPropertyChanges` and `endPropertyChanges` batch, so
-        observers will be buffered.
-
-        ```javascript
-        record.setProperties({ firstName: 'Charles', lastName: 'Jolley' });
-        ```
-
-        @method setProperties
-        @param {Hash} hash the hash of keys and values to set
-        @return {Ember.Observable}
-      */
-      setProperties: function(hash) {
-        return setProperties(this, hash);
-      },
-
-      /**
-        Begins a grouping of property changes.
-
-        You can use this method to group property changes so that notifications
-        will not be sent until the changes are finished. If you plan to make a
-        large number of changes to an object at one time, you should call this
-        method at the beginning of the changes to begin deferring change
-        notifications. When you are done making changes, call
-        `endPropertyChanges()` to deliver the deferred change notifications and end
-        deferring.
-
-        @method beginPropertyChanges
-        @return {Ember.Observable}
-      */
-      beginPropertyChanges: function() {
-        beginPropertyChanges();
-        return this;
-      },
-
-      /**
-        Ends a grouping of property changes.
-
-        You can use this method to group property changes so that notifications
-        will not be sent until the changes are finished. If you plan to make a
-        large number of changes to an object at one time, you should call
-        `beginPropertyChanges()` at the beginning of the changes to defer change
-        notifications. When you are done making changes, call this method to
-        deliver the deferred change notifications and end deferring.
-
-        @method endPropertyChanges
-        @return {Ember.Observable}
-      */
-      endPropertyChanges: function() {
-        endPropertyChanges();
-        return this;
-      },
-
-      /**
-        Notify the observer system that a property is about to change.
-
-        Sometimes you need to change a value directly or indirectly without
-        actually calling `get()` or `set()` on it. In this case, you can use this
-        method and `propertyDidChange()` instead. Calling these two methods
-        together will notify all observers that the property has potentially
-        changed value.
-
-        Note that you must always call `propertyWillChange` and `propertyDidChange`
-        as a pair. If you do not, it may get the property change groups out of
-        order and cause notifications to be delivered more often than you would
-        like.
-
-        @method propertyWillChange
-        @param {String} keyName The property key that is about to change.
-        @return {Ember.Observable}
-      */
-      propertyWillChange: function(keyName) {
-        propertyWillChange(this, keyName);
-        return this;
-      },
-
-      /**
-        Notify the observer system that a property has just changed.
-
-        Sometimes you need to change a value directly or indirectly without
-        actually calling `get()` or `set()` on it. In this case, you can use this
-        method and `propertyWillChange()` instead. Calling these two methods
-        together will notify all observers that the property has potentially
-        changed value.
-
-        Note that you must always call `propertyWillChange` and `propertyDidChange`
-        as a pair. If you do not, it may get the property change groups out of
-        order and cause notifications to be delivered more often than you would
-        like.
-
-        @method propertyDidChange
-        @param {String} keyName The property key that has just changed.
-        @return {Ember.Observable}
-      */
-      propertyDidChange: function(keyName) {
-        propertyDidChange(this, keyName);
-        return this;
-      },
-
-      /**
-        Convenience method to call `propertyWillChange` and `propertyDidChange` in
-        succession.
-
-        @method notifyPropertyChange
-        @param {String} keyName The property key to be notified about.
-        @return {Ember.Observable}
-      */
-      notifyPropertyChange: function(keyName) {
-        this.propertyWillChange(keyName);
-        this.propertyDidChange(keyName);
-        return this;
-      },
-
-      addBeforeObserver: function(key, target, method) {
-        addBeforeObserver(this, key, target, method);
-      },
-
-      /**
-        Adds an observer on a property.
-
-        This is the core method used to register an observer for a property.
-
-        Once you call this method, any time the key's value is set, your observer
-        will be notified. Note that the observers are triggered any time the
-        value is set, regardless of whether it has actually changed. Your
-        observer should be prepared to handle that.
-
-        You can also pass an optional context parameter to this method. The
-        context will be passed to your observer method whenever it is triggered.
-        Note that if you add the same target/method pair on a key multiple times
-        with different context parameters, your observer will only be called once
-        with the last context you passed.
-
-        ### Observer Methods
-
-        Observer methods you pass should generally have the following signature if
-        you do not pass a `context` parameter:
-
-        ```javascript
-        fooDidChange: function(sender, key, value, rev) { };
-        ```
-
-        The sender is the object that changed. The key is the property that
-        changes. The value property is currently reserved and unused. The rev
-        is the last property revision of the object when it changed, which you can
-        use to detect if the key value has really changed or not.
-
-        If you pass a `context` parameter, the context will be passed before the
-        revision like so:
-
-        ```javascript
-        fooDidChange: function(sender, key, value, context, rev) { };
-        ```
-
-        Usually you will not need the value, context or revision parameters at
-        the end. In this case, it is common to write observer methods that take
-        only a sender and key value as parameters or, if you aren't interested in
-        any of these values, to write an observer that has no parameters at all.
-
-        @method addObserver
-        @param {String} key The key to observer
-        @param {Object} target The target object to invoke
-        @param {String|Function} method The method to invoke.
-        @return {Ember.Object} self
-      */
-      addObserver: function(key, target, method) {
-        addObserver(this, key, target, method);
-      },
-
-      /**
-        Remove an observer you have previously registered on this object. Pass
-        the same key, target, and method you passed to `addObserver()` and your
-        target will no longer receive notifications.
-
-        @method removeObserver
-        @param {String} key The key to observer
-        @param {Object} target The target object to invoke
-        @param {String|Function} method The method to invoke.
-        @return {Ember.Observable} receiver
-      */
-      removeObserver: function(key, target, method) {
-        removeObserver(this, key, target, method);
-      },
-
-      /**
-        Returns `true` if the object currently has observers registered for a
-        particular key. You can use this method to potentially defer performing
-        an expensive action until someone begins observing a particular property
-        on the object.
-
-        @method hasObserverFor
-        @param {String} key Key to check
-        @return {Boolean}
-      */
-      hasObserverFor: function(key) {
-        return hasListeners(this, key+':change');
-      },
-
-      /**
-        Retrieves the value of a property, or a default value in the case that the
-        property returns `undefined`.
-
-        ```javascript
-        person.getWithDefault('lastName', 'Doe');
-        ```
-
-        @method getWithDefault
-        @param {String} keyName The name of the property to retrieve
-        @param {Object} defaultValue The value to return if the property value is undefined
-        @return {Object} The property value or the defaultValue.
-      */
-      getWithDefault: function(keyName, defaultValue) {
-        return getWithDefault(this, keyName, defaultValue);
-      },
-
-      /**
-        Set the value of a property to the current value plus some amount.
-
-        ```javascript
-        person.incrementProperty('age');
-        team.incrementProperty('score', 2);
-        ```
-
-        @method incrementProperty
-        @param {String} keyName The name of the property to increment
-        @param {Number} increment The amount to increment by. Defaults to 1
-        @return {Number} The new property value
-      */
-      incrementProperty: function(keyName, increment) {
-        if (isNone(increment)) { increment = 1; }
-        Ember.assert("Must pass a numeric value to incrementProperty", (!isNaN(parseFloat(increment)) && isFinite(increment)));
-        set(this, keyName, (get(this, keyName) || 0) + increment);
-        return get(this, keyName);
-      },
-
-      /**
-        Set the value of a property to the current value minus some amount.
-
-        ```javascript
-        player.decrementProperty('lives');
-        orc.decrementProperty('health', 5);
-        ```
-
-        @method decrementProperty
-        @param {String} keyName The name of the property to decrement
-        @param {Number} decrement The amount to decrement by. Defaults to 1
-        @return {Number} The new property value
-      */
-      decrementProperty: function(keyName, decrement) {
-        if (isNone(decrement)) { decrement = 1; }
-        Ember.assert("Must pass a numeric value to decrementProperty", (!isNaN(parseFloat(decrement)) && isFinite(decrement)));
-        set(this, keyName, (get(this, keyName) || 0) - decrement);
-        return get(this, keyName);
-      },
-
-      /**
-        Set the value of a boolean property to the opposite of it's
-        current value.
-
-        ```javascript
-        starship.toggleProperty('warpDriveEngaged');
-        ```
-
-        @method toggleProperty
-        @param {String} keyName The name of the property to toggle
-        @return {Object} The new property value
-      */
-      toggleProperty: function(keyName) {
-        set(this, keyName, !get(this, keyName));
-        return get(this, keyName);
-      },
-
-      /**
-        Returns the cached value of a computed property, if it exists.
-        This allows you to inspect the value of a computed property
-        without accidentally invoking it if it is intended to be
-        generated lazily.
-
-        @method cacheFor
-        @param {String} keyName
-        @return {Object} The cached value of the computed property, if any
-      */
-      cacheFor: function(keyName) {
-        return cacheFor(this, keyName);
-      },
-
-      // intended for debugging purposes
-      observersForKey: function(keyName) {
-        return observersFor(this, keyName);
-      }
-    });
-
-    __exports__["default"] = Observable;
-  });
-define("ember-runtime/mixins/promise_proxy", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/mixin","ember-metal/error","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var computed = __dependency3__.computed;
-    var Mixin = __dependency4__.Mixin;
-    var EmberError = __dependency5__["default"];
-
-    var not = computed.not, or = computed.or;
-
-    /**
-      @module ember
-      @submodule ember-runtime
-     */
-
-    function tap(proxy, promise) {
-      set(proxy, 'isFulfilled', false);
-      set(proxy, 'isRejected', false);
-
-      return promise.then(function(value) {
-        set(proxy, 'isFulfilled', true);
-        set(proxy, 'content', value);
-        return value;
-      }, function(reason) {
-        set(proxy, 'isRejected', true);
-        set(proxy, 'reason', reason);
-        throw reason;
-      }, "Ember: PromiseProxy");
-    }
-
-    /**
-      A low level mixin making ObjectProxy, ObjectController or ArrayController's promise aware.
-
-      ```javascript
-      var ObjectPromiseController = Ember.ObjectController.extend(Ember.PromiseProxyMixin);
-
-      var controller = ObjectPromiseController.create({
-        promise: $.getJSON('/some/remote/data.json')
-      });
-
-      controller.then(function(json){
-         // the json
-      }, function(reason) {
-         // the reason why you have no json
-      });
-      ```
-
-      the controller has bindable attributes which
-      track the promises life cycle
-
-      ```javascript
-      controller.get('isPending')   //=> true
-      controller.get('isSettled')  //=> false
-      controller.get('isRejected')  //=> false
-      controller.get('isFulfilled') //=> false
-      ```
-
-      When the the $.getJSON completes, and the promise is fulfilled
-      with json, the life cycle attributes will update accordingly.
-
-      ```javascript
-      controller.get('isPending')   //=> false
-      controller.get('isSettled')   //=> true
-      controller.get('isRejected')  //=> false
-      controller.get('isFulfilled') //=> true
-      ```
-
-      As the controller is an ObjectController, and the json now its content,
-      all the json properties will be available directly from the controller.
-
-      ```javascript
-      // Assuming the following json:
-      {
-        firstName: 'Stefan',
-        lastName: 'Penner'
-      }
-
-      // both properties will accessible on the controller
-      controller.get('firstName') //=> 'Stefan'
-      controller.get('lastName')  //=> 'Penner'
-      ```
-
-      If the controller is backing a template, the attributes are
-      bindable from within that template
-
-      ```handlebars
-      {{#if isPending}}
-        loading...
-      {{else}}
-        firstName: {{firstName}}
-        lastName: {{lastName}}
-      {{/if}}
-      ```
-      @class Ember.PromiseProxyMixin
-    */
-    var PromiseProxyMixin = Mixin.create({
-      /**
-        If the proxied promise is rejected this will contain the reason
-        provided.
-
-        @property reason
-        @default null
-      */
-      reason:    null,
-
-      /**
-        Once the proxied promise has settled this will become `false`.
-
-        @property isPending
-        @default true
-      */
-      isPending:  not('isSettled').readOnly(),
-
-      /**
-        Once the proxied promise has settled this will become `true`.
-
-        @property isSettled
-        @default false
-      */
-      isSettled:  or('isRejected', 'isFulfilled').readOnly(),
-
-      /**
-        Will become `true` if the proxied promise is rejected.
-
-        @property isRejected
-        @default false
-      */
-      isRejected:  false,
-
-      /**
-        Will become `true` if the proxied promise is fulfilled.
-
-        @property isFullfilled
-        @default false
-      */
-      isFulfilled: false,
-
-      /**
-        The promise whose fulfillment value is being proxied by this object.
-
-        This property must be specified upon creation, and should not be
-        changed once created.
-
-        Example:
-
-        ```javascript
-        Ember.ObjectController.extend(Ember.PromiseProxyMixin).create({
-          promise: <thenable>
-        });
-        ```
-
-        @property promise
-      */
-      promise: computed(function(key, promise) {
-        if (arguments.length === 2) {
-          return tap(this, promise);
-        } else {
-          throw new EmberError("PromiseProxy's promise must be set");
-        }
-      }),
-
-      /**
-        An alias to the proxied promise's `then`.
-
-        See RSVP.Promise.then.
-
-        @method then
-        @param {Function} callback
-        @return {RSVP.Promise}
-      */
-      then: promiseAlias('then'),
-
-      /**
-        An alias to the proxied promise's `catch`.
-
-        See RSVP.Promise.catch.
-
-        @method catch
-        @param {Function} callback
-        @return {RSVP.Promise}
-      */
-      'catch': promiseAlias('catch'),
-
-      /**
-        An alias to the proxied promise's `finally`.
-
-        See RSVP.Promise.finally.
-
-        @method finally
-        @param {Function} callback
-        @return {RSVP.Promise}
-      */
-      'finally': promiseAlias('finally')
-
-    });
-
-    function promiseAlias(name) {
-      return function () {
-        var promise = get(this, 'promise');
-        return promise[name].apply(promise, arguments);
-      };
-    }
-
-    __exports__["default"] = PromiseProxyMixin;
-  });
-define("ember-runtime/mixins/sortable", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/mutable_enumerable","ember-runtime/compare","ember-metal/observer","ember-metal/computed","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.A
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var EnumerableUtils = __dependency4__["default"];
-    var Mixin = __dependency5__.Mixin;
-    var MutableEnumerable = __dependency6__["default"];
-    var compare = __dependency7__["default"];
-    var addObserver = __dependency8__.addObserver;
-    var removeObserver = __dependency8__.removeObserver;
-    var computed = __dependency9__.computed;
-    var beforeObserver = __dependency5__.beforeObserver;
-    var observer = __dependency5__.observer;
-    //ES6TODO: should we access these directly from their package or from how thier exposed in ember-metal?
-
-    var forEach = EnumerableUtils.forEach;
-
-    /**
-      `Ember.SortableMixin` provides a standard interface for array proxies
-      to specify a sort order and maintain this sorting when objects are added,
-      removed, or updated without changing the implicit order of their underlying
-      content array:
-
-      ```javascript
-      songs = [
-        {trackNumber: 4, title: 'Ob-La-Di, Ob-La-Da'},
-        {trackNumber: 2, title: 'Back in the U.S.S.R.'},
-        {trackNumber: 3, title: 'Glass Onion'},
-      ];
-
-      songsController = Ember.ArrayController.create({
-        content: songs,
-        sortProperties: ['trackNumber'],
-        sortAscending: true
-      });
-
-      songsController.get('firstObject');  // {trackNumber: 2, title: 'Back in the U.S.S.R.'}
-
-      songsController.addObject({trackNumber: 1, title: 'Dear Prudence'});
-      songsController.get('firstObject');  // {trackNumber: 1, title: 'Dear Prudence'}
-      ```
-
-      If you add or remove the properties to sort by or change the sort direction the content
-      sort order will be automatically updated.
-
-      ```javascript
-      songsController.set('sortProperties', ['title']);
-      songsController.get('firstObject'); // {trackNumber: 2, title: 'Back in the U.S.S.R.'}
-
-      songsController.toggleProperty('sortAscending');
-      songsController.get('firstObject'); // {trackNumber: 4, title: 'Ob-La-Di, Ob-La-Da'}
-      ```
-
-      SortableMixin works by sorting the arrangedContent array, which is the array that
-      arrayProxy displays. Due to the fact that the underlying 'content' array is not changed, that
-      array will not display the sorted list:
-
-       ```javascript
-      songsController.get('content').get('firstObject'); // Returns the unsorted original content
-      songsController.get('firstObject'); // Returns the sorted content.
-      ```
-
-      Although the sorted content can also be accessed through the arrangedContent property,
-      it is preferable to use the proxied class and not the arrangedContent array directly.
-
-      @class SortableMixin
-      @namespace Ember
-      @uses Ember.MutableEnumerable
-    */
-    var SortableMixin = Mixin.create(MutableEnumerable, {
-
-      /**
-        Specifies which properties dictate the arrangedContent's sort order.
-
-        When specifying multiple properties the sorting will use properties
-        from the `sortProperties` array prioritized from first to last.
-
-        @property {Array} sortProperties
-      */
-      sortProperties: null,
-
-      /**
-        Specifies the arrangedContent's sort direction.
-        Sorts the content in ascending order by default. Set to `false` to
-        use descending order.
-
-        @property {Boolean} sortAscending
-        @default true
-      */
-      sortAscending: true,
-
-      /**
-        The function used to compare two values. You can override this if you
-        want to do custom comparisons. Functions must be of the type expected by
-        Array#sort, i.e.
-          return 0 if the two parameters are equal,
-          return a negative value if the first parameter is smaller than the second or
-          return a positive value otherwise:
-
-        ```javascript
-        function(x,y) { // These are assumed to be integers
-          if (x === y)
-            return 0;
-          return x < y ? -1 : 1;
-        }
-        ```
-
-        @property sortFunction
-        @type {Function}
-        @default Ember.compare
-      */
-      sortFunction: compare,
-
-      orderBy: function(item1, item2) {
-        var result = 0,
-            sortProperties = get(this, 'sortProperties'),
-            sortAscending = get(this, 'sortAscending'),
-            sortFunction = get(this, 'sortFunction');
-
-        Ember.assert("you need to define `sortProperties`", !!sortProperties);
-
-        forEach(sortProperties, function(propertyName) {
-          if (result === 0) {
-            result = sortFunction(get(item1, propertyName), get(item2, propertyName));
-            if ((result !== 0) && !sortAscending) {
-              result = (-1) * result;
-            }
-          }
-        });
-
-        return result;
-      },
-
-      destroy: function() {
-        var content = get(this, 'content'),
-            sortProperties = get(this, 'sortProperties');
-
-        if (content && sortProperties) {
-          forEach(content, function(item) {
-            forEach(sortProperties, function(sortProperty) {
-              removeObserver(item, sortProperty, this, 'contentItemSortPropertyDidChange');
-            }, this);
-          }, this);
-        }
-
-        return this._super();
-      },
-
-      isSorted: computed.bool('sortProperties'),
-
-      /**
-        Overrides the default arrangedContent from arrayProxy in order to sort by sortFunction.
-        Also sets up observers for each sortProperty on each item in the content Array.
-
-        @property arrangedContent
-      */
-
-      arrangedContent: computed('content', 'sortProperties.@each', function(key, value) {
-        var content = get(this, 'content'),
-            isSorted = get(this, 'isSorted'),
-            sortProperties = get(this, 'sortProperties'),
-            self = this;
-
-        if (content && isSorted) {
-          content = content.slice();
-          content.sort(function(item1, item2) {
-            return self.orderBy(item1, item2);
-          });
-          forEach(content, function(item) {
-            forEach(sortProperties, function(sortProperty) {
-              addObserver(item, sortProperty, this, 'contentItemSortPropertyDidChange');
-            }, this);
-          }, this);
-          return Ember.A(content);
-        }
-
-        return content;
-      }),
-
-      _contentWillChange: beforeObserver('content', function() {
-        var content = get(this, 'content'),
-            sortProperties = get(this, 'sortProperties');
-
-        if (content && sortProperties) {
-          forEach(content, function(item) {
-            forEach(sortProperties, function(sortProperty) {
-              removeObserver(item, sortProperty, this, 'contentItemSortPropertyDidChange');
-            }, this);
-          }, this);
-        }
-
-        this._super();
-      }),
-
-      sortAscendingWillChange: beforeObserver('sortAscending', function() {
-        this._lastSortAscending = get(this, 'sortAscending');
-      }),
-
-      sortAscendingDidChange: observer('sortAscending', function() {
-        if (get(this, 'sortAscending') !== this._lastSortAscending) {
-          var arrangedContent = get(this, 'arrangedContent');
-          arrangedContent.reverseObjects();
-        }
-      }),
-
-      contentArrayWillChange: function(array, idx, removedCount, addedCount) {
-        var isSorted = get(this, 'isSorted');
-
-        if (isSorted) {
-          var arrangedContent = get(this, 'arrangedContent');
-          var removedObjects = array.slice(idx, idx+removedCount);
-          var sortProperties = get(this, 'sortProperties');
-
-          forEach(removedObjects, function(item) {
-            arrangedContent.removeObject(item);
-
-            forEach(sortProperties, function(sortProperty) {
-              removeObserver(item, sortProperty, this, 'contentItemSortPropertyDidChange');
-            }, this);
-          }, this);
-        }
-
-        return this._super(array, idx, removedCount, addedCount);
-      },
-
-      contentArrayDidChange: function(array, idx, removedCount, addedCount) {
-        var isSorted = get(this, 'isSorted'),
-            sortProperties = get(this, 'sortProperties');
-
-        if (isSorted) {
-          var addedObjects = array.slice(idx, idx+addedCount);
-
-          forEach(addedObjects, function(item) {
-            this.insertItemSorted(item);
-
-            forEach(sortProperties, function(sortProperty) {
-              addObserver(item, sortProperty, this, 'contentItemSortPropertyDidChange');
-            }, this);
-          }, this);
-        }
-
-        return this._super(array, idx, removedCount, addedCount);
-      },
-
-      insertItemSorted: function(item) {
-        var arrangedContent = get(this, 'arrangedContent');
-        var length = get(arrangedContent, 'length');
-
-        var idx = this._binarySearch(item, 0, length);
-        arrangedContent.insertAt(idx, item);
-      },
-
-      contentItemSortPropertyDidChange: function(item) {
-        var arrangedContent = get(this, 'arrangedContent'),
-            oldIndex = arrangedContent.indexOf(item),
-            leftItem = arrangedContent.objectAt(oldIndex - 1),
-            rightItem = arrangedContent.objectAt(oldIndex + 1),
-            leftResult = leftItem && this.orderBy(item, leftItem),
-            rightResult = rightItem && this.orderBy(item, rightItem);
-
-        if (leftResult < 0 || rightResult > 0) {
-          arrangedContent.removeObject(item);
-          this.insertItemSorted(item);
-        }
-      },
-
-      _binarySearch: function(item, low, high) {
-        var mid, midItem, res, arrangedContent;
-
-        if (low === high) {
-          return low;
-        }
-
-        arrangedContent = get(this, 'arrangedContent');
-
-        mid = low + Math.floor((high - low) / 2);
-        midItem = arrangedContent.objectAt(mid);
-
-        res = this.orderBy(midItem, item);
-
-        if (res < 0) {
-          return this._binarySearch(item, mid+1, high);
-        } else if (res > 0) {
-          return this._binarySearch(item, low, mid);
-        }
-
-        return mid;
-      }
-    });
-
-    __exports__["default"] = SortableMixin;
-  });
-define("ember-runtime/mixins/target_action_support", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/mixin","ember-metal/computed","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.lookup, Ember.assert
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var typeOf = __dependency4__.typeOf;
-    var Mixin = __dependency5__.Mixin;
-    var computed = __dependency6__.computed;
-
-    /**
-    `Ember.TargetActionSupport` is a mixin that can be included in a class
-    to add a `triggerAction` method with semantics similar to the Handlebars
-    `{{action}}` helper. In normal Ember usage, the `{{action}}` helper is
-    usually the best choice. This mixin is most often useful when you are
-    doing more complex event handling in View objects.
-
-    See also `Ember.ViewTargetActionSupport`, which has
-    view-aware defaults for target and actionContext.
-
-    @class TargetActionSupport
-    @namespace Ember
-    @extends Ember.Mixin
-    */
-    var TargetActionSupport = Mixin.create({
-      target: null,
-      action: null,
-      actionContext: null,
-
-      targetObject: computed(function() {
-        var target = get(this, 'target');
-
-        if (typeOf(target) === "string") {
-          var value = get(this, target);
-          if (value === undefined) { value = get(Ember.lookup, target); }
-          return value;
-        } else {
-          return target;
-        }
-      }).property('target'),
-
-      actionContextObject: computed(function() {
-        var actionContext = get(this, 'actionContext');
-
-        if (typeOf(actionContext) === "string") {
-          var value = get(this, actionContext);
-          if (value === undefined) { value = get(Ember.lookup, actionContext); }
-          return value;
-        } else {
-          return actionContext;
-        }
-      }).property('actionContext'),
-
-      /**
-      Send an `action` with an `actionContext` to a `target`. The action, actionContext
-      and target will be retrieved from properties of the object. For example:
-
-      ```javascript
-      App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
-        target: Ember.computed.alias('controller'),
-        action: 'save',
-        actionContext: Ember.computed.alias('context'),
-        click: function() {
-          this.triggerAction(); // Sends the `save` action, along with the current context
-                                // to the current controller
-        }
-      });
-      ```
-
-      The `target`, `action`, and `actionContext` can be provided as properties of
-      an optional object argument to `triggerAction` as well.
-
-      ```javascript
-      App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
-        click: function() {
-          this.triggerAction({
-            action: 'save',
-            target: this.get('controller'),
-            actionContext: this.get('context'),
-          }); // Sends the `save` action, along with the current context
-              // to the current controller
-        }
-      });
-      ```
-
-      The `actionContext` defaults to the object you mixing `TargetActionSupport` into.
-      But `target` and `action` must be specified either as properties or with the argument
-      to `triggerAction`, or a combination:
-
-      ```javascript
-      App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
-        target: Ember.computed.alias('controller'),
-        click: function() {
-          this.triggerAction({
-            action: 'save'
-          }); // Sends the `save` action, along with a reference to `this`,
-              // to the current controller
-        }
-      });
-      ```
-
-      @method triggerAction
-      @param opts {Hash} (optional, with the optional keys action, target and/or actionContext)
-      @return {Boolean} true if the action was sent successfully and did not return false
-      */
-      triggerAction: function(opts) {
-        opts = opts || {};
-        var action = opts.action || get(this, 'action'),
-            target = opts.target || get(this, 'targetObject'),
-            actionContext = opts.actionContext;
-
-        function args(options, actionName) {
-          var ret = [];
-          if (actionName) { ret.push(actionName); }
-
-          return ret.concat(options);
-        }
-
-        if (typeof actionContext === 'undefined') {
-          actionContext = get(this, 'actionContextObject') || this;
-        }
-
-        if (target && action) {
-          var ret;
-
-          if (target.send) {
-            ret = target.send.apply(target, args(actionContext, action));
-          } else {
-            Ember.assert("The action '" + action + "' did not exist on " + target, typeof target[action] === 'function');
-            ret = target[action].apply(target, args(actionContext));
-          }
-
-          if (ret !== false) ret = true;
-
-          return ret;
-        } else {
-          return false;
-        }
-      }
-    });
-
-    __exports__["default"] = TargetActionSupport;
-  });
-define("ember-runtime/system/application", 
-  ["ember-runtime/system/namespace","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Namespace = __dependency1__["default"];
-
-    var Application = Namespace.extend();
-    __exports__["default"] = Application;
-  });
-define("ember-runtime/system/array_proxy", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/property_events","ember-metal/error","ember-runtime/system/object","ember-runtime/mixins/mutable_array","ember-runtime/mixins/enumerable","ember-runtime/system/string","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.K, Ember.assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var isArray = __dependency4__.isArray;
-    var apply = __dependency4__.apply;
-    var computed = __dependency5__.computed;
-    var beforeObserver = __dependency6__.beforeObserver;
-    var observer = __dependency6__.observer;
-    var beginPropertyChanges = __dependency7__.beginPropertyChanges;
-    var endPropertyChanges = __dependency7__.endPropertyChanges;
-    var EmberError = __dependency8__["default"];
-    var EmberObject = __dependency9__["default"];var MutableArray = __dependency10__["default"];var Enumerable = __dependency11__["default"];
-    var fmt = __dependency12__.fmt;
-
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var OUT_OF_RANGE_EXCEPTION = "Index out of range";
-    var EMPTY = [];
-    var alias = computed.alias;
-    var K = Ember.K;
-
-    /**
-      An ArrayProxy wraps any other object that implements `Ember.Array` and/or
-      `Ember.MutableArray,` forwarding all requests. This makes it very useful for
-      a number of binding use cases or other cases where being able to swap
-      out the underlying array is useful.
-
-      A simple example of usage:
-
-      ```javascript
-      var pets = ['dog', 'cat', 'fish'];
-      var ap = Ember.ArrayProxy.create({ content: Ember.A(pets) });
-
-      ap.get('firstObject');                        // 'dog'
-      ap.set('content', ['amoeba', 'paramecium']);
-      ap.get('firstObject');                        // 'amoeba'
-      ```
-
-      This class can also be useful as a layer to transform the contents of
-      an array, as they are accessed. This can be done by overriding
-      `objectAtContent`:
-
-      ```javascript
-      var pets = ['dog', 'cat', 'fish'];
-      var ap = Ember.ArrayProxy.create({
-          content: Ember.A(pets),
-          objectAtContent: function(idx) {
-              return this.get('content').objectAt(idx).toUpperCase();
-          }
-      });
-
-      ap.get('firstObject'); // . 'DOG'
-      ```
-
-      @class ArrayProxy
-      @namespace Ember
-      @extends Ember.Object
-      @uses Ember.MutableArray
-    */
-    var ArrayProxy = EmberObject.extend(MutableArray, {
-
-      /**
-        The content array. Must be an object that implements `Ember.Array` and/or
-        `Ember.MutableArray.`
-
-        @property content
-        @type Ember.Array
-      */
-      content: null,
-
-      /**
-       The array that the proxy pretends to be. In the default `ArrayProxy`
-       implementation, this and `content` are the same. Subclasses of `ArrayProxy`
-       can override this property to provide things like sorting and filtering.
-
-       @property arrangedContent
-      */
-      arrangedContent: alias('content'),
-
-      /**
-        Should actually retrieve the object at the specified index from the
-        content. You can override this method in subclasses to transform the
-        content item to something new.
-
-        This method will only be called if content is non-`null`.
-
-        @method objectAtContent
-        @param {Number} idx The index to retrieve.
-        @return {Object} the value or undefined if none found
-      */
-      objectAtContent: function(idx) {
-        return get(this, 'arrangedContent').objectAt(idx);
-      },
-
-      /**
-        Should actually replace the specified objects on the content array.
-        You can override this method in subclasses to transform the content item
-        into something new.
-
-        This method will only be called if content is non-`null`.
-
-        @method replaceContent
-        @param {Number} idx The starting index
-        @param {Number} amt The number of items to remove from the content.
-        @param {Array} objects Optional array of objects to insert or null if no
-          objects.
-        @return {void}
-      */
-      replaceContent: function(idx, amt, objects) {
-        get(this, 'content').replace(idx, amt, objects);
-      },
-
-      /**
-        Invoked when the content property is about to change. Notifies observers that the
-        entire array content will change.
-
-        @private
-        @method _contentWillChange
-      */
-      _contentWillChange: beforeObserver('content', function() {
-        this._teardownContent();
-      }),
-
-      _teardownContent: function() {
-        var content = get(this, 'content');
-
-        if (content) {
-          content.removeArrayObserver(this, {
-            willChange: 'contentArrayWillChange',
-            didChange: 'contentArrayDidChange'
-          });
-        }
-      },
-
-      contentArrayWillChange: K,
-      contentArrayDidChange: K,
-
-      /**
-        Invoked when the content property changes. Notifies observers that the
-        entire array content has changed.
-
-        @private
-        @method _contentDidChange
-      */
-      _contentDidChange: observer('content', function() {
-        var content = get(this, 'content');
-
-        Ember.assert("Can't set ArrayProxy's content to itself", content !== this);
-
-        this._setupContent();
-      }),
-
-      _setupContent: function() {
-        var content = get(this, 'content');
-
-        if (content) {
-          Ember.assert(fmt('ArrayProxy expects an Array or ' +
-            'Ember.ArrayProxy, but you passed %@', [typeof content]),
-            isArray(content) || content.isDestroyed);
-
-          content.addArrayObserver(this, {
-            willChange: 'contentArrayWillChange',
-            didChange: 'contentArrayDidChange'
-          });
-        }
-      },
-
-      _arrangedContentWillChange: beforeObserver('arrangedContent', function() {
-        var arrangedContent = get(this, 'arrangedContent'),
-            len = arrangedContent ? get(arrangedContent, 'length') : 0;
-
-        this.arrangedContentArrayWillChange(this, 0, len, undefined);
-        this.arrangedContentWillChange(this);
-
-        this._teardownArrangedContent(arrangedContent);
-      }),
-
-      _arrangedContentDidChange: observer('arrangedContent', function() {
-        var arrangedContent = get(this, 'arrangedContent'),
-            len = arrangedContent ? get(arrangedContent, 'length') : 0;
-
-        Ember.assert("Can't set ArrayProxy's content to itself", arrangedContent !== this);
-
-        this._setupArrangedContent();
-
-        this.arrangedContentDidChange(this);
-        this.arrangedContentArrayDidChange(this, 0, undefined, len);
-      }),
-
-      _setupArrangedContent: function() {
-        var arrangedContent = get(this, 'arrangedContent');
-
-        if (arrangedContent) {
-          Ember.assert(fmt('ArrayProxy expects an Array or ' +
-            'Ember.ArrayProxy, but you passed %@', [typeof arrangedContent]),
-            isArray(arrangedContent) || arrangedContent.isDestroyed);
-
-          arrangedContent.addArrayObserver(this, {
-            willChange: 'arrangedContentArrayWillChange',
-            didChange: 'arrangedContentArrayDidChange'
-          });
-        }
-      },
-
-      _teardownArrangedContent: function() {
-        var arrangedContent = get(this, 'arrangedContent');
-
-        if (arrangedContent) {
-          arrangedContent.removeArrayObserver(this, {
-            willChange: 'arrangedContentArrayWillChange',
-            didChange: 'arrangedContentArrayDidChange'
-          });
-        }
-      },
-
-      arrangedContentWillChange: K,
-      arrangedContentDidChange: K,
-
-      objectAt: function(idx) {
-        return get(this, 'content') && this.objectAtContent(idx);
-      },
-
-      length: computed(function() {
-        var arrangedContent = get(this, 'arrangedContent');
-        return arrangedContent ? get(arrangedContent, 'length') : 0;
-        // No dependencies since Enumerable notifies length of change
-      }),
-
-      _replace: function(idx, amt, objects) {
-        var content = get(this, 'content');
-        Ember.assert('The content property of '+ this.constructor + ' should be set before modifying it', content);
-        if (content) this.replaceContent(idx, amt, objects);
-        return this;
-      },
-
-      replace: function() {
-        if (get(this, 'arrangedContent') === get(this, 'content')) {
-          apply(this, this._replace, arguments);
-        } else {
-          throw new EmberError("Using replace on an arranged ArrayProxy is not allowed.");
-        }
-      },
-
-      _insertAt: function(idx, object) {
-        if (idx > get(this, 'content.length')) throw new EmberError(OUT_OF_RANGE_EXCEPTION);
-        this._replace(idx, 0, [object]);
-        return this;
-      },
-
-      insertAt: function(idx, object) {
-        if (get(this, 'arrangedContent') === get(this, 'content')) {
-          return this._insertAt(idx, object);
-        } else {
-          throw new EmberError("Using insertAt on an arranged ArrayProxy is not allowed.");
-        }
-      },
-
-      removeAt: function(start, len) {
-        if ('number' === typeof start) {
-          var content = get(this, 'content'),
-              arrangedContent = get(this, 'arrangedContent'),
-              indices = [], i;
-
-          if ((start < 0) || (start >= get(this, 'length'))) {
-            throw new EmberError(OUT_OF_RANGE_EXCEPTION);
-          }
-
-          if (len === undefined) len = 1;
-
-          // Get a list of indices in original content to remove
-          for (i=start; i<start+len; i++) {
-            // Use arrangedContent here so we avoid confusion with objects transformed by objectAtContent
-            indices.push(content.indexOf(arrangedContent.objectAt(i)));
-          }
-
-          // Replace in reverse order since indices will change
-          indices.sort(function(a,b) { return b - a; });
-
-          beginPropertyChanges();
-          for (i=0; i<indices.length; i++) {
-            this._replace(indices[i], 1, EMPTY);
-          }
-          endPropertyChanges();
-        }
-
-        return this ;
-      },
-
-      pushObject: function(obj) {
-        this._insertAt(get(this, 'content.length'), obj) ;
-        return obj ;
-      },
-
-      pushObjects: function(objects) {
-        if (!(Enumerable.detect(objects) || isArray(objects))) {
-          throw new TypeError("Must pass Ember.Enumerable to Ember.MutableArray#pushObjects");
-        }
-        this._replace(get(this, 'length'), 0, objects);
-        return this;
-      },
-
-      setObjects: function(objects) {
-        if (objects.length === 0) return this.clear();
-
-        var len = get(this, 'length');
-        this._replace(0, len, objects);
-        return this;
-      },
-
-      unshiftObject: function(obj) {
-        this._insertAt(0, obj) ;
-        return obj ;
-      },
-
-      unshiftObjects: function(objects) {
-        this._replace(0, 0, objects);
-        return this;
-      },
-
-      slice: function() {
-        var arr = this.toArray();
-        return arr.slice.apply(arr, arguments);
-      },
-
-      arrangedContentArrayWillChange: function(item, idx, removedCnt, addedCnt) {
-        this.arrayContentWillChange(idx, removedCnt, addedCnt);
-      },
-
-      arrangedContentArrayDidChange: function(item, idx, removedCnt, addedCnt) {
-        this.arrayContentDidChange(idx, removedCnt, addedCnt);
-      },
-
-      init: function() {
-        this._super();
-        this._setupContent();
-        this._setupArrangedContent();
-      },
-
-      willDestroy: function() {
-        this._teardownArrangedContent();
-        this._teardownContent();
-      }
-    });
-
-    __exports__["default"] = ArrayProxy;
-  });
-define("ember-runtime/system/container", 
-  ["ember-metal/property_set","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var set = __dependency1__["default"];
-
-    var Container = requireModule('container')["default"];
-    Container.set = set;
-
-    __exports__["default"] = Container;
-  });
-define("ember-runtime/system/core_object", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/platform","ember-metal/watching","ember-metal/chains","ember-metal/events","ember-metal/mixin","ember-metal/enumerable_utils","ember-metal/error","ember-runtime/keys","ember-runtime/mixins/action_handler","ember-metal/properties","ember-metal/binding","ember-metal/computed","ember-metal/run_loop","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __exports__) {
-    "use strict";
-    /**
-      @module ember
-      @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-
-    // Ember.ENV.MANDATORY_SETTER, Ember.assert, Ember.K, Ember.config
-
-    // NOTE: this object should never be included directly. Instead use `Ember.Object`.
-    // We only define this separately so that `Ember.Set` can depend on it.
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var guidFor = __dependency4__.guidFor;
-    var apply = __dependency4__.apply;
-    var create = __dependency5__.create;
-    var generateGuid = __dependency4__.generateGuid;
-    var GUID_KEY = __dependency4__.GUID_KEY;
-    var meta = __dependency4__.meta;
-    var META_KEY = __dependency4__.META_KEY;
-    var makeArray = __dependency4__.makeArray;
-    var rewatch = __dependency6__.rewatch;
-    var finishChains = __dependency7__.finishChains;
-    var sendEvent = __dependency8__.sendEvent;
-    var IS_BINDING = __dependency9__.IS_BINDING;
-    var Mixin = __dependency9__.Mixin;
-    var required = __dependency9__.required;
-    var EnumerableUtils = __dependency10__["default"];
-    var EmberError = __dependency11__["default"];
-    var platform = __dependency5__.platform;
-    var keys = __dependency12__["default"];
-    var ActionHandler = __dependency13__["default"];
-    var defineProperty = __dependency14__.defineProperty;
-    var Binding = __dependency15__.Binding;
-    var ComputedProperty = __dependency16__.ComputedProperty;
-    var run = __dependency17__["default"];
-    var destroy = __dependency6__.destroy;
-
-
-    var o_create = create,
-        o_defineProperty = platform.defineProperty,
-        schedule = run.schedule,
-        applyMixin = Mixin._apply,
-        finishPartial = Mixin.finishPartial,
-        reopen = Mixin.prototype.reopen,
-        MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
-        indexOf = EnumerableUtils.indexOf,
-        K = Ember.K;
-
-    var undefinedDescriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: false,
-      value: undefined
-    };
-
-    var nullDescriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: false,
-      value: null
-    };
-
-    function makeCtor() {
-
-      // Note: avoid accessing any properties on the object since it makes the
-      // method a lot faster. This is glue code so we want it to be as fast as
-      // possible.
-
-      var wasApplied = false, initMixins, initProperties;
-
-      var Class = function() {
-        if (!wasApplied) {
-          Class.proto(); // prepare prototype...
-        }
-        o_defineProperty(this, GUID_KEY, nullDescriptor);
-        o_defineProperty(this, '__nextSuper', undefinedDescriptor);
-        var m = meta(this), proto = m.proto;
-        m.proto = this;
-        if (initMixins) {
-          // capture locally so we can clear the closed over variable
-          var mixins = initMixins;
-          initMixins = null;
-          apply(this, this.reopen, mixins);
-        }
-        if (initProperties) {
-          // capture locally so we can clear the closed over variable
-          var props = initProperties;
-          initProperties = null;
-
-          var concatenatedProperties = this.concatenatedProperties;
-
-          for (var i = 0, l = props.length; i < l; i++) {
-            var properties = props[i];
-
-            Ember.assert("Ember.Object.create no longer supports mixing in other definitions, use createWithMixins instead.", !(properties instanceof Mixin));
-
-            if (typeof properties !== 'object' && properties !== undefined) {
-              throw new EmberError("Ember.Object.create only accepts objects.");
-            }
-
-            if (!properties) { continue; }
-
-            var keyNames = keys(properties);
-
-            for (var j = 0, ll = keyNames.length; j < ll; j++) {
-              var keyName = keyNames[j];
-              if (!properties.hasOwnProperty(keyName)) { continue; }
-
-              var value = properties[keyName];
-
-              if (IS_BINDING.test(keyName)) {
-                var bindings = m.bindings;
-                if (!bindings) {
-                  bindings = m.bindings = {};
-                } else if (!m.hasOwnProperty('bindings')) {
-                  bindings = m.bindings = o_create(m.bindings);
-                }
-                bindings[keyName] = value;
-              }
-
-              var desc = m.descs[keyName];
-
-              Ember.assert("Ember.Object.create no longer supports defining computed properties. Define computed properties using extend() or reopen() before calling create().", !(value instanceof ComputedProperty));
-              Ember.assert("Ember.Object.create no longer supports defining methods that call _super.", !(typeof value === 'function' && value.toString().indexOf('._super') !== -1));
-              Ember.assert("`actions` must be provided at extend time, not at create " +
-                           "time, when Ember.ActionHandler is used (i.e. views, " +
-                           "controllers & routes).", !((keyName === 'actions') && ActionHandler.detect(this)));
-
-              if (concatenatedProperties && indexOf(concatenatedProperties, keyName) >= 0) {
-                var baseValue = this[keyName];
-
-                if (baseValue) {
-                  if ('function' === typeof baseValue.concat) {
-                    value = baseValue.concat(value);
-                  } else {
-                    value = makeArray(baseValue).concat(value);
-                  }
-                } else {
-                  value = makeArray(value);
-                }
-              }
-
-              if (desc) {
-                desc.set(this, keyName, value);
-              } else {
-                if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) {
-                  this.setUnknownProperty(keyName, value);
-                } else if (MANDATORY_SETTER) {
-                  defineProperty(this, keyName, null, value); // setup mandatory setter
-                } else {
-                  this[keyName] = value;
-                }
-              }
-            }
-          }
-        }
-        finishPartial(this, m);
-        apply(this, this.init, arguments);
-        m.proto = proto;
-        finishChains(this);
-        sendEvent(this, "init");
-      };
-
-      Class.toString = Mixin.prototype.toString;
-      Class.willReopen = function() {
-        if (wasApplied) {
-          Class.PrototypeMixin = Mixin.create(Class.PrototypeMixin);
-        }
-
-        wasApplied = false;
-      };
-      Class._initMixins = function(args) { initMixins = args; };
-      Class._initProperties = function(args) { initProperties = args; };
-
-      Class.proto = function() {
-        var superclass = Class.superclass;
-        if (superclass) { superclass.proto(); }
-
-        if (!wasApplied) {
-          wasApplied = true;
-          Class.PrototypeMixin.applyPartial(Class.prototype);
-          rewatch(Class.prototype);
-        }
-
-        return this.prototype;
-      };
-
-      return Class;
-
-    }
-
-    /**
-      @class CoreObject
-      @namespace Ember
-    */
-    var CoreObject = makeCtor();
-    CoreObject.toString = function() { return "Ember.CoreObject"; };
-
-    CoreObject.PrototypeMixin = Mixin.create({
-      reopen: function() {
-        applyMixin(this, arguments, true);
-        return this;
-      },
-
-      /**
-        An overridable method called when objects are instantiated. By default,
-        does nothing unless it is overridden during class definition.
-
-        Example:
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          init: function() {
-            alert('Name is ' + this.get('name'));
-          }
-        });
-
-        var steve = App.Person.create({
-          name: "Steve"
-        });
-
-        // alerts 'Name is Steve'.
-        ```
-
-        NOTE: If you do override `init` for a framework class like `Ember.View` or
-        `Ember.ArrayController`, be sure to call `this._super()` in your
-        `init` declaration! If you don't, Ember may not have an opportunity to
-        do important setup work, and you'll see strange behavior in your
-        application.
-
-        @method init
-      */
-      init: function() {},
-
-      /**
-        Defines the properties that will be concatenated from the superclass
-        (instead of overridden).
-
-        By default, when you extend an Ember class a property defined in
-        the subclass overrides a property with the same name that is defined
-        in the superclass. However, there are some cases where it is preferable
-        to build up a property's value by combining the superclass' property
-        value with the subclass' value. An example of this in use within Ember
-        is the `classNames` property of `Ember.View`.
-
-        Here is some sample code showing the difference between a concatenated
-        property and a normal one:
-
-        ```javascript
-        App.BarView = Ember.View.extend({
-          someNonConcatenatedProperty: ['bar'],
-          classNames: ['bar']
-        });
-
-        App.FooBarView = App.BarView.extend({
-          someNonConcatenatedProperty: ['foo'],
-          classNames: ['foo'],
-        });
-
-        var fooBarView = App.FooBarView.create();
-        fooBarView.get('someNonConcatenatedProperty'); // ['foo']
-        fooBarView.get('classNames'); // ['ember-view', 'bar', 'foo']
-        ```
-
-        This behavior extends to object creation as well. Continuing the
-        above example:
-
-        ```javascript
-        var view = App.FooBarView.create({
-          someNonConcatenatedProperty: ['baz'],
-          classNames: ['baz']
-        })
-        view.get('someNonConcatenatedProperty'); // ['baz']
-        view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']
-        ```
-        Adding a single property that is not an array will just add it in the array:
-
-        ```javascript
-        var view = App.FooBarView.create({
-          classNames: 'baz'
-        })
-        view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']
-        ```
-
-        Using the `concatenatedProperties` property, we can tell to Ember that mix
-        the content of the properties.
-
-        In `Ember.View` the `classNameBindings` and `attributeBindings` properties
-        are also concatenated, in addition to `classNames`.
-
-        This feature is available for you to use throughout the Ember object model,
-        although typical app developers are likely to use it infrequently. Since
-        it changes expectations about behavior of properties, you should properly
-        document its usage in each individual concatenated property (to not
-        mislead your users to think they can override the property in a subclass).
-
-        @property concatenatedProperties
-        @type Array
-        @default null
-      */
-      concatenatedProperties: null,
-
-      /**
-        Destroyed object property flag.
-
-        if this property is `true` the observers and bindings were already
-        removed by the effect of calling the `destroy()` method.
-
-        @property isDestroyed
-        @default false
-      */
-      isDestroyed: false,
-
-      /**
-        Destruction scheduled flag. The `destroy()` method has been called.
-
-        The object stays intact until the end of the run loop at which point
-        the `isDestroyed` flag is set.
-
-        @property isDestroying
-        @default false
-      */
-      isDestroying: false,
-
-      /**
-        Destroys an object by setting the `isDestroyed` flag and removing its
-        metadata, which effectively destroys observers and bindings.
-
-        If you try to set a property on a destroyed object, an exception will be
-        raised.
-
-        Note that destruction is scheduled for the end of the run loop and does not
-        happen immediately.  It will set an isDestroying flag immediately.
-
-        @method destroy
-        @return {Ember.Object} receiver
-      */
-      destroy: function() {
-        if (this.isDestroying) { return; }
-        this.isDestroying = true;
-
-        schedule('actions', this, this.willDestroy);
-        schedule('destroy', this, this._scheduledDestroy);
-        return this;
-      },
-
-      /**
-        Override to implement teardown.
-
-        @method willDestroy
-       */
-      willDestroy: K,
-
-      /**
-        Invoked by the run loop to actually destroy the object. This is
-        scheduled for execution by the `destroy` method.
-
-        @private
-        @method _scheduledDestroy
-      */
-      _scheduledDestroy: function() {
-        if (this.isDestroyed) { return; }
-        destroy(this);
-        this.isDestroyed = true;
-      },
-
-      bind: function(to, from) {
-        if (!(from instanceof Binding)) { from = Binding.from(from); }
-        from.to(to).connect(this);
-        return from;
-      },
-
-      /**
-        Returns a string representation which attempts to provide more information
-        than Javascript's `toString` typically does, in a generic way for all Ember
-        objects.
-
-        ```javascript
-        App.Person = Em.Object.extend()
-        person = App.Person.create()
-        person.toString() //=> "<App.Person:ember1024>"
-        ```
-
-        If the object's class is not defined on an Ember namespace, it will
-        indicate it is a subclass of the registered superclass:
-
-       ```javascript
-        Student = App.Person.extend()
-        student = Student.create()
-        student.toString() //=> "<(subclass of App.Person):ember1025>"
-        ```
-
-        If the method `toStringExtension` is defined, its return value will be
-        included in the output.
-
-        ```javascript
-        App.Teacher = App.Person.extend({
-          toStringExtension: function() {
-            return this.get('fullName');
-          }
-        });
-        teacher = App.Teacher.create()
-        teacher.toString(); //=> "<App.Teacher:ember1026:Tom Dale>"
-        ```
-
-        @method toString
-        @return {String} string representation
-      */
-      toString: function toString() {
-        var hasToStringExtension = typeof this.toStringExtension === 'function',
-            extension = hasToStringExtension ? ":" + this.toStringExtension() : '';
-        var ret = '<'+this.constructor.toString()+':'+guidFor(this)+extension+'>';
-        this.toString = makeToString(ret);
-        return ret;
-      }
-    });
-
-    CoreObject.PrototypeMixin.ownerConstructor = CoreObject;
-
-    function makeToString(ret) {
-      return function() { return ret; };
-    }
-
-    if (Ember.config.overridePrototypeMixin) {
-      Ember.config.overridePrototypeMixin(CoreObject.PrototypeMixin);
-    }
-
-    CoreObject.__super__ = null;
-
-    var ClassMixin = Mixin.create({
-
-      ClassMixin: required(),
-
-      PrototypeMixin: required(),
-
-      isClass: true,
-
-      isMethod: false,
-
-      /**
-        Creates a new subclass.
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          say: function(thing) {
-            alert(thing);
-           }
-        });
-        ```
-
-        This defines a new subclass of Ember.Object: `App.Person`. It contains one method: `say()`.
-
-        You can also create a subclass from any existing class by calling its `extend()`  method. For example, you might want to create a subclass of Ember's built-in `Ember.View` class:
-
-        ```javascript
-        App.PersonView = Ember.View.extend({
-          tagName: 'li',
-          classNameBindings: ['isAdministrator']
-        });
-        ```
-
-        When defining a subclass, you can override methods but still access the implementation of your parent class by calling the special `_super()` method:
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          say: function(thing) {
-            var name = this.get('name');
-            alert(name + ' says: ' + thing);
-          }
-        });
-
-        App.Soldier = App.Person.extend({
-          say: function(thing) {
-            this._super(thing + ", sir!");
-          },
-          march: function(numberOfHours) {
-            alert(this.get('name') + ' marches for ' + numberOfHours + ' hours.')
-          }
-        });
-
-        var yehuda = App.Soldier.create({
-          name: "Yehuda Katz"
-        });
-
-        yehuda.say("Yes");  // alerts "Yehuda Katz says: Yes, sir!"
-        ```
-
-        The `create()` on line #17 creates an *instance* of the `App.Soldier` class. The `extend()` on line #8 creates a *subclass* of `App.Person`. Any instance of the `App.Person` class will *not* have the `march()` method.
-
-        You can also pass `Mixin` classes to add additional properties to the subclass.
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          say: function(thing) {
-            alert(this.get('name') + ' says: ' + thing);
-          }
-        });
-
-        App.SingingMixin = Mixin.create({
-          sing: function(thing){
-            alert(this.get('name') + ' sings: la la la ' + thing);
-          }
-        });
-
-        App.BroadwayStar = App.Person.extend(App.SingingMixin, {
-          dance: function() {
-            alert(this.get('name') + ' dances: tap tap tap tap ');
-          }
-        });
-        ```
-
-        The `App.BroadwayStar` class contains three methods: `say()`, `sing()`, and `dance()`.
-
-        @method extend
-        @static
-
-        @param {Mixin} [mixins]* One or more Mixin classes
-        @param {Object} [arguments]* Object containing values to use within the new class
-      */
-      extend: function() {
-        var Class = makeCtor(), proto;
-        Class.ClassMixin = Mixin.create(this.ClassMixin);
-        Class.PrototypeMixin = Mixin.create(this.PrototypeMixin);
-
-        Class.ClassMixin.ownerConstructor = Class;
-        Class.PrototypeMixin.ownerConstructor = Class;
-
-        reopen.apply(Class.PrototypeMixin, arguments);
-
-        Class.superclass = this;
-        Class.__super__  = this.prototype;
-
-        proto = Class.prototype = o_create(this.prototype);
-        proto.constructor = Class;
-        generateGuid(proto);
-        meta(proto).proto = proto; // this will disable observers on prototype
-
-        Class.ClassMixin.apply(Class);
-        return Class;
-      },
-
-      /**
-        Equivalent to doing `extend(arguments).create()`.
-        If possible use the normal `create` method instead.
-
-        @method createWithMixins
-        @static
-        @param [arguments]*
-      */
-      createWithMixins: function() {
-        var C = this;
-        if (arguments.length>0) { this._initMixins(arguments); }
-        return new C();
-      },
-
-      /**
-        Creates an instance of a class. Accepts either no arguments, or an object
-        containing values to initialize the newly instantiated object with.
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          helloWorld: function() {
-            alert("Hi, my name is " + this.get('name'));
-          }
-        });
-
-        var tom = App.Person.create({
-          name: 'Tom Dale'
-        });
-
-        tom.helloWorld(); // alerts "Hi, my name is Tom Dale".
-        ```
-
-        `create` will call the `init` function if defined during
-        `Ember.AnyObject.extend`
-
-        If no arguments are passed to `create`, it will not set values to the new
-        instance during initialization:
-
-        ```javascript
-        var noName = App.Person.create();
-        noName.helloWorld(); // alerts undefined
-        ```
-
-        NOTE: For performance reasons, you cannot declare methods or computed
-        properties during `create`. You should instead declare methods and computed
-        properties when using `extend` or use the `createWithMixins` shorthand.
-
-        @method create
-        @static
-        @param [arguments]*
-      */
-      create: function() {
-        var C = this;
-        if (arguments.length>0) { this._initProperties(arguments); }
-        return new C();
-      },
-
-      /**
-        Augments a constructor's prototype with additional
-        properties and functions:
-
-        ```javascript
-        MyObject = Ember.Object.extend({
-          name: 'an object'
-        });
-
-        o = MyObject.create();
-        o.get('name'); // 'an object'
-
-        MyObject.reopen({
-          say: function(msg){
-            console.log(msg);
-          }
-        })
-
-        o2 = MyObject.create();
-        o2.say("hello"); // logs "hello"
-
-        o.say("goodbye"); // logs "goodbye"
-        ```
-
-        To add functions and properties to the constructor itself,
-        see `reopenClass`
-
-        @method reopen
-      */
-      reopen: function() {
-        this.willReopen();
-        apply(this.PrototypeMixin, reopen, arguments);
-        return this;
-      },
-
-      /**
-        Augments a constructor's own properties and functions:
-
-        ```javascript
-        MyObject = Ember.Object.extend({
-          name: 'an object'
-        });
-
-        MyObject.reopenClass({
-          canBuild: false
-        });
-
-        MyObject.canBuild; // false
-        o = MyObject.create();
-        ```
-
-        In other words, this creates static properties and functions for the class. These are only available on the class
-        and not on any instance of that class.
-
-        ```javascript
-        App.Person = Ember.Object.extend({
-          name : "",
-          sayHello : function(){
-            alert("Hello. My name is " + this.get('name'));
-          }
-        });
-
-        App.Person.reopenClass({
-          species : "Homo sapiens",
-          createPerson: function(newPersonsName){
-            return App.Person.create({
-              name:newPersonsName
-            });
-          }
-        });
-
-        var tom = App.Person.create({
-          name : "Tom Dale"
-        });
-        var yehuda = App.Person.createPerson("Yehuda Katz");
-
-        tom.sayHello(); // "Hello. My name is Tom Dale"
-        yehuda.sayHello(); // "Hello. My name is Yehuda Katz"
-        alert(App.Person.species); // "Homo sapiens"
-        ```
-
-        Note that `species` and `createPerson` are *not* valid on the `tom` and `yehuda`
-        variables. They are only valid on `App.Person`.
-
-        To add functions and properties to instances of
-        a constructor by extending the constructor's prototype
-        see `reopen`
-
-        @method reopenClass
-      */
-      reopenClass: function() {
-        apply(this.ClassMixin, reopen, arguments);
-        applyMixin(this, arguments, false);
-        return this;
-      },
-
-      detect: function(obj) {
-        if ('function' !== typeof obj) { return false; }
-        while(obj) {
-          if (obj===this) { return true; }
-          obj = obj.superclass;
-        }
-        return false;
-      },
-
-      detectInstance: function(obj) {
-        return obj instanceof this;
-      },
-
-      /**
-        In some cases, you may want to annotate computed properties with additional
-        metadata about how they function or what values they operate on. For
-        example, computed property functions may close over variables that are then
-        no longer available for introspection.
-
-        You can pass a hash of these values to a computed property like this:
-
-        ```javascript
-        person: function() {
-          var personId = this.get('personId');
-          return App.Person.create({ id: personId });
-        }.property().meta({ type: App.Person })
-        ```
-
-        Once you've done this, you can retrieve the values saved to the computed
-        property from your class like this:
-
-        ```javascript
-        MyClass.metaForProperty('person');
-        ```
-
-        This will return the original hash that was passed to `meta()`.
-
-        @method metaForProperty
-        @param key {String} property name
-      */
-      metaForProperty: function(key) {
-        var meta = this.proto()[META_KEY],
-            desc = meta && meta.descs[key];
-
-        Ember.assert("metaForProperty() could not find a computed property with key '"+key+"'.", !!desc && desc instanceof ComputedProperty);
-        return desc._meta || {};
-      },
-
-      /**
-        Iterate over each computed property for the class, passing its name
-        and any associated metadata (see `metaForProperty`) to the callback.
-
-        @method eachComputedProperty
-        @param {Function} callback
-        @param {Object} binding
-      */
-      eachComputedProperty: function(callback, binding) {
-        var proto = this.proto(),
-            descs = meta(proto).descs,
-            empty = {},
-            property;
-
-        for (var name in descs) {
-          property = descs[name];
-
-          if (property instanceof ComputedProperty) {
-            callback.call(binding || this, name, property._meta || empty);
-          }
-        }
-      }
-
-    });
-
-    ClassMixin.ownerConstructor = CoreObject;
-
-    if (Ember.config.overrideClassMixin) {
-      Ember.config.overrideClassMixin(ClassMixin);
-    }
-
-    CoreObject.ClassMixin = ClassMixin;
-    ClassMixin.apply(CoreObject);
-
-    __exports__["default"] = CoreObject;
-  });
-define("ember-runtime/system/deferred", 
-  ["ember-runtime/mixins/deferred","ember-metal/property_get","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var DeferredMixin = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var EmberObject = __dependency3__["default"];
-
-    var Deferred = EmberObject.extend(DeferredMixin);
-
-    Deferred.reopenClass({
-      promise: function(callback, binding) {
-        var deferred = Deferred.create();
-        callback.call(binding, deferred);
-        return deferred;
-      }
-    });
-
-    __exports__["default"] = Deferred;
-  });
-define("ember-runtime/system/each_proxy", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/enumerable_utils","ember-metal/array","ember-runtime/mixins/array","ember-runtime/system/object","ember-metal/computed","ember-metal/observer","ember-metal/events","ember-metal/properties","ember-metal/property_events","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var guidFor = __dependency4__.guidFor;
-    var EnumerableUtils = __dependency5__["default"];
-    var indexOf = __dependency6__.indexOf;
-    var EmberArray = __dependency7__["default"];
-    // ES6TODO: WAT? Circular dep?
-    var EmberObject = __dependency8__["default"];
-    var computed = __dependency9__.computed;
-    var addObserver = __dependency10__.addObserver;
-    var addBeforeObserver = __dependency10__.addBeforeObserver;
-    var removeBeforeObserver = __dependency10__.removeBeforeObserver;
-    var removeObserver = __dependency10__.removeObserver;
-    var typeOf = __dependency4__.typeOf;
-    var watchedEvents = __dependency11__.watchedEvents;
-    var defineProperty = __dependency12__.defineProperty;
-    var beginPropertyChanges = __dependency13__.beginPropertyChanges;
-    var propertyDidChange = __dependency13__.propertyDidChange;
-    var propertyWillChange = __dependency13__.propertyWillChange;
-    var endPropertyChanges = __dependency13__.endPropertyChanges;
-    var changeProperties = __dependency13__.changeProperties;
-
-    var forEach = EnumerableUtils.forEach;
-
-    var EachArray = EmberObject.extend(EmberArray, {
-
-      init: function(content, keyName, owner) {
-        this._super();
-        this._keyName = keyName;
-        this._owner   = owner;
-        this._content = content;
-      },
-
-      objectAt: function(idx) {
-        var item = this._content.objectAt(idx);
-        return item && get(item, this._keyName);
-      },
-
-      length: computed(function() {
-        var content = this._content;
-        return content ? get(content, 'length') : 0;
-      })
-
-    });
-
-    var IS_OBSERVER = /^.+:(before|change)$/;
-
-    function addObserverForContentKey(content, keyName, proxy, idx, loc) {
-      var objects = proxy._objects, guid;
-      if (!objects) objects = proxy._objects = {};
-
-      while(--loc>=idx) {
-        var item = content.objectAt(loc);
-        if (item) {
-          Ember.assert('When using @each to observe the array ' + content + ', the array must return an object', typeOf(item) === 'instance' || typeOf(item) === 'object');
-          addBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
-          addObserver(item, keyName, proxy, 'contentKeyDidChange');
-
-          // keep track of the index each item was found at so we can map
-          // it back when the obj changes.
-          guid = guidFor(item);
-          if (!objects[guid]) objects[guid] = [];
-          objects[guid].push(loc);
-        }
-      }
-    }
-
-    function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
-      var objects = proxy._objects;
-      if (!objects) objects = proxy._objects = {};
-      var indicies, guid;
-
-      while(--loc>=idx) {
-        var item = content.objectAt(loc);
-        if (item) {
-          removeBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
-          removeObserver(item, keyName, proxy, 'contentKeyDidChange');
-
-          guid = guidFor(item);
-          indicies = objects[guid];
-          indicies[indexOf.call(indicies, loc)] = null;
-        }
-      }
-    }
-
-    /**
-      This is the object instance returned when you get the `@each` property on an
-      array. It uses the unknownProperty handler to automatically create
-      EachArray instances for property names.
-
-      @private
-      @class EachProxy
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var EachProxy = EmberObject.extend({
-
-      init: function(content) {
-        this._super();
-        this._content = content;
-        content.addArrayObserver(this);
-
-        // in case someone is already observing some keys make sure they are
-        // added
-        forEach(watchedEvents(this), function(eventName) {
-          this.didAddListener(eventName);
-        }, this);
-      },
-
-      /**
-        You can directly access mapped properties by simply requesting them.
-        The `unknownProperty` handler will generate an EachArray of each item.
-
-        @method unknownProperty
-        @param keyName {String}
-        @param value {*}
-      */
-      unknownProperty: function(keyName, value) {
-        var ret;
-        ret = new EachArray(this._content, keyName, this);
-        defineProperty(this, keyName, null, ret);
-        this.beginObservingContentKey(keyName);
-        return ret;
-      },
-
-      // ..........................................................
-      // ARRAY CHANGES
-      // Invokes whenever the content array itself changes.
-
-      arrayWillChange: function(content, idx, removedCnt, addedCnt) {
-        var keys = this._keys, key, lim;
-
-        lim = removedCnt>0 ? idx+removedCnt : -1;
-        beginPropertyChanges(this);
-
-        for(key in keys) {
-          if (!keys.hasOwnProperty(key)) { continue; }
-
-          if (lim>0) { removeObserverForContentKey(content, key, this, idx, lim); }
-
-          propertyWillChange(this, key);
-        }
-
-        propertyWillChange(this._content, '@each');
-        endPropertyChanges(this);
-      },
-
-      arrayDidChange: function(content, idx, removedCnt, addedCnt) {
-        var keys = this._keys, lim;
-
-        lim = addedCnt>0 ? idx+addedCnt : -1;
-        changeProperties(function() {
-          for(var key in keys) {
-            if (!keys.hasOwnProperty(key)) { continue; }
-
-            if (lim>0) { addObserverForContentKey(content, key, this, idx, lim); }
-
-            propertyDidChange(this, key);
-          }
-
-          propertyDidChange(this._content, '@each');
-        }, this);
-      },
-
-      // ..........................................................
-      // LISTEN FOR NEW OBSERVERS AND OTHER EVENT LISTENERS
-      // Start monitoring keys based on who is listening...
-
-      didAddListener: function(eventName) {
-        if (IS_OBSERVER.test(eventName)) {
-          this.beginObservingContentKey(eventName.slice(0, -7));
-        }
-      },
-
-      didRemoveListener: function(eventName) {
-        if (IS_OBSERVER.test(eventName)) {
-          this.stopObservingContentKey(eventName.slice(0, -7));
-        }
-      },
-
-      // ..........................................................
-      // CONTENT KEY OBSERVING
-      // Actual watch keys on the source content.
-
-      beginObservingContentKey: function(keyName) {
-        var keys = this._keys;
-        if (!keys) keys = this._keys = {};
-        if (!keys[keyName]) {
-          keys[keyName] = 1;
-          var content = this._content,
-              len = get(content, 'length');
-          addObserverForContentKey(content, keyName, this, 0, len);
-        } else {
-          keys[keyName]++;
-        }
-      },
-
-      stopObservingContentKey: function(keyName) {
-        var keys = this._keys;
-        if (keys && (keys[keyName]>0) && (--keys[keyName]<=0)) {
-          var content = this._content,
-              len     = get(content, 'length');
-          removeObserverForContentKey(content, keyName, this, 0, len);
-        }
-      },
-
-      contentKeyWillChange: function(obj, keyName) {
-        propertyWillChange(this, keyName);
-      },
-
-      contentKeyDidChange: function(obj, keyName) {
-        propertyDidChange(this, keyName);
-      }
-
-    });
-
-    __exports__.EachArray = EachArray;
-    __exports__.EachProxy = EachProxy;
-  });
-define("ember-runtime/system/lazy_load", 
-  ["ember-metal/core","ember-metal/array","ember-runtime/system/native_array","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    /*globals CustomEvent */
-
-    var Ember = __dependency1__["default"];
-    // Ember.ENV.EMBER_LOAD_HOOKS
-    var forEach = __dependency2__.forEach;
-    // make sure Ember.A is setup.
-
-    /**
-      @module ember
-      @submodule ember-runtime
-    */
-
-    var loadHooks = Ember.ENV.EMBER_LOAD_HOOKS || {};
-    var loaded = {};
-
-    /**
-      Detects when a specific package of Ember (e.g. 'Ember.Handlebars')
-      has fully loaded and is available for extension.
-
-      The provided `callback` will be called with the `name` passed
-      resolved from a string into the object:
-
-      ``` javascript
-      Ember.onLoad('Ember.Handlebars' function(hbars){
-        hbars.registerHelper(...);
-      });
-      ```
-
-      @method onLoad
-      @for Ember
-      @param name {String} name of hook
-      @param callback {Function} callback to be called
-    */
-    function onLoad(name, callback) {
-      var object;
-
-      loadHooks[name] = loadHooks[name] || Ember.A();
-      loadHooks[name].pushObject(callback);
-
-      if (object = loaded[name]) {
-        callback(object);
-      }
-    };
-
-    /**
-      Called when an Ember.js package (e.g Ember.Handlebars) has finished
-      loading. Triggers any callbacks registered for this event.
-
-      @method runLoadHooks
-      @for Ember
-      @param name {String} name of hook
-      @param object {Object} object to pass to callbacks
-    */
-    function runLoadHooks(name, object) {
-      loaded[name] = object;
-
-      if (typeof window === 'object' && typeof window.dispatchEvent === 'function' && typeof CustomEvent === "function") {
-        var event = new CustomEvent(name, {detail: object, name: name});
-        window.dispatchEvent(event);
-      }
-
-      if (loadHooks[name]) {
-        forEach.call(loadHooks[name], function(callback) {
-          callback(object);
-        });
-      }
-    };
-
-    __exports__.onLoad = onLoad;
-    __exports__.runLoadHooks = runLoadHooks;
-  });
-define("ember-runtime/system/namespace", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/utils","ember-metal/mixin","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    // Ember.lookup, Ember.BOOTED, Ember.deprecate, Ember.NAME_KEY, Ember.anyUnprocessedMixins
-    var Ember = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var indexOf = __dependency3__.indexOf;
-    var GUID_KEY = __dependency4__.GUID_KEY;
-    var guidFor = __dependency4__.guidFor;
-    var Mixin = __dependency5__.Mixin;
-
-    var EmberObject = __dependency6__["default"];
-
-    /**
-      A Namespace is an object usually used to contain other objects or methods
-      such as an application or framework. Create a namespace anytime you want
-      to define one of these new containers.
-
-      # Example Usage
-
-      ```javascript
-      MyFramework = Ember.Namespace.create({
-        VERSION: '1.0.0'
-      });
-      ```
-
-      @class Namespace
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var Namespace = EmberObject.extend({
-      isNamespace: true,
-
-      init: function() {
-        Namespace.NAMESPACES.push(this);
-        Namespace.PROCESSED = false;
-      },
-
-      toString: function() {
-        var name = get(this, 'name');
-        if (name) { return name; }
-
-        findNamespaces();
-        return this[GUID_KEY+'_name'];
-      },
-
-      nameClasses: function() {
-        processNamespace([this.toString()], this, {});
-      },
-
-      destroy: function() {
-        var namespaces = Namespace.NAMESPACES,
-            toString = this.toString();
-
-        if (toString) {
-          Ember.lookup[toString] = undefined;
-          delete Namespace.NAMESPACES_BY_ID[toString];
-        }
-        namespaces.splice(indexOf.call(namespaces, this), 1);
-        this._super();
-      }
-    });
-
-    Namespace.reopenClass({
-      NAMESPACES: [Ember],
-      NAMESPACES_BY_ID: {},
-      PROCESSED: false,
-      processAll: processAllNamespaces,
-      byName: function(name) {
-        if (!Ember.BOOTED) {
-          processAllNamespaces();
-        }
-
-        return NAMESPACES_BY_ID[name];
-      }
-    });
-
-    var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
-
-    var hasOwnProp = ({}).hasOwnProperty;
-
-    function processNamespace(paths, root, seen) {
-      var idx = paths.length;
-
-      NAMESPACES_BY_ID[paths.join('.')] = root;
-
-      // Loop over all of the keys in the namespace, looking for classes
-      for(var key in root) {
-        if (!hasOwnProp.call(root, key)) { continue; }
-        var obj = root[key];
-
-        // If we are processing the `Ember` namespace, for example, the
-        // `paths` will start with `["Ember"]`. Every iteration through
-        // the loop will update the **second** element of this list with
-        // the key, so processing `Ember.View` will make the Array
-        // `['Ember', 'View']`.
-        paths[idx] = key;
-
-        // If we have found an unprocessed class
-        if (obj && obj.toString === classToString) {
-          // Replace the class' `toString` with the dot-separated path
-          // and set its `NAME_KEY`
-          obj.toString = makeToString(paths.join('.'));
-          obj[NAME_KEY] = paths.join('.');
-
-        // Support nested namespaces
-        } else if (obj && obj.isNamespace) {
-          // Skip aliased namespaces
-          if (seen[guidFor(obj)]) { continue; }
-          seen[guidFor(obj)] = true;
-
-          // Process the child namespace
-          processNamespace(paths, obj, seen);
-        }
-      }
-
-      paths.length = idx; // cut out last item
-    }
-
-    function findNamespaces() {
-      var lookup = Ember.lookup, obj, isNamespace;
-
-      if (Namespace.PROCESSED) { return; }
-
-      for (var prop in lookup) {
-        // These don't raise exceptions but can cause warnings
-        if (prop === "parent" || prop === "top" || prop === "frameElement" || prop === "webkitStorageInfo") { continue; }
-
-        //  get(window.globalStorage, 'isNamespace') would try to read the storage for domain isNamespace and cause exception in Firefox.
-        // globalStorage is a storage obsoleted by the WhatWG storage specification. See https://developer.mozilla.org/en/DOM/Storage#globalStorage
-        if (prop === "globalStorage" && lookup.StorageList && lookup.globalStorage instanceof lookup.StorageList) { continue; }
-        // Unfortunately, some versions of IE don't support window.hasOwnProperty
-        if (lookup.hasOwnProperty && !lookup.hasOwnProperty(prop)) { continue; }
-
-        // At times we are not allowed to access certain properties for security reasons.
-        // There are also times where even if we can access them, we are not allowed to access their properties.
-        try {
-          obj = Ember.lookup[prop];
-          isNamespace = obj && obj.isNamespace;
-        } catch (e) {
-          continue;
-        }
-
-        if (isNamespace) {
-          Ember.deprecate("Namespaces should not begin with lowercase.", /^[A-Z]/.test(prop));
-          obj[NAME_KEY] = prop;
-        }
-      }
-    }
-
-    var NAME_KEY = Ember.NAME_KEY = GUID_KEY + '_name';
-
-    function superClassString(mixin) {
-      var superclass = mixin.superclass;
-      if (superclass) {
-        if (superclass[NAME_KEY]) { return superclass[NAME_KEY]; }
-        else { return superClassString(superclass); }
-      } else {
-        return;
-      }
-    }
-
-    function classToString() {
-      if (!Ember.BOOTED && !this[NAME_KEY]) {
-        processAllNamespaces();
-      }
-
-      var ret;
-
-      if (this[NAME_KEY]) {
-        ret = this[NAME_KEY];
-      } else if (this._toString) {
-        ret = this._toString; 
-      } else {
-        var str = superClassString(this);
-        if (str) {
-          ret = "(subclass of " + str + ")";
-        } else {
-          ret = "(unknown mixin)";
-        }
-        this.toString = makeToString(ret);
-      }
-
-      return ret;
-    }
-
-    function processAllNamespaces() {
-      var unprocessedNamespaces = !Namespace.PROCESSED,
-          unprocessedMixins = Ember.anyUnprocessedMixins;
-
-      if (unprocessedNamespaces) {
-        findNamespaces();
-        Namespace.PROCESSED = true;
-      }
-
-      if (unprocessedNamespaces || unprocessedMixins) {
-        var namespaces = Namespace.NAMESPACES, namespace;
-        for (var i=0, l=namespaces.length; i<l; i++) {
-          namespace = namespaces[i];
-          processNamespace([namespace.toString()], namespace, {});
-        }
-
-        Ember.anyUnprocessedMixins = false;
-      }
-    }
-
-    function makeToString(ret) {
-      return function() { return ret; };
-    }
-
-    Mixin.prototype.toString = classToString; // ES6TODO: altering imported objects. SBB.
-
-    __exports__["default"] = Namespace;
-  });
-define("ember-runtime/system/native_array", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/array","ember-runtime/mixins/mutable_array","ember-runtime/mixins/observable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-runtime/copy","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.EXTEND_PROTOTYPES
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var EnumerableUtils = __dependency4__["default"];
-    var Mixin = __dependency5__.Mixin;
-    var EmberArray = __dependency6__["default"];
-    var MutableArray = __dependency7__["default"];
-    var Observable = __dependency8__["default"];
-    var Copyable = __dependency9__["default"];
-    var FROZEN_ERROR = __dependency10__.FROZEN_ERROR;
-    var copy = __dependency11__["default"];
-
-    var replace = EnumerableUtils._replace,
-        forEach = EnumerableUtils.forEach;
-
-    // Add Ember.Array to Array.prototype. Remove methods with native
-    // implementations and supply some more optimized versions of generic methods
-    // because they are so common.
-
-    /**
-      The NativeArray mixin contains the properties needed to to make the native
-      Array support Ember.MutableArray and all of its dependent APIs. Unless you
-      have `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Array` set to
-      false, this will be applied automatically. Otherwise you can apply the mixin
-      at anytime by calling `Ember.NativeArray.activate`.
-
-      @class NativeArray
-      @namespace Ember
-      @uses Ember.MutableArray
-      @uses Ember.Observable
-      @uses Ember.Copyable
-    */
-    var NativeArray = Mixin.create(MutableArray, Observable, Copyable, {
-
-      // because length is a built-in property we need to know to just get the
-      // original property.
-      get: function(key) {
-        if (key==='length') return this.length;
-        else if ('number' === typeof key) return this[key];
-        else return this._super(key);
-      },
-
-      objectAt: function(idx) {
-        return this[idx];
-      },
-
-      // primitive for array support.
-      replace: function(idx, amt, objects) {
-
-        if (this.isFrozen) throw FROZEN_ERROR;
-
-        // if we replaced exactly the same number of items, then pass only the
-        // replaced range. Otherwise, pass the full remaining array length
-        // since everything has shifted
-        var len = objects ? get(objects, 'length') : 0;
-        this.arrayContentWillChange(idx, amt, len);
-
-        if (len === 0) {
-          this.splice(idx, amt);
-        } else {
-          replace(this, idx, amt, objects);
-        }
-
-        this.arrayContentDidChange(idx, amt, len);
-        return this;
-      },
-
-      // If you ask for an unknown property, then try to collect the value
-      // from member items.
-      unknownProperty: function(key, value) {
-        var ret;// = this.reducedProperty(key, value) ;
-        if ((value !== undefined) && ret === undefined) {
-          ret = this[key] = value;
-        }
-        return ret ;
-      },
-
-      // If browser did not implement indexOf natively, then override with
-      // specialized version
-      indexOf: function(object, startAt) {
-        var idx, len = this.length;
-
-        if (startAt === undefined) startAt = 0;
-        else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
-        if (startAt < 0) startAt += len;
-
-        for(idx=startAt;idx<len;idx++) {
-          if (this[idx] === object) return idx ;
-        }
-        return -1;
-      },
-
-      lastIndexOf: function(object, startAt) {
-        var idx, len = this.length;
-
-        if (startAt === undefined) startAt = len-1;
-        else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
-        if (startAt < 0) startAt += len;
-
-        for(idx=startAt;idx>=0;idx--) {
-          if (this[idx] === object) return idx ;
-        }
-        return -1;
-      },
-
-      copy: function(deep) {
-        if (deep) {
-          return this.map(function(item) { return copy(item, true); });
-        }
-
-        return this.slice();
-      }
-    });
-
-    // Remove any methods implemented natively so we don't override them
-    var ignore = ['length'];
-    forEach(NativeArray.keys(), function(methodName) {
-      if (Array.prototype[methodName]) ignore.push(methodName);
-    });
-
-    if (ignore.length>0) {
-      NativeArray = NativeArray.without.apply(NativeArray, ignore);
-    }
-
-    /**
-      Creates an `Ember.NativeArray` from an Array like object.
-      Does not modify the original object. Ember.A is not needed if
-      `Ember.EXTEND_PROTOTYPES` is `true` (the default value). However,
-      it is recommended that you use Ember.A when creating addons for
-      ember or when you can not guarantee that `Ember.EXTEND_PROTOTYPES`
-      will be `true`.
-
-      Example
-
-      ```js
-      var Pagination = Ember.CollectionView.extend({
-        tagName: 'ul',
-        classNames: ['pagination'],
-        init: function() {
-          this._super();
-          if (!this.get('content')) {
-            this.set('content', Ember.A([]));
-          }
-        }
-      });
-      ```
-
-      @method A
-      @for Ember
-      @return {Ember.NativeArray}
-    */
-    var A = function(arr) {
-      if (arr === undefined) { arr = []; }
-      return EmberArray.detect(arr) ? arr : NativeArray.apply(arr);
-    };
-
-    /**
-      Activates the mixin on the Array.prototype if not already applied. Calling
-      this method more than once is safe. This will be called when ember is loaded
-      unless you have `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Array`
-      set to `false`.
-
-      Example
-
-      ```js
-      if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
-        Ember.NativeArray.activate();
-      }
-      ```
-
-      @method activate
-      @for Ember.NativeArray
-      @static
-      @return {void}
-    */
-    NativeArray.activate = function() {
-      NativeArray.apply(Array.prototype);
-
-      A = function(arr) { return arr || []; };
-    };
-
-    if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
-      NativeArray.activate();
-    }
-
-    Ember.A = A; // ES6TODO: Setting A onto the object returned by ember-metal/core to avoid circles
-    __exports__.A = A;
-    __exports__.NativeArray = NativeArray;__exports__["default"] = NativeArray;
-  });
-define("ember-runtime/system/object", 
-  ["ember-runtime/system/core_object","ember-runtime/mixins/observable","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-
-    var CoreObject = __dependency1__["default"];
-    var Observable = __dependency2__["default"];
-
-    /**
-      `Ember.Object` is the main base class for all Ember objects. It is a subclass
-      of `Ember.CoreObject` with the `Ember.Observable` mixin applied. For details,
-      see the documentation for each of these.
-
-      @class Object
-      @namespace Ember
-      @extends Ember.CoreObject
-      @uses Ember.Observable
-    */
-    var EmberObject = CoreObject.extend(Observable);
-    EmberObject.toString = function() { return "Ember.Object"; };
-
-    __exports__["default"] = EmberObject;
-  });
-define("ember-runtime/system/object_proxy", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/observer","ember-metal/property_events","ember-metal/computed","ember-metal/properties","ember-metal/mixin","ember-runtime/system/string","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var meta = __dependency4__.meta;
-    var addObserver = __dependency5__.addObserver;
-    var removeObserver = __dependency5__.removeObserver;
-    var addBeforeObserver = __dependency5__.addBeforeObserver;
-    var removeBeforeObserver = __dependency5__.removeBeforeObserver;
-    var propertyWillChange = __dependency6__.propertyWillChange;
-    var propertyDidChange = __dependency6__.propertyDidChange;
-    var computed = __dependency7__.computed;
-    var defineProperty = __dependency8__.defineProperty;
-    var observer = __dependency9__.observer;
-    var fmt = __dependency10__.fmt;
-    var EmberObject = __dependency11__["default"];
-
-    function contentPropertyWillChange(content, contentKey) {
-      var key = contentKey.slice(8); // remove "content."
-      if (key in this) { return; }  // if shadowed in proxy
-      propertyWillChange(this, key);
-    }
-
-    function contentPropertyDidChange(content, contentKey) {
-      var key = contentKey.slice(8); // remove "content."
-      if (key in this) { return; } // if shadowed in proxy
-      propertyDidChange(this, key);
-    }
-
-    /**
-      `Ember.ObjectProxy` forwards all properties not defined by the proxy itself
-      to a proxied `content` object.
-
-      ```javascript
-      object = Ember.Object.create({
-        name: 'Foo'
-      });
-
-      proxy = Ember.ObjectProxy.create({
-        content: object
-      });
-
-      // Access and change existing properties
-      proxy.get('name')          // 'Foo'
-      proxy.set('name', 'Bar');
-      object.get('name')         // 'Bar'
-
-      // Create new 'description' property on `object`
-      proxy.set('description', 'Foo is a whizboo baz');
-      object.get('description')  // 'Foo is a whizboo baz'
-      ```
-
-      While `content` is unset, setting a property to be delegated will throw an
-      Error.
-
-      ```javascript
-      proxy = Ember.ObjectProxy.create({
-        content: null,
-        flag: null
-      });
-      proxy.set('flag', true);
-      proxy.get('flag');         // true
-      proxy.get('foo');          // undefined
-      proxy.set('foo', 'data');  // throws Error
-      ```
-
-      Delegated properties can be bound to and will change when content is updated.
-
-      Computed properties on the proxy itself can depend on delegated properties.
-
-      ```javascript
-      ProxyWithComputedProperty = Ember.ObjectProxy.extend({
-        fullName: function () {
-          var firstName = this.get('firstName'),
-              lastName = this.get('lastName');
-          if (firstName && lastName) {
-            return firstName + ' ' + lastName;
-          }
-          return firstName || lastName;
-        }.property('firstName', 'lastName')
-      });
-
-      proxy = ProxyWithComputedProperty.create();
-
-      proxy.get('fullName');  // undefined
-      proxy.set('content', {
-        firstName: 'Tom', lastName: 'Dale'
-      }); // triggers property change for fullName on proxy
-
-      proxy.get('fullName');  // 'Tom Dale'
-      ```
-
-      @class ObjectProxy
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var ObjectProxy = EmberObject.extend({
-      /**
-        The object whose properties will be forwarded.
-
-        @property content
-        @type Ember.Object
-        @default null
-      */
-      content: null,
-      _contentDidChange: observer('content', function() {
-        Ember.assert("Can't set ObjectProxy's content to itself", get(this, 'content') !== this);
-      }),
-
-      isTruthy: computed.bool('content'),
-
-      _debugContainerKey: null,
-
-      willWatchProperty: function (key) {
-        var contentKey = 'content.' + key;
-        addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
-        addObserver(this, contentKey, null, contentPropertyDidChange);
-      },
-
-      didUnwatchProperty: function (key) {
-        var contentKey = 'content.' + key;
-        removeBeforeObserver(this, contentKey, null, contentPropertyWillChange);
-        removeObserver(this, contentKey, null, contentPropertyDidChange);
-      },
-
-      unknownProperty: function (key) {
-        var content = get(this, 'content');
-        if (content) {
-          return get(content, key);
-        }
-      },
-
-      setUnknownProperty: function (key, value) {
-        var m = meta(this);
-        if (m.proto === this) {
-          // if marked as prototype then just defineProperty
-          // rather than delegate
-          defineProperty(this, key, null, value);
-          return value;
-        }
-
-        var content = get(this, 'content');
-        Ember.assert(fmt("Cannot delegate set('%@', %@) to the 'content' property of object proxy %@: its 'content' is undefined.", [key, value, this]), content);
-        return set(content, key, value);
-      }
-
-    });
-
-    __exports__["default"] = ObjectProxy;
-  });
-define("ember-runtime/system/set", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/is_none","ember-runtime/system/string","ember-runtime/system/core_object","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/enumerable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-metal/error","ember-metal/property_events","ember-metal/mixin","ember-metal/computed","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.isNone
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var guidFor = __dependency4__.guidFor;
-    var isNone = __dependency5__.isNone;
-    var fmt = __dependency6__.fmt;
-    var CoreObject = __dependency7__["default"];
-    var MutableEnumerable = __dependency8__["default"];
-    var Enumerable = __dependency9__["default"];
-    var Copyable = __dependency10__["default"];
-    var Freezable = __dependency11__.Freezable;
-    var FROZEN_ERROR = __dependency11__.FROZEN_ERROR;
-    var EmberError = __dependency12__["default"];
-    var propertyWillChange = __dependency13__.propertyWillChange;
-    var propertyDidChange = __dependency13__.propertyDidChange;
-    var aliasMethod = __dependency14__.aliasMethod;
-    var computed = __dependency15__.computed;
-
-    /**
-      An unordered collection of objects.
-
-      A Set works a bit like an array except that its items are not ordered. You
-      can create a set to efficiently test for membership for an object. You can
-      also iterate through a set just like an array, even accessing objects by
-      index, however there is no guarantee as to their order.
-
-      All Sets are observable via the Enumerable Observer API - which works
-      on any enumerable object including both Sets and Arrays.
-
-      ## Creating a Set
-
-      You can create a set like you would most objects using
-      `new Ember.Set()`. Most new sets you create will be empty, but you can
-      also initialize the set with some content by passing an array or other
-      enumerable of objects to the constructor.
-
-      Finally, you can pass in an existing set and the set will be copied. You
-      can also create a copy of a set by calling `Ember.Set#copy()`.
-
-      ```javascript
-      // creates a new empty set
-      var foundNames = new Ember.Set();
-
-      // creates a set with four names in it.
-      var names = new Ember.Set(["Charles", "Tom", "Juan", "Alex"]); // :P
-
-      // creates a copy of the names set.
-      var namesCopy = new Ember.Set(names);
-
-      // same as above.
-      var anotherNamesCopy = names.copy();
-      ```
-
-      ## Adding/Removing Objects
-
-      You generally add or remove objects from a set using `add()` or
-      `remove()`. You can add any type of object including primitives such as
-      numbers, strings, and booleans.
-
-      Unlike arrays, objects can only exist one time in a set. If you call `add()`
-      on a set with the same object multiple times, the object will only be added
-      once. Likewise, calling `remove()` with the same object multiple times will
-      remove the object the first time and have no effect on future calls until
-      you add the object to the set again.
-
-      NOTE: You cannot add/remove `null` or `undefined` to a set. Any attempt to do
-      so will be ignored.
-
-      In addition to add/remove you can also call `push()`/`pop()`. Push behaves
-      just like `add()` but `pop()`, unlike `remove()` will pick an arbitrary
-      object, remove it and return it. This is a good way to use a set as a job
-      queue when you don't care which order the jobs are executed in.
-
-      ## Testing for an Object
-
-      To test for an object's presence in a set you simply call
-      `Ember.Set#contains()`.
-
-      ## Observing changes
-
-      When using `Ember.Set`, you can observe the `"[]"` property to be
-      alerted whenever the content changes. You can also add an enumerable
-      observer to the set to be notified of specific objects that are added and
-      removed from the set. See [Ember.Enumerable](/api/classes/Ember.Enumerable.html)
-      for more information on enumerables.
-
-      This is often unhelpful. If you are filtering sets of objects, for instance,
-      it is very inefficient to re-filter all of the items each time the set
-      changes. It would be better if you could just adjust the filtered set based
-      on what was changed on the original set. The same issue applies to merging
-      sets, as well.
-
-      ## Other Methods
-
-      `Ember.Set` primary implements other mixin APIs. For a complete reference
-      on the methods you will use with `Ember.Set`, please consult these mixins.
-      The most useful ones will be `Ember.Enumerable` and
-      `Ember.MutableEnumerable` which implement most of the common iterator
-      methods you are used to on Array.
-
-      Note that you can also use the `Ember.Copyable` and `Ember.Freezable`
-      APIs on `Ember.Set` as well. Once a set is frozen it can no longer be
-      modified. The benefit of this is that when you call `frozenCopy()` on it,
-      Ember will avoid making copies of the set. This allows you to write
-      code that can know with certainty when the underlying set data will or
-      will not be modified.
-
-      @class Set
-      @namespace Ember
-      @extends Ember.CoreObject
-      @uses Ember.MutableEnumerable
-      @uses Ember.Copyable
-      @uses Ember.Freezable
-      @since Ember 0.9
-    */
-    var Set = CoreObject.extend(MutableEnumerable, Copyable, Freezable,
-      {
-
-      // ..........................................................
-      // IMPLEMENT ENUMERABLE APIS
-      //
-
-      /**
-        This property will change as the number of objects in the set changes.
-
-        @property length
-        @type number
-        @default 0
-      */
-      length: 0,
-
-      /**
-        Clears the set. This is useful if you want to reuse an existing set
-        without having to recreate it.
-
-        ```javascript
-        var colors = new Ember.Set(["red", "green", "blue"]);
-        colors.length;  // 3
-        colors.clear();
-        colors.length;  // 0
-        ```
-
-        @method clear
-        @return {Ember.Set} An empty Set
-      */
-      clear: function() {
-        if (this.isFrozen) { throw new EmberError(FROZEN_ERROR); }
-
-        var len = get(this, 'length');
-        if (len === 0) { return this; }
-
-        var guid;
-
-        this.enumerableContentWillChange(len, 0);
-        propertyWillChange(this, 'firstObject');
-        propertyWillChange(this, 'lastObject');
-
-        for (var i=0; i < len; i++) {
-          guid = guidFor(this[i]);
-          delete this[guid];
-          delete this[i];
-        }
-
-        set(this, 'length', 0);
-
-        propertyDidChange(this, 'firstObject');
-        propertyDidChange(this, 'lastObject');
-        this.enumerableContentDidChange(len, 0);
-
-        return this;
-      },
-
-      /**
-        Returns true if the passed object is also an enumerable that contains the
-        same objects as the receiver.
-
-        ```javascript
-        var colors = ["red", "green", "blue"],
-            same_colors = new Ember.Set(colors);
-
-        same_colors.isEqual(colors);               // true
-        same_colors.isEqual(["purple", "brown"]);  // false
-        ```
-
-        @method isEqual
-        @param {Ember.Set} obj the other object.
-        @return {Boolean}
-      */
-      isEqual: function(obj) {
-        // fail fast
-        if (!Enumerable.detect(obj)) return false;
-
-        var loc = get(this, 'length');
-        if (get(obj, 'length') !== loc) return false;
-
-        while(--loc >= 0) {
-          if (!obj.contains(this[loc])) return false;
-        }
-
-        return true;
-      },
-
-      /**
-        Adds an object to the set. Only non-`null` objects can be added to a set
-        and those can only be added once. If the object is already in the set or
-        the passed value is null this method will have no effect.
-
-        This is an alias for `Ember.MutableEnumerable.addObject()`.
-
-        ```javascript
-        var colors = new Ember.Set();
-        colors.add("blue");     // ["blue"]
-        colors.add("blue");     // ["blue"]
-        colors.add("red");      // ["blue", "red"]
-        colors.add(null);       // ["blue", "red"]
-        colors.add(undefined);  // ["blue", "red"]
-        ```
-
-        @method add
-        @param {Object} obj The object to add.
-        @return {Ember.Set} The set itself.
-      */
-      add: aliasMethod('addObject'),
-
-      /**
-        Removes the object from the set if it is found. If you pass a `null` value
-        or an object that is already not in the set, this method will have no
-        effect. This is an alias for `Ember.MutableEnumerable.removeObject()`.
-
-        ```javascript
-        var colors = new Ember.Set(["red", "green", "blue"]);
-        colors.remove("red");     // ["blue", "green"]
-        colors.remove("purple");  // ["blue", "green"]
-        colors.remove(null);      // ["blue", "green"]
-        ```
-
-        @method remove
-        @param {Object} obj The object to remove
-        @return {Ember.Set} The set itself.
-      */
-      remove: aliasMethod('removeObject'),
-
-      /**
-        Removes the last element from the set and returns it, or `null` if it's empty.
-
-        ```javascript
-        var colors = new Ember.Set(["green", "blue"]);
-        colors.pop();  // "blue"
-        colors.pop();  // "green"
-        colors.pop();  // null
-        ```
-
-        @method pop
-        @return {Object} The removed object from the set or null.
-      */
-      pop: function() {
-        if (get(this, 'isFrozen')) throw new EmberError(FROZEN_ERROR);
-        var obj = this.length > 0 ? this[this.length-1] : null;
-        this.remove(obj);
-        return obj;
-      },
-
-      /**
-        Inserts the given object on to the end of the set. It returns
-        the set itself.
-
-        This is an alias for `Ember.MutableEnumerable.addObject()`.
-
-        ```javascript
-        var colors = new Ember.Set();
-        colors.push("red");   // ["red"]
-        colors.push("green"); // ["red", "green"]
-        colors.push("blue");  // ["red", "green", "blue"]
-        ```
-
-        @method push
-        @return {Ember.Set} The set itself.
-      */
-      push: aliasMethod('addObject'),
-
-      /**
-        Removes the last element from the set and returns it, or `null` if it's empty.
-
-        This is an alias for `Ember.Set.pop()`.
-
-        ```javascript
-        var colors = new Ember.Set(["green", "blue"]);
-        colors.shift();  // "blue"
-        colors.shift();  // "green"
-        colors.shift();  // null
-        ```
-
-        @method shift
-        @return {Object} The removed object from the set or null.
-      */
-      shift: aliasMethod('pop'),
-
-      /**
-        Inserts the given object on to the end of the set. It returns
-        the set itself.
-
-        This is an alias of `Ember.Set.push()`
-
-        ```javascript
-        var colors = new Ember.Set();
-        colors.unshift("red");    // ["red"]
-        colors.unshift("green");  // ["red", "green"]
-        colors.unshift("blue");   // ["red", "green", "blue"]
-        ```
-
-        @method unshift
-        @return {Ember.Set} The set itself.
-      */
-      unshift: aliasMethod('push'),
-
-      /**
-        Adds each object in the passed enumerable to the set.
-
-        This is an alias of `Ember.MutableEnumerable.addObjects()`
-
-        ```javascript
-        var colors = new Ember.Set();
-        colors.addEach(["red", "green", "blue"]);  // ["red", "green", "blue"]
-        ```
-
-        @method addEach
-        @param {Ember.Enumerable} objects the objects to add.
-        @return {Ember.Set} The set itself.
-      */
-      addEach: aliasMethod('addObjects'),
-
-      /**
-        Removes each object in the passed enumerable to the set.
-
-        This is an alias of `Ember.MutableEnumerable.removeObjects()`
-
-        ```javascript
-        var colors = new Ember.Set(["red", "green", "blue"]);
-        colors.removeEach(["red", "blue"]);  //  ["green"]
-        ```
-
-        @method removeEach
-        @param {Ember.Enumerable} objects the objects to remove.
-        @return {Ember.Set} The set itself.
-      */
-      removeEach: aliasMethod('removeObjects'),
-
-      // ..........................................................
-      // PRIVATE ENUMERABLE SUPPORT
-      //
-
-      init: function(items) {
-        this._super();
-        if (items) this.addObjects(items);
-      },
-
-      // implement Ember.Enumerable
-      nextObject: function(idx) {
-        return this[idx];
-      },
-
-      // more optimized version
-      firstObject: computed(function() {
-        return this.length > 0 ? this[0] : undefined;
-      }),
-
-      // more optimized version
-      lastObject: computed(function() {
-        return this.length > 0 ? this[this.length-1] : undefined;
-      }),
-
-      // implements Ember.MutableEnumerable
-      addObject: function(obj) {
-        if (get(this, 'isFrozen')) throw new EmberError(FROZEN_ERROR);
-        if (isNone(obj)) return this; // nothing to do
-
-        var guid = guidFor(obj),
-            idx  = this[guid],
-            len  = get(this, 'length'),
-            added ;
-
-        if (idx>=0 && idx<len && (this[idx] === obj)) return this; // added
-
-        added = [obj];
-
-        this.enumerableContentWillChange(null, added);
-        propertyWillChange(this, 'lastObject');
-
-        len = get(this, 'length');
-        this[guid] = len;
-        this[len] = obj;
-        set(this, 'length', len+1);
-
-        propertyDidChange(this, 'lastObject');
-        this.enumerableContentDidChange(null, added);
-
-        return this;
-      },
-
-      // implements Ember.MutableEnumerable
-      removeObject: function(obj) {
-        if (get(this, 'isFrozen')) throw new EmberError(FROZEN_ERROR);
-        if (isNone(obj)) return this; // nothing to do
-
-        var guid = guidFor(obj),
-            idx  = this[guid],
-            len = get(this, 'length'),
-            isFirst = idx === 0,
-            isLast = idx === len-1,
-            last, removed;
-
-
-        if (idx>=0 && idx<len && (this[idx] === obj)) {
-          removed = [obj];
-
-          this.enumerableContentWillChange(removed, null);
-          if (isFirst) { propertyWillChange(this, 'firstObject'); }
-          if (isLast)  { propertyWillChange(this, 'lastObject'); }
-
-          // swap items - basically move the item to the end so it can be removed
-          if (idx < len-1) {
-            last = this[len-1];
-            this[idx] = last;
-            this[guidFor(last)] = idx;
-          }
-
-          delete this[guid];
-          delete this[len-1];
-          set(this, 'length', len-1);
-
-          if (isFirst) { propertyDidChange(this, 'firstObject'); }
-          if (isLast)  { propertyDidChange(this, 'lastObject'); }
-          this.enumerableContentDidChange(removed, null);
-        }
-
-        return this;
-      },
-
-      // optimized version
-      contains: function(obj) {
-        return this[guidFor(obj)]>=0;
-      },
-
-      copy: function() {
-        var C = this.constructor, ret = new C(), loc = get(this, 'length');
-        set(ret, 'length', loc);
-        while(--loc>=0) {
-          ret[loc] = this[loc];
-          ret[guidFor(this[loc])] = loc;
-        }
-        return ret;
-      },
-
-      toString: function() {
-        var len = this.length, idx, array = [];
-        for(idx = 0; idx < len; idx++) {
-          array[idx] = this[idx];
-        }
-        return fmt("Ember.Set<%@>", [array.join(',')]);
-      }
-
-    });
-
-
-    __exports__["default"] = Set;
-  });
-define("ember-runtime/system/string", 
-  ["ember-metal/core","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-runtime
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.STRINGS, Ember.FEATURES
-    var EmberInspect = __dependency2__.inspect;
-
-
-    var STRING_DASHERIZE_REGEXP = (/[ _]/g);
-    var STRING_DASHERIZE_CACHE = {};
-    var STRING_DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
-    var STRING_CAMELIZE_REGEXP = (/(\-|_|\.|\s)+(.)?/g);
-    var STRING_UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
-    var STRING_UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
-
-    function fmt(str, formats) {
-      // first, replace any ORDERED replacements.
-      var idx  = 0; // the current index for non-numerical replacements
-      return str.replace(/%@([0-9]+)?/g, function(s, argIndex) {
-        argIndex = (argIndex) ? parseInt(argIndex, 10) - 1 : idx++;
-        s = formats[argIndex];
-        return (s === null) ? '(null)' : (s === undefined) ? '' : EmberInspect(s);
-      }) ;
-    }
-
-    function loc(str, formats) {
-      str = Ember.STRINGS[str] || str;
-      return fmt(str, formats);
-    }
-
-    function w(str) {
-      return str.split(/\s+/);
-    }
-
-    function decamelize(str) {
-      return str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
-    }
-
-    function dasherize(str) {
-      var cache = STRING_DASHERIZE_CACHE,
-          hit   = cache.hasOwnProperty(str),
-          ret;
-
-      if (hit) {
-        return cache[str];
-      } else {
-        ret = decamelize(str).replace(STRING_DASHERIZE_REGEXP,'-');
-        cache[str] = ret;
-      }
-
-      return ret;
-    }
-
-    function camelize(str) {
-      return str.replace(STRING_CAMELIZE_REGEXP, function(match, separator, chr) {
-        return chr ? chr.toUpperCase() : '';
-      }).replace(/^([A-Z])/, function(match, separator, chr) {
-        return match.toLowerCase();
-      });
-    }
-
-    function classify(str) {
-      var parts = str.split("."),
-          out = [];
-
-      for (var i=0, l=parts.length; i<l; i++) {
-        var camelized = camelize(parts[i]);
-        out.push(camelized.charAt(0).toUpperCase() + camelized.substr(1));
-      }
-
-      return out.join(".");
-    }
-
-    function underscore(str) {
-      return str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').
-        replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase();
-    }
-
-    function capitalize(str) {
-      return str.charAt(0).toUpperCase() + str.substr(1);
-    }
-
-    /**
-      Defines the hash of localized strings for the current language. Used by
-      the `Ember.String.loc()` helper. To localize, add string values to this
-      hash.
-
-      @property STRINGS
-      @for Ember
-      @type Hash
-    */
-    Ember.STRINGS = {};
-
-    /**
-      Defines string helper methods including string formatting and localization.
-      Unless `Ember.EXTEND_PROTOTYPES.String` is `false` these methods will also be
-      added to the `String.prototype` as well.
-
-      @class String
-      @namespace Ember
-      @static
-    */
-    var EmberStringUtils = {
-
-      /**
-        Apply formatting options to the string. This will look for occurrences
-        of "%@" in your string and substitute them with the arguments you pass into
-        this method. If you want to control the specific order of replacement,
-        you can add a number after the key as well to indicate which argument
-        you want to insert.
-
-        Ordered insertions are most useful when building loc strings where values
-        you need to insert may appear in different orders.
-
-        ```javascript
-        "Hello %@ %@".fmt('John', 'Doe');     // "Hello John Doe"
-        "Hello %@2, %@1".fmt('John', 'Doe');  // "Hello Doe, John"
-        ```
-
-        @method fmt
-        @param {String} str The string to format
-        @param {Array} formats An array of parameters to interpolate into string.
-        @return {String} formatted string
-      */
-      fmt: fmt,
-
-      /**
-        Formats the passed string, but first looks up the string in the localized
-        strings hash. This is a convenient way to localize text. See
-        `Ember.String.fmt()` for more information on formatting.
-
-        Note that it is traditional but not required to prefix localized string
-        keys with an underscore or other character so you can easily identify
-        localized strings.
-
-        ```javascript
-        Ember.STRINGS = {
-          '_Hello World': 'Bonjour le monde',
-          '_Hello %@ %@': 'Bonjour %@ %@'
-        };
-
-        Ember.String.loc("_Hello World");  // 'Bonjour le monde';
-        Ember.String.loc("_Hello %@ %@", ["John", "Smith"]);  // "Bonjour John Smith";
-        ```
-
-        @method loc
-        @param {String} str The string to format
-        @param {Array} formats Optional array of parameters to interpolate into string.
-        @return {String} formatted string
-      */
-      loc: loc,
-
-      /**
-        Splits a string into separate units separated by spaces, eliminating any
-        empty strings in the process. This is a convenience method for split that
-        is mostly useful when applied to the `String.prototype`.
-
-        ```javascript
-        Ember.String.w("alpha beta gamma").forEach(function(key) {
-          console.log(key);
-        });
-
-        // > alpha
-        // > beta
-        // > gamma
-        ```
-
-        @method w
-        @param {String} str The string to split
-        @return {Array} array containing the split strings
-      */
-      w: w,
-
-      /**
-        Converts a camelized string into all lower case separated by underscores.
-
-        ```javascript
-        'innerHTML'.decamelize();           // 'inner_html'
-        'action_name'.decamelize();        // 'action_name'
-        'css-class-name'.decamelize();     // 'css-class-name'
-        'my favorite items'.decamelize();  // 'my favorite items'
-        ```
-
-        @method decamelize
-        @param {String} str The string to decamelize.
-        @return {String} the decamelized string.
-      */
-      decamelize: decamelize,
-
-      /**
-        Replaces underscores, spaces, or camelCase with dashes.
-
-        ```javascript
-        'innerHTML'.dasherize();          // 'inner-html'
-        'action_name'.dasherize();        // 'action-name'
-        'css-class-name'.dasherize();     // 'css-class-name'
-        'my favorite items'.dasherize();  // 'my-favorite-items'
-        ```
-
-        @method dasherize
-        @param {String} str The string to dasherize.
-        @return {String} the dasherized string.
-      */
-      dasherize: dasherize,
-
-      /**
-        Returns the lowerCamelCase form of a string.
-
-        ```javascript
-        'innerHTML'.camelize();          // 'innerHTML'
-        'action_name'.camelize();        // 'actionName'
-        'css-class-name'.camelize();     // 'cssClassName'
-        'my favorite items'.camelize();  // 'myFavoriteItems'
-        'My Favorite Items'.camelize();  // 'myFavoriteItems'
-        ```
-
-        @method camelize
-        @param {String} str The string to camelize.
-        @return {String} the camelized string.
-      */
-      camelize: camelize,
-
-      /**
-        Returns the UpperCamelCase form of a string.
-
-        ```javascript
-        'innerHTML'.classify();          // 'InnerHTML'
-        'action_name'.classify();        // 'ActionName'
-        'css-class-name'.classify();     // 'CssClassName'
-        'my favorite items'.classify();  // 'MyFavoriteItems'
-        ```
-
-        @method classify
-        @param {String} str the string to classify
-        @return {String} the classified string
-      */
-      classify: classify,
-
-      /**
-        More general than decamelize. Returns the lower\_case\_and\_underscored
-        form of a string.
-
-        ```javascript
-        'innerHTML'.underscore();          // 'inner_html'
-        'action_name'.underscore();        // 'action_name'
-        'css-class-name'.underscore();     // 'css_class_name'
-        'my favorite items'.underscore();  // 'my_favorite_items'
-        ```
-
-        @method underscore
-        @param {String} str The string to underscore.
-        @return {String} the underscored string.
-      */
-      underscore: underscore,
-
-      /**
-        Returns the Capitalized form of a string
-
-        ```javascript
-        'innerHTML'.capitalize()         // 'InnerHTML'
-        'action_name'.capitalize()       // 'Action_name'
-        'css-class-name'.capitalize()    // 'Css-class-name'
-        'my favorite items'.capitalize() // 'My favorite items'
-        ```
-
-        @method capitalize
-        @param {String} str The string to capitalize.
-        @return {String} The capitalized string.
-      */
-      capitalize: capitalize
-    };
-
-    __exports__["default"] = EmberStringUtils;
-    __exports__.fmt = fmt;
-    __exports__.loc = loc;
-    __exports__.w = w;
-    __exports__.decamelize = decamelize;
-    __exports__.dasherize = dasherize;
-    __exports__.camelize = camelize;
-    __exports__.classify = classify;
-    __exports__.underscore = underscore;
-    __exports__.capitalize = capitalize;
-  });
-define("ember-runtime/system/subarray", 
-  ["ember-metal/property_get","ember-metal/error","ember-metal/enumerable_utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var EmberError = __dependency2__["default"];
-    var EnumerableUtils = __dependency3__["default"];
-
-    var RETAIN = 'r',
-        FILTER = 'f';
-
-    function Operation (type, count) {
-      this.type = type;
-      this.count = count;
-    }
-
-    /**
-      An `Ember.SubArray` tracks an array in a way similar to, but more specialized
-      than, `Ember.TrackedArray`.  It is useful for keeping track of the indexes of
-      items within a filtered array.
-
-      @class SubArray
-      @namespace Ember
-    */
-    function SubArray (length) {
-      if (arguments.length < 1) { length = 0; }
-
-      if (length > 0) {
-        this._operations = [new Operation(RETAIN, length)];
-      } else {
-        this._operations = [];
-      }
-    };
-
-    SubArray.prototype = {
-      /**
-        Track that an item was added to the tracked array.
-
-        @method addItem
-
-        @param {number} index The index of the item in the tracked array.
-        @param {boolean} match `true` iff the item is included in the subarray.
-
-        @return {number} The index of the item in the subarray.
-      */
-      addItem: function(index, match) {
-        var returnValue = -1,
-            itemType = match ? RETAIN : FILTER,
-            self = this;
-
-        this._findOperation(index, function(operation, operationIndex, rangeStart, rangeEnd, seenInSubArray) {
-          var newOperation, splitOperation;
-
-          if (itemType === operation.type) {
-            ++operation.count;
-          } else if (index === rangeStart) {
-            // insert to the left of `operation`
-            self._operations.splice(operationIndex, 0, new Operation(itemType, 1));
-          } else {
-            newOperation = new Operation(itemType, 1);
-            splitOperation = new Operation(operation.type, rangeEnd - index + 1);
-            operation.count = index - rangeStart;
-
-            self._operations.splice(operationIndex + 1, 0, newOperation, splitOperation);
-          }
-
-          if (match) {
-            if (operation.type === RETAIN) {
-              returnValue = seenInSubArray + (index - rangeStart);
-            } else {
-              returnValue = seenInSubArray;
-            }
-          }
-
-          self._composeAt(operationIndex);
-        }, function(seenInSubArray) {
-          self._operations.push(new Operation(itemType, 1));
-
-          if (match) {
-            returnValue = seenInSubArray;
-          }
-
-          self._composeAt(self._operations.length-1);
-        });
-
-        return returnValue;
-      },
-
-      /**
-        Track that an item was removed from the tracked array.
-
-        @method removeItem
-
-        @param {number} index The index of the item in the tracked array.
-
-        @return {number} The index of the item in the subarray, or `-1` if the item
-        was not in the subarray.
-      */
-      removeItem: function(index) {
-        var returnValue = -1,
-            self = this;
-
-        this._findOperation(index, function (operation, operationIndex, rangeStart, rangeEnd, seenInSubArray) {
-          if (operation.type === RETAIN) {
-            returnValue = seenInSubArray + (index - rangeStart);
-          }
-
-          if (operation.count > 1) {
-            --operation.count;
-          } else {
-            self._operations.splice(operationIndex, 1);
-            self._composeAt(operationIndex);
-          }
-        }, function() {
-          throw new EmberError("Can't remove an item that has never been added.");
-        });
-
-        return returnValue;
-      },
-
-
-      _findOperation: function (index, foundCallback, notFoundCallback) {
-        var operationIndex,
-            len,
-            operation,
-            rangeStart,
-            rangeEnd,
-            seenInSubArray = 0;
-
-        // OPTIMIZE: change to balanced tree
-        // find leftmost operation to the right of `index`
-        for (operationIndex = rangeStart = 0, len = this._operations.length; operationIndex < len; rangeStart = rangeEnd + 1, ++operationIndex) {
-          operation = this._operations[operationIndex];
-          rangeEnd = rangeStart + operation.count - 1;
-
-          if (index >= rangeStart && index <= rangeEnd) {
-            foundCallback(operation, operationIndex, rangeStart, rangeEnd, seenInSubArray);
-            return;
-          } else if (operation.type === RETAIN) {
-            seenInSubArray += operation.count;
-          }
-        }
-
-        notFoundCallback(seenInSubArray);
-      },
-
-      _composeAt: function(index) {
-        var op = this._operations[index],
-            otherOp;
-
-        if (!op) {
-          // Composing out of bounds is a no-op, as when removing the last operation
-          // in the list.
-          return;
-        }
-
-        if (index > 0) {
-          otherOp = this._operations[index-1];
-          if (otherOp.type === op.type) {
-            op.count += otherOp.count;
-            this._operations.splice(index-1, 1);
-            --index;
-          }
-        }
-
-        if (index < this._operations.length-1) {
-          otherOp = this._operations[index+1];
-          if (otherOp.type === op.type) {
-            op.count += otherOp.count;
-            this._operations.splice(index+1, 1);
-          }
-        }
-      },
-
-      toString: function () {
-        var str = "";
-        forEach(this._operations, function (operation) {
-          str += " " + operation.type + ":" + operation.count;
-        });
-        return str.substring(1);
-      }
-    };
-
-    __exports__["default"] = SubArray;
-  });
-define("ember-runtime/system/tracked_array", 
-  ["ember-metal/property_get","ember-metal/enumerable_utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var EnumerableUtils = __dependency2__["default"];
-
-    var forEach = EnumerableUtils.forEach,
-        RETAIN = 'r',
-        INSERT = 'i',
-        DELETE = 'd';
-
-
-    /**
-      An `Ember.TrackedArray` tracks array operations.  It's useful when you want to
-      lazily compute the indexes of items in an array after they've been shifted by
-      subsequent operations.
-
-      @class TrackedArray
-      @namespace Ember
-      @param {array} [items=[]] The array to be tracked.  This is used just to get
-      the initial items for the starting state of retain:n.
-    */
-    function TrackedArray(items) {
-      if (arguments.length < 1) { items = []; }
-
-      var length = get(items, 'length');
-
-      if (length) {
-        this._operations = [new ArrayOperation(RETAIN, length, items)];
-      } else {
-        this._operations = [];
-      }
-    };
-
-    TrackedArray.RETAIN = RETAIN;
-    TrackedArray.INSERT = INSERT;
-    TrackedArray.DELETE = DELETE;
-
-    TrackedArray.prototype = {
-
-      /**
-        Track that `newItems` were added to the tracked array at `index`.
-
-        @method addItems
-        @param index
-        @param newItems
-      */
-      addItems: function (index, newItems) {
-        var count = get(newItems, 'length');
-        if (count < 1) { return; }
-
-        var match = this._findArrayOperation(index),
-            arrayOperation = match.operation,
-            arrayOperationIndex = match.index,
-            arrayOperationRangeStart = match.rangeStart,
-            composeIndex,
-            splitIndex,
-            splitItems,
-            splitArrayOperation,
-            newArrayOperation;
-
-        newArrayOperation = new ArrayOperation(INSERT, count, newItems);
-
-        if (arrayOperation) {
-          if (!match.split) {
-            // insert left of arrayOperation
-            this._operations.splice(arrayOperationIndex, 0, newArrayOperation);
-            composeIndex = arrayOperationIndex;
-          } else {
-            this._split(arrayOperationIndex, index - arrayOperationRangeStart, newArrayOperation);
-            composeIndex = arrayOperationIndex + 1;
-          }
-        } else {
-          // insert at end
-          this._operations.push(newArrayOperation);
-          composeIndex = arrayOperationIndex;
-        }
-
-        this._composeInsert(composeIndex);
-      },
-
-      /**
-        Track that `count` items were removed at `index`.
-
-        @method removeItems
-        @param index
-        @param count
-      */
-      removeItems: function (index, count) {
-        if (count < 1) { return; }
-
-        var match = this._findArrayOperation(index),
-            arrayOperation = match.operation,
-            arrayOperationIndex = match.index,
-            arrayOperationRangeStart = match.rangeStart,
-            newArrayOperation,
-            composeIndex;
-
-        newArrayOperation = new ArrayOperation(DELETE, count);
-        if (!match.split) {
-          // insert left of arrayOperation
-          this._operations.splice(arrayOperationIndex, 0, newArrayOperation);
-          composeIndex = arrayOperationIndex;
-        } else {
-          this._split(arrayOperationIndex, index - arrayOperationRangeStart, newArrayOperation);
-          composeIndex = arrayOperationIndex + 1;
-        }
-
-        return this._composeDelete(composeIndex);
-      },
-
-      /**
-        Apply all operations, reducing them to retain:n, for `n`, the number of
-        items in the array.
-
-        `callback` will be called for each operation and will be passed the following arguments:
-
-        * {array} items The items for the given operation
-        * {number} offset The computed offset of the items, ie the index in the
-        array of the first item for this operation.
-        * {string} operation The type of the operation.  One of
-        `Ember.TrackedArray.{RETAIN, DELETE, INSERT}`
-
-        @method apply
-        @param {function} callback
-      */
-      apply: function (callback) {
-        var items = [],
-            offset = 0;
-
-        forEach(this._operations, function (arrayOperation) {
-          callback(arrayOperation.items, offset, arrayOperation.type);
-
-          if (arrayOperation.type !== DELETE) {
-            offset += arrayOperation.count;
-            items = items.concat(arrayOperation.items);
-          }
-        });
-
-        this._operations = [new ArrayOperation(RETAIN, items.length, items)];
-      },
-
-      /**
-        Return an `ArrayOperationMatch` for the operation that contains the item at `index`.
-
-        @method _findArrayOperation
-
-        @param {number} index the index of the item whose operation information
-        should be returned.
-        @private
-      */
-      _findArrayOperation: function (index) {
-        var arrayOperationIndex,
-            len,
-            split = false,
-            arrayOperation,
-            arrayOperationRangeStart,
-            arrayOperationRangeEnd;
-
-        // OPTIMIZE: we could search these faster if we kept a balanced tree.
-        // find leftmost arrayOperation to the right of `index`
-        for (arrayOperationIndex = arrayOperationRangeStart = 0, len = this._operations.length; arrayOperationIndex < len; ++arrayOperationIndex) {
-          arrayOperation = this._operations[arrayOperationIndex];
-
-          if (arrayOperation.type === DELETE) { continue; }
-
-          arrayOperationRangeEnd = arrayOperationRangeStart + arrayOperation.count - 1;
-
-          if (index === arrayOperationRangeStart) {
-            break;
-          } else if (index > arrayOperationRangeStart && index <= arrayOperationRangeEnd) {
-            split = true;
-            break;
-          } else {
-            arrayOperationRangeStart = arrayOperationRangeEnd + 1;
-          }
-        }
-
-        return new ArrayOperationMatch(arrayOperation, arrayOperationIndex, split, arrayOperationRangeStart);
-      },
-
-      _split: function (arrayOperationIndex, splitIndex, newArrayOperation) {
-        var arrayOperation = this._operations[arrayOperationIndex],
-            splitItems = arrayOperation.items.slice(splitIndex),
-            splitArrayOperation = new ArrayOperation(arrayOperation.type, splitItems.length, splitItems);
-
-        // truncate LHS
-        arrayOperation.count = splitIndex;
-        arrayOperation.items = arrayOperation.items.slice(0, splitIndex);
-
-        this._operations.splice(arrayOperationIndex + 1, 0, newArrayOperation, splitArrayOperation);
-      },
-
-      // see SubArray for a better implementation.
-      _composeInsert: function (index) {
-        var newArrayOperation = this._operations[index],
-            leftArrayOperation = this._operations[index-1], // may be undefined
-            rightArrayOperation = this._operations[index+1], // may be undefined
-            leftOp = leftArrayOperation && leftArrayOperation.type,
-            rightOp = rightArrayOperation && rightArrayOperation.type;
-
-        if (leftOp === INSERT) {
-            // merge left
-            leftArrayOperation.count += newArrayOperation.count;
-            leftArrayOperation.items = leftArrayOperation.items.concat(newArrayOperation.items);
-
-          if (rightOp === INSERT) {
-            // also merge right (we have split an insert with an insert)
-            leftArrayOperation.count += rightArrayOperation.count;
-            leftArrayOperation.items = leftArrayOperation.items.concat(rightArrayOperation.items);
-            this._operations.splice(index, 2);
-          } else {
-            // only merge left
-            this._operations.splice(index, 1);
-          }
-        } else if (rightOp === INSERT) {
-          // merge right
-          newArrayOperation.count += rightArrayOperation.count;
-          newArrayOperation.items = newArrayOperation.items.concat(rightArrayOperation.items);
-          this._operations.splice(index + 1, 1);
-        }
-      },
-
-      _composeDelete: function (index) {
-        var arrayOperation = this._operations[index],
-            deletesToGo = arrayOperation.count,
-            leftArrayOperation = this._operations[index-1], // may be undefined
-            leftOp = leftArrayOperation && leftArrayOperation.type,
-            nextArrayOperation,
-            nextOp,
-            nextCount,
-            removeNewAndNextOp = false,
-            removedItems = [];
-
-        if (leftOp === DELETE) {
-          arrayOperation = leftArrayOperation;
-          index -= 1;
-        }
-
-        for (var i = index + 1; deletesToGo > 0; ++i) {
-          nextArrayOperation = this._operations[i];
-          nextOp = nextArrayOperation.type;
-          nextCount = nextArrayOperation.count;
-
-          if (nextOp === DELETE) {
-            arrayOperation.count += nextCount;
-            continue;
-          }
-
-          if (nextCount > deletesToGo) {
-            // d:2 {r,i}:5  we reduce the retain or insert, but it stays
-            removedItems = removedItems.concat(nextArrayOperation.items.splice(0, deletesToGo));
-            nextArrayOperation.count -= deletesToGo;
-
-            // In the case where we truncate the last arrayOperation, we don't need to
-            // remove it; also the deletesToGo reduction is not the entirety of
-            // nextCount
-            i -= 1;
-            nextCount = deletesToGo;
-
-            deletesToGo = 0;
-          } else {
-            if (nextCount === deletesToGo) {
-              // Handle edge case of d:2 i:2 in which case both operations go away
-              // during composition.
-              removeNewAndNextOp = true;
-            }
-            removedItems = removedItems.concat(nextArrayOperation.items);
-            deletesToGo -= nextCount;
-          }
-
-          if (nextOp === INSERT) {
-            // d:2 i:3 will result in delete going away
-            arrayOperation.count -= nextCount;
-          }
-        }
-
-        if (arrayOperation.count > 0) {
-          // compose our new delete with possibly several operations to the right of
-          // disparate types
-          this._operations.splice(index+1, i-1-index);
-        } else {
-          // The delete operation can go away; it has merely reduced some other
-          // operation, as in d:3 i:4; it may also have eliminated that operation,
-          // as in d:3 i:3.
-          this._operations.splice(index, removeNewAndNextOp ? 2 : 1);
-        }
-
-        return removedItems;
-      },
-
-      toString: function () {
-        var str = "";
-        forEach(this._operations, function (operation) {
-          str += " " + operation.type + ":" + operation.count;
-        });
-        return str.substring(1);
-      }
-    };
-
-    /**
-      Internal data structure to represent an array operation.
-
-      @method ArrayOperation
-      @private
-      @param {string} type The type of the operation.  One of
-      `Ember.TrackedArray.{RETAIN, INSERT, DELETE}`
-      @param {number} count The number of items in this operation.
-      @param {array} items The items of the operation, if included.  RETAIN and
-      INSERT include their items, DELETE does not.
-    */
-    function ArrayOperation (operation, count, items) {
-      this.type = operation; // RETAIN | INSERT | DELETE
-      this.count = count;
-      this.items = items;
-    }
-
-    /**
-      Internal data structure used to include information when looking up operations
-      by item index.
-
-      @method ArrayOperationMatch
-      @private
-      @param {ArrayOperation} operation
-      @param {number} index The index of `operation` in the array of operations.
-      @param {boolean} split Whether or not the item index searched for would
-      require a split for a new operation type.
-      @param {number} rangeStart The index of the first item in the operation,
-      with respect to the tracked array.  The index of the last item can be computed
-      from `rangeStart` and `operation.count`.
-    */
-    function ArrayOperationMatch(operation, index, split, rangeStart) {
-      this.operation = operation;
-      this.index = index;
-      this.split = split;
-      this.rangeStart = rangeStart;
-    }
-
-    __exports__["default"] = TrackedArray;
-  });
-})();
-
-(function() {
-define("ember-views", 
-  ["ember-runtime","ember-views/system/jquery","ember-views/system/utils","ember-views/system/render_buffer","ember-views/system/ext","ember-views/views/states","ember-views/views/view","ember-views/views/container_view","ember-views/views/collection_view","ember-views/views/component","ember-views/system/event_dispatcher","ember-views/mixins/view_target_action_support","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) {
-    "use strict";
-    /**
-    Ember Views
-
-    @module ember
-    @submodule ember-views
-    @requires ember-runtime
-    @main ember-views
-    */
-
-    // BEGIN EXPORTS
-    Ember.$ = __dependency2__["default"];
-
-    Ember.ViewTargetActionSupport = __dependency12__["default"];
-    Ember.RenderBuffer = __dependency4__["default"];
-
-    var ViewUtils = Ember.ViewUtils = {};
-    ViewUtils.setInnerHTML = __dependency3__.setInnerHTML;
-    ViewUtils.isSimpleClick = __dependency3__.isSimpleClick;
-
-    Ember.CoreView = __dependency7__.CoreView;
-    Ember.View = __dependency7__.View;
-    Ember.View.states = __dependency6__.states;
-    Ember.View.cloneStates = __dependency6__.cloneStates;
-
-    Ember._ViewCollection = __dependency7__.ViewCollection;
-    Ember.ContainerView = __dependency8__["default"];
-    Ember.CollectionView = __dependency9__["default"];
-    Ember.Component = __dependency10__["default"];
-    Ember.EventDispatcher = __dependency11__["default"];
-    // END EXPORTS
-
-    __exports__["default"] = Ember;
-  });
-define("ember-views/mixins/component_template_deprecation", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/mixin","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.deprecate
-    var get = __dependency2__.get;
-    var Mixin = __dependency3__.Mixin;
-
-    /**
-      The ComponentTemplateDeprecation mixin is used to provide a useful
-      deprecation warning when using either `template` or `templateName` with
-      a component. The `template` and `templateName` properties specified at
-      extend time are moved to `layout` and `layoutName` respectively.
-
-      `Ember.ComponentTemplateDeprecation` is used internally by Ember in
-      `Ember.Component`.
-
-      @class ComponentTemplateDeprecation
-      @namespace Ember
-    */
-    var ComponentTemplateDeprecation = Mixin.create({
-      /**
-        @private
-
-        Moves `templateName` to `layoutName` and `template` to `layout` at extend
-        time if a layout is not also specified.
-
-        Note that this currently modifies the mixin themselves, which is technically
-        dubious but is practically of little consequence. This may change in the
-        future.
-
-        @method willMergeMixin
-      */
-      willMergeMixin: function(props) {
-        // must call _super here to ensure that the ActionHandler
-        // mixin is setup properly (moves actions -> _actions)
-        //
-        // Calling super is only OK here since we KNOW that
-        // there is another Mixin loaded first.
-        this._super.apply(this, arguments);
-
-        var deprecatedProperty, replacementProperty,
-            layoutSpecified = (props.layoutName || props.layout || get(this, 'layoutName'));
-
-        if (props.templateName && !layoutSpecified) {
-          deprecatedProperty = 'templateName';
-          replacementProperty = 'layoutName';
-
-          props.layoutName = props.templateName;
-          delete props['templateName'];
-        }
-
-        if (props.template && !layoutSpecified) {
-          deprecatedProperty = 'template';
-          replacementProperty = 'layout';
-
-          props.layout = props.template;
-          delete props['template'];
-        }
-
-        if (deprecatedProperty) {
-          Ember.deprecate('Do not specify ' + deprecatedProperty + ' on a Component, use ' + replacementProperty + ' instead.', false);
-        }
-      }
-    });
-
-    __exports__["default"] = ComponentTemplateDeprecation;
-  });
-define("ember-views/mixins/view_target_action_support", 
-  ["ember-metal/mixin","ember-runtime/mixins/target_action_support","ember-metal/computed","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Mixin = __dependency1__.Mixin;
-    var TargetActionSupport = __dependency2__["default"];
-
-    // ES6TODO: computed should have its own export path so you can do import {defaultTo} from computed
-    var computed = __dependency3__.computed;
-    var alias = computed.alias;
-
-    /**
-    `Ember.ViewTargetActionSupport` is a mixin that can be included in a
-    view class to add a `triggerAction` method with semantics similar to
-    the Handlebars `{{action}}` helper. It provides intelligent defaults
-    for the action's target: the view's controller; and the context that is
-    sent with the action: the view's context.
-
-    Note: In normal Ember usage, the `{{action}}` helper is usually the best
-    choice. This mixin is most often useful when you are doing more complex
-    event handling in custom View subclasses.
-
-    For example:
-
-    ```javascript
-    App.SaveButtonView = Ember.View.extend(Ember.ViewTargetActionSupport, {
-      action: 'save',
-      click: function() {
-        this.triggerAction(); // Sends the `save` action, along with the current context
-                              // to the current controller
-      }
-    });
-    ```
-
-    The `action` can be provided as properties of an optional object argument
-    to `triggerAction` as well.
-
-    ```javascript
-    App.SaveButtonView = Ember.View.extend(Ember.ViewTargetActionSupport, {
-      click: function() {
-        this.triggerAction({
-          action: 'save'
-        }); // Sends the `save` action, along with the current context
-            // to the current controller
-      }
-    });
-    ```
-
-    @class ViewTargetActionSupport
-    @namespace Ember
-    @extends Ember.TargetActionSupport
-    */
-    var ViewTargetActionSupport = Mixin.create(TargetActionSupport, {
-      /**
-      @property target
-      */
-      target: alias('controller'),
-      /**
-      @property actionContext
-      */
-      actionContext: alias('context')
-    });
-
-    __exports__["default"] = ViewTargetActionSupport;
-  });
-define("ember-views/system/event_dispatcher", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/is_none","ember-metal/run_loop","ember-metal/utils","ember-runtime/system/string","ember-runtime/system/object","ember-views/system/jquery","ember-views/views/view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-views
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var isNone = __dependency4__.isNone;
-    var run = __dependency5__["default"];
-    var typeOf = __dependency6__.typeOf;
-    var fmt = __dependency7__.fmt;
-    var EmberObject = __dependency8__["default"];
-    var jQuery = __dependency9__["default"];
-    var View = __dependency10__.View;
-
-    var ActionHelper;
-
-    //ES6TODO:
-    // find a better way to do Ember.View.views without global state
-
-    /**
-      `Ember.EventDispatcher` handles delegating browser events to their
-      corresponding `Ember.Views.` For example, when you click on a view,
-      `Ember.EventDispatcher` ensures that that view's `mouseDown` method gets
-      called.
-
-      @class EventDispatcher
-      @namespace Ember
-      @private
-      @extends Ember.Object
-    */
-    var EventDispatcher = EmberObject.extend({
-
-      /**
-        The set of events names (and associated handler function names) to be setup
-        and dispatched by the `EventDispatcher`. Custom events can added to this list at setup
-        time, generally via the `Ember.Application.customEvents` hash. Only override this
-        default set to prevent the EventDispatcher from listening on some events all together.
-
-        This set will be modified by `setup` to also include any events added at that time.
-
-        @property events
-        @type Object
-      */
-      events: {
-        touchstart  : 'touchStart',
-        touchmove   : 'touchMove',
-        touchend    : 'touchEnd',
-        touchcancel : 'touchCancel',
-        keydown     : 'keyDown',
-        keyup       : 'keyUp',
-        keypress    : 'keyPress',
-        mousedown   : 'mouseDown',
-        mouseup     : 'mouseUp',
-        contextmenu : 'contextMenu',
-        click       : 'click',
-        dblclick    : 'doubleClick',
-        mousemove   : 'mouseMove',
-        focusin     : 'focusIn',
-        focusout    : 'focusOut',
-        mouseenter  : 'mouseEnter',
-        mouseleave  : 'mouseLeave',
-        submit      : 'submit',
-        input       : 'input',
-        change      : 'change',
-        dragstart   : 'dragStart',
-        drag        : 'drag',
-        dragenter   : 'dragEnter',
-        dragleave   : 'dragLeave',
-        dragover    : 'dragOver',
-        drop        : 'drop',
-        dragend     : 'dragEnd'
-      },
-
-      /**
-        The root DOM element to which event listeners should be attached. Event
-        listeners will be attached to the document unless this is overridden.
-
-        Can be specified as a DOMElement or a selector string.
-
-        The default body is a string since this may be evaluated before document.body
-        exists in the DOM.
-
-        @private
-        @property rootElement
-        @type DOMElement
-        @default 'body'
-      */
-      rootElement: 'body',
-
-      /**
-        Sets up event listeners for standard browser events.
-
-        This will be called after the browser sends a `DOMContentReady` event. By
-        default, it will set up all of the listeners on the document body. If you
-        would like to register the listeners on a different element, set the event
-        dispatcher's `root` property.
-
-        @private
-        @method setup
-        @param addedEvents {Hash}
-      */
-      setup: function(addedEvents, rootElement) {
-        var event, events = get(this, 'events');
-
-        jQuery.extend(events, addedEvents || {});
-
-
-        if (!isNone(rootElement)) {
-          set(this, 'rootElement', rootElement);
-        }
-
-        rootElement = jQuery(get(this, 'rootElement'));
-
-        Ember.assert(fmt('You cannot use the same root element (%@) multiple times in an Ember.Application', [rootElement.selector || rootElement[0].tagName]), !rootElement.is('.ember-application'));
-        Ember.assert('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', !rootElement.closest('.ember-application').length);
-        Ember.assert('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.find('.ember-application').length);
-
-        rootElement.addClass('ember-application');
-
-        Ember.assert('Unable to add "ember-application" class to rootElement. Make sure you set rootElement to the body or an element in the body.', rootElement.is('.ember-application'));
-
-        for (event in events) {
-          if (events.hasOwnProperty(event)) {
-            this.setupHandler(rootElement, event, events[event]);
-          }
-        }
-      },
-
-      /**
-        Registers an event listener on the document. If the given event is
-        triggered, the provided event handler will be triggered on the target view.
-
-        If the target view does not implement the event handler, or if the handler
-        returns `false`, the parent view will be called. The event will continue to
-        bubble to each successive parent view until it reaches the top.
-
-        For example, to have the `mouseDown` method called on the target view when
-        a `mousedown` event is received from the browser, do the following:
-
-        ```javascript
-        setupHandler('mousedown', 'mouseDown');
-        ```
-
-        @private
-        @method setupHandler
-        @param {Element} rootElement
-        @param {String} event the browser-originated event to listen to
-        @param {String} eventName the name of the method to call on the view
-      */
-      setupHandler: function(rootElement, event, eventName) {
-        var self = this;
-
-        rootElement.on(event + '.ember', '.ember-view', function(evt, triggeringManager) {
-          var view = View.views[this.id],
-              result = true, manager = null;
-
-          manager = self._findNearestEventManager(view, eventName);
-
-          if (manager && manager !== triggeringManager) {
-            result = self._dispatchEvent(manager, evt, eventName, view);
-          } else if (view) {
-            result = self._bubbleEvent(view, evt, eventName);
-          } else {
-            evt.stopPropagation();
-          }
-
-          return result;
-        });
-
-        rootElement.on(event + '.ember', '[data-ember-action]', function(evt) {
-          //ES6TODO: Needed for ActionHelper (generally not available in ember-views test suite)
-          if (!ActionHelper) { ActionHelper = requireModule("ember-routing/helpers/action")["ActionHelper"]; };
-
-          var actionId = jQuery(evt.currentTarget).attr('data-ember-action'),
-              action   = ActionHelper.registeredActions[actionId];
-
-          // We have to check for action here since in some cases, jQuery will trigger
-          // an event on `removeChild` (i.e. focusout) after we've already torn down the
-          // action handlers for the view.
-          if (action && action.eventName === eventName) {
-            return action.handler(evt);
-          }
-        });
-      },
-
-      _findNearestEventManager: function(view, eventName) {
-        var manager = null;
-
-        while (view) {
-          manager = get(view, 'eventManager');
-          if (manager && manager[eventName]) { break; }
-
-          view = get(view, 'parentView');
-        }
-
-        return manager;
-      },
-
-      _dispatchEvent: function(object, evt, eventName, view) {
-        var result = true;
-
-        var handler = object[eventName];
-        if (typeOf(handler) === 'function') {
-          result = run(object, handler, evt, view);
-          // Do not preventDefault in eventManagers.
-          evt.stopPropagation();
-        }
-        else {
-          result = this._bubbleEvent(view, evt, eventName);
-        }
-
-        return result;
-      },
-
-      _bubbleEvent: function(view, evt, eventName) {
-        return run(view, view.handleEvent, eventName, evt);
-      },
-
-      destroy: function() {
-        var rootElement = get(this, 'rootElement');
-        jQuery(rootElement).off('.ember', '**').removeClass('ember-application');
-        return this._super();
-      }
-    });
-
-    __exports__["default"] = EventDispatcher;
-  });
-define("ember-views/system/ext", 
-  ["ember-metal/run_loop"],
-  function(__dependency1__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var run = __dependency1__["default"];
-
-    // Add a new named queue for rendering views that happens
-    // after bindings have synced, and a queue for scheduling actions
-    // that that should occur after view rendering.
-    var queues = run.queues;
-    run._addQueue('render', 'actions');
-    run._addQueue('afterRender', 'render');
-  });
-define("ember-views/system/jquery", 
-  ["ember-metal/core","ember-runtime/system/string","ember-metal/enumerable_utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var w = __dependency2__.w;
-
-    // ES6TODO: the functions on EnumerableUtils need their own exports
-    var EnumerableUtils = __dependency3__["default"];
-    var forEach = EnumerableUtils.forEach;
-
-    /**
-    Ember Views
-
-    @module ember
-    @submodule ember-views
-    @requires ember-runtime
-    @main ember-views
-    */
-
-    var jQuery = (Ember.imports && Ember.imports.jQuery) || (this && this.jQuery);
-    if (!jQuery && typeof require === 'function') {
-      jQuery = require('jquery');
-    }
-
-    Ember.assert("Ember Views require jQuery between 1.7 and 2.1", jQuery && (jQuery().jquery.match(/^((1\.(7|8|9|10|11))|(2\.(0|1)))(\.\d+)?(pre|rc\d?)?/) || Ember.ENV.FORCE_JQUERY));
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-    if (jQuery) {
-      // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents
-      var dragEvents = w('dragstart drag dragenter dragleave dragover drop dragend');
-
-      // Copies the `dataTransfer` property from a browser event object onto the
-      // jQuery event object for the specified events
-      forEach(dragEvents, function(eventName) {
-        jQuery.event.fixHooks[eventName] = { props: ['dataTransfer'] };
-      });
-    }
-
-    __exports__["default"] = jQuery;
-  });
-define("ember-views/system/render_buffer", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-views/system/utils","ember-views/system/jquery","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var Ember = __dependency1__["default"];
-    // jQuery
-
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var setInnerHTML = __dependency4__.setInnerHTML;
-    var jQuery = __dependency5__["default"];
-
-    function ClassSet() {
-      this.seen = {};
-      this.list = [];
-    };
-
-
-    ClassSet.prototype = {
-      add: function(string) {
-        if (string in this.seen) { return; }
-        this.seen[string] = true;
-
-        this.list.push(string);
-      },
-
-      toDOM: function() {
-        return this.list.join(" ");
-      }
-    };
-
-    var BAD_TAG_NAME_TEST_REGEXP = /[^a-zA-Z0-9\-]/;
-    var BAD_TAG_NAME_REPLACE_REGEXP = /[^a-zA-Z0-9\-]/g;
-
-    function stripTagName(tagName) {
-      if (!tagName) {
-        return tagName;
-      }
-
-      if (!BAD_TAG_NAME_TEST_REGEXP.test(tagName)) {
-        return tagName;
-      }
-
-      return tagName.replace(BAD_TAG_NAME_REPLACE_REGEXP, '');
-    }
-
-    var BAD_CHARS_REGEXP = /&(?!\w+;)|[<>"'`]/g;
-    var POSSIBLE_CHARS_REGEXP = /[&<>"'`]/;
-
-    function escapeAttribute(value) {
-      // Stolen shamelessly from Handlebars
-
-      var escape = {
-        "<": "&lt;",
-        ">": "&gt;",
-        '"': "&quot;",
-        "'": "&#x27;",
-        "`": "&#x60;"
-      };
-
-      var escapeChar = function(chr) {
-        return escape[chr] || "&amp;";
-      };
-
-      var string = value.toString();
-
-      if(!POSSIBLE_CHARS_REGEXP.test(string)) { return string; }
-      return string.replace(BAD_CHARS_REGEXP, escapeChar);
-    }
-
-    // IE 6/7 have bugs around setting names on inputs during creation.
-    // From http://msdn.microsoft.com/en-us/library/ie/ms536389(v=vs.85).aspx:
-    // "To include the NAME attribute at run time on objects created with the createElement method, use the eTag."
-    var canSetNameOnInputs = (function() {
-      var div = document.createElement('div'),
-          el = document.createElement('input');
-
-      el.setAttribute('name', 'foo');
-      div.appendChild(el);
-
-      return !!div.innerHTML.match('foo');
-    })();
-
-    /**
-      `Ember.RenderBuffer` gathers information regarding the a view and generates the
-      final representation. `Ember.RenderBuffer` will generate HTML which can be pushed
-      to the DOM.
-
-       ```javascript
-       var buffer = Ember.RenderBuffer('div');
-      ```
-
-      @class RenderBuffer
-      @namespace Ember
-      @constructor
-      @param {String} tagName tag name (such as 'div' or 'p') used for the buffer
-    */
-    var RenderBuffer = function(tagName) {
-      return new _RenderBuffer(tagName);
-    };
-
-    var _RenderBuffer = function(tagName) {
-      this.tagNames = [tagName || null];
-      this.buffer = "";
-    };
-
-    _RenderBuffer.prototype = {
-
-      // The root view's element
-      _element: null,
-
-      _hasElement: true,
-
-      /**
-        An internal set used to de-dupe class names when `addClass()` is
-        used. After each call to `addClass()`, the `classes` property
-        will be updated.
-
-        @private
-        @property elementClasses
-        @type Array
-        @default []
-      */
-      elementClasses: null,
-
-      /**
-        Array of class names which will be applied in the class attribute.
-
-        You can use `setClasses()` to set this property directly. If you
-        use `addClass()`, it will be maintained for you.
-
-        @property classes
-        @type Array
-        @default []
-      */
-      classes: null,
-
-      /**
-        The id in of the element, to be applied in the id attribute.
-
-        You should not set this property yourself, rather, you should use
-        the `id()` method of `Ember.RenderBuffer`.
-
-        @property elementId
-        @type String
-        @default null
-      */
-      elementId: null,
-
-      /**
-        A hash keyed on the name of the attribute and whose value will be
-        applied to that attribute. For example, if you wanted to apply a
-        `data-view="Foo.bar"` property to an element, you would set the
-        elementAttributes hash to `{'data-view':'Foo.bar'}`.
-
-        You should not maintain this hash yourself, rather, you should use
-        the `attr()` method of `Ember.RenderBuffer`.
-
-        @property elementAttributes
-        @type Hash
-        @default {}
-      */
-      elementAttributes: null,
-
-      /**
-        A hash keyed on the name of the properties and whose value will be
-        applied to that property. For example, if you wanted to apply a
-        `checked=true` property to an element, you would set the
-        elementProperties hash to `{'checked':true}`.
-
-        You should not maintain this hash yourself, rather, you should use
-        the `prop()` method of `Ember.RenderBuffer`.
-
-        @property elementProperties
-        @type Hash
-        @default {}
-      */
-      elementProperties: null,
-
-      /**
-        The tagname of the element an instance of `Ember.RenderBuffer` represents.
-
-        Usually, this gets set as the first parameter to `Ember.RenderBuffer`. For
-        example, if you wanted to create a `p` tag, then you would call
-
-        ```javascript
-        Ember.RenderBuffer('p')
-        ```
-
-        @property elementTag
-        @type String
-        @default null
-      */
-      elementTag: null,
-
-      /**
-        A hash keyed on the name of the style attribute and whose value will
-        be applied to that attribute. For example, if you wanted to apply a
-        `background-color:black;` style to an element, you would set the
-        elementStyle hash to `{'background-color':'black'}`.
-
-        You should not maintain this hash yourself, rather, you should use
-        the `style()` method of `Ember.RenderBuffer`.
-
-        @property elementStyle
-        @type Hash
-        @default {}
-      */
-      elementStyle: null,
-
-      /**
-        Nested `RenderBuffers` will set this to their parent `RenderBuffer`
-        instance.
-
-        @property parentBuffer
-        @type Ember._RenderBuffer
-      */
-      parentBuffer: null,
-
-      /**
-        Adds a string of HTML to the `RenderBuffer`.
-
-        @method push
-        @param {String} string HTML to push into the buffer
-        @chainable
-      */
-      push: function(string) {
-        this.buffer += string;
-        return this;
-      },
-
-      /**
-        Adds a class to the buffer, which will be rendered to the class attribute.
-
-        @method addClass
-        @param {String} className Class name to add to the buffer
-        @chainable
-      */
-      addClass: function(className) {
-        // lazily create elementClasses
-        this.elementClasses = (this.elementClasses || new ClassSet());
-        this.elementClasses.add(className);
-        this.classes = this.elementClasses.list;
-
-        return this;
-      },
-
-      setClasses: function(classNames) {
-        this.elementClasses = null;
-        var len = classNames.length, i;
-        for (i = 0; i < len; i++) {
-          this.addClass(classNames[i]);
-        }
-      },
-
-      /**
-        Sets the elementID to be used for the element.
-
-        @method id
-        @param {String} id
-        @chainable
-      */
-      id: function(id) {
-        this.elementId = id;
-        return this;
-      },
-
-      // duck type attribute functionality like jQuery so a render buffer
-      // can be used like a jQuery object in attribute binding scenarios.
-
-      /**
-        Adds an attribute which will be rendered to the element.
-
-        @method attr
-        @param {String} name The name of the attribute
-        @param {String} value The value to add to the attribute
-        @chainable
-        @return {Ember.RenderBuffer|String} this or the current attribute value
-      */
-      attr: function(name, value) {
-        var attributes = this.elementAttributes = (this.elementAttributes || {});
-
-        if (arguments.length === 1) {
-          return attributes[name];
-        } else {
-          attributes[name] = value;
-        }
-
-        return this;
-      },
-
-      /**
-        Remove an attribute from the list of attributes to render.
-
-        @method removeAttr
-        @param {String} name The name of the attribute
-        @chainable
-      */
-      removeAttr: function(name) {
-        var attributes = this.elementAttributes;
-        if (attributes) { delete attributes[name]; }
-
-        return this;
-      },
-
-      /**
-        Adds a property which will be rendered to the element.
-
-        @method prop
-        @param {String} name The name of the property
-        @param {String} value The value to add to the property
-        @chainable
-        @return {Ember.RenderBuffer|String} this or the current property value
-      */
-      prop: function(name, value) {
-        var properties = this.elementProperties = (this.elementProperties || {});
-
-        if (arguments.length === 1) {
-          return properties[name];
-        } else {
-          properties[name] = value;
-        }
-
-        return this;
-      },
-
-      /**
-        Remove an property from the list of properties to render.
-
-        @method removeProp
-        @param {String} name The name of the property
-        @chainable
-      */
-      removeProp: function(name) {
-        var properties = this.elementProperties;
-        if (properties) { delete properties[name]; }
-
-        return this;
-      },
-
-      /**
-        Adds a style to the style attribute which will be rendered to the element.
-
-        @method style
-        @param {String} name Name of the style
-        @param {String} value
-        @chainable
-      */
-      style: function(name, value) {
-        this.elementStyle = (this.elementStyle || {});
-
-        this.elementStyle[name] = value;
-        return this;
-      },
-
-      begin: function(tagName) {
-        this.tagNames.push(tagName || null);
-        return this;
-      },
-
-      pushOpeningTag: function() {
-        var tagName = this.currentTagName();
-        if (!tagName) { return; }
-
-        if (this._hasElement && !this._element && this.buffer.length === 0) {
-          this._element = this.generateElement();
-          return;
-        }
-
-        var buffer = this.buffer,
-            id = this.elementId,
-            classes = this.classes,
-            attrs = this.elementAttributes,
-            props = this.elementProperties,
-            style = this.elementStyle,
-            attr, prop;
-
-        buffer += '<' + stripTagName(tagName);
-
-        if (id) {
-          buffer += ' id="' + escapeAttribute(id) + '"';
-          this.elementId = null;
-        }
-        if (classes) {
-          buffer += ' class="' + escapeAttribute(classes.join(' ')) + '"';
-          this.classes = null;
-          this.elementClasses = null;
-        }
-
-        if (style) {
-          buffer += ' style="';
-
-          for (prop in style) {
-            if (style.hasOwnProperty(prop)) {
-              buffer += prop + ':' + escapeAttribute(style[prop]) + ';';
-            }
-          }
-
-          buffer += '"';
-
-          this.elementStyle = null;
-        }
-
-        if (attrs) {
-          for (attr in attrs) {
-            if (attrs.hasOwnProperty(attr)) {
-              buffer += ' ' + attr + '="' + escapeAttribute(attrs[attr]) + '"';
-            }
-          }
-
-          this.elementAttributes = null;
-        }
-
-        if (props) {
-          for (prop in props) {
-            if (props.hasOwnProperty(prop)) {
-              var value = props[prop];
-              if (value || typeof(value) === 'number') {
-                if (value === true) {
-                  buffer += ' ' + prop + '="' + prop + '"';
-                } else {
-                  buffer += ' ' + prop + '="' + escapeAttribute(props[prop]) + '"';
-                }
-              }
-            }
-          }
-
-          this.elementProperties = null;
-        }
-
-        buffer += '>';
-        this.buffer = buffer;
-      },
-
-      pushClosingTag: function() {
-        var tagName = this.tagNames.pop();
-        if (tagName) { this.buffer += '</' + stripTagName(tagName) + '>'; }
-      },
-
-      currentTagName: function() {
-        return this.tagNames[this.tagNames.length-1];
-      },
-
-      generateElement: function() {
-        var tagName = this.tagNames.pop(), // pop since we don't need to close
-            id = this.elementId,
-            classes = this.classes,
-            attrs = this.elementAttributes,
-            props = this.elementProperties,
-            style = this.elementStyle,
-            styleBuffer = '', attr, prop, tagString;
-
-        if (attrs && attrs.name && !canSetNameOnInputs) {
-          // IE allows passing a tag to createElement. See note on `canSetNameOnInputs` above as well.
-          tagString = '<'+stripTagName(tagName)+' name="'+escapeAttribute(attrs.name)+'">';
-        } else {
-          tagString = tagName;
-        }
-
-        var element = document.createElement(tagString),
-            $element = jQuery(element);
-
-        if (id) {
-          $element.attr('id', id);
-          this.elementId = null;
-        }
-        if (classes) {
-          $element.attr('class', classes.join(' '));
-          this.classes = null;
-          this.elementClasses = null;
-        }
-
-        if (style) {
-          for (prop in style) {
-            if (style.hasOwnProperty(prop)) {
-              styleBuffer += (prop + ':' + style[prop] + ';');
-            }
-          }
-
-          $element.attr('style', styleBuffer);
-
-          this.elementStyle = null;
-        }
-
-        if (attrs) {
-          for (attr in attrs) {
-            if (attrs.hasOwnProperty(attr)) {
-              $element.attr(attr, attrs[attr]);
-            }
-          }
-
-          this.elementAttributes = null;
-        }
-
-        if (props) {
-          for (prop in props) {
-            if (props.hasOwnProperty(prop)) {
-              $element.prop(prop, props[prop]);
-            }
-          }
-
-          this.elementProperties = null;
-        }
-
-        return element;
-      },
-
-      /**
-        @method element
-        @return {DOMElement} The element corresponding to the generated HTML
-          of this buffer
-      */
-      element: function() {
-        var html = this.innerString();
-
-        if (html) {
-          this._element = setInnerHTML(this._element, html);
-        }
-
-        return this._element;
-      },
-
-      /**
-        Generates the HTML content for this buffer.
-
-        @method string
-        @return {String} The generated HTML
-      */
-      string: function() {
-        if (this._hasElement && this._element) {
-          // Firefox versions < 11 do not have support for element.outerHTML.
-          var thisElement = this.element(), outerHTML = thisElement.outerHTML;
-          if (typeof outerHTML === 'undefined') {
-            return jQuery('<div/>').append(thisElement).html();
-          }
-          return outerHTML;
-        } else {
-          return this.innerString();
-        }
-      },
-
-      innerString: function() {
-        return this.buffer;
-      }
-    };
-
-    __exports__["default"] = RenderBuffer;
-  });
-define("ember-views/system/utils", 
-  ["ember-metal/core","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    /* BEGIN METAMORPH HELPERS */
-
-    // Internet Explorer prior to 9 does not allow setting innerHTML if the first element
-    // is a "zero-scope" element. This problem can be worked around by making
-    // the first node an invisible text node. We, like Modernizr, use &shy;
-
-    var needsShy = typeof document !== 'undefined' && (function() {
-      var testEl = document.createElement('div');
-      testEl.innerHTML = "<div></div>";
-      testEl.firstChild.innerHTML = "<script></script>";
-      return testEl.firstChild.innerHTML === '';
-    })();
-
-    // IE 8 (and likely earlier) likes to move whitespace preceeding
-    // a script tag to appear after it. This means that we can
-    // accidentally remove whitespace when updating a morph.
-    var movesWhitespace = typeof document !== 'undefined' && (function() {
-      var testEl = document.createElement('div');
-      testEl.innerHTML = "Test: <script type='text/x-placeholder'></script>Value";
-      return testEl.childNodes[0].nodeValue === 'Test:' &&
-              testEl.childNodes[2].nodeValue === ' Value';
-    })();
-
-    // Use this to find children by ID instead of using jQuery
-    var findChildById = function(element, id) {
-      if (element.getAttribute('id') === id) { return element; }
-
-      var len = element.childNodes.length, idx, node, found;
-      for (idx=0; idx<len; idx++) {
-        node = element.childNodes[idx];
-        found = node.nodeType === 1 && findChildById(node, id);
-        if (found) { return found; }
-      }
-    };
-
-    var setInnerHTMLWithoutFix = function(element, html) {
-      if (needsShy) {
-        html = '&shy;' + html;
-      }
-
-      var matches = [];
-      if (movesWhitespace) {
-        // Right now we only check for script tags with ids with the
-        // goal of targeting morphs.
-        html = html.replace(/(\s+)(<script id='([^']+)')/g, function(match, spaces, tag, id) {
-          matches.push([id, spaces]);
-          return tag;
-        });
-      }
-
-      element.innerHTML = html;
-
-      // If we have to do any whitespace adjustments do them now
-      if (matches.length > 0) {
-        var len = matches.length, idx;
-        for (idx=0; idx<len; idx++) {
-          var script = findChildById(element, matches[idx][0]),
-              node = document.createTextNode(matches[idx][1]);
-          script.parentNode.insertBefore(node, script);
-        }
-      }
-
-      if (needsShy) {
-        var shyElement = element.firstChild;
-        while (shyElement.nodeType === 1 && !shyElement.nodeName) {
-          shyElement = shyElement.firstChild;
-        }
-        if (shyElement.nodeType === 3 && shyElement.nodeValue.charAt(0) === "\u00AD") {
-          shyElement.nodeValue = shyElement.nodeValue.slice(1);
-        }
-      }
-    };
-
-    /* END METAMORPH HELPERS */
-
-
-    var innerHTMLTags = {};
-    var canSetInnerHTML = function(tagName) {
-      if (innerHTMLTags[tagName] !== undefined) {
-        return innerHTMLTags[tagName];
-      }
-
-      var canSet = true;
-
-      // IE 8 and earlier don't allow us to do innerHTML on select
-      if (tagName.toLowerCase() === 'select') {
-        var el = document.createElement('select');
-        setInnerHTMLWithoutFix(el, '<option value="test">Test</option>');
-        canSet = el.options.length === 1;
-      }
-
-      innerHTMLTags[tagName] = canSet;
-
-      return canSet;
-    };
-
-    var setInnerHTML = function(element, html) {
-      var tagName = element.tagName;
-
-      if (canSetInnerHTML(tagName)) {
-        setInnerHTMLWithoutFix(element, html);
-      } else {
-        // Firefox versions < 11 do not have support for element.outerHTML.
-        var outerHTML = element.outerHTML || new XMLSerializer().serializeToString(element);
-        Ember.assert("Can't set innerHTML on "+element.tagName+" in this browser", outerHTML);
-
-        var startTag = outerHTML.match(new RegExp("<"+tagName+"([^>]*)>", 'i'))[0],
-            endTag = '</'+tagName+'>';
-
-        var wrapper = document.createElement('div');
-        setInnerHTMLWithoutFix(wrapper, startTag + html + endTag);
-        element = wrapper.firstChild;
-        while (element.tagName !== tagName) {
-          element = element.nextSibling;
-        }
-      }
-
-      return element;
-    };
-
-    function isSimpleClick(event) {
-      var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey,
-          secondaryClick = event.which > 1; // IE9 may return undefined
-
-      return !modifier && !secondaryClick;
-    }
-
-    __exports__.setInnerHTML = setInnerHTML;
-    __exports__.isSimpleClick = isSimpleClick;
-  });
-define("ember-views/views/collection_view", 
-  ["ember-metal/core","ember-metal/platform","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-views/views/container_view","ember-views/views/view","ember-metal/mixin","ember-runtime/mixins/array","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
-    "use strict";
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var create = __dependency2__.create;
-    var merge = __dependency3__["default"];
-    var get = __dependency4__.get;
-    var set = __dependency5__.set;
-    var fmt = __dependency6__.fmt;
-    var ContainerView = __dependency7__["default"];
-    var CoreView = __dependency8__.CoreView;
-    var View = __dependency8__.View;
-    var observer = __dependency9__.observer;
-    var beforeObserver = __dependency9__.beforeObserver;
-    var EmberArray = __dependency10__["default"];
-
-    /**
-      `Ember.CollectionView` is an `Ember.View` descendent responsible for managing
-      a collection (an array or array-like object) by maintaining a child view object
-      and associated DOM representation for each item in the array and ensuring
-      that child views and their associated rendered HTML are updated when items in
-      the array are added, removed, or replaced.
-
-      ## Setting content
-
-      The managed collection of objects is referenced as the `Ember.CollectionView`
-      instance's `content` property.
-
-      ```javascript
-      someItemsView = Ember.CollectionView.create({
-        content: ['A', 'B','C']
-      })
-      ```
-
-      The view for each item in the collection will have its `content` property set
-      to the item.
-
-      ## Specifying itemViewClass
-
-      By default the view class for each item in the managed collection will be an
-      instance of `Ember.View`. You can supply a different class by setting the
-      `CollectionView`'s `itemViewClass` property.
-
-      Given an empty `<body>` and the following code:
-
-      ```javascript
-      someItemsView = Ember.CollectionView.create({
-        classNames: ['a-collection'],
-        content: ['A','B','C'],
-        itemViewClass: Ember.View.extend({
-          template: Ember.Handlebars.compile("the letter: {{view.content}}")
-        })
-      });
-
-      someItemsView.appendTo('body');
-      ```
-
-      Will result in the following HTML structure
-
-      ```html
-      <div class="ember-view a-collection">
-        <div class="ember-view">the letter: A</div>
-        <div class="ember-view">the letter: B</div>
-        <div class="ember-view">the letter: C</div>
-      </div>
-      ```
-
-      ## Automatic matching of parent/child tagNames
-
-      Setting the `tagName` property of a `CollectionView` to any of
-      "ul", "ol", "table", "thead", "tbody", "tfoot", "tr", or "select" will result
-      in the item views receiving an appropriately matched `tagName` property.
-
-      Given an empty `<body>` and the following code:
-
-      ```javascript
-      anUnorderedListView = Ember.CollectionView.create({
-        tagName: 'ul',
-        content: ['A','B','C'],
-        itemViewClass: Ember.View.extend({
-          template: Ember.Handlebars.compile("the letter: {{view.content}}")
-        })
-      });
-
-      anUnorderedListView.appendTo('body');
-      ```
-
-      Will result in the following HTML structure
-
-      ```html
-      <ul class="ember-view a-collection">
-        <li class="ember-view">the letter: A</li>
-        <li class="ember-view">the letter: B</li>
-        <li class="ember-view">the letter: C</li>
-      </ul>
-      ```
-
-      Additional `tagName` pairs can be provided by adding to
-      `Ember.CollectionView.CONTAINER_MAP `
-
-      ```javascript
-      Ember.CollectionView.CONTAINER_MAP['article'] = 'section'
-      ```
-
-      ## Programmatic creation of child views
-
-      For cases where additional customization beyond the use of a single
-      `itemViewClass` or `tagName` matching is required CollectionView's
-      `createChildView` method can be overidden:
-
-      ```javascript
-      CustomCollectionView = Ember.CollectionView.extend({
-        createChildView: function(viewClass, attrs) {
-          if (attrs.content.kind == 'album') {
-            viewClass = App.AlbumView;
-          } else {
-            viewClass = App.SongView;
-          }
-          return this._super(viewClass, attrs);
-        }
-      });
-      ```
-
-      ## Empty View
-
-      You can provide an `Ember.View` subclass to the `Ember.CollectionView`
-      instance as its `emptyView` property. If the `content` property of a
-      `CollectionView` is set to `null` or an empty array, an instance of this view
-      will be the `CollectionView`s only child.
-
-      ```javascript
-      aListWithNothing = Ember.CollectionView.create({
-        classNames: ['nothing']
-        content: null,
-        emptyView: Ember.View.extend({
-          template: Ember.Handlebars.compile("The collection is empty")
-        })
-      });
-
-      aListWithNothing.appendTo('body');
-      ```
-
-      Will result in the following HTML structure
-
-      ```html
-      <div class="ember-view nothing">
-        <div class="ember-view">
-          The collection is empty
-        </div>
-      </div>
-      ```
-
-      ## Adding and Removing items
-
-      The `childViews` property of a `CollectionView` should not be directly
-      manipulated. Instead, add, remove, replace items from its `content` property.
-      This will trigger appropriate changes to its rendered HTML.
-
-
-      @class CollectionView
-      @namespace Ember
-      @extends Ember.ContainerView
-      @since Ember 0.9
-    */
-    var CollectionView = ContainerView.extend({
-
-      /**
-        A list of items to be displayed by the `Ember.CollectionView`.
-
-        @property content
-        @type Ember.Array
-        @default null
-      */
-      content: null,
-
-      /**
-        This provides metadata about what kind of empty view class this
-        collection would like if it is being instantiated from another
-        system (like Handlebars)
-
-        @private
-        @property emptyViewClass
-      */
-      emptyViewClass: View,
-
-      /**
-        An optional view to display if content is set to an empty array.
-
-        @property emptyView
-        @type Ember.View
-        @default null
-      */
-      emptyView: null,
-
-      /**
-        @property itemViewClass
-        @type Ember.View
-        @default Ember.View
-      */
-      itemViewClass: View,
-
-      /**
-        Setup a CollectionView
-
-        @method init
-      */
-      init: function() {
-        var ret = this._super();
-        this._contentDidChange();
-        return ret;
-      },
-
-      /**
-        Invoked when the content property is about to change. Notifies observers that the
-        entire array content will change.
-
-        @private
-        @method _contentWillChange
-      */
-      _contentWillChange: beforeObserver('content', function() {
-        var content = this.get('content');
-
-        if (content) { content.removeArrayObserver(this); }
-        var len = content ? get(content, 'length') : 0;
-        this.arrayWillChange(content, 0, len);
-      }),
-
-      /**
-        Check to make sure that the content has changed, and if so,
-        update the children directly. This is always scheduled
-        asynchronously, to allow the element to be created before
-        bindings have synchronized and vice versa.
-
-        @private
-        @method _contentDidChange
-      */
-      _contentDidChange: observer('content', function() {
-        var content = get(this, 'content');
-
-        if (content) {
-          this._assertArrayLike(content);
-          content.addArrayObserver(this);
-        }
-
-        var len = content ? get(content, 'length') : 0;
-        this.arrayDidChange(content, 0, null, len);
-      }),
-
-      /**
-        Ensure that the content implements Ember.Array
-
-        @private
-        @method _assertArrayLike
-      */
-      _assertArrayLike: function(content) {
-        Ember.assert(fmt("an Ember.CollectionView's content must implement Ember.Array. You passed %@", [content]), EmberArray.detect(content));
-      },
-
-      /**
-        Removes the content and content observers.
-
-        @method destroy
-      */
-      destroy: function() {
-        if (!this._super()) { return; }
-
-        var content = get(this, 'content');
-        if (content) { content.removeArrayObserver(this); }
-
-        if (this._createdEmptyView) {
-          this._createdEmptyView.destroy();
-        }
-
-        return this;
-      },
-
-      /**
-        Called when a mutation to the underlying content array will occur.
-
-        This method will remove any views that are no longer in the underlying
-        content array.
-
-        Invokes whenever the content array itself will change.
-
-        @method arrayWillChange
-        @param {Array} content the managed collection of objects
-        @param {Number} start the index at which the changes will occurr
-        @param {Number} removed number of object to be removed from content
-      */
-      arrayWillChange: function(content, start, removedCount) {
-        // If the contents were empty before and this template collection has an
-        // empty view remove it now.
-        var emptyView = get(this, 'emptyView');
-        if (emptyView && emptyView instanceof View) {
-          emptyView.removeFromParent();
-        }
-
-        // Loop through child views that correspond with the removed items.
-        // Note that we loop from the end of the array to the beginning because
-        // we are mutating it as we go.
-        var childViews = this._childViews, childView, idx, len;
-
-        len = this._childViews.length;
-
-        var removingAll = removedCount === len;
-
-        if (removingAll) {
-          this.currentState.empty(this);
-          this.invokeRecursively(function(view) {
-            view.removedFromDOM = true;
-          }, false);
-        }
-
-        for (idx = start + removedCount - 1; idx >= start; idx--) {
-          childView = childViews[idx];
-          childView.destroy();
-        }
-      },
-
-      /**
-        Called when a mutation to the underlying content array occurs.
-
-        This method will replay that mutation against the views that compose the
-        `Ember.CollectionView`, ensuring that the view reflects the model.
-
-        This array observer is added in `contentDidChange`.
-
-        @method arrayDidChange
-        @param {Array} content the managed collection of objects
-        @param {Number} start the index at which the changes occurred
-        @param {Number} removed number of object removed from content
-        @param {Number} added number of object added to content
-      */
-      arrayDidChange: function(content, start, removed, added) {
-        var addedViews = [], view, item, idx, len, itemViewClass,
-          emptyView;
-
-        len = content ? get(content, 'length') : 0;
-
-        if (len) {
-          itemViewClass = get(this, 'itemViewClass');
-
-          if ('string' === typeof itemViewClass) {
-            itemViewClass = get(itemViewClass) || itemViewClass;
-          }
-
-          Ember.assert(fmt("itemViewClass must be a subclass of Ember.View, not %@",
-                           [itemViewClass]),
-                           'string' === typeof itemViewClass || View.detect(itemViewClass));
-
-          for (idx = start; idx < start+added; idx++) {
-            item = content.objectAt(idx);
-
-            view = this.createChildView(itemViewClass, {
-              content: item,
-              contentIndex: idx
-            });
-
-            addedViews.push(view);
-          }
-        } else {
-          emptyView = get(this, 'emptyView');
-
-          if (!emptyView) { return; }
-
-          if ('string' === typeof emptyView) {
-            emptyView = get(emptyView) || emptyView;
-          }
-
-          emptyView = this.createChildView(emptyView);
-          addedViews.push(emptyView);
-          set(this, 'emptyView', emptyView);
-
-          if (CoreView.detect(emptyView)) {
-            this._createdEmptyView = emptyView;
-          }
-        }
-
-        this.replace(start, 0, addedViews);
-      },
-
-      /**
-        Instantiates a view to be added to the childViews array during view
-        initialization. You generally will not call this method directly unless
-        you are overriding `createChildViews()`. Note that this method will
-        automatically configure the correct settings on the new view instance to
-        act as a child of the parent.
-
-        The tag name for the view will be set to the tagName of the viewClass
-        passed in.
-
-        @method createChildView
-        @param {Class} viewClass
-        @param {Hash} [attrs] Attributes to add
-        @return {Ember.View} new instance
-      */
-      createChildView: function(view, attrs) {
-        view = this._super(view, attrs);
-
-        var itemTagName = get(view, 'tagName');
-
-        if (itemTagName === null || itemTagName === undefined) {
-          itemTagName = CollectionView.CONTAINER_MAP[get(this, 'tagName')];
-          set(view, 'tagName', itemTagName);
-        }
-
-        return view;
-      }
-    });
-
-    /**
-      A map of parent tags to their default child tags. You can add
-      additional parent tags if you want collection views that use
-      a particular parent tag to default to a child tag.
-
-      @property CONTAINER_MAP
-      @type Hash
-      @static
-      @final
-    */
-    CollectionView.CONTAINER_MAP = {
-      ul: 'li',
-      ol: 'li',
-      table: 'tr',
-      thead: 'tr',
-      tbody: 'tr',
-      tfoot: 'tr',
-      tr: 'td',
-      select: 'option'
-    };
-
-    __exports__["default"] = CollectionView;
-  });
-define("ember-views/views/component", 
-  ["ember-metal/core","ember-views/mixins/component_template_deprecation","ember-runtime/mixins/target_action_support","ember-views/views/view","ember-metal/property_get","ember-metal/property_set","ember-metal/is_none","ember-metal/computed","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.Handlebars
-
-    var ComponentTemplateDeprecation = __dependency2__["default"];
-    var TargetActionSupport = __dependency3__["default"];
-    var View = __dependency4__.View;var get = __dependency5__.get;
-    var set = __dependency6__.set;
-    var isNone = __dependency7__.isNone;
-
-    var computed = __dependency8__.computed;
-
-    var a_slice = Array.prototype.slice;
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    /**
-      An `Ember.Component` is a view that is completely
-      isolated. Property access in its templates go
-      to the view object and actions are targeted at
-      the view object. There is no access to the
-      surrounding context or outer controller; all
-      contextual information must be passed in.
-
-      The easiest way to create an `Ember.Component` is via
-      a template. If you name a template
-      `components/my-foo`, you will be able to use
-      `{{my-foo}}` in other templates, which will make
-      an instance of the isolated component.
-
-      ```handlebars
-      {{app-profile person=currentUser}}
-      ```
-
-      ```handlebars
-      <!-- app-profile template -->
-      <h1>{{person.title}}</h1>
-      <img {{bind-attr src=person.avatar}}>
-      <p class='signature'>{{person.signature}}</p>
-      ```
-
-      You can use `yield` inside a template to
-      include the **contents** of any block attached to
-      the component. The block will be executed in the
-      context of the surrounding context or outer controller:
-
-      ```handlebars
-      {{#app-profile person=currentUser}}
-        <p>Admin mode</p>
-        {{! Executed in the controller's context. }}
-      {{/app-profile}}
-      ```
-
-      ```handlebars
-      <!-- app-profile template -->
-      <h1>{{person.title}}</h1>
-      {{! Executed in the components context. }}
-      {{yield}} {{! block contents }}
-      ```
-
-      If you want to customize the component, in order to
-      handle events or actions, you implement a subclass
-      of `Ember.Component` named after the name of the
-      component. Note that `Component` needs to be appended to the name of
-      your subclass like `AppProfileComponent`.
-
-      For example, you could implement the action
-      `hello` for the `app-profile` component:
-
-      ```javascript
-      App.AppProfileComponent = Ember.Component.extend({
-        actions: {
-          hello: function(name) {
-            console.log("Hello", name);
-          }
-        }
-      });
-      ```
-
-      And then use it in the component's template:
-
-      ```handlebars
-      <!-- app-profile template -->
-
-      <h1>{{person.title}}</h1>
-      {{yield}} <!-- block contents -->
-
-      <button {{action 'hello' person.name}}>
-        Say Hello to {{person.name}}
-      </button>
-      ```
-
-      Components must have a `-` in their name to avoid
-      conflicts with built-in controls that wrap HTML
-      elements. This is consistent with the same
-      requirement in web components.
-
-      @class Component
-      @namespace Ember
-      @extends Ember.View
-    */
-    var Component = View.extend(TargetActionSupport, ComponentTemplateDeprecation, {
-      init: function() {
-        this._super();
-        set(this, 'context', this);
-        set(this, 'controller', this);
-      },
-
-      defaultLayout: function(context, options){
-        Ember.Handlebars.helpers['yield'].call(context, options);
-      },
-
-      /**
-      A components template property is set by passing a block
-      during its invocation. It is executed within the parent context.
-
-      Example:
-
-      ```handlebars
-      {{#my-component}}
-        // something that is run in the context
-        // of the parent context
-      {{/my-component}}
-      ```
-
-      Specifying a template directly to a component is deprecated without
-      also specifying the layout property.
-
-      @deprecated
-      @property template
-      */
-      template: computed(function(key, value) {
-        if (value !== undefined) { return value; }
-
-        var templateName = get(this, 'templateName'),
-            template = this.templateForName(templateName, 'template');
-
-        Ember.assert("You specified the templateName " + templateName + " for " + this + ", but it did not exist.", !templateName || template);
-
-        return template || get(this, 'defaultTemplate');
-      }).property('templateName'),
-
-      /**
-      Specifying a components `templateName` is deprecated without also
-      providing the `layout` or `layoutName` properties.
-
-      @deprecated
-      @property templateName
-      */
-      templateName: null,
-
-      // during render, isolate keywords
-      cloneKeywords: function() {
-        return {
-          view: this,
-          controller: this
-        };
-      },
-
-      _yield: function(context, options) {
-        var view = options.data.view,
-            parentView = this._parentView,
-            template = get(this, 'template');
-
-        if (template) {
-          Ember.assert("A Component must have a parent view in order to yield.", parentView);
-
-          view.appendChild(View, {
-            isVirtual: true,
-            tagName: '',
-            _contextView: parentView,
-            template: template,
-            context: get(parentView, 'context'),
-            controller: get(parentView, 'controller'),
-            templateData: { keywords: parentView.cloneKeywords() }
-          });
-        }
-      },
-
-      /**
-        If the component is currently inserted into the DOM of a parent view, this
-        property will point to the controller of the parent view.
-
-        @property targetObject
-        @type Ember.Controller
-        @default null
-      */
-      targetObject: computed(function(key) {
-        var parentView = get(this, '_parentView');
-        return parentView ? get(parentView, 'controller') : null;
-      }).property('_parentView'),
-
-      /**
-        Triggers a named action on the controller context where the component is used if
-        this controller has registered for notifications of the action.
-
-        For example a component for playing or pausing music may translate click events
-        into action notifications of "play" or "stop" depending on some internal state
-        of the component:
-
-
-        ```javascript
-        App.PlayButtonComponent = Ember.Component.extend({
-          click: function(){
-            if (this.get('isPlaying')) {
-              this.sendAction('play');
-            } else {
-              this.sendAction('stop');
-            }
-          }
-        });
-        ```
-
-        When used inside a template these component actions are configured to
-        trigger actions in the outer application context:
-
-        ```handlebars
-        {{! application.hbs }}
-        {{play-button play="musicStarted" stop="musicStopped"}}
-        ```
-
-        When the component receives a browser `click` event it translate this
-        interaction into application-specific semantics ("play" or "stop") and
-        triggers the specified action name on the controller for the template
-        where the component is used:
-
-
-        ```javascript
-        App.ApplicationController = Ember.Controller.extend({
-          actions: {
-            musicStarted: function(){
-              // called when the play button is clicked
-              // and the music started playing
-            },
-            musicStopped: function(){
-              // called when the play button is clicked
-              // and the music stopped playing
-            }
-          }
-        });
-        ```
-
-        If no action name is passed to `sendAction` a default name of "action"
-        is assumed.
-
-        ```javascript
-        App.NextButtonComponent = Ember.Component.extend({
-          click: function(){
-            this.sendAction();
-          }
-        });
-        ```
-
-        ```handlebars
-        {{! application.hbs }}
-        {{next-button action="playNextSongInAlbum"}}
-        ```
-
-        ```javascript
-        App.ApplicationController = Ember.Controller.extend({
-          actions: {
-            playNextSongInAlbum: function(){
-              ...
-            }
-          }
-        });
-        ```
-
-        @method sendAction
-        @param [action] {String} the action to trigger
-        @param [context] {*} a context to send with the action
-      */
-      sendAction: function(action) {
-        var actionName,
-            contexts = a_slice.call(arguments, 1);
-
-        // Send the default action
-        if (action === undefined) {
-          actionName = get(this, 'action');
-          Ember.assert("The default action was triggered on the component " + this.toString() +
-                       ", but the action name (" + actionName + ") was not a string.",
-                       isNone(actionName) || typeof actionName === 'string');
-        } else {
-          actionName = get(this, action);
-          Ember.assert("The " + action + " action was triggered on the component " +
-                       this.toString() + ", but the action name (" + actionName +
-                       ") was not a string.",
-                       isNone(actionName) || typeof actionName === 'string');
-        }
-
-        // If no action name for that action could be found, just abort.
-        if (actionName === undefined) { return; }
-
-        this.triggerAction({
-          action: actionName,
-          actionContext: contexts
-        });
-      }
-    });
-
-    __exports__["default"] = Component;
-  });
-define("ember-views/views/container_view", 
-  ["ember-metal/core","ember-metal/merge","ember-runtime/mixins/mutable_array","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-views/views/states","ember-metal/error","ember-metal/enumerable_utils","ember-metal/computed","ember-metal/run_loop","ember-metal/properties","ember-views/system/render_buffer","ember-metal/mixin","ember-runtime/system/native_array","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.K
-
-    var merge = __dependency2__["default"];
-    var MutableArray = __dependency3__["default"];
-    var get = __dependency4__.get;
-    var set = __dependency5__.set;
-
-    var View = __dependency6__.View;
-    var ViewCollection = __dependency6__.ViewCollection;
-    var cloneStates = __dependency7__.cloneStates;
-    var EmberViewStates = __dependency7__.states;
-
-    var EmberError = __dependency8__["default"];
-
-    // ES6TODO: functions on EnumerableUtils should get their own export
-    var EnumerableUtils = __dependency9__["default"];
-    var forEach = EnumerableUtils.forEach;
-
-    var computed = __dependency10__.computed;
-    var run = __dependency11__["default"];
-    var defineProperty = __dependency12__.defineProperty;
-    var RenderBuffer = __dependency13__["default"];
-    var observer = __dependency14__.observer;
-    var beforeObserver = __dependency14__.beforeObserver;
-    var A = __dependency15__.A;
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var states = cloneStates(EmberViewStates);
-
-    /**
-      A `ContainerView` is an `Ember.View` subclass that implements `Ember.MutableArray`
-      allowing programmatic management of its child views.
-
-      ## Setting Initial Child Views
-
-      The initial array of child views can be set in one of two ways. You can
-      provide a `childViews` property at creation time that contains instance of
-      `Ember.View`:
-
-      ```javascript
-      aContainer = Ember.ContainerView.create({
-        childViews: [Ember.View.create(), Ember.View.create()]
-      });
-      ```
-
-      You can also provide a list of property names whose values are instances of
-      `Ember.View`:
-
-      ```javascript
-      aContainer = Ember.ContainerView.create({
-        childViews: ['aView', 'bView', 'cView'],
-        aView: Ember.View.create(),
-        bView: Ember.View.create(),
-        cView: Ember.View.create()
-      });
-      ```
-
-      The two strategies can be combined:
-
-      ```javascript
-      aContainer = Ember.ContainerView.create({
-        childViews: ['aView', Ember.View.create()],
-        aView: Ember.View.create()
-      });
-      ```
-
-      Each child view's rendering will be inserted into the container's rendered
-      HTML in the same order as its position in the `childViews` property.
-
-      ## Adding and Removing Child Views
-
-      The container view implements `Ember.MutableArray` allowing programmatic management of its child views.
-
-      To remove a view, pass that view into a `removeObject` call on the container view.
-
-      Given an empty `<body>` the following code
-
-      ```javascript
-      aContainer = Ember.ContainerView.create({
-        classNames: ['the-container'],
-        childViews: ['aView', 'bView'],
-        aView: Ember.View.create({
-          template: Ember.Handlebars.compile("A")
-        }),
-        bView: Ember.View.create({
-          template: Ember.Handlebars.compile("B")
-        })
-      });
-
-      aContainer.appendTo('body');
-      ```
-
-      Results in the HTML
-
-      ```html
-      <div class="ember-view the-container">
-        <div class="ember-view">A</div>
-        <div class="ember-view">B</div>
-      </div>
-      ```
-
-      Removing a view
-
-      ```javascript
-      aContainer.toArray();  // [aContainer.aView, aContainer.bView]
-      aContainer.removeObject(aContainer.get('bView'));
-      aContainer.toArray();  // [aContainer.aView]
-      ```
-
-      Will result in the following HTML
-
-      ```html
-      <div class="ember-view the-container">
-        <div class="ember-view">A</div>
-      </div>
-      ```
-
-      Similarly, adding a child view is accomplished by adding `Ember.View` instances to the
-      container view.
-
-      Given an empty `<body>` the following code
-
-      ```javascript
-      aContainer = Ember.ContainerView.create({
-        classNames: ['the-container'],
-        childViews: ['aView', 'bView'],
-        aView: Ember.View.create({
-          template: Ember.Handlebars.compile("A")
-        }),
-        bView: Ember.View.create({
-          template: Ember.Handlebars.compile("B")
-        })
-      });
-
-      aContainer.appendTo('body');
-      ```
-
-      Results in the HTML
-
-      ```html
-      <div class="ember-view the-container">
-        <div class="ember-view">A</div>
-        <div class="ember-view">B</div>
-      </div>
-      ```
-
-      Adding a view
-
-      ```javascript
-      AnotherViewClass = Ember.View.extend({
-        template: Ember.Handlebars.compile("Another view")
-      });
-
-      aContainer.toArray();  // [aContainer.aView, aContainer.bView]
-      aContainer.pushObject(AnotherViewClass.create());
-      aContainer.toArray(); // [aContainer.aView, aContainer.bView, <AnotherViewClass instance>]
-      ```
-
-      Will result in the following HTML
-
-      ```html
-      <div class="ember-view the-container">
-        <div class="ember-view">A</div>
-        <div class="ember-view">B</div>
-        <div class="ember-view">Another view</div>
-      </div>
-      ```
-
-      ## Templates and Layout
-
-      A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
-      `defaultLayout` property on a container view will not result in the template
-      or layout being rendered. The HTML contents of a `Ember.ContainerView`'s DOM
-      representation will only be the rendered HTML of its child views.
-
-      @class ContainerView
-      @namespace Ember
-      @extends Ember.View
-    */
-    var ContainerView = View.extend(MutableArray, {
-      states: states,
-
-      init: function() {
-        this._super();
-
-        var childViews = get(this, 'childViews');
-
-        // redefine view's childViews property that was obliterated
-        defineProperty(this, 'childViews', View.childViewsProperty);
-
-        var _childViews = this._childViews;
-
-        forEach(childViews, function(viewName, idx) {
-          var view;
-
-          if ('string' === typeof viewName) {
-            view = get(this, viewName);
-            view = this.createChildView(view);
-            set(this, viewName, view);
-          } else {
-            view = this.createChildView(viewName);
-          }
-
-          _childViews[idx] = view;
-        }, this);
-
-        var currentView = get(this, 'currentView');
-        if (currentView) {
-          if (!_childViews.length) { _childViews = this._childViews = this._childViews.slice(); }
-          _childViews.push(this.createChildView(currentView));
-        }
-      },
-
-      replace: function(idx, removedCount, addedViews) {
-        var addedCount = addedViews ? get(addedViews, 'length') : 0;
-        var self = this;
-        Ember.assert("You can't add a child to a container that is already a child of another view", A(addedViews).every(function(item) { return !get(item, '_parentView') || get(item, '_parentView') === self; }));
-
-        this.arrayContentWillChange(idx, removedCount, addedCount);
-        this.childViewsWillChange(this._childViews, idx, removedCount);
-
-        if (addedCount === 0) {
-          this._childViews.splice(idx, removedCount) ;
-        } else {
-          var args = [idx, removedCount].concat(addedViews);
-          if (addedViews.length && !this._childViews.length) { this._childViews = this._childViews.slice(); }
-          this._childViews.splice.apply(this._childViews, args);
-        }
-
-        this.arrayContentDidChange(idx, removedCount, addedCount);
-        this.childViewsDidChange(this._childViews, idx, removedCount, addedCount);
-
-        return this;
-      },
-
-      objectAt: function(idx) {
-        return this._childViews[idx];
-      },
-
-      length: computed(function () {
-        return this._childViews.length;
-      }).volatile(),
-
-      /**
-        Instructs each child view to render to the passed render buffer.
-
-        @private
-        @method render
-        @param {Ember.RenderBuffer} buffer the buffer to render to
-      */
-      render: function(buffer) {
-        this.forEachChildView(function(view) {
-          view.renderToBuffer(buffer);
-        });
-      },
-
-      instrumentName: 'container',
-
-      /**
-        When a child view is removed, destroy its element so that
-        it is removed from the DOM.
-
-        The array observer that triggers this action is set up in the
-        `renderToBuffer` method.
-
-        @private
-        @method childViewsWillChange
-        @param {Ember.Array} views the child views array before mutation
-        @param {Number} start the start position of the mutation
-        @param {Number} removed the number of child views removed
-      **/
-      childViewsWillChange: function(views, start, removed) {
-        this.propertyWillChange('childViews');
-
-        if (removed > 0) {
-          var changedViews = views.slice(start, start+removed);
-          // transition to preRender before clearing parentView
-          this.currentState.childViewsWillChange(this, views, start, removed);
-          this.initializeViews(changedViews, null, null);
-        }
-      },
-
-      removeChild: function(child) {
-        this.removeObject(child);
-        return this;
-      },
-
-      /**
-        When a child view is added, make sure the DOM gets updated appropriately.
-
-        If the view has already rendered an element, we tell the child view to
-        create an element and insert it into the DOM. If the enclosing container
-        view has already written to a buffer, but not yet converted that buffer
-        into an element, we insert the string representation of the child into the
-        appropriate place in the buffer.
-
-        @private
-        @method childViewsDidChange
-        @param {Ember.Array} views the array of child views after the mutation has occurred
-        @param {Number} start the start position of the mutation
-        @param {Number} removed the number of child views removed
-        @param {Number} the number of child views added
-      */
-      childViewsDidChange: function(views, start, removed, added) {
-        if (added > 0) {
-          var changedViews = views.slice(start, start+added);
-          this.initializeViews(changedViews, this, get(this, 'templateData'));
-          this.currentState.childViewsDidChange(this, views, start, added);
-        }
-        this.propertyDidChange('childViews');
-      },
-
-      initializeViews: function(views, parentView, templateData) {
-        forEach(views, function(view) {
-          set(view, '_parentView', parentView);
-
-          if (!view.container && parentView) {
-            set(view, 'container', parentView.container);
-          }
-
-          if (!get(view, 'templateData')) {
-            set(view, 'templateData', templateData);
-          }
-        });
-      },
-
-      currentView: null,
-
-      _currentViewWillChange: beforeObserver('currentView', function() {
-        var currentView = get(this, 'currentView');
-        if (currentView) {
-          currentView.destroy();
-        }
-      }),
-
-      _currentViewDidChange: observer('currentView', function() {
-        var currentView = get(this, 'currentView');
-        if (currentView) {
-          Ember.assert("You tried to set a current view that already has a parent. Make sure you don't have multiple outlets in the same view.", !get(currentView, '_parentView'));
-          this.pushObject(currentView);
-        }
-      }),
-
-      _ensureChildrenAreInDOM: function () {
-        this.currentState.ensureChildrenAreInDOM(this);
-      }
-    });
-
-    merge(states._default, {
-      childViewsWillChange: Ember.K,
-      childViewsDidChange: Ember.K,
-      ensureChildrenAreInDOM: Ember.K
-    });
-
-    merge(states.inBuffer, {
-      childViewsDidChange: function(parentView, views, start, added) {
-        throw new EmberError('You cannot modify child views while in the inBuffer state');
-      }
-    });
-
-    merge(states.hasElement, {
-      childViewsWillChange: function(view, views, start, removed) {
-        for (var i=start; i<start+removed; i++) {
-          views[i].remove();
-        }
-      },
-
-      childViewsDidChange: function(view, views, start, added) {
-        run.scheduleOnce('render', view, '_ensureChildrenAreInDOM');
-      },
-
-      ensureChildrenAreInDOM: function(view) {
-        var childViews = view._childViews, i, len, childView, previous, buffer, viewCollection = new ViewCollection();
-
-        for (i = 0, len = childViews.length; i < len; i++) {
-          childView = childViews[i];
-
-          if (!buffer) { buffer = RenderBuffer(); buffer._hasElement = false; }
-
-          if (childView.renderToBufferIfNeeded(buffer)) {
-            viewCollection.push(childView);
-          } else if (viewCollection.length) {
-            insertViewCollection(view, viewCollection, previous, buffer);
-            buffer = null;
-            previous = childView;
-            viewCollection.clear();
-          } else {
-            previous = childView;
-          }
-        }
-
-        if (viewCollection.length) {
-          insertViewCollection(view, viewCollection, previous, buffer);
-        }
-      }
-    });
-
-    function insertViewCollection(view, viewCollection, previous, buffer) {
-      viewCollection.triggerRecursively('willInsertElement');
-
-      if (previous) {
-        previous.domManager.after(previous, buffer.string());
-      } else {
-        view.domManager.prepend(view, buffer.string());
-      }
-
-      viewCollection.forEach(function(v) {
-        v.transitionTo('inDOM');
-        v.propertyDidChange('element');
-        v.triggerRecursively('didInsertElement');
-      });
-    }
-
-
-    __exports__["default"] = ContainerView;
-  });
-define("ember-views/views/states", 
-  ["ember-metal/platform","ember-metal/merge","ember-views/views/states/default","ember-views/views/states/pre_render","ember-views/views/states/in_buffer","ember-views/views/states/has_element","ember-views/views/states/in_dom","ember-views/views/states/destroying","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    var create = __dependency1__.create;
-    var merge = __dependency2__["default"];
-    var _default = __dependency3__["default"];
-    var preRender = __dependency4__["default"];
-    var inBuffer = __dependency5__["default"];
-    var hasElement = __dependency6__["default"];
-    var inDOM = __dependency7__["default"];
-    var destroying = __dependency8__["default"];
-
-    function cloneStates(from) {
-      var into = {};
-
-      into._default = {};
-      into.preRender = create(into._default);
-      into.destroying = create(into._default);
-      into.inBuffer = create(into._default);
-      into.hasElement = create(into._default);
-      into.inDOM = create(into.hasElement);
-
-      for (var stateName in from) {
-        if (!from.hasOwnProperty(stateName)) { continue; }
-        merge(into[stateName], from[stateName]);
-      }
-
-      return into;
-    };
-
-    var states = {
-      _default: _default,
-      preRender: preRender,
-      inDOM: inDOM,
-      inBuffer: inBuffer,
-      hasElement: hasElement,
-      destroying: destroying
-    };
-
-    __exports__.cloneStates = cloneStates;
-    __exports__.states = states;
-  });
-define("ember-views/views/states/default", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.K
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var run = __dependency4__["default"];
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-    var _default = {
-      // appendChild is only legal while rendering the buffer.
-      appendChild: function() {
-        throw "You can't use appendChild outside of the rendering process";
-      },
-
-      $: function() {
-        return undefined;
-      },
-
-      getElement: function() {
-        return null;
-      },
-
-      // Handle events from `Ember.EventDispatcher`
-      handleEvent: function() {
-        return true; // continue event propagation
-      },
-
-      destroyElement: function(view) {
-        set(view, 'element', null);
-        if (view._scheduledInsert) {
-          run.cancel(view._scheduledInsert);
-          view._scheduledInsert = null;
-        }
-        return view;
-      },
-
-      renderToBufferIfNeeded: function () {
-        return false;
-      },
-
-      rerender: Ember.K,
-      invokeObserver: Ember.K
-    };
-
-    __exports__["default"] = _default;
-  });
-define("ember-views/views/states/destroying", 
-  ["ember-metal/merge","ember-metal/platform","ember-runtime/system/string","ember-views/views/states/default","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var merge = __dependency1__["default"];
-    var create = __dependency2__.create;
-    var fmt = __dependency3__.fmt;
-    var _default = __dependency4__["default"];
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var destroyingError = "You can't call %@ on a view being destroyed";
-
-    var destroying = create(_default);
-
-    merge(destroying, {
-      appendChild: function() {
-        throw fmt(destroyingError, ['appendChild']);
-      },
-      rerender: function() {
-        throw fmt(destroyingError, ['rerender']);
-      },
-      destroyElement: function() {
-        throw fmt(destroyingError, ['destroyElement']);
-      },
-      empty: function() {
-        throw fmt(destroyingError, ['empty']);
-      },
-
-      setElement: function() {
-        throw fmt(destroyingError, ["set('element', ...)"]);
-      },
-
-      renderToBufferIfNeeded: function() {
-        return false;
-      },
-
-      // Since element insertion is scheduled, don't do anything if
-      // the view has been destroyed between scheduling and execution
-      insertElement: Ember.K
-    });
-
-    __exports__["default"] = destroying;
-  });
-define("ember-views/views/states/has_element", 
-  ["ember-views/views/states/default","ember-metal/run_loop","ember-metal/merge","ember-metal/platform","ember-views/system/jquery","ember-metal/property_get","ember-metal/property_set","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var _default = __dependency1__["default"];
-    var run = __dependency2__["default"];
-    var merge = __dependency3__["default"];
-    var create = __dependency4__.create;
-    var jQuery = __dependency5__["default"];
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var get = __dependency6__.get;
-    var set = __dependency7__.set;
-
-    var hasElement = create(_default);
-
-    merge(hasElement, {
-      $: function(view, sel) {
-        var elem = get(view, 'element');
-        return sel ? jQuery(sel, elem) : jQuery(elem);
-      },
-
-      getElement: function(view) {
-        var parent = get(view, 'parentView');
-        if (parent) { parent = get(parent, 'element'); }
-        if (parent) { return view.findElementInParentElement(parent); }
-        return jQuery("#" + get(view, 'elementId'))[0];
-      },
-
-      setElement: function(view, value) {
-        if (value === null) {
-          view.transitionTo('preRender');
-        } else {
-          throw "You cannot set an element to a non-null value when the element is already in the DOM.";
-        }
-
-        return value;
-      },
-
-      // once the view has been inserted into the DOM, rerendering is
-      // deferred to allow bindings to synchronize.
-      rerender: function(view) {
-        view.triggerRecursively('willClearRender');
-
-        view.clearRenderedChildren();
-
-        view.domManager.replace(view);
-        return view;
-      },
-
-      // once the view is already in the DOM, destroying it removes it
-      // from the DOM, nukes its element, and puts it back into the
-      // preRender state if inDOM.
-
-      destroyElement: function(view) {
-        view._notifyWillDestroyElement();
-        view.domManager.remove(view);
-        set(view, 'element', null);
-        if (view._scheduledInsert) {
-          run.cancel(view._scheduledInsert);
-          view._scheduledInsert = null;
-        }
-        return view;
-      },
-
-      empty: function(view) {
-        var _childViews = view._childViews, len, idx;
-        if (_childViews) {
-          len = _childViews.length;
-          for (idx = 0; idx < len; idx++) {
-            _childViews[idx]._notifyWillDestroyElement();
-          }
-        }
-        view.domManager.empty(view);
-      },
-
-      // Handle events from `Ember.EventDispatcher`
-      handleEvent: function(view, eventName, evt) {
-        if (view.has(eventName)) {
-          // Handler should be able to re-dispatch events, so we don't
-          // preventDefault or stopPropagation.
-          return view.trigger(eventName, evt);
-        } else {
-          return true; // continue event propagation
-        }
-      },
-
-      invokeObserver: function(target, observer) {
-        observer.call(target);
-      }
-    });
-
-    __exports__["default"] = hasElement;
-  });
-define("ember-views/views/states/in_buffer", 
-  ["ember-views/views/states/default","ember-metal/error","ember-metal/core","ember-metal/platform","ember-metal/merge","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var _default = __dependency1__["default"];
-    var EmberError = __dependency2__["default"];
-
-    var Ember = __dependency3__["default"];
-    // Ember.assert
-    var create = __dependency4__.create;
-    var merge = __dependency5__["default"];
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var inBuffer = create(_default);
-
-    merge(inBuffer, {
-      $: function(view, sel) {
-        // if we don't have an element yet, someone calling this.$() is
-        // trying to update an element that isn't in the DOM. Instead,
-        // rerender the view to allow the render method to reflect the
-        // changes.
-        view.rerender();
-        return Ember.$();
-      },
-
-      // when a view is rendered in a buffer, rerendering it simply
-      // replaces the existing buffer with a new one
-      rerender: function(view) {
-        throw new EmberError("Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.");
-      },
-
-      // when a view is rendered in a buffer, appending a child
-      // view will render that view and append the resulting
-      // buffer into its buffer.
-      appendChild: function(view, childView, options) {
-        var buffer = view.buffer, _childViews = view._childViews;
-
-        childView = view.createChildView(childView, options);
-        if (!_childViews.length) { _childViews = view._childViews = _childViews.slice(); }
-        _childViews.push(childView);
-
-        childView.renderToBuffer(buffer);
-
-        view.propertyDidChange('childViews');
-
-        return childView;
-      },
-
-      // when a view is rendered in a buffer, destroying the
-      // element will simply destroy the buffer and put the
-      // state back into the preRender state.
-      destroyElement: function(view) {
-        view.clearBuffer();
-        var viewCollection = view._notifyWillDestroyElement();
-        viewCollection.transitionTo('preRender', false);
-
-        return view;
-      },
-
-      empty: function() {
-        Ember.assert("Emptying a view in the inBuffer state is not allowed and " +
-                     "should not happen under normal circumstances. Most likely " +
-                     "there is a bug in your application. This may be due to " +
-                     "excessive property change notifications.");
-      },
-
-      renderToBufferIfNeeded: function (view, buffer) {
-        return false;
-      },
-
-      // It should be impossible for a rendered view to be scheduled for
-      // insertion.
-      insertElement: function() {
-        throw "You can't insert an element that has already been rendered";
-      },
-
-      setElement: function(view, value) {
-        if (value === null) {
-          view.transitionTo('preRender');
-        } else {
-          view.clearBuffer();
-          view.transitionTo('hasElement');
-        }
-
-        return value;
-      },
-
-      invokeObserver: function(target, observer) {
-        observer.call(target);
-      }
-    });
-
-    __exports__["default"] = inBuffer;
-  });
-define("ember-views/views/states/in_dom", 
-  ["ember-metal/core","ember-metal/platform","ember-metal/merge","ember-metal/error","ember-views/views/states/has_element","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var create = __dependency2__.create;
-    var merge = __dependency3__["default"];
-    var EmberError = __dependency4__["default"];
-
-    var hasElement = __dependency5__["default"];
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var inDOM = create(hasElement);
-
-    var View;
-
-    merge(inDOM, {
-      enter: function(view) {
-        if (!View) { View = requireModule('ember-views/views/view')["View"]; } // ES6TODO: this sucks. Have to avoid cycles...
-
-        // Register the view for event handling. This hash is used by
-        // Ember.EventDispatcher to dispatch incoming events.
-        if (!view.isVirtual) {
-          Ember.assert("Attempted to register a view with an id already in use: "+view.elementId, !View.views[view.elementId]);
-          View.views[view.elementId] = view;
-        }
-
-        view.addBeforeObserver('elementId', function() {
-          throw new EmberError("Changing a view's elementId after creation is not allowed");
-        });
-      },
-
-      exit: function(view) {
-        if (!View) { View = requireModule('ember-views/views/view')["View"]; } // ES6TODO: this sucks. Have to avoid cycles...
-
-        if (!this.isVirtual) delete View.views[view.elementId];
-      },
-
-      insertElement: function(view, fn) {
-        throw "You can't insert an element into the DOM that has already been inserted";
-      }
-    });
-
-    __exports__["default"] = inDOM;
-  });
-define("ember-views/views/states/pre_render", 
-  ["ember-views/views/states/default","ember-metal/platform","ember-metal/merge","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var _default = __dependency1__["default"];
-    var create = __dependency2__.create;
-    var merge = __dependency3__["default"];
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-    var preRender = create(_default);
-
-    merge(preRender, {
-      // a view leaves the preRender state once its element has been
-      // created (createElement).
-      insertElement: function(view, fn) {
-        view.createElement();
-        var viewCollection = view.viewHierarchyCollection();
-
-        viewCollection.trigger('willInsertElement');
-
-        fn.call(view);
-
-        // We transition to `inDOM` if the element exists in the DOM
-        var element = view.get('element');
-        if (document.body.contains(element)) {
-          viewCollection.transitionTo('inDOM', false);
-          viewCollection.trigger('didInsertElement');
-        }
-      },
-
-      renderToBufferIfNeeded: function(view, buffer) {
-        view.renderToBuffer(buffer);
-        return true;
-      },
-
-      empty: Ember.K,
-
-      setElement: function(view, value) {
-        if (value !== null) {
-          view.transitionTo('hasElement');
-        }
-        return value;
-      }
-    });
-
-    __exports__["default"] = preRender;
-  });
-define("ember-views/views/view", 
-  ["ember-metal/core","ember-metal/error","ember-runtime/system/object","ember-runtime/mixins/evented","ember-runtime/mixins/action_handler","ember-views/system/render_buffer","ember-metal/property_get","ember-metal/property_set","ember-metal/set_properties","ember-metal/run_loop","ember-metal/observer","ember-metal/properties","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/is_none","container/container","ember-runtime/system/native_array","ember-metal/instrumentation","ember-runtime/system/string","ember-metal/enumerable_utils","ember-runtime/copy","ember-metal/binding","ember-metal/property_events","ember-views/views/states","ember-views/system/jquery","ember-views/system/ext","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __exports__) {
-    "use strict";
-    // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES,
-    // Ember.K, jQuery, Ember.lookup,
-    // Ember.ContainerView circular dependency
-    // Ember.ENV
-    var Ember = __dependency1__["default"];
-
-    var EmberError = __dependency2__["default"];
-    var EmberObject = __dependency3__["default"];
-    var Evented = __dependency4__["default"];
-    var ActionHandler = __dependency5__["default"];
-    var RenderBuffer = __dependency6__["default"];
-    var get = __dependency7__.get;
-    var set = __dependency8__.set;
-    var setProperties = __dependency9__["default"];
-    var run = __dependency10__["default"];
-    var addObserver = __dependency11__.addObserver;
-    var removeObserver = __dependency11__.removeObserver;
-
-    var defineProperty = __dependency12__.defineProperty;
-    var guidFor = __dependency13__.guidFor;
-    var meta = __dependency13__.meta;
-    var computed = __dependency14__.computed;
-    var observer = __dependency15__.observer;
-
-    var typeOf = __dependency13__.typeOf;
-    var isNone = __dependency16__.isNone;
-    var Mixin = __dependency15__.Mixin;
-    var Container = __dependency17__["default"];
-    var A = __dependency18__.A;
-
-    var instrument = __dependency19__.instrument;
-
-    var dasherize = __dependency20__.dasherize;
-
-    // ES6TODO: functions on EnumerableUtils should get their own export
-    var EnumerableUtils = __dependency21__["default"];
-    var a_forEach = EnumerableUtils.forEach,
-        a_addObject = EnumerableUtils.addObject,
-        a_removeObject = EnumerableUtils.removeObject;
-
-    var beforeObserver = __dependency15__.beforeObserver;
-    var copy = __dependency22__["default"];
-    var isGlobalPath = __dependency23__.isGlobalPath;
-
-    var propertyWillChange = __dependency24__.propertyWillChange;
-    var propertyDidChange = __dependency24__.propertyDidChange;
-
-    var cloneStates = __dependency25__.cloneStates;
-    var states = __dependency25__.states;
-    var jQuery = __dependency26__["default"];
-     // for the side effect of extending Ember.run.queues
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    var ContainerView;
-
-    function nullViewsBuffer(view) {
-      view.buffer = null;
-
-    }
-
-    function clearCachedElement(view) {
-      meta(view).cache.element = undefined;
-    }
-
-    var childViewsProperty = computed(function() {
-      var childViews = this._childViews, ret = A(), view = this;
-
-      a_forEach(childViews, function(view) {
-        var currentChildViews;
-        if (view.isVirtual) {
-          if (currentChildViews = get(view, 'childViews')) {
-            ret.pushObjects(currentChildViews);
-          }
-        } else {
-          ret.push(view);
-        }
-      });
-
-      ret.replace = function (idx, removedCount, addedViews) {
-        if (!ContainerView) { ContainerView = requireModule('ember-views/views/container_view')['default']; } // ES6TODO: stupid circular dep
-
-        if (view instanceof ContainerView) {
-          Ember.deprecate("Manipulating an Ember.ContainerView through its childViews property is deprecated. Please use the ContainerView instance itself as an Ember.MutableArray.");
-          return view.replace(idx, removedCount, addedViews);
-        }
-        throw new EmberError("childViews is immutable");
-      };
-
-      return ret;
-    });
-
-    Ember.warn("The VIEW_PRESERVES_CONTEXT flag has been removed and the functionality can no longer be disabled.", Ember.ENV.VIEW_PRESERVES_CONTEXT !== false);
-
-    /**
-      Global hash of shared templates. This will automatically be populated
-      by the build tools so that you can store your Handlebars templates in
-      separate files that get loaded into JavaScript at buildtime.
-
-      @property TEMPLATES
-      @for Ember
-      @type Hash
-    */
-    Ember.TEMPLATES = {};
-
-    /**
-      `Ember.CoreView` is an abstract class that exists to give view-like behavior
-      to both Ember's main view class `Ember.View` and other classes like
-      `Ember._SimpleMetamorphView` that don't need the fully functionaltiy of
-      `Ember.View`.
-
-      Unless you have specific needs for `CoreView`, you will use `Ember.View`
-      in your applications.
-
-      @class CoreView
-      @namespace Ember
-      @extends Ember.Object
-      @uses Ember.Evented
-      @uses Ember.ActionHandler
-    */
-
-    var CoreView = EmberObject.extend(Evented, ActionHandler, {
-      isView: true,
-
-      states: cloneStates(states),
-
-      init: function() {
-        this._super();
-        this.transitionTo('preRender');
-        this._isVisible = get(this, 'isVisible');
-      },
-
-      /**
-        If the view is currently inserted into the DOM of a parent view, this
-        property will point to the parent of the view.
-
-        @property parentView
-        @type Ember.View
-        @default null
-      */
-      parentView: computed('_parentView', function() {
-        var parent = this._parentView;
-
-        if (parent && parent.isVirtual) {
-          return get(parent, 'parentView');
-        } else {
-          return parent;
-        }
-      }),
-
-      state: null,
-
-      _parentView: null,
-
-      // return the current view, not including virtual views
-      concreteView: computed('parentView', function() {
-        if (!this.isVirtual) { return this; }
-        else { return get(this, 'parentView'); }
-      }),
-
-      instrumentName: 'core_view',
-
-      instrumentDetails: function(hash) {
-        hash.object = this.toString();
-      },
-
-      /**
-        Invoked by the view system when this view needs to produce an HTML
-        representation. This method will create a new render buffer, if needed,
-        then apply any default attributes, such as class names and visibility.
-        Finally, the `render()` method is invoked, which is responsible for
-        doing the bulk of the rendering.
-
-        You should not need to override this method; instead, implement the
-        `template` property, or if you need more control, override the `render`
-        method.
-
-        @method renderToBuffer
-        @param {Ember.RenderBuffer} buffer the render buffer. If no buffer is
-          passed, a default buffer, using the current view's `tagName`, will
-          be used.
-        @private
-      */
-      renderToBuffer: function(parentBuffer, bufferOperation) {
-        var name = 'render.' + this.instrumentName,
-            details = {};
-
-        this.instrumentDetails(details);
-
-        return instrument(name, details, function instrumentRenderToBuffer() {
-          return this._renderToBuffer(parentBuffer, bufferOperation);
-        }, this);
-      },
-
-      _renderToBuffer: function(parentBuffer, bufferOperation) {
-        // If this is the top-most view, start a new buffer. Otherwise,
-        // create a new buffer relative to the original using the
-        // provided buffer operation (for example, `insertAfter` will
-        // insert a new buffer after the "parent buffer").
-        var tagName = this.tagName;
-
-        if (tagName === null || tagName === undefined) {
-          tagName = 'div';
-        }
-
-        var buffer = this.buffer = parentBuffer && parentBuffer.begin(tagName) || RenderBuffer(tagName);
-        this.transitionTo('inBuffer', false);
-
-        this.beforeRender(buffer);
-        this.render(buffer);
-        this.afterRender(buffer);
-
-        return buffer;
-      },
-
-      /**
-        Override the default event firing from `Ember.Evented` to
-        also call methods with the given name.
-
-        @method trigger
-        @param name {String}
-        @private
-      */
-      trigger: function(name) {
-        this._super.apply(this, arguments);
-        var method = this[name];
-        if (method) {
-          var args = [], i, l;
-          for (i = 1, l = arguments.length; i < l; i++) {
-            args.push(arguments[i]);
-          }
-          return method.apply(this, args);
-        }
-      },
-
-      deprecatedSendHandles: function(actionName) {
-        return !!this[actionName];
-      },
-
-      deprecatedSend: function(actionName) {
-        var args = [].slice.call(arguments, 1);
-        Ember.assert('' + this + " has the action " + actionName + " but it is not a function", typeof this[actionName] === 'function');
-        Ember.deprecate('Action handlers implemented directly on views are deprecated in favor of action handlers on an `actions` object ( action: `' + actionName + '` on ' + this + ')', false);
-        this[actionName].apply(this, args);
-        return;
-      },
-
-      has: function(name) {
-        return typeOf(this[name]) === 'function' || this._super(name);
-      },
-
-      destroy: function() {
-        var parent = this._parentView;
-
-        if (!this._super()) { return; }
-
-        // destroy the element -- this will avoid each child view destroying
-        // the element over and over again...
-        if (!this.removedFromDOM) { this.destroyElement(); }
-
-        // remove from parent if found. Don't call removeFromParent,
-        // as removeFromParent will try to remove the element from
-        // the DOM again.
-        if (parent) { parent.removeChild(this); }
-
-        this.transitionTo('destroying', false);
-
-        return this;
-      },
-
-      clearRenderedChildren: Ember.K,
-      triggerRecursively: Ember.K,
-      invokeRecursively: Ember.K,
-      transitionTo: Ember.K,
-      destroyElement: Ember.K
-    });
-
-    var ViewCollection = function(initialViews) {
-      var views = this.views = initialViews || [];
-      this.length = views.length;
-    };
-
-    ViewCollection.prototype = {
-      length: 0,
-
-      trigger: function(eventName) {
-        var views = this.views, view;
-        for (var i = 0, l = views.length; i < l; i++) {
-          view = views[i];
-          if (view.trigger) { view.trigger(eventName); }
-        }
-      },
-
-      triggerRecursively: function(eventName) {
-        var views = this.views;
-        for (var i = 0, l = views.length; i < l; i++) {
-          views[i].triggerRecursively(eventName);
-        }
-      },
-
-      invokeRecursively: function(fn) {
-        var views = this.views, view;
-
-        for (var i = 0, l = views.length; i < l; i++) {
-          view = views[i];
-          fn(view);
-        }
-      },
-
-      transitionTo: function(state, children) {
-        var views = this.views;
-        for (var i = 0, l = views.length; i < l; i++) {
-          views[i].transitionTo(state, children);
-        }
-      },
-
-      push: function() {
-        this.length += arguments.length;
-        var views = this.views;
-        return views.push.apply(views, arguments);
-      },
-
-      objectAt: function(idx) {
-        return this.views[idx];
-      },
-
-      forEach: function(callback) {
-        var views = this.views;
-        return a_forEach(views, callback);
-      },
-
-      clear: function() {
-        this.length = 0;
-        this.views.length = 0;
-      }
-    };
-
-    var EMPTY_ARRAY = [];
-
-    /**
-      `Ember.View` is the class in Ember responsible for encapsulating templates of
-      HTML content, combining templates with data to render as sections of a page's
-      DOM, and registering and responding to user-initiated events.
-
-      ## HTML Tag
-
-      The default HTML tag name used for a view's DOM representation is `div`. This
-      can be customized by setting the `tagName` property. The following view
-      class:
-
-      ```javascript
-      ParagraphView = Ember.View.extend({
-        tagName: 'em'
-      });
-      ```
-
-      Would result in instances with the following HTML:
-
-      ```html
-      <em id="ember1" class="ember-view"></em>
-      ```
-
-      ## HTML `class` Attribute
-
-      The HTML `class` attribute of a view's tag can be set by providing a
-      `classNames` property that is set to an array of strings:
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNames: ['my-class', 'my-other-class']
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view my-class my-other-class"></div>
-      ```
-
-      `class` attribute values can also be set by providing a `classNameBindings`
-      property set to an array of properties names for the view. The return value
-      of these properties will be added as part of the value for the view's `class`
-      attribute. These properties can be computed properties:
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNameBindings: ['propertyA', 'propertyB'],
-        propertyA: 'from-a',
-        propertyB: function() {
-          if (someLogic) { return 'from-b'; }
-        }.property()
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view from-a from-b"></div>
-      ```
-
-      If the value of a class name binding returns a boolean the property name
-      itself will be used as the class name if the property is true. The class name
-      will not be added if the value is `false` or `undefined`.
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNameBindings: ['hovered'],
-        hovered: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view hovered"></div>
-      ```
-
-      When using boolean class name bindings you can supply a string value other
-      than the property name for use as the `class` HTML attribute by appending the
-      preferred value after a ":" character when defining the binding:
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNameBindings: ['awesome:so-very-cool'],
-        awesome: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view so-very-cool"></div>
-      ```
-
-      Boolean value class name bindings whose property names are in a
-      camelCase-style format will be converted to a dasherized format:
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNameBindings: ['isUrgent'],
-        isUrgent: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view is-urgent"></div>
-      ```
-
-      Class name bindings can also refer to object values that are found by
-      traversing a path relative to the view itself:
-
-      ```javascript
-      MyView = Ember.View.extend({
-        classNameBindings: ['messages.empty']
-        messages: Ember.Object.create({
-          empty: true
-        })
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view empty"></div>
-      ```
-
-      If you want to add a class name for a property which evaluates to true and
-      and a different class name if it evaluates to false, you can pass a binding
-      like this:
-
-      ```javascript
-      // Applies 'enabled' class when isEnabled is true and 'disabled' when isEnabled is false
-      Ember.View.extend({
-        classNameBindings: ['isEnabled:enabled:disabled']
-        isEnabled: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view enabled"></div>
-      ```
-
-      When isEnabled is `false`, the resulting HTML reprensentation looks like
-      this:
-
-      ```html
-      <div id="ember1" class="ember-view disabled"></div>
-      ```
-
-      This syntax offers the convenience to add a class if a property is `false`:
-
-      ```javascript
-      // Applies no class when isEnabled is true and class 'disabled' when isEnabled is false
-      Ember.View.extend({
-        classNameBindings: ['isEnabled::disabled']
-        isEnabled: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view"></div>
-      ```
-
-      When the `isEnabled` property on the view is set to `false`, it will result
-      in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view disabled"></div>
-      ```
-
-      Updates to the the value of a class name binding will result in automatic
-      update of the  HTML `class` attribute in the view's rendered HTML
-      representation. If the value becomes `false` or `undefined` the class name
-      will be removed.
-
-      Both `classNames` and `classNameBindings` are concatenated properties. See
-      [Ember.Object](/api/classes/Ember.Object.html) documentation for more
-      information about concatenated properties.
-
-      ## HTML Attributes
-
-      The HTML attribute section of a view's tag can be set by providing an
-      `attributeBindings` property set to an array of property names on the view.
-      The return value of these properties will be used as the value of the view's
-      HTML associated attribute:
-
-      ```javascript
-      AnchorView = Ember.View.extend({
-        tagName: 'a',
-        attributeBindings: ['href'],
-        href: 'http://google.com'
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <a id="ember1" class="ember-view" href="http://google.com"></a>
-      ```
-
-      If the return value of an `attributeBindings` monitored property is a boolean
-      the property will follow HTML's pattern of repeating the attribute's name as
-      its value:
-
-      ```javascript
-      MyTextInput = Ember.View.extend({
-        tagName: 'input',
-        attributeBindings: ['disabled'],
-        disabled: true
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <input id="ember1" class="ember-view" disabled="disabled" />
-      ```
-
-      `attributeBindings` can refer to computed properties:
-
-      ```javascript
-      MyTextInput = Ember.View.extend({
-        tagName: 'input',
-        attributeBindings: ['disabled'],
-        disabled: function() {
-          if (someLogic) {
-            return true;
-          } else {
-            return false;
-          }
-        }.property()
-      });
-      ```
-
-      Updates to the the property of an attribute binding will result in automatic
-      update of the  HTML attribute in the view's rendered HTML representation.
-
-      `attributeBindings` is a concatenated property. See [Ember.Object](/api/classes/Ember.Object.html)
-      documentation for more information about concatenated properties.
-
-      ## Templates
-
-      The HTML contents of a view's rendered representation are determined by its
-      template. Templates can be any function that accepts an optional context
-      parameter and returns a string of HTML that will be inserted within the
-      view's tag. Most typically in Ember this function will be a compiled
-      `Ember.Handlebars` template.
-
-      ```javascript
-      AView = Ember.View.extend({
-        template: Ember.Handlebars.compile('I am the template')
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view">I am the template</div>
-      ```
-
-      Within an Ember application is more common to define a Handlebars templates as
-      part of a page:
-
-      ```html
-      <script type='text/x-handlebars' data-template-name='some-template'>
-        Hello
-      </script>
-      ```
-
-      And associate it by name using a view's `templateName` property:
-
-      ```javascript
-      AView = Ember.View.extend({
-        templateName: 'some-template'
-      });
-      ```
-
-      If you have nested resources, your Handlebars template will look like this:
-
-      ```html
-      <script type='text/x-handlebars' data-template-name='posts/new'>
-        <h1>New Post</h1>
-      </script>
-      ```
-
-      And `templateName` property:
-
-      ```javascript
-      AView = Ember.View.extend({
-        templateName: 'posts/new'
-      });
-      ```
-
-      Using a value for `templateName` that does not have a Handlebars template
-      with a matching `data-template-name` attribute will throw an error.
-
-      For views classes that may have a template later defined (e.g. as the block
-      portion of a `{{view}}` Handlebars helper call in another template or in
-      a subclass), you can provide a `defaultTemplate` property set to compiled
-      template function. If a template is not later provided for the view instance
-      the `defaultTemplate` value will be used:
-
-      ```javascript
-      AView = Ember.View.extend({
-        defaultTemplate: Ember.Handlebars.compile('I was the default'),
-        template: null,
-        templateName: null
-      });
-      ```
-
-      Will result in instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view">I was the default</div>
-      ```
-
-      If a `template` or `templateName` is provided it will take precedence over
-      `defaultTemplate`:
-
-      ```javascript
-      AView = Ember.View.extend({
-        defaultTemplate: Ember.Handlebars.compile('I was the default')
-      });
-
-      aView = AView.create({
-        template: Ember.Handlebars.compile('I was the template, not default')
-      });
-      ```
-
-      Will result in the following HTML representation when rendered:
-
-      ```html
-      <div id="ember1" class="ember-view">I was the template, not default</div>
-      ```
-
-      ## View Context
-
-      The default context of the compiled template is the view's controller:
-
-      ```javascript
-      AView = Ember.View.extend({
-        template: Ember.Handlebars.compile('Hello {{excitedGreeting}}')
-      });
-
-      aController = Ember.Object.create({
-        firstName: 'Barry',
-        excitedGreeting: function() {
-          return this.get("content.firstName") + "!!!"
-        }.property()
-      });
-
-      aView = AView.create({
-        controller: aController,
-      });
-      ```
-
-      Will result in an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view">Hello Barry!!!</div>
-      ```
-
-      A context can also be explicitly supplied through the view's `context`
-      property. If the view has neither `context` nor `controller` properties, the
-      `parentView`'s context will be used.
-
-      ## Layouts
-
-      Views can have a secondary template that wraps their main template. Like
-      primary templates, layouts can be any function that  accepts an optional
-      context parameter and returns a string of HTML that will be inserted inside
-      view's tag. Views whose HTML element is self closing (e.g. `<input />`)
-      cannot have a layout and this property will be ignored.
-
-      Most typically in Ember a layout will be a compiled `Ember.Handlebars`
-      template.
-
-      A view's layout can be set directly with the `layout` property or reference
-      an existing Handlebars template by name with the `layoutName` property.
-
-      A template used as a layout must contain a single use of the Handlebars
-      `{{yield}}` helper. The HTML contents of a view's rendered `template` will be
-      inserted at this location:
-
-      ```javascript
-      AViewWithLayout = Ember.View.extend({
-        layout: Ember.Handlebars.compile("<div class='my-decorative-class'>{{yield}}</div>")
-        template: Ember.Handlebars.compile("I got wrapped"),
-      });
-      ```
-
-      Will result in view instances with an HTML representation of:
-
-      ```html
-      <div id="ember1" class="ember-view">
-        <div class="my-decorative-class">
-          I got wrapped
-        </div>
-      </div>
-      ```
-
-      See [Ember.Handlebars.helpers.yield](/api/classes/Ember.Handlebars.helpers.html#method_yield)
-      for more information.
-
-      ## Responding to Browser Events
-
-      Views can respond to user-initiated events in one of three ways: method
-      implementation, through an event manager, and through `{{action}}` helper use
-      in their template or layout.
-
-      ### Method Implementation
-
-      Views can respond to user-initiated events by implementing a method that
-      matches the event name. A `jQuery.Event` object will be passed as the
-      argument to this method.
-
-      ```javascript
-      AView = Ember.View.extend({
-        click: function(event) {
-          // will be called when when an instance's
-          // rendered element is clicked
-        }
-      });
-      ```
-
-      ### Event Managers
-
-      Views can define an object as their `eventManager` property. This object can
-      then implement methods that match the desired event names. Matching events
-      that occur on the view's rendered HTML or the rendered HTML of any of its DOM
-      descendants will trigger this method. A `jQuery.Event` object will be passed
-      as the first argument to the method and an  `Ember.View` object as the
-      second. The `Ember.View` will be the view whose rendered HTML was interacted
-      with. This may be the view with the `eventManager` property or one of its
-      descendent views.
-
-      ```javascript
-      AView = Ember.View.extend({
-        eventManager: Ember.Object.create({
-          doubleClick: function(event, view) {
-            // will be called when when an instance's
-            // rendered element or any rendering
-            // of this views's descendent
-            // elements is clicked
-          }
-        })
-      });
-      ```
-
-      An event defined for an event manager takes precedence over events of the
-      same name handled through methods on the view.
-
-      ```javascript
-      AView = Ember.View.extend({
-        mouseEnter: function(event) {
-          // will never trigger.
-        },
-        eventManager: Ember.Object.create({
-          mouseEnter: function(event, view) {
-            // takes precedence over AView#mouseEnter
-          }
-        })
-      });
-      ```
-
-      Similarly a view's event manager will take precedence for events of any views
-      rendered as a descendent. A method name that matches an event name will not
-      be called if the view instance was rendered inside the HTML representation of
-      a view that has an `eventManager` property defined that handles events of the
-      name. Events not handled by the event manager will still trigger method calls
-      on the descendent.
-
-      ```javascript
-      OuterView = Ember.View.extend({
-        template: Ember.Handlebars.compile("outer {{#view InnerView}}inner{{/view}} outer"),
-        eventManager: Ember.Object.create({
-          mouseEnter: function(event, view) {
-            // view might be instance of either
-            // OuterView or InnerView depending on
-            // where on the page the user interaction occured
-          }
-        })
-      });
-
-      InnerView = Ember.View.extend({
-        click: function(event) {
-          // will be called if rendered inside
-          // an OuterView because OuterView's
-          // eventManager doesn't handle click events
-        },
-        mouseEnter: function(event) {
-          // will never be called if rendered inside
-          // an OuterView.
-        }
-      });
-      ```
-
-      ### Handlebars `{{action}}` Helper
-
-      See [Handlebars.helpers.action](/api/classes/Ember.Handlebars.helpers.html#method_action).
-
-      ### Event Names
-
-      All of the event handling approaches described above respond to the same set
-      of events. The names of the built-in events are listed below. (The hash of
-      built-in events exists in `Ember.EventDispatcher`.) Additional, custom events
-      can be registered by using `Ember.Application.customEvents`.
-
-      Touch events:
-
-      * `touchStart`
-      * `touchMove`
-      * `touchEnd`
-      * `touchCancel`
-
-      Keyboard events
-
-      * `keyDown`
-      * `keyUp`
-      * `keyPress`
-
-      Mouse events
-
-      * `mouseDown`
-      * `mouseUp`
-      * `contextMenu`
-      * `click`
-      * `doubleClick`
-      * `mouseMove`
-      * `focusIn`
-      * `focusOut`
-      * `mouseEnter`
-      * `mouseLeave`
-
-      Form events:
-
-      * `submit`
-      * `change`
-      * `focusIn`
-      * `focusOut`
-      * `input`
-
-      HTML5 drag and drop events:
-
-      * `dragStart`
-      * `drag`
-      * `dragEnter`
-      * `dragLeave`
-      * `dragOver`
-      * `dragEnd`
-      * `drop`
-
-      ## Handlebars `{{view}}` Helper
-
-      Other `Ember.View` instances can be included as part of a view's template by
-      using the `{{view}}` Handlebars helper. See [Ember.Handlebars.helpers.view](/api/classes/Ember.Handlebars.helpers.html#method_view)
-      for additional information.
-
-      @class View
-      @namespace Ember
-      @extends Ember.CoreView
-    */
-    var View = CoreView.extend({
-
-      concatenatedProperties: ['classNames', 'classNameBindings', 'attributeBindings'],
-
-      /**
-        @property isView
-        @type Boolean
-        @default true
-        @static
-      */
-      isView: true,
-
-      // ..........................................................
-      // TEMPLATE SUPPORT
-      //
-
-      /**
-        The name of the template to lookup if no template is provided.
-
-        By default `Ember.View` will lookup a template with this name in
-        `Ember.TEMPLATES` (a shared global object).
-
-        @property templateName
-        @type String
-        @default null
-      */
-      templateName: null,
-
-      /**
-        The name of the layout to lookup if no layout is provided.
-
-        By default `Ember.View` will lookup a template with this name in
-        `Ember.TEMPLATES` (a shared global object).
-
-        @property layoutName
-        @type String
-        @default null
-      */
-      layoutName: null,
-
-      /**
-        The template used to render the view. This should be a function that
-        accepts an optional context parameter and returns a string of HTML that
-        will be inserted into the DOM relative to its parent view.
-
-        In general, you should set the `templateName` property instead of setting
-        the template yourself.
-
-        @property template
-        @type Function
-      */
-      template: computed('templateName', function(key, value) {
-        if (value !== undefined) { return value; }
-
-        var templateName = get(this, 'templateName'),
-            template = this.templateForName(templateName, 'template');
-
-        Ember.assert("You specified the templateName " + templateName + " for " + this + ", but it did not exist.", !templateName || template);
-
-        return template || get(this, 'defaultTemplate');
-      }),
-
-      /**
-        The controller managing this view. If this property is set, it will be
-        made available for use by the template.
-
-        @property controller
-        @type Object
-      */
-      controller: computed('_parentView', function(key) {
-        var parentView = get(this, '_parentView');
-        return parentView ? get(parentView, 'controller') : null;
-      }),
-
-      /**
-        A view may contain a layout. A layout is a regular template but
-        supersedes the `template` property during rendering. It is the
-        responsibility of the layout template to retrieve the `template`
-        property from the view (or alternatively, call `Handlebars.helpers.yield`,
-        `{{yield}}`) to render it in the correct location.
-
-        This is useful for a view that has a shared wrapper, but which delegates
-        the rendering of the contents of the wrapper to the `template` property
-        on a subclass.
-
-        @property layout
-        @type Function
-      */
-      layout: computed(function(key) {
-        var layoutName = get(this, 'layoutName'),
-            layout = this.templateForName(layoutName, 'layout');
-
-        Ember.assert("You specified the layoutName " + layoutName + " for " + this + ", but it did not exist.", !layoutName || layout);
-
-        return layout || get(this, 'defaultLayout');
-      }).property('layoutName'),
-
-      _yield: function(context, options) {
-        var template = get(this, 'template');
-        if (template) { template(context, options); }
-      },
-
-      templateForName: function(name, type) {
-        if (!name) { return; }
-        Ember.assert("templateNames are not allowed to contain periods: "+name, name.indexOf('.') === -1);
-
-        // the defaultContainer is deprecated
-        var container = this.container || (Container && Container.defaultContainer);
-        return container && container.lookup('template:' + name);
-      },
-
-      /**
-        The object from which templates should access properties.
-
-        This object will be passed to the template function each time the render
-        method is called, but it is up to the individual function to decide what
-        to do with it.
-
-        By default, this will be the view's controller.
-
-        @property context
-        @type Object
-      */
-      context: computed(function(key, value) {
-        if (arguments.length === 2) {
-          set(this, '_context', value);
-          return value;
-        } else {
-          return get(this, '_context');
-        }
-      }).volatile(),
-
-      /**
-        Private copy of the view's template context. This can be set directly
-        by Handlebars without triggering the observer that causes the view
-        to be re-rendered.
-
-        The context of a view is looked up as follows:
-
-        1. Supplied context (usually by Handlebars)
-        2. Specified controller
-        3. `parentView`'s context (for a child of a ContainerView)
-
-        The code in Handlebars that overrides the `_context` property first
-        checks to see whether the view has a specified controller. This is
-        something of a hack and should be revisited.
-
-        @property _context
-        @private
-      */
-      _context: computed(function(key) {
-        var parentView, controller;
-
-        if (controller = get(this, 'controller')) {
-          return controller;
-        }
-
-        parentView = this._parentView;
-        if (parentView) {
-          return get(parentView, '_context');
-        }
-
-        return null;
-      }),
-
-      /**
-        If a value that affects template rendering changes, the view should be
-        re-rendered to reflect the new value.
-
-        @method _contextDidChange
-        @private
-      */
-      _contextDidChange: observer('context', function() {
-        this.rerender();
-      }),
-
-      /**
-        If `false`, the view will appear hidden in DOM.
-
-        @property isVisible
-        @type Boolean
-        @default null
-      */
-      isVisible: true,
-
-      /**
-        Array of child views. You should never edit this array directly.
-        Instead, use `appendChild` and `removeFromParent`.
-
-        @property childViews
-        @type Array
-        @default []
-        @private
-      */
-      childViews: childViewsProperty,
-
-      _childViews: EMPTY_ARRAY,
-
-      // When it's a virtual view, we need to notify the parent that their
-      // childViews will change.
-      _childViewsWillChange: beforeObserver('childViews', function() {
-        if (this.isVirtual) {
-          var parentView = get(this, 'parentView');
-          if (parentView) { propertyWillChange(parentView, 'childViews'); }
-        }
-      }),
-
-      // When it's a virtual view, we need to notify the parent that their
-      // childViews did change.
-      _childViewsDidChange: observer('childViews', function() {
-        if (this.isVirtual) {
-          var parentView = get(this, 'parentView');
-          if (parentView) { propertyDidChange(parentView, 'childViews'); }
-        }
-      }),
-
-      /**
-        Return the nearest ancestor that is an instance of the provided
-        class.
-
-        @method nearestInstanceOf
-        @param {Class} klass Subclass of Ember.View (or Ember.View itself)
-        @return Ember.View
-        @deprecated
-      */
-      nearestInstanceOf: function(klass) {
-        Ember.deprecate("nearestInstanceOf is deprecated and will be removed from future releases. Use nearestOfType.");
-        var view = get(this, 'parentView');
-
-        while (view) {
-          if (view instanceof klass) { return view; }
-          view = get(view, 'parentView');
-        }
-      },
-
-      /**
-        Return the nearest ancestor that is an instance of the provided
-        class or mixin.
-
-        @method nearestOfType
-        @param {Class,Mixin} klass Subclass of Ember.View (or Ember.View itself),
-               or an instance of Ember.Mixin.
-        @return Ember.View
-      */
-      nearestOfType: function(klass) {
-        var view = get(this, 'parentView'),
-            isOfType = klass instanceof Mixin ?
-                       function(view) { return klass.detect(view); } :
-                       function(view) { return klass.detect(view.constructor); };
-
-        while (view) {
-          if (isOfType(view)) { return view; }
-          view = get(view, 'parentView');
-        }
-      },
-
-      /**
-        Return the nearest ancestor that has a given property.
-
-        @function nearestWithProperty
-        @param {String} property A property name
-        @return Ember.View
-      */
-      nearestWithProperty: function(property) {
-        var view = get(this, 'parentView');
-
-        while (view) {
-          if (property in view) { return view; }
-          view = get(view, 'parentView');
-        }
-      },
-
-      /**
-        Return the nearest ancestor whose parent is an instance of
-        `klass`.
-
-        @method nearestChildOf
-        @param {Class} klass Subclass of Ember.View (or Ember.View itself)
-        @return Ember.View
-      */
-      nearestChildOf: function(klass) {
-        var view = get(this, 'parentView');
-
-        while (view) {
-          if (get(view, 'parentView') instanceof klass) { return view; }
-          view = get(view, 'parentView');
-        }
-      },
-
-      /**
-        When the parent view changes, recursively invalidate `controller`
-
-        @method _parentViewDidChange
-        @private
-      */
-      _parentViewDidChange: observer('_parentView', function() {
-        if (this.isDestroying) { return; }
-
-        this.trigger('parentViewDidChange');
-
-        if (get(this, 'parentView.controller') && !get(this, 'controller')) {
-          this.notifyPropertyChange('controller');
-        }
-      }),
-
-      _controllerDidChange: observer('controller', function() {
-        if (this.isDestroying) { return; }
-
-        this.rerender();
-
-        this.forEachChildView(function(view) {
-          view.propertyDidChange('controller');
-        });
-      }),
-
-      cloneKeywords: function() {
-        var templateData = get(this, 'templateData');
-
-        var keywords = templateData ? copy(templateData.keywords) : {};
-        set(keywords, 'view', get(this, 'concreteView'));
-        set(keywords, '_view', this);
-        set(keywords, 'controller', get(this, 'controller'));
-
-        return keywords;
-      },
-
-      /**
-        Called on your view when it should push strings of HTML into a
-        `Ember.RenderBuffer`. Most users will want to override the `template`
-        or `templateName` properties instead of this method.
-
-        By default, `Ember.View` will look for a function in the `template`
-        property and invoke it with the value of `context`. The value of
-        `context` will be the view's controller unless you override it.
-
-        @method render
-        @param {Ember.RenderBuffer} buffer The render buffer
-      */
-      render: function(buffer) {
-        // If this view has a layout, it is the responsibility of the
-        // the layout to render the view's template. Otherwise, render the template
-        // directly.
-        var template = get(this, 'layout') || get(this, 'template');
-
-        if (template) {
-          var context = get(this, 'context');
-          var keywords = this.cloneKeywords();
-          var output;
-
-          var data = {
-            view: this,
-            buffer: buffer,
-            isRenderData: true,
-            keywords: keywords,
-            insideGroup: get(this, 'templateData.insideGroup')
-          };
-
-          // Invoke the template with the provided template context, which
-          // is the view's controller by default. A hash of data is also passed that provides
-          // the template with access to the view and render buffer.
-
-          Ember.assert('template must be a function. Did you mean to call Ember.Handlebars.compile("...") or specify templateName instead?', typeof template === 'function');
-          // The template should write directly to the render buffer instead
-          // of returning a string.
-          output = template(context, { data: data });
-
-          // If the template returned a string instead of writing to the buffer,
-          // push the string onto the buffer.
-          if (output !== undefined) { buffer.push(output); }
-        }
-      },
-
-      /**
-        Renders the view again. This will work regardless of whether the
-        view is already in the DOM or not. If the view is in the DOM, the
-        rendering process will be deferred to give bindings a chance
-        to synchronize.
-
-        If children were added during the rendering process using `appendChild`,
-        `rerender` will remove them, because they will be added again
-        if needed by the next `render`.
-
-        In general, if the display of your view changes, you should modify
-        the DOM element directly instead of manually calling `rerender`, which can
-        be slow.
-
-        @method rerender
-      */
-      rerender: function() {
-        return this.currentState.rerender(this);
-      },
-
-      clearRenderedChildren: function() {
-        var lengthBefore = this.lengthBeforeRender,
-            lengthAfter  = this.lengthAfterRender;
-
-        // If there were child views created during the last call to render(),
-        // remove them under the assumption that they will be re-created when
-        // we re-render.
-
-        // VIEW-TODO: Unit test this path.
-        var childViews = this._childViews;
-        for (var i=lengthAfter-1; i>=lengthBefore; i--) {
-          if (childViews[i]) { childViews[i].destroy(); }
-        }
-      },
-
-      /**
-        Iterates over the view's `classNameBindings` array, inserts the value
-        of the specified property into the `classNames` array, then creates an
-        observer to update the view's element if the bound property ever changes
-        in the future.
-
-        @method _applyClassNameBindings
-        @private
-      */
-      _applyClassNameBindings: function(classBindings) {
-        var classNames = this.classNames,
-        elem, newClass, dasherizedClass;
-
-        // Loop through all of the configured bindings. These will be either
-        // property names ('isUrgent') or property paths relative to the view
-        // ('content.isUrgent')
-        a_forEach(classBindings, function(binding) {
-
-          Ember.assert("classNameBindings must not have spaces in them. Multiple class name bindings can be provided as elements of an array, e.g. ['foo', ':bar']", binding.indexOf(' ') === -1);
-
-          // Variable in which the old class value is saved. The observer function
-          // closes over this variable, so it knows which string to remove when
-          // the property changes.
-          var oldClass;
-          // Extract just the property name from bindings like 'foo:bar'
-          var parsedPath = View._parsePropertyPath(binding);
-
-          // Set up an observer on the context. If the property changes, toggle the
-          // class name.
-          var observer = function() {
-            // Get the current value of the property
-            newClass = this._classStringForProperty(binding);
-            elem = this.$();
-
-            // If we had previously added a class to the element, remove it.
-            if (oldClass) {
-              elem.removeClass(oldClass);
-              // Also remove from classNames so that if the view gets rerendered,
-              // the class doesn't get added back to the DOM.
-              classNames.removeObject(oldClass);
-            }
-
-            // If necessary, add a new class. Make sure we keep track of it so
-            // it can be removed in the future.
-            if (newClass) {
-              elem.addClass(newClass);
-              oldClass = newClass;
-            } else {
-              oldClass = null;
-            }
-          };
-
-          // Get the class name for the property at its current value
-          dasherizedClass = this._classStringForProperty(binding);
-
-          if (dasherizedClass) {
-            // Ensure that it gets into the classNames array
-            // so it is displayed when we render.
-            a_addObject(classNames, dasherizedClass);
-
-            // Save a reference to the class name so we can remove it
-            // if the observer fires. Remember that this variable has
-            // been closed over by the observer.
-            oldClass = dasherizedClass;
-          }
-
-          this.registerObserver(this, parsedPath.path, observer);
-          // Remove className so when the view is rerendered,
-          // the className is added based on binding reevaluation
-          this.one('willClearRender', function() {
-            if (oldClass) {
-              classNames.removeObject(oldClass);
-              oldClass = null;
-            }
-          });
-
-        }, this);
-      },
-
-      _unspecifiedAttributeBindings: null,
-
-      /**
-        Iterates through the view's attribute bindings, sets up observers for each,
-        then applies the current value of the attributes to the passed render buffer.
-
-        @method _applyAttributeBindings
-        @param {Ember.RenderBuffer} buffer
-        @private
-      */
-      _applyAttributeBindings: function(buffer, attributeBindings) {
-        var attributeValue,
-            unspecifiedAttributeBindings = this._unspecifiedAttributeBindings = this._unspecifiedAttributeBindings || {};
-
-        a_forEach(attributeBindings, function(binding) {
-          var split = binding.split(':'),
-              property = split[0],
-              attributeName = split[1] || property;
-
-          if (property in this) {
-            this._setupAttributeBindingObservation(property, attributeName);
-
-            // Determine the current value and add it to the render buffer
-            // if necessary.
-            attributeValue = get(this, property);
-            View.applyAttributeBindings(buffer, attributeName, attributeValue);
-          } else {
-            unspecifiedAttributeBindings[property] = attributeName;
-          }
-        }, this);
-
-        // Lazily setup setUnknownProperty after attributeBindings are initially applied
-        this.setUnknownProperty = this._setUnknownProperty;
-      },
-
-      _setupAttributeBindingObservation: function(property, attributeName) {
-        var attributeValue, elem;
-
-        // Create an observer to add/remove/change the attribute if the
-        // JavaScript property changes.
-        var observer = function() {
-          elem = this.$();
-
-          attributeValue = get(this, property);
-
-          View.applyAttributeBindings(elem, attributeName, attributeValue);
-        };
-
-        this.registerObserver(this, property, observer);
-      },
-
-      /**
-        We're using setUnknownProperty as a hook to setup attributeBinding observers for
-        properties that aren't defined on a view at initialization time.
-
-        Note: setUnknownProperty will only be called once for each property.
-
-        @method setUnknownProperty
-        @param key
-        @param value
-        @private
-      */
-      setUnknownProperty: null, // Gets defined after initialization by _applyAttributeBindings
-
-      _setUnknownProperty: function(key, value) {
-        var attributeName = this._unspecifiedAttributeBindings && this._unspecifiedAttributeBindings[key];
-        if (attributeName) {
-          this._setupAttributeBindingObservation(key, attributeName);
-        }
-
-        defineProperty(this, key);
-        return set(this, key, value);
-      },
-
-      /**
-        Given a property name, returns a dasherized version of that
-        property name if the property evaluates to a non-falsy value.
-
-        For example, if the view has property `isUrgent` that evaluates to true,
-        passing `isUrgent` to this method will return `"is-urgent"`.
-
-        @method _classStringForProperty
-        @param property
-        @private
-      */
-      _classStringForProperty: function(property) {
-        var parsedPath = View._parsePropertyPath(property);
-        var path = parsedPath.path;
-
-        var val = get(this, path);
-        if (val === undefined && isGlobalPath(path)) {
-          val = get(Ember.lookup, path);
-        }
-
-        return View._classStringForValue(path, val, parsedPath.className, parsedPath.falsyClassName);
-      },
-
-      // ..........................................................
-      // ELEMENT SUPPORT
-      //
-
-      /**
-        Returns the current DOM element for the view.
-
-        @property element
-        @type DOMElement
-      */
-      element: computed('_parentView', function(key, value) {
-        if (value !== undefined) {
-          return this.currentState.setElement(this, value);
-        } else {
-          return this.currentState.getElement(this);
-        }
-      }),
-
-      /**
-        Returns a jQuery object for this view's element. If you pass in a selector
-        string, this method will return a jQuery object, using the current element
-        as its buffer.
-
-        For example, calling `view.$('li')` will return a jQuery object containing
-        all of the `li` elements inside the DOM element of this view.
-
-        @method $
-        @param {String} [selector] a jQuery-compatible selector string
-        @return {jQuery} the jQuery object for the DOM node
-      */
-      $: function(sel) {
-        return this.currentState.$(this, sel);
-      },
-
-      mutateChildViews: function(callback) {
-        var childViews = this._childViews,
-            idx = childViews.length,
-            view;
-
-        while(--idx >= 0) {
-          view = childViews[idx];
-          callback(this, view, idx);
-        }
-
-        return this;
-      },
-
-      forEachChildView: function(callback) {
-        var childViews = this._childViews;
-
-        if (!childViews) { return this; }
-
-        var len = childViews.length,
-            view, idx;
-
-        for (idx = 0; idx < len; idx++) {
-          view = childViews[idx];
-          callback(view);
-        }
-
-        return this;
-      },
-
-      /**
-        Appends the view's element to the specified parent element.
-
-        If the view does not have an HTML representation yet, `createElement()`
-        will be called automatically.
-
-        Note that this method just schedules the view to be appended; the DOM
-        element will not be appended to the given element until all bindings have
-        finished synchronizing.
-
-        This is not typically a function that you will need to call directly when
-        building your application. You might consider using `Ember.ContainerView`
-        instead. If you do need to use `appendTo`, be sure that the target element
-        you are providing is associated with an `Ember.Application` and does not
-        have an ancestor element that is associated with an Ember view.
-
-        @method appendTo
-        @param {String|DOMElement|jQuery} A selector, element, HTML string, or jQuery object
-        @return {Ember.View} receiver
-      */
-      appendTo: function(target) {
-        // Schedule the DOM element to be created and appended to the given
-        // element after bindings have synchronized.
-        this._insertElementLater(function() {
-          Ember.assert("You tried to append to (" + target + ") but that isn't in the DOM", jQuery(target).length > 0);
-          Ember.assert("You cannot append to an existing Ember.View. Consider using Ember.ContainerView instead.", !jQuery(target).is('.ember-view') && !jQuery(target).parents().is('.ember-view'));
-          this.$().appendTo(target);
-        });
-
-        return this;
-      },
-
-      /**
-        Replaces the content of the specified parent element with this view's
-        element. If the view does not have an HTML representation yet,
-        `createElement()` will be called automatically.
-
-        Note that this method just schedules the view to be appended; the DOM
-        element will not be appended to the given element until all bindings have
-        finished synchronizing
-
-        @method replaceIn
-        @param {String|DOMElement|jQuery} target A selector, element, HTML string, or jQuery object
-        @return {Ember.View} received
-      */
-      replaceIn: function(target) {
-        Ember.assert("You tried to replace in (" + target + ") but that isn't in the DOM", jQuery(target).length > 0);
-        Ember.assert("You cannot replace an existing Ember.View. Consider using Ember.ContainerView instead.", !jQuery(target).is('.ember-view') && !jQuery(target).parents().is('.ember-view'));
-
-        this._insertElementLater(function() {
-          jQuery(target).empty();
-          this.$().appendTo(target);
-        });
-
-        return this;
-      },
-
-      /**
-        Schedules a DOM operation to occur during the next render phase. This
-        ensures that all bindings have finished synchronizing before the view is
-        rendered.
-
-        To use, pass a function that performs a DOM operation.
-
-        Before your function is called, this view and all child views will receive
-        the `willInsertElement` event. After your function is invoked, this view
-        and all of its child views will receive the `didInsertElement` event.
-
-        ```javascript
-        view._insertElementLater(function() {
-          this.createElement();
-          this.$().appendTo('body');
-        });
-        ```
-
-        @method _insertElementLater
-        @param {Function} fn the function that inserts the element into the DOM
-        @private
-      */
-      _insertElementLater: function(fn) {
-        this._scheduledInsert = run.scheduleOnce('render', this, '_insertElement', fn);
-      },
-
-      _insertElement: function (fn) {
-        this._scheduledInsert = null;
-        this.currentState.insertElement(this, fn);
-      },
-
-      /**
-        Appends the view's element to the document body. If the view does
-        not have an HTML representation yet, `createElement()` will be called
-        automatically.
-
-        If your application uses the `rootElement` property, you must append
-        the view within that element. Rendering views outside of the `rootElement`
-        is not supported.
-
-        Note that this method just schedules the view to be appended; the DOM
-        element will not be appended to the document body until all bindings have
-        finished synchronizing.
-
-        @method append
-        @return {Ember.View} receiver
-      */
-      append: function() {
-        return this.appendTo(document.body);
-      },
-
-      /**
-        Removes the view's element from the element to which it is attached.
-
-        @method remove
-        @return {Ember.View} receiver
-      */
-      remove: function() {
-        // What we should really do here is wait until the end of the run loop
-        // to determine if the element has been re-appended to a different
-        // element.
-        // In the interim, we will just re-render if that happens. It is more
-        // important than elements get garbage collected.
-        if (!this.removedFromDOM) { this.destroyElement(); }
-        this.invokeRecursively(function(view) {
-          if (view.clearRenderedChildren) { view.clearRenderedChildren(); }
-        });
-      },
-
-      elementId: null,
-
-      /**
-        Attempts to discover the element in the parent element. The default
-        implementation looks for an element with an ID of `elementId` (or the
-        view's guid if `elementId` is null). You can override this method to
-        provide your own form of lookup. For example, if you want to discover your
-        element using a CSS class name instead of an ID.
-
-        @method findElementInParentElement
-        @param {DOMElement} parentElement The parent's DOM element
-        @return {DOMElement} The discovered element
-      */
-      findElementInParentElement: function(parentElem) {
-        var id = "#" + this.elementId;
-        return jQuery(id)[0] || jQuery(id, parentElem)[0];
-      },
-
-      /**
-        Creates a DOM representation of the view and all of its
-        child views by recursively calling the `render()` method.
-
-        After the element has been created, `didInsertElement` will
-        be called on this view and all of its child views.
-
-        @method createElement
-        @return {Ember.View} receiver
-      */
-      createElement: function() {
-        if (get(this, 'element')) { return this; }
-
-        var buffer = this.renderToBuffer();
-        set(this, 'element', buffer.element());
-
-        return this;
-      },
-
-      /**
-        Called when a view is going to insert an element into the DOM.
-
-        @event willInsertElement
-      */
-      willInsertElement: Ember.K,
-
-      /**
-        Called when the element of the view has been inserted into the DOM
-        or after the view was re-rendered. Override this function to do any
-        set up that requires an element in the document body.
-
-        @event didInsertElement
-      */
-      didInsertElement: Ember.K,
-
-      /**
-        Called when the view is about to rerender, but before anything has
-        been torn down. This is a good opportunity to tear down any manual
-        observers you have installed based on the DOM state
-
-        @event willClearRender
-      */
-      willClearRender: Ember.K,
-
-      /**
-        Run this callback on the current view (unless includeSelf is false) and recursively on child views.
-
-        @method invokeRecursively
-        @param fn {Function}
-        @param includeSelf {Boolean} Includes itself if true.
-        @private
-      */
-      invokeRecursively: function(fn, includeSelf) {
-        var childViews = (includeSelf === false) ? this._childViews : [this];
-        var currentViews, view, currentChildViews;
-
-        while (childViews.length) {
-          currentViews = childViews.slice();
-          childViews = [];
-
-          for (var i=0, l=currentViews.length; i<l; i++) {
-            view = currentViews[i];
-            currentChildViews = view._childViews ? view._childViews.slice(0) : null;
-            fn(view);
-            if (currentChildViews) {
-              childViews.push.apply(childViews, currentChildViews);
-            }
-          }
-        }
-      },
-
-      triggerRecursively: function(eventName) {
-        var childViews = [this], currentViews, view, currentChildViews;
-
-        while (childViews.length) {
-          currentViews = childViews.slice();
-          childViews = [];
-
-          for (var i=0, l=currentViews.length; i<l; i++) {
-            view = currentViews[i];
-            currentChildViews = view._childViews ? view._childViews.slice(0) : null;
-            if (view.trigger) { view.trigger(eventName); }
-            if (currentChildViews) {
-              childViews.push.apply(childViews, currentChildViews);
-            }
-
-          }
-        }
-      },
-
-      viewHierarchyCollection: function() {
-        var currentView, viewCollection = new ViewCollection([this]);
-
-        for (var i = 0; i < viewCollection.length; i++) {
-          currentView = viewCollection.objectAt(i);
-          if (currentView._childViews) {
-            viewCollection.push.apply(viewCollection, currentView._childViews);
-          }
-        }
-
-        return viewCollection;
-      },
-
-      /**
-        Destroys any existing element along with the element for any child views
-        as well. If the view does not currently have a element, then this method
-        will do nothing.
-
-        If you implement `willDestroyElement()` on your view, then this method will
-        be invoked on your view before your element is destroyed to give you a
-        chance to clean up any event handlers, etc.
-
-        If you write a `willDestroyElement()` handler, you can assume that your
-        `didInsertElement()` handler was called earlier for the same element.
-
-        You should not call or override this method yourself, but you may
-        want to implement the above callbacks.
-
-        @method destroyElement
-        @return {Ember.View} receiver
-      */
-      destroyElement: function() {
-        return this.currentState.destroyElement(this);
-      },
-
-      /**
-        Called when the element of the view is going to be destroyed. Override
-        this function to do any teardown that requires an element, like removing
-        event listeners.
-
-        @event willDestroyElement
-      */
-      willDestroyElement: Ember.K,
-
-      /**
-        Triggers the `willDestroyElement` event (which invokes the
-        `willDestroyElement()` method if it exists) on this view and all child
-        views.
-
-        Before triggering `willDestroyElement`, it first triggers the
-        `willClearRender` event recursively.
-
-        @method _notifyWillDestroyElement
-        @private
-      */
-      _notifyWillDestroyElement: function() {
-        var viewCollection = this.viewHierarchyCollection();
-        viewCollection.trigger('willClearRender');
-        viewCollection.trigger('willDestroyElement');
-        return viewCollection;
-      },
-
-      /**
-        If this view's element changes, we need to invalidate the caches of our
-        child views so that we do not retain references to DOM elements that are
-        no longer needed.
-
-        @method _elementDidChange
-        @private
-      */
-      _elementDidChange: observer('element', function() {
-        this.forEachChildView(clearCachedElement);
-      }),
-
-      /**
-        Called when the parentView property has changed.
-
-        @event parentViewDidChange
-      */
-      parentViewDidChange: Ember.K,
-
-      instrumentName: 'view',
-
-      instrumentDetails: function(hash) {
-        hash.template = get(this, 'templateName');
-        this._super(hash);
-      },
-
-      _renderToBuffer: function(parentBuffer, bufferOperation) {
-        this.lengthBeforeRender = this._childViews.length;
-        var buffer = this._super(parentBuffer, bufferOperation);
-        this.lengthAfterRender = this._childViews.length;
-
-        return buffer;
-      },
-
-      renderToBufferIfNeeded: function (buffer) {
-        return this.currentState.renderToBufferIfNeeded(this, buffer);
-      },
-
-      beforeRender: function(buffer) {
-        this.applyAttributesToBuffer(buffer);
-        buffer.pushOpeningTag();
-      },
-
-      afterRender: function(buffer) {
-        buffer.pushClosingTag();
-      },
-
-      applyAttributesToBuffer: function(buffer) {
-        // Creates observers for all registered class name and attribute bindings,
-        // then adds them to the element.
-        var classNameBindings = get(this, 'classNameBindings');
-        if (classNameBindings.length) {
-          this._applyClassNameBindings(classNameBindings);
-        }
-
-        // Pass the render buffer so the method can apply attributes directly.
-        // This isn't needed for class name bindings because they use the
-        // existing classNames infrastructure.
-        var attributeBindings = get(this, 'attributeBindings');
-        if (attributeBindings.length) {
-          this._applyAttributeBindings(buffer, attributeBindings);
-        }
-
-        buffer.setClasses(this.classNames);
-        buffer.id(this.elementId);
-
-        var role = get(this, 'ariaRole');
-        if (role) {
-          buffer.attr('role', role);
-        }
-
-        if (get(this, 'isVisible') === false) {
-          buffer.style('display', 'none');
-        }
-      },
-
-      // ..........................................................
-      // STANDARD RENDER PROPERTIES
-      //
-
-      /**
-        Tag name for the view's outer element. The tag name is only used when an
-        element is first created. If you change the `tagName` for an element, you
-        must destroy and recreate the view element.
-
-        By default, the render buffer will use a `<div>` tag for views.
-
-        @property tagName
-        @type String
-        @default null
-      */
-
-      // We leave this null by default so we can tell the difference between
-      // the default case and a user-specified tag.
-      tagName: null,
-
-      /**
-        The WAI-ARIA role of the control represented by this view. For example, a
-        button may have a role of type 'button', or a pane may have a role of
-        type 'alertdialog'. This property is used by assistive software to help
-        visually challenged users navigate rich web applications.
-
-        The full list of valid WAI-ARIA roles is available at:
-        [http://www.w3.org/TR/wai-aria/roles#roles_categorization](http://www.w3.org/TR/wai-aria/roles#roles_categorization)
-
-        @property ariaRole
-        @type String
-        @default null
-      */
-      ariaRole: null,
-
-      /**
-        Standard CSS class names to apply to the view's outer element. This
-        property automatically inherits any class names defined by the view's
-        superclasses as well.
-
-        @property classNames
-        @type Array
-        @default ['ember-view']
-      */
-      classNames: ['ember-view'],
-
-      /**
-        A list of properties of the view to apply as class names. If the property
-        is a string value, the value of that string will be applied as a class
-        name.
-
-        ```javascript
-        // Applies the 'high' class to the view element
-        Ember.View.extend({
-          classNameBindings: ['priority']
-          priority: 'high'
-        });
-        ```
-
-        If the value of the property is a Boolean, the name of that property is
-        added as a dasherized class name.
-
-        ```javascript
-        // Applies the 'is-urgent' class to the view element
-        Ember.View.extend({
-          classNameBindings: ['isUrgent']
-          isUrgent: true
-        });
-        ```
-
-        If you would prefer to use a custom value instead of the dasherized
-        property name, you can pass a binding like this:
-
-        ```javascript
-        // Applies the 'urgent' class to the view element
-        Ember.View.extend({
-          classNameBindings: ['isUrgent:urgent']
-          isUrgent: true
-        });
-        ```
-
-        This list of properties is inherited from the view's superclasses as well.
-
-        @property classNameBindings
-        @type Array
-        @default []
-      */
-      classNameBindings: EMPTY_ARRAY,
-
-      /**
-        A list of properties of the view to apply as attributes. If the property is
-        a string value, the value of that string will be applied as the attribute.
-
-        ```javascript
-        // Applies the type attribute to the element
-        // with the value "button", like <div type="button">
-        Ember.View.extend({
-          attributeBindings: ['type'],
-          type: 'button'
-        });
-        ```
-
-        If the value of the property is a Boolean, the name of that property is
-        added as an attribute.
-
-        ```javascript
-        // Renders something like <div enabled="enabled">
-        Ember.View.extend({
-          attributeBindings: ['enabled'],
-          enabled: true
-        });
-        ```
-
-        @property attributeBindings
-      */
-      attributeBindings: EMPTY_ARRAY,
-
-      // .......................................................
-      // CORE DISPLAY METHODS
-      //
-
-      /**
-        Setup a view, but do not finish waking it up.
-
-        * configure `childViews`
-        * register the view with the global views hash, which is used for event
-          dispatch
-
-        @method init
-        @private
-      */
-      init: function() {
-        this.elementId = this.elementId || guidFor(this);
-
-        this._super();
-
-        // setup child views. be sure to clone the child views array first
-        this._childViews = this._childViews.slice();
-
-        Ember.assert("Only arrays are allowed for 'classNameBindings'", typeOf(this.classNameBindings) === 'array');
-        this.classNameBindings = A(this.classNameBindings.slice());
-
-        Ember.assert("Only arrays are allowed for 'classNames'", typeOf(this.classNames) === 'array');
-        this.classNames = A(this.classNames.slice());
-      },
-
-      appendChild: function(view, options) {
-        return this.currentState.appendChild(this, view, options);
-      },
-
-      /**
-        Removes the child view from the parent view.
-
-        @method removeChild
-        @param {Ember.View} view
-        @return {Ember.View} receiver
-      */
-      removeChild: function(view) {
-        // If we're destroying, the entire subtree will be
-        // freed, and the DOM will be handled separately,
-        // so no need to mess with childViews.
-        if (this.isDestroying) { return; }
-
-        // update parent node
-        set(view, '_parentView', null);
-
-        // remove view from childViews array.
-        var childViews = this._childViews;
-
-        a_removeObject(childViews, view);
-
-        this.propertyDidChange('childViews'); // HUH?! what happened to will change?
-
-        return this;
-      },
-
-      /**
-        Removes all children from the `parentView`.
-
-        @method removeAllChildren
-        @return {Ember.View} receiver
-      */
-      removeAllChildren: function() {
-        return this.mutateChildViews(function(parentView, view) {
-          parentView.removeChild(view);
-        });
-      },
-
-      destroyAllChildren: function() {
-        return this.mutateChildViews(function(parentView, view) {
-          view.destroy();
-        });
-      },
-
-      /**
-        Removes the view from its `parentView`, if one is found. Otherwise
-        does nothing.
-
-        @method removeFromParent
-        @return {Ember.View} receiver
-      */
-      removeFromParent: function() {
-        var parent = this._parentView;
-
-        // Remove DOM element from parent
-        this.remove();
-
-        if (parent) { parent.removeChild(this); }
-        return this;
-      },
-
-      /**
-        You must call `destroy` on a view to destroy the view (and all of its
-        child views). This will remove the view from any parent node, then make
-        sure that the DOM element managed by the view can be released by the
-        memory manager.
-
-        @method destroy
-      */
-      destroy: function() {
-        var childViews = this._childViews,
-            // get parentView before calling super because it'll be destroyed
-            nonVirtualParentView = get(this, 'parentView'),
-            viewName = this.viewName,
-            childLen, i;
-
-        if (!this._super()) { return; }
-
-        childLen = childViews.length;
-        for (i=childLen-1; i>=0; i--) {
-          childViews[i].removedFromDOM = true;
-        }
-
-        // remove from non-virtual parent view if viewName was specified
-        if (viewName && nonVirtualParentView) {
-          nonVirtualParentView.set(viewName, null);
-        }
-
-        childLen = childViews.length;
-        for (i=childLen-1; i>=0; i--) {
-          childViews[i].destroy();
-        }
-
-        return this;
-      },
-
-      /**
-        Instantiates a view to be added to the childViews array during view
-        initialization. You generally will not call this method directly unless
-        you are overriding `createChildViews()`. Note that this method will
-        automatically configure the correct settings on the new view instance to
-        act as a child of the parent.
-
-        @method createChildView
-        @param {Class|String} viewClass
-        @param {Hash} [attrs] Attributes to add
-        @return {Ember.View} new instance
-      */
-      createChildView: function(view, attrs) {
-        if (!view) {
-          throw new TypeError("createChildViews first argument must exist");
-        }
-
-        if (view.isView && view._parentView === this && view.container === this.container) {
-          return view;
-        }
-
-        attrs = attrs || {};
-        attrs._parentView = this;
-
-        if (CoreView.detect(view)) {
-          attrs.templateData = attrs.templateData || get(this, 'templateData');
-
-          attrs.container = this.container;
-          view = view.create(attrs);
-
-          // don't set the property on a virtual view, as they are invisible to
-          // consumers of the view API
-          if (view.viewName) {
-            set(get(this, 'concreteView'), view.viewName, view);
-          }
-        } else if ('string' === typeof view) {
-          var fullName = 'view:' + view;
-          var ViewKlass = this.container.lookupFactory(fullName);
-
-          Ember.assert("Could not find view: '" + fullName + "'", !!ViewKlass);
-
-          attrs.templateData = get(this, 'templateData');
-          view = ViewKlass.create(attrs);
-        } else {
-          Ember.assert('You must pass instance or subclass of View', view.isView);
-          attrs.container = this.container;
-
-          if (!get(view, 'templateData')) {
-            attrs.templateData = get(this, 'templateData');
-          }
-
-          setProperties(view, attrs);
-
-        }
-
-        return view;
-      },
-
-      becameVisible: Ember.K,
-      becameHidden: Ember.K,
-
-      /**
-        When the view's `isVisible` property changes, toggle the visibility
-        element of the actual DOM element.
-
-        @method _isVisibleDidChange
-        @private
-      */
-      _isVisibleDidChange: observer('isVisible', function() {
-        if (this._isVisible === get(this, 'isVisible')) { return ; }
-        run.scheduleOnce('render', this, this._toggleVisibility);
-      }),
-
-      _toggleVisibility: function() {
-        var $el = this.$();
-        if (!$el) { return; }
-
-        var isVisible = get(this, 'isVisible');
-
-        if (this._isVisible === isVisible) { return ; }
-
-        $el.toggle(isVisible);
-
-        this._isVisible = isVisible;
-
-        if (this._isAncestorHidden()) { return; }
-
-        if (isVisible) {
-          this._notifyBecameVisible();
-        } else {
-          this._notifyBecameHidden();
-        }
-      },
-
-      _notifyBecameVisible: function() {
-        this.trigger('becameVisible');
-
-        this.forEachChildView(function(view) {
-          var isVisible = get(view, 'isVisible');
-
-          if (isVisible || isVisible === null) {
-            view._notifyBecameVisible();
-          }
-        });
-      },
-
-      _notifyBecameHidden: function() {
-        this.trigger('becameHidden');
-        this.forEachChildView(function(view) {
-          var isVisible = get(view, 'isVisible');
-
-          if (isVisible || isVisible === null) {
-            view._notifyBecameHidden();
-          }
-        });
-      },
-
-      _isAncestorHidden: function() {
-        var parent = get(this, 'parentView');
-
-        while (parent) {
-          if (get(parent, 'isVisible') === false) { return true; }
-
-          parent = get(parent, 'parentView');
-        }
-
-        return false;
-      },
-
-      clearBuffer: function() {
-        this.invokeRecursively(nullViewsBuffer);
-      },
-
-      transitionTo: function(state, children) {
-        var priorState = this.currentState,
-            currentState = this.currentState = this.states[state];
-        this.state = state;
-
-        if (priorState && priorState.exit) { priorState.exit(this); }
-        if (currentState.enter) { currentState.enter(this); }
-        if (state === 'inDOM') { meta(this).cache.element = undefined; }
-
-        if (children !== false) {
-          this.forEachChildView(function(view) {
-            view.transitionTo(state);
-          });
-        }
-      },
-
-      // .......................................................
-      // EVENT HANDLING
-      //
-
-      /**
-        Handle events from `Ember.EventDispatcher`
-
-        @method handleEvent
-        @param eventName {String}
-        @param evt {Event}
-        @private
-      */
-      handleEvent: function(eventName, evt) {
-        return this.currentState.handleEvent(this, eventName, evt);
-      },
-
-      registerObserver: function(root, path, target, observer) {
-        if (!observer && 'function' === typeof target) {
-          observer = target;
-          target = null;
-        }
-
-        if (!root || typeof root !== 'object') {
-          return;
-        }
-
-        var view = this,
-            stateCheckedObserver = function() {
-              view.currentState.invokeObserver(this, observer);
-            },
-            scheduledObserver = function() {
-              run.scheduleOnce('render', this, stateCheckedObserver);
-            };
-
-        addObserver(root, path, target, scheduledObserver);
-
-        this.one('willClearRender', function() {
-          removeObserver(root, path, target, scheduledObserver);
-        });
-      }
-
-    });
-
-    /*
-      Describe how the specified actions should behave in the various
-      states that a view can exist in. Possible states:
-
-      * preRender: when a view is first instantiated, and after its
-        element was destroyed, it is in the preRender state
-      * inBuffer: once a view has been rendered, but before it has
-        been inserted into the DOM, it is in the inBuffer state
-      * hasElement: the DOM representation of the view is created,
-        and is ready to be inserted
-      * inDOM: once a view has been inserted into the DOM it is in
-        the inDOM state. A view spends the vast majority of its
-        existence in this state.
-      * destroyed: once a view has been destroyed (using the destroy
-        method), it is in this state. No further actions can be invoked
-        on a destroyed view.
-    */
-
-      // in the destroyed state, everything is illegal
-
-      // before rendering has begun, all legal manipulations are noops.
-
-      // inside the buffer, legal manipulations are done on the buffer
-
-      // once the view has been inserted into the DOM, legal manipulations
-      // are done on the DOM element.
-
-    function notifyMutationListeners() {
-      run.once(View, 'notifyMutationListeners');
-    }
-
-    var DOMManager = {
-      prepend: function(view, html) {
-        view.$().prepend(html);
-        notifyMutationListeners();
-      },
-
-      after: function(view, html) {
-        view.$().after(html);
-        notifyMutationListeners();
-      },
-
-      html: function(view, html) {
-        view.$().html(html);
-        notifyMutationListeners();
-      },
-
-      replace: function(view) {
-        var element = get(view, 'element');
-
-        set(view, 'element', null);
-
-        view._insertElementLater(function() {
-          jQuery(element).replaceWith(get(view, 'element'));
-          notifyMutationListeners();
-        });
-      },
-
-      remove: function(view) {
-        view.$().remove();
-        notifyMutationListeners();
-      },
-
-      empty: function(view) {
-        view.$().empty();
-        notifyMutationListeners();
-      }
-    };
-
-    View.reopen({
-      domManager: DOMManager
-    });
-
-    View.reopenClass({
-
-      /**
-        Parse a path and return an object which holds the parsed properties.
-
-        For example a path like "content.isEnabled:enabled:disabled" will return the
-        following object:
-
-        ```javascript
-        {
-          path: "content.isEnabled",
-          className: "enabled",
-          falsyClassName: "disabled",
-          classNames: ":enabled:disabled"
-        }
-        ```
-
-        @method _parsePropertyPath
-        @static
-        @private
-      */
-      _parsePropertyPath: function(path) {
-        var split = path.split(':'),
-            propertyPath = split[0],
-            classNames = "",
-            className,
-            falsyClassName;
-
-        // check if the property is defined as prop:class or prop:trueClass:falseClass
-        if (split.length > 1) {
-          className = split[1];
-          if (split.length === 3) { falsyClassName = split[2]; }
-
-          classNames = ':' + className;
-          if (falsyClassName) { classNames += ":" + falsyClassName; }
-        }
-
-        return {
-          path: propertyPath,
-          classNames: classNames,
-          className: (className === '') ? undefined : className,
-          falsyClassName: falsyClassName
-        };
-      },
-
-      /**
-        Get the class name for a given value, based on the path, optional
-        `className` and optional `falsyClassName`.
-
-        - if a `className` or `falsyClassName` has been specified:
-          - if the value is truthy and `className` has been specified,
-            `className` is returned
-          - if the value is falsy and `falsyClassName` has been specified,
-            `falsyClassName` is returned
-          - otherwise `null` is returned
-        - if the value is `true`, the dasherized last part of the supplied path
-          is returned
-        - if the value is not `false`, `undefined` or `null`, the `value`
-          is returned
-        - if none of the above rules apply, `null` is returned
-
-        @method _classStringForValue
-        @param path
-        @param val
-        @param className
-        @param falsyClassName
-        @static
-        @private
-      */
-      _classStringForValue: function(path, val, className, falsyClassName) {
-        // When using the colon syntax, evaluate the truthiness or falsiness
-        // of the value to determine which className to return
-        if (className || falsyClassName) {
-          if (className && !!val) {
-            return className;
-
-          } else if (falsyClassName && !val) {
-            return falsyClassName;
-
-          } else {
-            return null;
-          }
-
-        // If value is a Boolean and true, return the dasherized property
-        // name.
-        } else if (val === true) {
-          // Normalize property path to be suitable for use
-          // as a class name. For exaple, content.foo.barBaz
-          // becomes bar-baz.
-          var parts = path.split('.');
-          return dasherize(parts[parts.length-1]);
-
-        // If the value is not false, undefined, or null, return the current
-        // value of the property.
-        } else if (val !== false && val != null) {
-          return val;
-
-        // Nothing to display. Return null so that the old class is removed
-        // but no new class is added.
-        } else {
-          return null;
-        }
-      }
-    });
-
-    var mutation = EmberObject.extend(Evented).create();
-
-    View.addMutationListener = function(callback) {
-      mutation.on('change', callback);
-    };
-
-    View.removeMutationListener = function(callback) {
-      mutation.off('change', callback);
-    };
-
-    View.notifyMutationListeners = function() {
-      mutation.trigger('change');
-    };
-
-    /**
-      Global views hash
-
-      @property views
-      @static
-      @type Hash
-    */
-    View.views = {};
-
-    // If someone overrides the child views computed property when
-    // defining their class, we want to be able to process the user's
-    // supplied childViews and then restore the original computed property
-    // at view initialization time. This happens in Ember.ContainerView's init
-    // method.
-    View.childViewsProperty = childViewsProperty;
-
-    View.applyAttributeBindings = function(elem, name, value) {
-      var type = typeOf(value);
-
-      // if this changes, also change the logic in ember-handlebars/lib/helpers/binding.js
-      if (name !== 'value' && (type === 'string' || (type === 'number' && !isNaN(value)))) {
-        if (value !== elem.attr(name)) {
-          elem.attr(name, value);
-        }
-      } else if (name === 'value' || type === 'boolean') {
-        if (isNone(value) || value === false) {
-          // `null`, `undefined` or `false` should remove attribute
-          elem.removeAttr(name);
-          elem.prop(name, '');
-        } else if (value !== elem.prop(name)) {
-          // value should always be properties
-          elem.prop(name, value);
-        }
-      } else if (!value) {
-        elem.removeAttr(name);
-      }
-    };
-
-    __exports__.CoreView = CoreView;
-    __exports__.View = View;
-    __exports__.ViewCollection = ViewCollection;
-  });
-})();
-
-(function() {
-define("metamorph",
-  [],
-  function() {
-    "use strict";
-    // ==========================================================================
-    // Project:   metamorph
-    // Copyright: ©2014 Tilde, Inc. All rights reserved.
-    // ==========================================================================
-
-    var K = function() {},
-        guid = 0,
-        disableRange = (function(){
-          if ('undefined' !== typeof MetamorphENV) {
-            return MetamorphENV.DISABLE_RANGE_API;
-          } else if ('undefined' !== ENV) {
-            return ENV.DISABLE_RANGE_API;
-          } else {
-            return false;
-          }
-        })(),
-
-        // Feature-detect the W3C range API, the extended check is for IE9 which only partially supports ranges
-        supportsRange = (!disableRange) && typeof document !== 'undefined' && ('createRange' in document) && (typeof Range !== 'undefined') && Range.prototype.createContextualFragment,
-
-        // Internet Explorer prior to 9 does not allow setting innerHTML if the first element
-        // is a "zero-scope" element. This problem can be worked around by making
-        // the first node an invisible text node. We, like Modernizr, use &shy;
-        needsShy = typeof document !== 'undefined' && (function() {
-          var testEl = document.createElement('div');
-          testEl.innerHTML = "<div></div>";
-          testEl.firstChild.innerHTML = "<script></script>";
-          return testEl.firstChild.innerHTML === '';
-        })(),
-
-
-        // IE 8 (and likely earlier) likes to move whitespace preceeding
-        // a script tag to appear after it. This means that we can
-        // accidentally remove whitespace when updating a morph.
-        movesWhitespace = document && (function() {
-          var testEl = document.createElement('div');
-          testEl.innerHTML = "Test: <script type='text/x-placeholder'></script>Value";
-          return testEl.childNodes[0].nodeValue === 'Test:' &&
-                  testEl.childNodes[2].nodeValue === ' Value';
-        })();
-
-    // Constructor that supports either Metamorph('foo') or new
-    // Metamorph('foo');
-    //
-    // Takes a string of HTML as the argument.
-
-    var Metamorph = function(html) {
-      var self;
-
-      if (this instanceof Metamorph) {
-        self = this;
-      } else {
-        self = new K();
-      }
-
-      self.innerHTML = html;
-      var myGuid = 'metamorph-'+(guid++);
-      self.start = myGuid + '-start';
-      self.end = myGuid + '-end';
-
-      return self;
-    };
-
-    K.prototype = Metamorph.prototype;
-
-    var rangeFor, htmlFunc, removeFunc, outerHTMLFunc, appendToFunc, afterFunc, prependFunc, startTagFunc, endTagFunc;
-
-    outerHTMLFunc = function() {
-      return this.startTag() + this.innerHTML + this.endTag();
-    };
-
-    startTagFunc = function() {
-      /*
-       * We replace chevron by its hex code in order to prevent escaping problems.
-       * Check this thread for more explaination:
-       * http://stackoverflow.com/questions/8231048/why-use-x3c-instead-of-when-generating-html-from-javascript
-       */
-      return "<script id='" + this.start + "' type='text/x-placeholder'>\x3C/script>";
-    };
-
-    endTagFunc = function() {
-      /*
-       * We replace chevron by its hex code in order to prevent escaping problems.
-       * Check this thread for more explaination:
-       * http://stackoverflow.com/questions/8231048/why-use-x3c-instead-of-when-generating-html-from-javascript
-       */
-      return "<script id='" + this.end + "' type='text/x-placeholder'>\x3C/script>";
-    };
-
-    // If we have the W3C range API, this process is relatively straight forward.
-    if (supportsRange) {
-
-      // Get a range for the current morph. Optionally include the starting and
-      // ending placeholders.
-      rangeFor = function(morph, outerToo) {
-        var range = document.createRange();
-        var before = document.getElementById(morph.start);
-        var after = document.getElementById(morph.end);
-
-        if (outerToo) {
-          range.setStartBefore(before);
-          range.setEndAfter(after);
-        } else {
-          range.setStartAfter(before);
-          range.setEndBefore(after);
-        }
-
-        return range;
-      };
-
-      htmlFunc = function(html, outerToo) {
-        // get a range for the current metamorph object
-        var range = rangeFor(this, outerToo);
-
-        // delete the contents of the range, which will be the
-        // nodes between the starting and ending placeholder.
-        range.deleteContents();
-
-        // create a new document fragment for the HTML
-        var fragment = range.createContextualFragment(html);
-
-        // insert the fragment into the range
-        range.insertNode(fragment);
-      };
-
-      /**
-      * @public
-      *
-      * Remove this object (including starting and ending
-      * placeholders).
-      *
-      * @method remove
-      */
-      removeFunc = function() {
-        // get a range for the current metamorph object including
-        // the starting and ending placeholders.
-        var range = rangeFor(this, true);
-
-        // delete the entire range.
-        range.deleteContents();
-      };
-
-      appendToFunc = function(node) {
-        var range = document.createRange();
-        range.setStart(node);
-        range.collapse(false);
-        var frag = range.createContextualFragment(this.outerHTML());
-        node.appendChild(frag);
-      };
-
-      afterFunc = function(html) {
-        var range = document.createRange();
-        var after = document.getElementById(this.end);
-
-        range.setStartAfter(after);
-        range.setEndAfter(after);
-
-        var fragment = range.createContextualFragment(html);
-        range.insertNode(fragment);
-      };
-
-      prependFunc = function(html) {
-        var range = document.createRange();
-        var start = document.getElementById(this.start);
-
-        range.setStartAfter(start);
-        range.setEndAfter(start);
-
-        var fragment = range.createContextualFragment(html);
-        range.insertNode(fragment);
-      };
-
-    } else {
-      /*
-       * This code is mostly taken from jQuery, with one exception. In jQuery's case, we
-       * have some HTML and we need to figure out how to convert it into some nodes.
-       *
-       * In this case, jQuery needs to scan the HTML looking for an opening tag and use
-       * that as the key for the wrap map. In our case, we know the parent node, and
-       * can use its type as the key for the wrap map.
-       **/
-      var wrapMap = {
-        select: [ 1, "<select multiple='multiple'>", "</select>" ],
-        fieldset: [ 1, "<fieldset>", "</fieldset>" ],
-        table: [ 1, "<table>", "</table>" ],
-        tbody: [ 2, "<table><tbody>", "</tbody></table>" ],
-        tr: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-        colgroup: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-        map: [ 1, "<map>", "</map>" ],
-        _default: [ 0, "", "" ]
-      };
-
-      var findChildById = function(element, id) {
-        if (element.getAttribute('id') === id) { return element; }
-
-        var len = element.childNodes.length, idx, node, found;
-        for (idx=0; idx<len; idx++) {
-          node = element.childNodes[idx];
-          found = node.nodeType === 1 && findChildById(node, id);
-          if (found) { return found; }
-        }
-      };
-
-      var setInnerHTML = function(element, html) {
-        var matches = [];
-        if (movesWhitespace) {
-          // Right now we only check for script tags with ids with the
-          // goal of targeting morphs.
-          html = html.replace(/(\s+)(<script id='([^']+)')/g, function(match, spaces, tag, id) {
-            matches.push([id, spaces]);
-            return tag;
-          });
-        }
-
-        element.innerHTML = html;
-
-        // If we have to do any whitespace adjustments do them now
-        if (matches.length > 0) {
-          var len = matches.length, idx;
-          for (idx=0; idx<len; idx++) {
-            var script = findChildById(element, matches[idx][0]),
-                node = document.createTextNode(matches[idx][1]);
-            script.parentNode.insertBefore(node, script);
-          }
-        }
-      };
-
-      /*
-       * Given a parent node and some HTML, generate a set of nodes. Return the first
-       * node, which will allow us to traverse the rest using nextSibling.
-       *
-       * We need to do this because innerHTML in IE does not really parse the nodes.
-       */
-      var firstNodeFor = function(parentNode, html) {
-        var arr = wrapMap[parentNode.tagName.toLowerCase()] || wrapMap._default;
-        var depth = arr[0], start = arr[1], end = arr[2];
-
-        if (needsShy) { html = '&shy;'+html; }
-
-        var element = document.createElement('div');
-
-        setInnerHTML(element, start + html + end);
-
-        for (var i=0; i<=depth; i++) {
-          element = element.firstChild;
-        }
-
-        // Look for &shy; to remove it.
-        if (needsShy) {
-          var shyElement = element;
-
-          // Sometimes we get nameless elements with the shy inside
-          while (shyElement.nodeType === 1 && !shyElement.nodeName) {
-            shyElement = shyElement.firstChild;
-          }
-
-          // At this point it's the actual unicode character.
-          if (shyElement.nodeType === 3 && shyElement.nodeValue.charAt(0) === "\u00AD") {
-            shyElement.nodeValue = shyElement.nodeValue.slice(1);
-          }
-        }
-
-        return element;
-      };
-
-      /*
-       * In some cases, Internet Explorer can create an anonymous node in
-       * the hierarchy with no tagName. You can create this scenario via:
-       *
-       *     div = document.createElement("div");
-       *     div.innerHTML = "<table>&shy<script></script><tr><td>hi</td></tr></table>";
-       *     div.firstChild.firstChild.tagName //=> ""
-       *
-       * If our script markers are inside such a node, we need to find that
-       * node and use *it* as the marker.
-       */
-      var realNode = function(start) {
-        while (start.parentNode.tagName === "") {
-          start = start.parentNode;
-        }
-
-        return start;
-      };
-
-      /*
-       * When automatically adding a tbody, Internet Explorer inserts the
-       * tbody immediately before the first <tr>. Other browsers create it
-       * before the first node, no matter what.
-       *
-       * This means the the following code:
-       *
-       *     div = document.createElement("div");
-       *     div.innerHTML = "<table><script id='first'></script><tr><td>hi</td></tr><script id='last'></script></table>
-       *
-       * Generates the following DOM in IE:
-       *
-       *     + div
-       *       + table
-       *         - script id='first'
-       *         + tbody
-       *           + tr
-       *             + td
-       *               - "hi"
-       *           - script id='last'
-       *
-       * Which means that the two script tags, even though they were
-       * inserted at the same point in the hierarchy in the original
-       * HTML, now have different parents.
-       *
-       * This code reparents the first script tag by making it the tbody's
-       * first child.
-       *
-       */
-      var fixParentage = function(start, end) {
-        if (start.parentNode !== end.parentNode) {
-          end.parentNode.insertBefore(start, end.parentNode.firstChild);
-        }
-      };
-
-      htmlFunc = function(html, outerToo) {
-        // get the real starting node. see realNode for details.
-        var start = realNode(document.getElementById(this.start));
-        var end = document.getElementById(this.end);
-        var parentNode = end.parentNode;
-        var node, nextSibling, last;
-
-        // make sure that the start and end nodes share the same
-        // parent. If not, fix it.
-        fixParentage(start, end);
-
-        // remove all of the nodes after the starting placeholder and
-        // before the ending placeholder.
-        node = start.nextSibling;
-        while (node) {
-          nextSibling = node.nextSibling;
-          last = node === end;
-
-          // if this is the last node, and we want to remove it as well,
-          // set the `end` node to the next sibling. This is because
-          // for the rest of the function, we insert the new nodes
-          // before the end (note that insertBefore(node, null) is
-          // the same as appendChild(node)).
-          //
-          // if we do not want to remove it, just break.
-          if (last) {
-            if (outerToo) { end = node.nextSibling; } else { break; }
-          }
-
-          node.parentNode.removeChild(node);
-
-          // if this is the last node and we didn't break before
-          // (because we wanted to remove the outer nodes), break
-          // now.
-          if (last) { break; }
-
-          node = nextSibling;
-        }
-
-        // get the first node for the HTML string, even in cases like
-        // tables and lists where a simple innerHTML on a div would
-        // swallow some of the content.
-        node = firstNodeFor(start.parentNode, html);
-
-        if (outerToo) {
-          start.parentNode.removeChild(start);
-        }
-
-        // copy the nodes for the HTML between the starting and ending
-        // placeholder.
-        while (node) {
-          nextSibling = node.nextSibling;
-          parentNode.insertBefore(node, end);
-          node = nextSibling;
-        }
-      };
-
-      // remove the nodes in the DOM representing this metamorph.
-      //
-      // this includes the starting and ending placeholders.
-      removeFunc = function() {
-        var start = realNode(document.getElementById(this.start));
-        var end = document.getElementById(this.end);
-
-        this.html('');
-        start.parentNode.removeChild(start);
-        end.parentNode.removeChild(end);
-      };
-
-      appendToFunc = function(parentNode) {
-        var node = firstNodeFor(parentNode, this.outerHTML());
-        var nextSibling;
-
-        while (node) {
-          nextSibling = node.nextSibling;
-          parentNode.appendChild(node);
-          node = nextSibling;
-        }
-      };
-
-      afterFunc = function(html) {
-        // get the real starting node. see realNode for details.
-        var end = document.getElementById(this.end);
-        var insertBefore = end.nextSibling;
-        var parentNode = end.parentNode;
-        var nextSibling;
-        var node;
-
-        // get the first node for the HTML string, even in cases like
-        // tables and lists where a simple innerHTML on a div would
-        // swallow some of the content.
-        node = firstNodeFor(parentNode, html);
-
-        // copy the nodes for the HTML between the starting and ending
-        // placeholder.
-        while (node) {
-          nextSibling = node.nextSibling;
-          parentNode.insertBefore(node, insertBefore);
-          node = nextSibling;
-        }
-      };
-
-      prependFunc = function(html) {
-        var start = document.getElementById(this.start);
-        var parentNode = start.parentNode;
-        var nextSibling;
-        var node;
-
-        node = firstNodeFor(parentNode, html);
-        var insertBefore = start.nextSibling;
-
-        while (node) {
-          nextSibling = node.nextSibling;
-          parentNode.insertBefore(node, insertBefore);
-          node = nextSibling;
-        }
-      };
-    }
-
-    Metamorph.prototype.html = function(html) {
-      this.checkRemoved();
-      if (html === undefined) { return this.innerHTML; }
-
-      htmlFunc.call(this, html);
-
-      this.innerHTML = html;
-    };
-
-    Metamorph.prototype.replaceWith = function(html) {
-      this.checkRemoved();
-      htmlFunc.call(this, html, true);
-    };
-
-    Metamorph.prototype.remove = removeFunc;
-    Metamorph.prototype.outerHTML = outerHTMLFunc;
-    Metamorph.prototype.appendTo = appendToFunc;
-    Metamorph.prototype.after = afterFunc;
-    Metamorph.prototype.prepend = prependFunc;
-    Metamorph.prototype.startTag = startTagFunc;
-    Metamorph.prototype.endTag = endTagFunc;
-
-    Metamorph.prototype.isRemoved = function() {
-      var before = document.getElementById(this.start);
-      var after = document.getElementById(this.end);
-
-      return !before || !after;
-    };
-
-    Metamorph.prototype.checkRemoved = function() {
-      if (this.isRemoved()) {
-        throw new Error("Cannot perform operations on a Metamorph that is not in the DOM.");
-      }
-    };
-
-    return Metamorph;
-  });
-
-})();
-
-(function() {
-define("ember-handlebars-compiler", 
-  ["ember-metal/core","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars-compiler
-    */
-
-    var Ember = __dependency1__["default"];
-
-    // ES6Todo: you'll need to import debugger once debugger is es6'd.
-    if (typeof Ember.assert === 'undefined')   { Ember.assert = function(){}; };
-    if (typeof Ember.FEATURES === 'undefined') { Ember.FEATURES = { isEnabled: function(){} }; };
-
-    var objectCreate = Object.create || function(parent) {
-      function F() {}
-      F.prototype = parent;
-      return new F();
-    };
-
-    // set up for circular references later
-    var View, Component;
-
-    // ES6Todo: when ember-debug is es6'ed import this.
-    // var emberAssert = Ember.assert;
-    var Handlebars = (Ember.imports && Ember.imports.Handlebars) || (this && this.Handlebars);
-    if (!Handlebars && typeof require === 'function') {
-      Handlebars = require('handlebars');
-    }
-
-    Ember.assert("Ember Handlebars requires Handlebars version 1.0 or 1.1. Include " +
-                 "a SCRIPT tag in the HTML HEAD linking to the Handlebars file " +
-                 "before you link to Ember.", Handlebars);
-
-    Ember.assert("Ember Handlebars requires Handlebars version 1.0 or 1.1, " +
-                 "COMPILER_REVISION expected: 4, got: " +  Handlebars.COMPILER_REVISION +
-                 " - Please note: Builds of master may have other COMPILER_REVISION values.",
-                 Handlebars.COMPILER_REVISION === 4);
-
-    /**
-      Prepares the Handlebars templating library for use inside Ember's view
-      system.
-
-      The `Ember.Handlebars` object is the standard Handlebars library, extended to
-      use Ember's `get()` method instead of direct property access, which allows
-      computed properties to be used inside templates.
-
-      To create an `Ember.Handlebars` template, call `Ember.Handlebars.compile()`.
-      This will return a function that can be used by `Ember.View` for rendering.
-
-      @class Handlebars
-      @namespace Ember
-    */
-    var EmberHandlebars = Ember.Handlebars = objectCreate(Handlebars);
-
-    /**
-      Register a bound helper or custom view helper.
-
-      ## Simple bound helper example
-
-      ```javascript
-      Ember.Handlebars.helper('capitalize', function(value) {
-        return value.toUpperCase();
-      });
-      ```
-
-      The above bound helper can be used inside of templates as follows:
-
-      ```handlebars
-      {{capitalize name}}
-      ```
-
-      In this case, when the `name` property of the template's context changes,
-      the rendered value of the helper will update to reflect this change.
-
-      For more examples of bound helpers, see documentation for
-      `Ember.Handlebars.registerBoundHelper`.
-
-      ## Custom view helper example
-
-      Assuming a view subclass named `App.CalendarView` were defined, a helper
-      for rendering instances of this view could be registered as follows:
-
-      ```javascript
-      Ember.Handlebars.helper('calendar', App.CalendarView):
-      ```
-
-      The above bound helper can be used inside of templates as follows:
-
-      ```handlebars
-      {{calendar}}
-      ```
-
-      Which is functionally equivalent to:
-
-      ```handlebars
-      {{view App.CalendarView}}
-      ```
-
-      Options in the helper will be passed to the view in exactly the same
-      manner as with the `view` helper.
-
-      @method helper
-      @for Ember.Handlebars
-      @param {String} name
-      @param {Function|Ember.View} function or view class constructor
-      @param {String} dependentKeys*
-    */
-    EmberHandlebars.helper = function(name, value) {
-      if (!View) { View = requireModule('ember-views/views/view')['View']; } // ES6TODO: stupid circular dep
-      if (!Component) { Component = requireModule('ember-views/views/component')['default']; } // ES6TODO: stupid circular dep
-
-      Ember.assert("You tried to register a component named '" + name + "', but component names must include a '-'", !Component.detect(value) || name.match(/-/));
-
-      if (View.detect(value)) {
-        EmberHandlebars.registerHelper(name, EmberHandlebars.makeViewHelper(value));
-      } else {
-        EmberHandlebars.registerBoundHelper.apply(null, arguments);
-      }
-    };
-
-    /**
-      Returns a helper function that renders the provided ViewClass.
-
-      Used internally by Ember.Handlebars.helper and other methods
-      involving helper/component registration.
-
-      @private
-      @method makeViewHelper
-      @for Ember.Handlebars
-      @param {Function} ViewClass view class constructor
-    */
-    EmberHandlebars.makeViewHelper = function(ViewClass) {
-      return function(options) {
-        Ember.assert("You can only pass attributes (such as name=value) not bare values to a helper for a View found in '" + ViewClass.toString() + "'", arguments.length < 2);
-        return EmberHandlebars.helpers.view.call(this, ViewClass, options);
-      };
-    };
-
-    /**
-    @class helpers
-    @namespace Ember.Handlebars
-    */
-    EmberHandlebars.helpers = objectCreate(Handlebars.helpers);
-
-    /**
-      Override the the opcode compiler and JavaScript compiler for Handlebars.
-
-      @class Compiler
-      @namespace Ember.Handlebars
-      @private
-      @constructor
-    */
-    EmberHandlebars.Compiler = function() {};
-
-    // Handlebars.Compiler doesn't exist in runtime-only
-    if (Handlebars.Compiler) {
-      EmberHandlebars.Compiler.prototype = objectCreate(Handlebars.Compiler.prototype);
-    }
-
-    EmberHandlebars.Compiler.prototype.compiler = EmberHandlebars.Compiler;
-
-    /**
-      @class JavaScriptCompiler
-      @namespace Ember.Handlebars
-      @private
-      @constructor
-    */
-    EmberHandlebars.JavaScriptCompiler = function() {};
-
-    // Handlebars.JavaScriptCompiler doesn't exist in runtime-only
-    if (Handlebars.JavaScriptCompiler) {
-      EmberHandlebars.JavaScriptCompiler.prototype = objectCreate(Handlebars.JavaScriptCompiler.prototype);
-      EmberHandlebars.JavaScriptCompiler.prototype.compiler = EmberHandlebars.JavaScriptCompiler;
-    }
-
-
-    EmberHandlebars.JavaScriptCompiler.prototype.namespace = "Ember.Handlebars";
-
-    EmberHandlebars.JavaScriptCompiler.prototype.initializeBuffer = function() {
-      return "''";
-    };
-
-    /**
-      Override the default buffer for Ember Handlebars. By default, Handlebars
-      creates an empty String at the beginning of each invocation and appends to
-      it. Ember's Handlebars overrides this to append to a single shared buffer.
-
-      @private
-      @method appendToBuffer
-      @param string {String}
-    */
-    EmberHandlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string) {
-      return "data.buffer.push("+string+");";
-    };
-
-    // Hacks ahead:
-    // Handlebars presently has a bug where the `blockHelperMissing` hook
-    // doesn't get passed the name of the missing helper name, but rather
-    // gets passed the value of that missing helper evaluated on the current
-    // context, which is most likely `undefined` and totally useless.
-    //
-    // So we alter the compiled template function to pass the name of the helper
-    // instead, as expected.
-    //
-    // This can go away once the following is closed:
-    // https://github.com/wycats/handlebars.js/issues/634
-
-    var DOT_LOOKUP_REGEX = /helpers\.(.*?)\)/,
-        BRACKET_STRING_LOOKUP_REGEX = /helpers\['(.*?)'/,
-        INVOCATION_SPLITTING_REGEX = /(.*blockHelperMissing\.call\(.*)(stack[0-9]+)(,.*)/;
-
-    EmberHandlebars.JavaScriptCompiler.stringifyLastBlockHelperMissingInvocation = function(source) {
-      var helperInvocation = source[source.length - 1],
-          helperName = (DOT_LOOKUP_REGEX.exec(helperInvocation) || BRACKET_STRING_LOOKUP_REGEX.exec(helperInvocation))[1],
-          matches = INVOCATION_SPLITTING_REGEX.exec(helperInvocation);
-
-      source[source.length - 1] = matches[1] + "'" + helperName + "'" + matches[3];
-    };
-
-    var stringifyBlockHelperMissing = EmberHandlebars.JavaScriptCompiler.stringifyLastBlockHelperMissingInvocation;
-
-    var originalBlockValue = EmberHandlebars.JavaScriptCompiler.prototype.blockValue;
-    EmberHandlebars.JavaScriptCompiler.prototype.blockValue = function() {
-      originalBlockValue.apply(this, arguments);
-      stringifyBlockHelperMissing(this.source);
-    };
-
-    var originalAmbiguousBlockValue = EmberHandlebars.JavaScriptCompiler.prototype.ambiguousBlockValue;
-    EmberHandlebars.JavaScriptCompiler.prototype.ambiguousBlockValue = function() {
-      originalAmbiguousBlockValue.apply(this, arguments);
-      stringifyBlockHelperMissing(this.source);
-    };
-
-    /**
-      Rewrite simple mustaches from `{{foo}}` to `{{bind "foo"}}`. This means that
-      all simple mustaches in Ember's Handlebars will also set up an observer to
-      keep the DOM up to date when the underlying property changes.
-
-      @private
-      @method mustache
-      @for Ember.Handlebars.Compiler
-      @param mustache
-    */
-    EmberHandlebars.Compiler.prototype.mustache = function(mustache) {
-      if (!(mustache.params.length || mustache.hash)) {
-        var id = new Handlebars.AST.IdNode([{ part: '_triageMustache' }]);
-
-        // Update the mustache node to include a hash value indicating whether the original node
-        // was escaped. This will allow us to properly escape values when the underlying value
-        // changes and we need to re-render the value.
-        if (!mustache.escaped) {
-          mustache.hash = mustache.hash || new Handlebars.AST.HashNode([]);
-          mustache.hash.pairs.push(["unescaped", new Handlebars.AST.StringNode("true")]);
-        }
-        mustache = new Handlebars.AST.MustacheNode([id].concat([mustache.id]), mustache.hash, !mustache.escaped);
-      }
-
-      return Handlebars.Compiler.prototype.mustache.call(this, mustache);
-    };
-
-    /**
-      Used for precompilation of Ember Handlebars templates. This will not be used
-      during normal app execution.
-
-      @method precompile
-      @for Ember.Handlebars
-      @static
-      @param {String} string The template to precompile
-      @param {Boolean} asObject optional parameter, defaulting to true, of whether or not the 
-                                compiled template should be returned as an Object or a String
-    */
-    EmberHandlebars.precompile = function(string, asObject) {
-      var ast = Handlebars.parse(string);
-
-      var options = {
-        knownHelpers: {
-          action: true,
-          unbound: true,
-          'bind-attr': true,
-          template: true,
-          view: true,
-          _triageMustache: true
-        },
-        data: true,
-        stringParams: true
-      };
-
-      asObject = asObject === undefined ? true : asObject;
-
-      var environment = new EmberHandlebars.Compiler().compile(ast, options);
-      return new EmberHandlebars.JavaScriptCompiler().compile(environment, options, undefined, asObject);
-    };
-
-    // We don't support this for Handlebars runtime-only
-    if (Handlebars.compile) {
-      /**
-        The entry point for Ember Handlebars. This replaces the default
-        `Handlebars.compile` and turns on template-local data and String
-        parameters.
-
-        @method compile
-        @for Ember.Handlebars
-        @static
-        @param {String} string The template to compile
-        @return {Function}
-      */
-      EmberHandlebars.compile = function(string) {
-        var ast = Handlebars.parse(string);
-        var options = { data: true, stringParams: true };
-        var environment = new EmberHandlebars.Compiler().compile(ast, options);
-        var templateSpec = new EmberHandlebars.JavaScriptCompiler().compile(environment, options, undefined, true);
-
-        var template = EmberHandlebars.template(templateSpec);
-        template.isMethod = false; //Make sure we don't wrap templates with ._super
-
-        return template;
-      };
-    }
-
-    __exports__["default"] = EmberHandlebars;
-  });
-})();
-
-(function() {
-define("ember-handlebars/component_lookup", 
-  ["ember-runtime/system/object","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var EmberObject = __dependency1__["default"];
-
-    var ComponentLookup = EmberObject.extend({
-      lookupFactory: function(name, container) {
-
-        container = container || this.container;
-
-        var fullName = 'component:' + name,
-            templateFullName = 'template:components/' + name,
-            templateRegistered = container && container.has(templateFullName);
-
-        if (templateRegistered) {
-          container.injection(fullName, 'layout', templateFullName);
-        }
-
-        var Component = container.lookupFactory(fullName);
-
-        // Only treat as a component if either the component
-        // or a template has been registered.
-        if (templateRegistered || Component) {
-          if (!Component) {
-            container.register(fullName, Ember.Component);
-            Component = container.lookupFactory(fullName);
-          }
-          return Component;
-        }
-      }
-    });
-
-    __exports__["default"] = ComponentLookup;
-  });
-define("ember-handlebars/controls", 
-  ["ember-handlebars/controls/checkbox","ember-handlebars/controls/text_field","ember-handlebars/controls/text_area","ember-metal/core","ember-handlebars-compiler","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var Checkbox = __dependency1__["default"];
-    var TextField = __dependency2__["default"];
-    var TextArea = __dependency3__["default"];
-
-    var Ember = __dependency4__["default"];
-    // Ember.assert
-    // var emberAssert = Ember.assert;
-
-    var EmberHandlebars = __dependency5__["default"];
-    var helpers = EmberHandlebars.helpers;
-    /**
-    @module ember
-    @submodule ember-handlebars-compiler
-    */
-
-    /**
-
-      The `{{input}}` helper inserts an HTML `<input>` tag into the template,
-      with a `type` value of either `text` or `checkbox`. If no `type` is provided,
-      `text` will be the default value applied. The attributes of `{{input}}`
-      match those of the native HTML tag as closely as possible for these two types.
-
-      ## Use as text field
-      An `{{input}}` with no `type` or a `type` of `text` will render an HTML text input.
-      The following HTML attributes can be set via the helper:
-
-     <table>
-      <tr><td>`readonly`</td><td>`required`</td><td>`autofocus`</td></tr>
-      <tr><td>`value`</td><td>`placeholder`</td><td>`disabled`</td></tr>
-      <tr><td>`size`</td><td>`tabindex`</td><td>`maxlength`</td></tr>
-      <tr><td>`name`</td><td>`min`</td><td>`max`</td></tr>
-      <tr><td>`pattern`</td><td>`accept`</td><td>`autocomplete`</td></tr>
-      <tr><td>`autosave`</td><td>`formaction`</td><td>`formenctype`</td></tr>
-      <tr><td>`formmethod`</td><td>`formnovalidate`</td><td>`formtarget`</td></tr>
-      <tr><td>`height`</td><td>`inputmode`</td><td>`multiple`</td></tr>
-      <tr><td>`step`</td><td>`width`</td><td>`form`</td></tr>
-      <tr><td>`selectionDirection`</td><td>`spellcheck`</td><td>&nbsp;</td></tr>
-     </table>
-
-
-      When set to a quoted string, these values will be directly applied to the HTML
-      element. When left unquoted, these values will be bound to a property on the
-      template's current rendering context (most typically a controller instance).
-
-      ## Unbound:
-
-      ```handlebars
-      {{input value="http://www.facebook.com"}}
-      ```
-
-
-      ```html
-      <input type="text" value="http://www.facebook.com"/>
-      ```
-
-      ## Bound:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        firstName: "Stanley",
-        entryNotAllowed: true
-      });
-      ```
-
-
-      ```handlebars
-      {{input type="text" value=firstName disabled=entryNotAllowed size="50"}}
-      ```
-
-
-      ```html
-      <input type="text" value="Stanley" disabled="disabled" size="50"/>
-      ```
-
-      ## Extension
-
-      Internally, `{{input type="text"}}` creates an instance of `Ember.TextField`, passing
-      arguments from the helper to `Ember.TextField`'s `create` method. You can extend the
-      capablilties of text inputs in your applications by reopening this class. For example,
-      if you are deploying to browsers where the `required` attribute is used, you
-      can add this to the `TextField`'s `attributeBindings` property:
-
-
-      ```javascript
-      Ember.TextField.reopen({
-        attributeBindings: ['required']
-      });
-      ```
-
-      Keep in mind when writing `Ember.TextField` subclasses that `Ember.TextField`
-      itself extends `Ember.Component`, meaning that it does NOT inherit
-      the `controller` of the parent view.
-
-      See more about [Ember components](api/classes/Ember.Component.html)
-
-
-      ## Use as checkbox
-
-      An `{{input}}` with a `type` of `checkbox` will render an HTML checkbox input.
-      The following HTML attributes can be set via the helper:
-
-    * `checked`
-    * `disabled`
-    * `tabindex`
-    * `indeterminate`
-    * `name`
-    * `autofocus`
-    * `form`
-
-
-      When set to a quoted string, these values will be directly applied to the HTML
-      element. When left unquoted, these values will be bound to a property on the
-      template's current rendering context (most typically a controller instance).
-
-      ## Unbound:
-
-      ```handlebars
-      {{input type="checkbox" name="isAdmin"}}
-      ```
-
-      ```html
-      <input type="checkbox" name="isAdmin" />
-      ```
-
-      ## Bound:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        isAdmin: true
-      });
-      ```
-
-
-      ```handlebars
-      {{input type="checkbox" checked=isAdmin }}
-      ```
-
-
-      ```html
-      <input type="checkbox" checked="checked" />
-      ```
-
-      ## Extension
-
-      Internally, `{{input type="checkbox"}}` creates an instance of `Ember.Checkbox`, passing
-      arguments from the helper to `Ember.Checkbox`'s `create` method. You can extend the
-      capablilties of checkbox inputs in your applications by reopening this class. For example,
-      if you wanted to add a css class to all checkboxes in your application:
-
-
-      ```javascript
-      Ember.Checkbox.reopen({
-        classNames: ['my-app-checkbox']
-      });
-      ```
-
-
-      @method input
-      @for Ember.Handlebars.helpers
-      @param {Hash} options
-    */
-    function inputHelper(options) {
-      Ember.assert('You can only pass attributes to the `input` helper, not arguments', arguments.length < 2);
-
-      var hash = options.hash,
-          types = options.hashTypes,
-          inputType = hash.type,
-          onEvent = hash.on;
-
-      delete hash.type;
-      delete hash.on;
-
-      if (inputType === 'checkbox') {
-        Ember.assert("{{input type='checkbox'}} does not support setting `value=someBooleanValue`; you must use `checked=someBooleanValue` instead.", options.hashTypes.value !== 'ID');
-        return helpers.view.call(this, Checkbox, options);
-      } else {
-        if (inputType) { hash.type = inputType; }
-        hash.onEvent = onEvent || 'enter';
-        return helpers.view.call(this, TextField, options);
-      }
-    }
-
-    /**
-      `{{textarea}}` inserts a new instance of `<textarea>` tag into the template.
-      The attributes of `{{textarea}}` match those of the native HTML tags as
-      closely as possible.
-
-      The following HTML attributes can be set:
-
-        * `value`
-        * `name`
-        * `rows`
-        * `cols`
-        * `placeholder`
-        * `disabled`
-        * `maxlength`
-        * `tabindex`
-        * `selectionEnd`
-        * `selectionStart`
-        * `selectionDirection`
-        * `wrap`
-        * `readonly`
-        * `autofocus`
-        * `form`
-        * `spellcheck`
-        * `required`
-
-      When set to a quoted string, these value will be directly applied to the HTML
-      element. When left unquoted, these values will be bound to a property on the
-      template's current rendering context (most typically a controller instance).
-
-      Unbound:
-
-      ```handlebars
-      {{textarea value="Lots of static text that ISN'T bound"}}
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <textarea class="ember-text-area">
-        Lots of static text that ISN'T bound
-      </textarea>
-      ```
-
-      Bound:
-
-      In the following example, the `writtenWords` property on `App.ApplicationController`
-      will be updated live as the user types 'Lots of text that IS bound' into
-      the text area of their browser's window.
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        writtenWords: "Lots of text that IS bound"
-      });
-      ```
-
-      ```handlebars
-      {{textarea value=writtenWords}}
-      ```
-
-       Would result in the following HTML:
-
-      ```html
-      <textarea class="ember-text-area">
-        Lots of text that IS bound
-      </textarea>
-      ```
-
-      If you wanted a one way binding between the text area and a div tag
-      somewhere else on your screen, you could use `Ember.computed.oneWay`:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        writtenWords: "Lots of text that IS bound",
-        outputWrittenWords: Ember.computed.oneWay("writtenWords")
-      });
-      ```
-
-      ```handlebars
-      {{textarea value=writtenWords}}
-
-      <div>
-        {{outputWrittenWords}}
-      </div>
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <textarea class="ember-text-area">
-        Lots of text that IS bound
-      </textarea>
-
-      <-- the following div will be updated in real time as you type -->
-
-      <div>
-        Lots of text that IS bound
-      </div>
-      ```
-
-      Finally, this example really shows the power and ease of Ember when two
-      properties are bound to eachother via `Ember.computed.alias`. Type into
-      either text area box and they'll both stay in sync. Note that
-      `Ember.computed.alias` costs more in terms of performance, so only use it when
-      your really binding in both directions:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        writtenWords: "Lots of text that IS bound",
-        twoWayWrittenWords: Ember.computed.alias("writtenWords")
-      });
-      ```
-
-      ```handlebars
-      {{textarea value=writtenWords}}
-      {{textarea value=twoWayWrittenWords}}
-      ```
-
-      ```html
-      <textarea id="ember1" class="ember-text-area">
-        Lots of text that IS bound
-      </textarea>
-
-      <-- both updated in real time -->
-
-      <textarea id="ember2" class="ember-text-area">
-        Lots of text that IS bound
-      </textarea>
-      ```
-
-      ## Extension
-
-      Internally, `{{textarea}}` creates an instance of `Ember.TextArea`, passing
-      arguments from the helper to `Ember.TextArea`'s `create` method. You can
-      extend the capabilities of text areas in your application by reopening this
-      class. For example, if you are deploying to browsers where the `required`
-      attribute is used, you can globally add support for the `required` attribute
-      on all `{{textarea}}`s' in your app by reopening `Ember.TextArea` or
-      `Ember.TextSupport` and adding it to the `attributeBindings` concatenated
-      property:
-
-      ```javascript
-      Ember.TextArea.reopen({
-        attributeBindings: ['required']
-      });
-      ```
-
-      Keep in mind when writing `Ember.TextArea` subclasses that `Ember.TextArea`
-      itself extends `Ember.Component`, meaning that it does NOT inherit
-      the `controller` of the parent view.
-
-      See more about [Ember components](api/classes/Ember.Component.html)
-
-      @method textarea
-      @for Ember.Handlebars.helpers
-      @param {Hash} options
-    */
-    function textareaHelper(options) {
-      Ember.assert('You can only pass attributes to the `textarea` helper, not arguments', arguments.length < 2);
-
-      var hash = options.hash,
-          types = options.hashTypes;
-
-      return helpers.view.call(this, TextArea, options);
-    }
-
-    __exports__.inputHelper = inputHelper;
-    __exports__.textareaHelper = textareaHelper;
-  });
-define("ember-handlebars/controls/checkbox", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-views/views/view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var View = __dependency3__.View;
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    /**
-      The internal class used to create text inputs when the `{{input}}`
-      helper is used with `type` of `checkbox`.
-
-      See [handlebars.helpers.input](/api/classes/Ember.Handlebars.helpers.html#method_input)  for usage details.
-
-      ## Direct manipulation of `checked`
-
-      The `checked` attribute of an `Ember.Checkbox` object should always be set
-      through the Ember object or by interacting with its rendered element
-      representation via the mouse, keyboard, or touch. Updating the value of the
-      checkbox via jQuery will result in the checked value of the object and its
-      element losing synchronization.
-
-      ## Layout and LayoutName properties
-
-      Because HTML `input` elements are self closing `layout` and `layoutName`
-      properties will not be applied. See [Ember.View](/api/classes/Ember.View.html)'s
-      layout section for more information.
-
-      @class Checkbox
-      @namespace Ember
-      @extends Ember.View
-    */
-    var Checkbox = View.extend({
-      classNames: ['ember-checkbox'],
-
-      tagName: 'input',
-
-      attributeBindings: ['type', 'checked', 'indeterminate', 'disabled', 'tabindex', 'name',
-                          'autofocus', 'required', 'form'],
-
-      type: "checkbox",
-      checked: false,
-      disabled: false,
-      indeterminate: false,
-
-      init: function() {
-        this._super();
-        this.on("change", this, this._updateElementValue);
-      },
-
-      didInsertElement: function() {
-        this._super();
-        get(this, 'element').indeterminate = !!get(this, 'indeterminate');
-      },
-
-      _updateElementValue: function() {
-        set(this, 'checked', this.$().prop('checked'));
-      }
-    });
-
-    __exports__["default"] = Checkbox;
-  });
-define("ember-handlebars/controls/select", 
-  ["ember-handlebars-compiler","ember-metal/enumerable_utils","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-views/views/collection_view","ember-metal/utils","ember-metal/is_none","ember-metal/computed","ember-runtime/system/native_array","ember-metal/mixin","ember-metal/properties","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) {
-    "use strict";
-    /*jshint eqeqeq:false newcap:false */
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var EmberHandlebars = __dependency1__["default"];
-    var EnumerableUtils = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var View = __dependency5__.View;
-    var CollectionView = __dependency6__["default"];
-    var isArray = __dependency7__.isArray;
-    var isNone = __dependency8__["default"];
-    var computed = __dependency9__.computed;
-    var A = __dependency10__.A;
-    var observer = __dependency11__.observer;
-    var defineProperty = __dependency12__.defineProperty;
-
-    var indexOf = EnumerableUtils.indexOf,
-        indexesOf = EnumerableUtils.indexesOf,
-        forEach = EnumerableUtils.forEach,
-        replace = EnumerableUtils.replace,
-        precompileTemplate = EmberHandlebars.compile;
-
-    var SelectOption = View.extend({
-      tagName: 'option',
-      attributeBindings: ['value', 'selected'],
-
-      defaultTemplate: function(context, options) {
-        options = { data: options.data, hash: {} };
-        EmberHandlebars.helpers.bind.call(context, "view.label", options);
-      },
-
-      init: function() {
-        this.labelPathDidChange();
-        this.valuePathDidChange();
-
-        this._super();
-      },
-
-      selected: computed(function() {
-        var content = get(this, 'content'),
-            selection = get(this, 'parentView.selection');
-        if (get(this, 'parentView.multiple')) {
-          return selection && indexOf(selection, content.valueOf()) > -1;
-        } else {
-          // Primitives get passed through bindings as objects... since
-          // `new Number(4) !== 4`, we use `==` below
-          return content == selection;
-        }
-      }).property('content', 'parentView.selection'),
-
-      labelPathDidChange: observer('parentView.optionLabelPath', function() {
-        var labelPath = get(this, 'parentView.optionLabelPath');
-
-        if (!labelPath) { return; }
-
-        defineProperty(this, 'label', computed(function() {
-          return get(this, labelPath);
-        }).property(labelPath));
-      }),
-
-      valuePathDidChange: observer('parentView.optionValuePath', function() {
-        var valuePath = get(this, 'parentView.optionValuePath');
-
-        if (!valuePath) { return; }
-
-        defineProperty(this, 'value', computed(function() {
-          return get(this, valuePath);
-        }).property(valuePath));
-      })
-    });
-
-    var SelectOptgroup = CollectionView.extend({
-      tagName: 'optgroup',
-      attributeBindings: ['label'],
-
-      selectionBinding: 'parentView.selection',
-      multipleBinding: 'parentView.multiple',
-      optionLabelPathBinding: 'parentView.optionLabelPath',
-      optionValuePathBinding: 'parentView.optionValuePath',
-
-      itemViewClassBinding: 'parentView.optionView'
-    });
-
-    /**
-      The `Ember.Select` view class renders a
-      [select](https://developer.mozilla.org/en/HTML/Element/select) HTML element,
-      allowing the user to choose from a list of options.
-
-      The text and `value` property of each `<option>` element within the
-      `<select>` element are populated from the objects in the `Element.Select`'s
-      `content` property. The underlying data object of the selected `<option>` is
-      stored in the `Element.Select`'s `value` property.
-
-      ## The Content Property (array of strings)
-
-      The simplest version of an `Ember.Select` takes an array of strings as its
-      `content` property. The string will be used as both the `value` property and
-      the inner text of each `<option>` element inside the rendered `<select>`.
-
-      Example:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        names: ["Yehuda", "Tom"]
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select content=names}}
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <select class="ember-select">
-        <option value="Yehuda">Yehuda</option>
-        <option value="Tom">Tom</option>
-      </select>
-      ```
-
-      You can control which `<option>` is selected through the `Ember.Select`'s
-      `value` property:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        selectedName: 'Tom',
-        names: ["Yehuda", "Tom"]
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select
-             content=names
-             value=selectedName
-      }}
-      ```
-
-      Would result in the following HTML with the `<option>` for 'Tom' selected:
-
-      ```html
-      <select class="ember-select">
-        <option value="Yehuda">Yehuda</option>
-        <option value="Tom" selected="selected">Tom</option>
-      </select>
-      ```
-
-      A user interacting with the rendered `<select>` to choose "Yehuda" would
-      update the value of `selectedName` to "Yehuda".
-
-      ## The Content Property (array of Objects)
-
-      An `Ember.Select` can also take an array of JavaScript or Ember objects as
-      its `content` property.
-
-      When using objects you need to tell the `Ember.Select` which property should
-      be accessed on each object to supply the `value` attribute of the `<option>`
-      and which property should be used to supply the element text.
-
-      The `optionValuePath` option is used to specify the path on each object to
-      the desired property for the `value` attribute. The `optionLabelPath`
-      specifies the path on each object to the desired property for the
-      element's text. Both paths must reference each object itself as `content`:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        programmers: [
-          {firstName: "Yehuda", id: 1},
-          {firstName: "Tom",    id: 2}
-        ]
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select
-             content=programmers
-             optionValuePath="content.id"
-             optionLabelPath="content.firstName"}}
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <select class="ember-select">
-        <option value="1">Yehuda</option>
-        <option value="2">Tom</option>
-      </select>
-      ```
-
-      The `value` attribute of the selected `<option>` within an `Ember.Select`
-      can be bound to a property on another object:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        programmers: [
-          {firstName: "Yehuda", id: 1},
-          {firstName: "Tom",    id: 2}
-        ],
-        currentProgrammer: {
-          id: 2
-        }
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select
-             content=programmers
-             optionValuePath="content.id"
-             optionLabelPath="content.firstName"
-             value=currentProgrammer.id}}
-      ```
-
-      Would result in the following HTML with a selected option:
-
-      ```html
-      <select class="ember-select">
-        <option value="1">Yehuda</option>
-        <option value="2" selected="selected">Tom</option>
-      </select>
-      ```
-
-      Interacting with the rendered element by selecting the first option
-      ('Yehuda') will update the `id` of `currentProgrammer`
-      to match the `value` property of the newly selected `<option>`.
-
-      Alternatively, you can control selection through the underlying objects
-      used to render each object by binding the `selection` option. When the selected
-      `<option>` is changed, the property path provided to `selection`
-      will be updated to match the content object of the rendered `<option>`
-      element:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        selectedPerson: null,
-        programmers: [
-          {firstName: "Yehuda", id: 1},
-          {firstName: "Tom",    id: 2}
-        ]
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select
-             content=programmers
-             optionValuePath="content.id"
-             optionLabelPath="content.firstName"
-             selection=selectedPerson}}
-      ```
-
-      Would result in the following HTML with a selected option:
-
-      ```html
-      <select class="ember-select">
-        <option value="1">Yehuda</option>
-        <option value="2" selected="selected">Tom</option>
-      </select>
-      ```
-
-      Interacting with the rendered element by selecting the first option
-      ('Yehuda') will update the `selectedPerson` to match the object of
-      the newly selected `<option>`. In this case it is the first object
-      in the `programmers`
-
-      ## Supplying a Prompt
-
-      A `null` value for the `Ember.Select`'s `value` or `selection` property
-      results in there being no `<option>` with a `selected` attribute:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        selectedProgrammer: null,
-        programmers: [
-          "Yehuda",
-          "Tom"
-        ]
-      });
-      ```
-
-      ``` handlebars
-      {{view Ember.Select
-             content=programmers
-             value=selectedProgrammer
-      }}
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <select class="ember-select">
-        <option value="Yehuda">Yehuda</option>
-        <option value="Tom">Tom</option>
-      </select>
-      ```
-
-      Although `selectedProgrammer` is `null` and no `<option>`
-      has a `selected` attribute the rendered HTML will display the
-      first item as though it were selected. You can supply a string
-      value for the `Ember.Select` to display when there is no selection
-      with the `prompt` option:
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        selectedProgrammer: null,
-        programmers: [
-          "Yehuda",
-          "Tom"
-        ]
-      });
-      ```
-
-      ```handlebars
-      {{view Ember.Select
-             content=programmers
-             value=selectedProgrammer
-             prompt="Please select a name"
-      }}
-      ```
-
-      Would result in the following HTML:
-
-      ```html
-      <select class="ember-select">
-        <option>Please select a name</option>
-        <option value="Yehuda">Yehuda</option>
-        <option value="Tom">Tom</option>
-      </select>
-      ```
-
-      @class Select
-      @namespace Ember
-      @extends Ember.View
-    */
-    var Select = View.extend({
-      tagName: 'select',
-      classNames: ['ember-select'],
-      defaultTemplate: Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {
-this.compilerInfo = [4,'>= 1.0.0'];
-helpers = this.merge(helpers, Ember.Handlebars.helpers); data = data || {};
-  var buffer = '', stack1, escapeExpression=this.escapeExpression, self=this;
-
-function program1(depth0,data) {
-  
-  var buffer = '', stack1;
-  data.buffer.push("<option value=\"\">");
-  stack1 = helpers._triageMustache.call(depth0, "view.prompt", {hash:{},hashTypes:{},hashContexts:{},contexts:[depth0],types:["ID"],data:data});
-  if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
-  data.buffer.push("</option>");
-  return buffer;
-  }
-
-function program3(depth0,data) {
-  
-  var stack1;
-  stack1 = helpers.each.call(depth0, "view.groupedContent", {hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(4, program4, data),contexts:[depth0],types:["ID"],data:data});
-  if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
-  else { data.buffer.push(''); }
-  }
-function program4(depth0,data) {
-  
-  
-  data.buffer.push(escapeExpression(helpers.view.call(depth0, "view.groupView", {hash:{
-    'content': ("content"),
-    'label': ("label")
-  },hashTypes:{'content': "ID",'label': "ID"},hashContexts:{'content': depth0,'label': depth0},contexts:[depth0],types:["ID"],data:data})));
-  }
-
-function program6(depth0,data) {
-  
-  var stack1;
-  stack1 = helpers.each.call(depth0, "view.content", {hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(7, program7, data),contexts:[depth0],types:["ID"],data:data});
-  if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
-  else { data.buffer.push(''); }
-  }
-function program7(depth0,data) {
-  
-  
-  data.buffer.push(escapeExpression(helpers.view.call(depth0, "view.optionView", {hash:{
-    'content': ("")
-  },hashTypes:{'content': "ID"},hashContexts:{'content': depth0},contexts:[depth0],types:["ID"],data:data})));
-  }
-
-  stack1 = helpers['if'].call(depth0, "view.prompt", {hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(1, program1, data),contexts:[depth0],types:["ID"],data:data});
-  if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
-  stack1 = helpers['if'].call(depth0, "view.optionGroupPath", {hash:{},hashTypes:{},hashContexts:{},inverse:self.program(6, program6, data),fn:self.program(3, program3, data),contexts:[depth0],types:["ID"],data:data});
-  if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
-  return buffer;
-  
-}),
-      attributeBindings: ['multiple', 'disabled', 'tabindex', 'name', 'required', 'autofocus',
-                          'form', 'size'],
-
-      /**
-        The `multiple` attribute of the select element. Indicates whether multiple
-        options can be selected.
-
-        @property multiple
-        @type Boolean
-        @default false
-      */
-      multiple: false,
-
-      /**
-        The `disabled` attribute of the select element. Indicates whether
-        the element is disabled from interactions.
-
-        @property disabled
-        @type Boolean
-        @default false
-      */
-      disabled: false,
-
-      /**
-        The `required` attribute of the select element. Indicates whether
-        a selected option is required for form validation.
-
-        @property required
-        @type Boolean
-        @default false
-      */
-      required: false,
-
-      /**
-        The list of options.
-
-        If `optionLabelPath` and `optionValuePath` are not overridden, this should
-        be a list of strings, which will serve simultaneously as labels and values.
-
-        Otherwise, this should be a list of objects. For instance:
-
-        ```javascript
-        Ember.Select.create({
-          content: A([
-              { id: 1, firstName: 'Yehuda' },
-              { id: 2, firstName: 'Tom' }
-            ]),
-          optionLabelPath: 'content.firstName',
-          optionValuePath: 'content.id'
-        });
-        ```
-
-        @property content
-        @type Array
-        @default null
-      */
-      content: null,
-
-      /**
-        When `multiple` is `false`, the element of `content` that is currently
-        selected, if any.
-
-        When `multiple` is `true`, an array of such elements.
-
-        @property selection
-        @type Object or Array
-        @default null
-      */
-      selection: null,
-
-      /**
-        In single selection mode (when `multiple` is `false`), value can be used to
-        get the current selection's value or set the selection by it's value.
-
-        It is not currently supported in multiple selection mode.
-
-        @property value
-        @type String
-        @default null
-      */
-      value: computed(function(key, value) {
-        if (arguments.length === 2) { return value; }
-        var valuePath = get(this, 'optionValuePath').replace(/^content\.?/, '');
-        return valuePath ? get(this, 'selection.' + valuePath) : get(this, 'selection');
-      }).property('selection'),
-
-      /**
-        If given, a top-most dummy option will be rendered to serve as a user
-        prompt.
-
-        @property prompt
-        @type String
-        @default null
-      */
-      prompt: null,
-
-      /**
-        The path of the option labels. See [content](/api/classes/Ember.Select.html#property_content).
-
-        @property optionLabelPath
-        @type String
-        @default 'content'
-      */
-      optionLabelPath: 'content',
-
-      /**
-        The path of the option values. See [content](/api/classes/Ember.Select.html#property_content).
-
-        @property optionValuePath
-        @type String
-        @default 'content'
-      */
-      optionValuePath: 'content',
-
-      /**
-        The path of the option group.
-        When this property is used, `content` should be sorted by `optionGroupPath`.
-
-        @property optionGroupPath
-        @type String
-        @default null
-      */
-      optionGroupPath: null,
-
-      /**
-        The view class for optgroup.
-
-        @property groupView
-        @type Ember.View
-        @default Ember.SelectOptgroup
-      */
-      groupView: SelectOptgroup,
-
-      groupedContent: computed(function() {
-        var groupPath = get(this, 'optionGroupPath');
-        var groupedContent = A();
-        var content = get(this, 'content') || [];
-
-        forEach(content, function(item) {
-          var label = get(item, groupPath);
-
-          if (get(groupedContent, 'lastObject.label') !== label) {
-            groupedContent.pushObject({
-              label: label,
-              content: A()
-            });
-          }
-
-          get(groupedContent, 'lastObject.content').push(item);
-        });
-
-        return groupedContent;
-      }).property('optionGroupPath', 'content.@each'),
-
-      /**
-        The view class for option.
-
-        @property optionView
-        @type Ember.View
-        @default Ember.SelectOption
-      */
-      optionView: SelectOption,
-
-      _change: function() {
-        if (get(this, 'multiple')) {
-          this._changeMultiple();
-        } else {
-          this._changeSingle();
-        }
-      },
-
-      selectionDidChange: observer('selection.@each', function() {
-        var selection = get(this, 'selection');
-        if (get(this, 'multiple')) {
-          if (!isArray(selection)) {
-            set(this, 'selection', A([selection]));
-            return;
-          }
-          this._selectionDidChangeMultiple();
-        } else {
-          this._selectionDidChangeSingle();
-        }
-      }),
-
-      valueDidChange: observer('value', function() {
-        var content = get(this, 'content'),
-            value = get(this, 'value'),
-            valuePath = get(this, 'optionValuePath').replace(/^content\.?/, ''),
-            selectedValue = (valuePath ? get(this, 'selection.' + valuePath) : get(this, 'selection')),
-            selection;
-
-        if (value !== selectedValue) {
-          selection = content ? content.find(function(obj) {
-            return value === (valuePath ? get(obj, valuePath) : obj);
-          }) : null;
-
-          this.set('selection', selection);
-        }
-      }),
-
-
-      _triggerChange: function() {
-        var selection = get(this, 'selection');
-        var value = get(this, 'value');
-
-        if (!isNone(selection)) { this.selectionDidChange(); }
-        if (!isNone(value)) { this.valueDidChange(); }
-
-        this._change();
-      },
-
-      _changeSingle: function() {
-        var selectedIndex = this.$()[0].selectedIndex,
-            content = get(this, 'content'),
-            prompt = get(this, 'prompt');
-
-        if (!content || !get(content, 'length')) { return; }
-        if (prompt && selectedIndex === 0) { set(this, 'selection', null); return; }
-
-        if (prompt) { selectedIndex -= 1; }
-        set(this, 'selection', content.objectAt(selectedIndex));
-      },
-
-
-      _changeMultiple: function() {
-        var options = this.$('option:selected'),
-            prompt = get(this, 'prompt'),
-            offset = prompt ? 1 : 0,
-            content = get(this, 'content'),
-            selection = get(this, 'selection');
-
-        if (!content) { return; }
-        if (options) {
-          var selectedIndexes = options.map(function() {
-            return this.index - offset;
-          }).toArray();
-          var newSelection = content.objectsAt(selectedIndexes);
-
-          if (isArray(selection)) {
-            replace(selection, 0, get(selection, 'length'), newSelection);
-          } else {
-            set(this, 'selection', newSelection);
-          }
-        }
-      },
-
-      _selectionDidChangeSingle: function() {
-        var el = this.get('element');
-        if (!el) { return; }
-
-        var content = get(this, 'content'),
-            selection = get(this, 'selection'),
-            selectionIndex = content ? indexOf(content, selection) : -1,
-            prompt = get(this, 'prompt');
-
-        if (prompt) { selectionIndex += 1; }
-        if (el) { el.selectedIndex = selectionIndex; }
-      },
-
-      _selectionDidChangeMultiple: function() {
-        var content = get(this, 'content'),
-            selection = get(this, 'selection'),
-            selectedIndexes = content ? indexesOf(content, selection) : [-1],
-            prompt = get(this, 'prompt'),
-            offset = prompt ? 1 : 0,
-            options = this.$('option'),
-            adjusted;
-
-        if (options) {
-          options.each(function() {
-            adjusted = this.index > -1 ? this.index - offset : -1;
-            this.selected = indexOf(selectedIndexes, adjusted) > -1;
-          });
-        }
-      },
-
-      init: function() {
-        this._super();
-        this.on("didInsertElement", this, this._triggerChange);
-        this.on("change", this, this._change);
-      }
-    });
-
-    __exports__["default"] = Select
-    __exports__.Select = Select;
-    __exports__.SelectOption = SelectOption;
-    __exports__.SelectOptgroup = SelectOptgroup;
-  });
-define("ember-handlebars/controls/text_area", 
-  ["ember-metal/property_get","ember-views/views/component","ember-handlebars/controls/text_support","ember-metal/mixin","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-    var get = __dependency1__.get;
-    var Component = __dependency2__["default"];
-    var TextSupport = __dependency3__["default"];
-    var observer = __dependency4__.observer;
-
-    /**
-      The internal class used to create textarea element when the `{{textarea}}`
-      helper is used.
-
-      See [handlebars.helpers.textarea](/api/classes/Ember.Handlebars.helpers.html#method_textarea)  for usage details.
-
-      ## Layout and LayoutName properties
-
-      Because HTML `textarea` elements do not contain inner HTML the `layout` and
-      `layoutName` properties will not be applied. See [Ember.View](/api/classes/Ember.View.html)'s
-      layout section for more information.
-
-      @class TextArea
-      @namespace Ember
-      @extends Ember.Component
-      @uses Ember.TextSupport
-    */
-    var TextArea = Component.extend(TextSupport, {
-      classNames: ['ember-text-area'],
-
-      tagName: "textarea",
-      attributeBindings: ['rows', 'cols', 'name', 'selectionEnd', 'selectionStart', 'wrap'],
-      rows: null,
-      cols: null,
-
-      _updateElementValue: observer('value', function() {
-        // We do this check so cursor position doesn't get affected in IE
-        var value = get(this, 'value'),
-            $el = this.$();
-        if ($el && value !== $el.val()) {
-          $el.val(value);
-        }
-      }),
-
-      init: function() {
-        this._super();
-        this.on("didInsertElement", this, this._updateElementValue);
-      }
-
-    });
-
-    __exports__["default"] = TextArea;
-  });
-define("ember-handlebars/controls/text_field", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-views/views/component","ember-handlebars/controls/text_support","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var Component = __dependency3__["default"];
-    var TextSupport = __dependency4__["default"];
-
-    /**
-
-      The internal class used to create text inputs when the `{{input}}`
-      helper is used with `type` of `text`.
-
-      See [Handlebars.helpers.input](/api/classes/Ember.Handlebars.helpers.html#method_input)  for usage details.
-
-      ## Layout and LayoutName properties
-
-      Because HTML `input` elements are self closing `layout` and `layoutName`
-      properties will not be applied. See [Ember.View](/api/classes/Ember.View.html)'s
-      layout section for more information.
-
-      @class TextField
-      @namespace Ember
-      @extends Ember.Component
-      @uses Ember.TextSupport
-    */
-    var TextField = Component.extend(TextSupport, {
-
-      classNames: ['ember-text-field'],
-      tagName: "input",
-      attributeBindings: ['type', 'value', 'size', 'pattern', 'name', 'min', 'max',
-                          'accept', 'autocomplete', 'autosave', 'formaction',
-                          'formenctype', 'formmethod', 'formnovalidate', 'formtarget',
-                          'height', 'inputmode', 'list', 'multiple', 'pattern', 'step',
-                          'width'],
-
-      /**
-        The `value` attribute of the input element. As the user inputs text, this
-        property is updated live.
-
-        @property value
-        @type String
-        @default ""
-      */
-      value: "",
-
-      /**
-        The `type` attribute of the input element.
-
-        @property type
-        @type String
-        @default "text"
-      */
-      type: "text",
-
-      /**
-        The `size` of the text field in characters.
-
-        @property size
-        @type String
-        @default null
-      */
-      size: null,
-
-      /**
-        The `pattern` attribute of input element.
-
-        @property pattern
-        @type String
-        @default null
-      */
-      pattern: null,
-
-      /**
-        The `min` attribute of input element used with `type="number"` or `type="range"`.
-
-        @property min
-        @type String
-        @default null
-      */
-      min: null,
-
-      /**
-        The `max` attribute of input element used with `type="number"` or `type="range"`.
-
-        @property max
-        @type String
-        @default null
-      */
-      max: null
-    });
-
-    __exports__["default"] = TextField;
-  });
-define("ember-handlebars/controls/text_support", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-runtime/mixins/target_action_support","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var Mixin = __dependency3__.Mixin;
-    var TargetActionSupport = __dependency4__["default"];
-
-    /**
-      Shared mixin used by `Ember.TextField` and `Ember.TextArea`.
-
-      @class TextSupport
-      @namespace Ember
-      @uses Ember.TargetActionSupport
-      @extends Ember.Mixin
-      @private
-    */
-    var TextSupport = Mixin.create(TargetActionSupport, {
-      value: "",
-
-      attributeBindings: ['placeholder', 'disabled', 'maxlength', 'tabindex', 'readonly',
-                          'autofocus', 'form', 'selectionDirection', 'spellcheck', 'required'],
-      placeholder: null,
-      disabled: false,
-      maxlength: null,
-
-      init: function() {
-        this._super();
-        this.on("focusOut", this, this._elementValueDidChange);
-        this.on("change", this, this._elementValueDidChange);
-        this.on("paste", this, this._elementValueDidChange);
-        this.on("cut", this, this._elementValueDidChange);
-        this.on("input", this, this._elementValueDidChange);
-        this.on("keyUp", this, this.interpretKeyEvents);
-      },
-
-      /**
-        The action to be sent when the user presses the return key.
-
-        This is similar to the `{{action}}` helper, but is fired when
-        the user presses the return key when editing a text field, and sends
-        the value of the field as the context.
-
-        @property action
-        @type String
-        @default null
-      */
-      action: null,
-
-      /**
-        The event that should send the action.
-
-        Options are:
-
-        * `enter`: the user pressed enter
-        * `keyPress`: the user pressed a key
-
-        @property onEvent
-        @type String
-        @default enter
-      */
-      onEvent: 'enter',
-
-      /**
-        Whether they `keyUp` event that triggers an `action` to be sent continues
-        propagating to other views.
-
-        By default, when the user presses the return key on their keyboard and
-        the text field has an `action` set, the action will be sent to the view's
-        controller and the key event will stop propagating.
-
-        If you would like parent views to receive the `keyUp` event even after an
-        action has been dispatched, set `bubbles` to true.
-
-        @property bubbles
-        @type Boolean
-        @default false
-      */
-      bubbles: false,
-
-      interpretKeyEvents: function(event) {
-        var map = TextSupport.KEY_EVENTS;
-        var method = map[event.keyCode];
-
-        this._elementValueDidChange();
-        if (method) { return this[method](event); }
-      },
-
-      _elementValueDidChange: function() {
-        set(this, 'value', this.$().val());
-      },
-
-      /**
-        The action to be sent when the user inserts a new line.
-
-        Called by the `Ember.TextSupport` mixin on keyUp if keycode matches 13.
-        Uses sendAction to send the `enter` action to the controller.
-
-        @method insertNewline
-        @param {Event} event
-      */
-      insertNewline: function(event) {
-        sendAction('enter', this, event);
-        sendAction('insert-newline', this, event);
-      },
-
-      /**
-        Called when the user hits escape.
-
-        Called by the `Ember.TextSupport` mixin on keyUp if keycode matches 27.
-        Uses sendAction to send the `escape-press` action to the controller.
-
-        @method cancel
-        @param {Event} event
-      */
-      cancel: function(event) {
-        sendAction('escape-press', this, event);
-      },
-
-      /**
-        Called when the text area is focused.
-
-        @method focusIn
-        @param {Event} event
-      */
-      focusIn: function(event) {
-        sendAction('focus-in', this, event);
-      },
-
-      /**
-        Called when the text area is blurred.
-
-        @method focusOut
-        @param {Event} event
-      */
-      focusOut: function(event) {
-        sendAction('focus-out', this, event);
-      },
-
-      /**
-        The action to be sent when the user presses a key. Enabled by setting
-        the `onEvent` property to `keyPress`.
-
-        Uses sendAction to send the `keyPress` action to the controller.
-
-        @method keyPress
-        @param {Event} event
-      */
-      keyPress: function(event) {
-        sendAction('key-press', this, event);
-      }
-
-    });
-
-    TextSupport.KEY_EVENTS = {
-      13: 'insertNewline',
-      27: 'cancel'
-    };
-
-    // In principle, this shouldn't be necessary, but the legacy
-    // sectionAction semantics for TextField are different from
-    // the component semantics so this method normalizes them.
-    function sendAction(eventName, view, event) {
-      var action = get(view, eventName),
-          on = get(view, 'onEvent'),
-          value = get(view, 'value');
-
-      // back-compat support for keyPress as an event name even though
-      // it's also a method name that consumes the event (and therefore
-      // incompatible with sendAction semantics).
-      if (on === eventName || (on === 'keyPress' && eventName === 'key-press')) {
-        view.sendAction('action', value);
-      }
-
-      view.sendAction(eventName, value);
-
-      if (action || on === eventName) {
-        if(!get(view, 'bubbles')) {
-          event.stopPropagation();
-        }
-      }
-    }
-
-    __exports__["default"] = TextSupport;
-  });
-define("ember-handlebars/ext", 
-  ["ember-metal/core","ember-runtime/system/string","ember-handlebars-compiler","ember-metal/property_get","ember-metal/binding","ember-metal/error","ember-metal/mixin","ember-metal/is_empty","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.FEATURES, Ember.assert, Ember.Handlebars, Ember.lookup
-    // var emberAssert = Ember.assert;
-
-    var fmt = __dependency2__.fmt;
-
-    var EmberHandlebars = __dependency3__["default"];
-    var helpers = EmberHandlebars.helpers;
-
-    var get = __dependency4__.get;
-    var isGlobalPath = __dependency5__.isGlobalPath;
-    var EmberError = __dependency6__["default"];
-    var IS_BINDING = __dependency7__.IS_BINDING;
-
-    // late bound via requireModule because of circular dependencies.
-    var resolveHelper,
-        SimpleHandlebarsView;
-
-    var isEmpty = __dependency8__["default"];
-
-    var slice = [].slice, originalTemplate = EmberHandlebars.template;
-
-    /**
-      If a path starts with a reserved keyword, returns the root
-      that should be used.
-
-      @private
-      @method normalizePath
-      @for Ember
-      @param root {Object}
-      @param path {String}
-      @param data {Hash}
-    */
-    function normalizePath(root, path, data) {
-      var keywords = (data && data.keywords) || {},
-          keyword, isKeyword;
-
-      // Get the first segment of the path. For example, if the
-      // path is "foo.bar.baz", returns "foo".
-      keyword = path.split('.', 1)[0];
-
-      // Test to see if the first path is a keyword that has been
-      // passed along in the view's data hash. If so, we will treat
-      // that object as the new root.
-      if (keywords.hasOwnProperty(keyword)) {
-        // Look up the value in the template's data hash.
-        root = keywords[keyword];
-        isKeyword = true;
-
-        // Handle cases where the entire path is the reserved
-        // word. In that case, return the object itself.
-        if (path === keyword) {
-          path = '';
-        } else {
-          // Strip the keyword from the path and look up
-          // the remainder from the newly found root.
-          path = path.substr(keyword.length+1);
-        }
-      }
-
-      return { root: root, path: path, isKeyword: isKeyword };
-    };
-
-
-    /**
-      Lookup both on root and on window. If the path starts with
-      a keyword, the corresponding object will be looked up in the
-      template's data hash and used to resolve the path.
-
-      @method get
-      @for Ember.Handlebars
-      @param {Object} root The object to look up the property on
-      @param {String} path The path to be lookedup
-      @param {Object} options The template's option hash
-    */
-    function handlebarsGet(root, path, options) {
-      var data = options && options.data,
-          normalizedPath = normalizePath(root, path, data),
-          value;
-
-      if (Ember.FEATURES.isEnabled("ember-handlebars-caps-lookup")) {
-
-        // If the path starts with a capital letter, look it up on Ember.lookup,
-        // which defaults to the `window` object in browsers.
-        if (isGlobalPath(path)) {
-          value = get(Ember.lookup, path);
-        } else {
-
-          // In cases where the path begins with a keyword, change the
-          // root to the value represented by that keyword, and ensure
-          // the path is relative to it.
-          value = get(normalizedPath.root, normalizedPath.path);
-        }
-
-      } else {
-        root = normalizedPath.root;
-        path = normalizedPath.path;
-
-        value = get(root, path);
-
-        if (value === undefined && root !== Ember.lookup && isGlobalPath(path)) {
-          value = get(Ember.lookup, path);
-        }
-      }
-
-      return value;
-    }
-
-    /**
-      This method uses `Ember.Handlebars.get` to lookup a value, then ensures
-      that the value is escaped properly.
-
-      If `unescaped` is a truthy value then the escaping will not be performed.
-
-      @method getEscaped
-      @for Ember.Handlebars
-      @param {Object} root The object to look up the property on
-      @param {String} path The path to be lookedup
-      @param {Object} options The template's option hash
-    */
-    function getEscaped(root, path, options) {
-      var result = handlebarsGet(root, path, options);
-
-      if (result === null || result === undefined) {
-        result = "";
-      } else if (!(result instanceof Handlebars.SafeString)) {
-        result = String(result);
-      }
-      if (!options.hash.unescaped){
-        result = Handlebars.Utils.escapeExpression(result);
-      }
-
-      return result;
-    };
-
-    function resolveParams(context, params, options) {
-      var resolvedParams = [], types = options.types, param, type;
-
-      for (var i=0, l=params.length; i<l; i++) {
-        param = params[i];
-        type = types[i];
-
-        if (type === 'ID') {
-          resolvedParams.push(handlebarsGet(context, param, options));
-        } else {
-          resolvedParams.push(param);
-        }
-      }
-
-      return resolvedParams;
-    };
-
-    function resolveHash(context, hash, options) {
-      var resolvedHash = {}, types = options.hashTypes, type;
-
-      for (var key in hash) {
-        if (!hash.hasOwnProperty(key)) { continue; }
-
-        type = types[key];
-
-        if (type === 'ID') {
-          resolvedHash[key] = handlebarsGet(context, hash[key], options);
-        } else {
-          resolvedHash[key] = hash[key];
-        }
-      }
-
-      return resolvedHash;
-    };
-
-    /**
-      Registers a helper in Handlebars that will be called if no property with the
-      given name can be found on the current context object, and no helper with
-      that name is registered.
-
-      This throws an exception with a more helpful error message so the user can
-      track down where the problem is happening.
-
-      @private
-      @method helperMissing
-      @for Ember.Handlebars.helpers
-      @param {String} path
-      @param {Hash} options
-    */
-    function helperMissingHelper(path) {
-      if (!resolveHelper) { resolveHelper = requireModule('ember-handlebars/helpers/binding')['resolveHelper']; } // ES6TODO: stupid circular dep
-
-      var error, view = "";
-
-      var options = arguments[arguments.length - 1];
-
-      var helper = resolveHelper(options.data.view.container, path);
-
-      if (helper) {
-        return helper.apply(this, slice.call(arguments, 1));
-      }
-
-      error = "%@ Handlebars error: Could not find property '%@' on object %@.";
-      if (options.data) {
-        view = options.data.view;
-      }
-      throw new EmberError(fmt(error, [view, path, this]));
-    }
-
-    /**
-      Registers a helper in Handlebars that will be called if no property with the
-      given name can be found on the current context object, and no helper with
-      that name is registered.
-
-      This throws an exception with a more helpful error message so the user can
-      track down where the problem is happening.
-
-      @private
-      @method helperMissing
-      @for Ember.Handlebars.helpers
-      @param {String} path
-      @param {Hash} options
-    */
-    function blockHelperMissingHelper(path) {
-      if (!resolveHelper) { resolveHelper = requireModule('ember-handlebars/helpers/binding')['resolveHelper']; } // ES6TODO: stupid circular dep
-
-      var options = arguments[arguments.length - 1];
-
-      Ember.assert("`blockHelperMissing` was invoked without a helper name, which " +
-                   "is most likely due to a mismatch between the version of " +
-                   "Ember.js you're running now and the one used to precompile your " +
-                   "templates. Please make sure the version of " +
-                   "`ember-handlebars-compiler` you're using is up to date.", path);
-
-      var helper = resolveHelper(options.data.view.container, path);
-
-      if (helper) {
-        return helper.apply(this, slice.call(arguments, 1));
-      } else {
-        return helpers.helperMissing.call(this, path);
-      }
-    }
-
-    /**
-      Register a bound handlebars helper. Bound helpers behave similarly to regular
-      handlebars helpers, with the added ability to re-render when the underlying data
-      changes.
-
-      ## Simple example
-
-      ```javascript
-      Ember.Handlebars.registerBoundHelper('capitalize', function(value) {
-        return value.toUpperCase();
-      });
-      ```
-
-      The above bound helper can be used inside of templates as follows:
-
-      ```handlebars
-      {{capitalize name}}
-      ```
-
-      In this case, when the `name` property of the template's context changes,
-      the rendered value of the helper will update to reflect this change.
-
-      ## Example with options
-
-      Like normal handlebars helpers, bound helpers have access to the options
-      passed into the helper call.
-
-      ```javascript
-      Ember.Handlebars.registerBoundHelper('repeat', function(value, options) {
-        var count = options.hash.count;
-        var a = [];
-        while(a.length < count) {
-            a.push(value);
-        }
-        return a.join('');
-      });
-      ```
-
-      This helper could be used in a template as follows:
-
-      ```handlebars
-      {{repeat text count=3}}
-      ```
-
-      ## Example with bound options
-
-      Bound hash options are also supported. Example:
-
-      ```handlebars
-      {{repeat text countBinding="numRepeats"}}
-      ```
-
-      In this example, count will be bound to the value of
-      the `numRepeats` property on the context. If that property
-      changes, the helper will be re-rendered.
-
-      ## Example with extra dependencies
-
-      The `Ember.Handlebars.registerBoundHelper` method takes a variable length
-      third parameter which indicates extra dependencies on the passed in value.
-      This allows the handlebars helper to update when these dependencies change.
-
-      ```javascript
-      Ember.Handlebars.registerBoundHelper('capitalizeName', function(value) {
-        return value.get('name').toUpperCase();
-      }, 'name');
-      ```
-
-      ## Example with multiple bound properties
-
-      `Ember.Handlebars.registerBoundHelper` supports binding to
-      multiple properties, e.g.:
-
-      ```javascript
-      Ember.Handlebars.registerBoundHelper('concatenate', function() {
-        var values = Array.prototype.slice.call(arguments, 0, -1);
-        return values.join('||');
-      });
-      ```
-
-      Which allows for template syntax such as `{{concatenate prop1 prop2}}` or
-      `{{concatenate prop1 prop2 prop3}}`. If any of the properties change,
-      the helpr will re-render.  Note that dependency keys cannot be
-      using in conjunction with multi-property helpers, since it is ambiguous
-      which property the dependent keys would belong to.
-
-      ## Use with unbound helper
-
-      The `{{unbound}}` helper can be used with bound helper invocations
-      to render them in their unbound form, e.g.
-
-      ```handlebars
-      {{unbound capitalize name}}
-      ```
-
-      In this example, if the name property changes, the helper
-      will not re-render.
-
-      ## Use with blocks not supported
-
-      Bound helpers do not support use with Handlebars blocks or
-      the addition of child views of any kind.
-
-      @method registerBoundHelper
-      @for Ember.Handlebars
-      @param {String} name
-      @param {Function} function
-      @param {String} dependentKeys*
-    */
-    function registerBoundHelper(name, fn) {
-      var boundHelperArgs = slice.call(arguments, 1),
-          boundFn = makeBoundHelper.apply(this, boundHelperArgs);
-      EmberHandlebars.registerHelper(name, boundFn);
-    };
-
-    /**
-      A (mostly) private helper function to `registerBoundHelper`. Takes the
-      provided Handlebars helper function fn and returns it in wrapped
-      bound helper form.
-
-      The main use case for using this outside of `registerBoundHelper`
-      is for registering helpers on the container:
-
-      ```js
-      var boundHelperFn = Ember.Handlebars.makeBoundHelper(function(word) {
-        return word.toUpperCase();
-      });
-
-      container.register('helper:my-bound-helper', boundHelperFn);
-      ```
-
-      In the above example, if the helper function hadn't been wrapped in
-      `makeBoundHelper`, the registered helper would be unbound.
-
-      @private
-      @method makeBoundHelper
-      @for Ember.Handlebars
-      @param {Function} function
-      @param {String} dependentKeys*
-    */
-    function makeBoundHelper(fn) {
-      if (!SimpleHandlebarsView) { SimpleHandlebarsView = requireModule('ember-handlebars/views/handlebars_bound_view')['SimpleHandlebarsView']; } // ES6TODO: stupid circular dep
-
-      var dependentKeys = slice.call(arguments, 1);
-
-      function helper() {
-        var properties = slice.call(arguments, 0, -1),
-          numProperties = properties.length,
-          options = arguments[arguments.length - 1],
-          normalizedProperties = [],
-          data = options.data,
-          types = data.isUnbound ? slice.call(options.types, 1) : options.types,
-          hash = options.hash,
-          view = data.view,
-          contexts = options.contexts,
-          currentContext = (contexts && contexts.length) ? contexts[0] : this,
-          prefixPathForDependentKeys = '',
-          loc, len, hashOption,
-          boundOption, property,
-          normalizedValue = SimpleHandlebarsView.prototype.normalizedValue;
-
-        Ember.assert("registerBoundHelper-generated helpers do not support use with Handlebars blocks.", !options.fn);
-
-        // Detect bound options (e.g. countBinding="otherCount")
-        var boundOptions = hash.boundOptions = {};
-        for (hashOption in hash) {
-          if (IS_BINDING.test(hashOption)) {
-            // Lop off 'Binding' suffix.
-            boundOptions[hashOption.slice(0, -7)] = hash[hashOption];
-          }
-        }
-
-        // Expose property names on data.properties object.
-        var watchedProperties = [];
-        data.properties = [];
-        for (loc = 0; loc < numProperties; ++loc) {
-          data.properties.push(properties[loc]);
-          if (types[loc] === 'ID') {
-            var normalizedProp = normalizePath(currentContext, properties[loc], data);
-            normalizedProperties.push(normalizedProp);
-            watchedProperties.push(normalizedProp);
-          } else {
-            if(data.isUnbound) {
-              normalizedProperties.push({path: properties[loc]});
-            }else {
-              normalizedProperties.push(null);
-            }
-          }
-        }
-
-        // Handle case when helper invocation is preceded by `unbound`, e.g.
-        // {{unbound myHelper foo}}
-        if (data.isUnbound) {
-          return evaluateUnboundHelper(this, fn, normalizedProperties, options);
-        }
-
-        var bindView = new SimpleHandlebarsView(null, null, !options.hash.unescaped, options.data);
-
-        // Override SimpleHandlebarsView's method for generating the view's content.
-        bindView.normalizedValue = function() {
-          var args = [], boundOption;
-
-          // Copy over bound hash options.
-          for (boundOption in boundOptions) {
-            if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
-            property = normalizePath(currentContext, boundOptions[boundOption], data);
-            bindView.path = property.path;
-            bindView.pathRoot = property.root;
-            hash[boundOption] = normalizedValue.call(bindView);
-          }
-
-          for (loc = 0; loc < numProperties; ++loc) {
-            property = normalizedProperties[loc];
-            if (property) {
-              bindView.path = property.path;
-              bindView.pathRoot = property.root;
-              args.push(normalizedValue.call(bindView));
-            } else {
-              args.push(properties[loc]);
-            }
-          }
-          args.push(options);
-
-          // Run the supplied helper function.
-          return fn.apply(currentContext, args);
-        };
-
-        view.appendChild(bindView);
-
-        // Assemble list of watched properties that'll re-render this helper.
-        for (boundOption in boundOptions) {
-          if (boundOptions.hasOwnProperty(boundOption)) {
-            watchedProperties.push(normalizePath(currentContext, boundOptions[boundOption], data));
-          }
-        }
-
-        // Observe each property.
-        for (loc = 0, len = watchedProperties.length; loc < len; ++loc) {
-          property = watchedProperties[loc];
-          view.registerObserver(property.root, property.path, bindView, bindView.rerender);
-        }
-
-        if (types[0] !== 'ID' || normalizedProperties.length === 0) {
-          return;
-        }
-
-        // Add dependent key observers to the first param
-        var normalized = normalizedProperties[0],
-            pathRoot = normalized.root,
-            path = normalized.path;
-
-        if(!isEmpty(path)) {
-          prefixPathForDependentKeys = path + '.';
-        }
-        for (var i=0, l=dependentKeys.length; i<l; i++) {
-          view.registerObserver(pathRoot, prefixPathForDependentKeys + dependentKeys[i], bindView, bindView.rerender);
-        }
-      }
-
-      helper._rawFunction = fn;
-      return helper;
-    };
-
-    /**
-      Renders the unbound form of an otherwise bound helper function.
-
-      @private
-      @method evaluateUnboundHelper
-      @param {Function} fn
-      @param {Object} context
-      @param {Array} normalizedProperties
-      @param {String} options
-    */
-    function evaluateUnboundHelper(context, fn, normalizedProperties, options) {
-      var args = [],
-       hash = options.hash,
-       boundOptions = hash.boundOptions,
-       types = slice.call(options.types, 1),
-       loc,
-       len,
-       property,
-       propertyType,
-       boundOption;
-
-      for (boundOption in boundOptions) {
-        if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
-        hash[boundOption] = handlebarsGet(context, boundOptions[boundOption], options);
-      }
-
-      for(loc = 0, len = normalizedProperties.length; loc < len; ++loc) {
-        property = normalizedProperties[loc];
-        propertyType = types[loc];
-        if(propertyType === "ID") {
-          args.push(handlebarsGet(property.root, property.path, options));
-        } else {
-          args.push(property.path);
-        }
-      }
-      args.push(options);
-      return fn.apply(context, args);
-    }
-
-    /**
-      Overrides Handlebars.template so that we can distinguish
-      user-created, top-level templates from inner contexts.
-
-      @private
-      @method template
-      @for Ember.Handlebars
-      @param {String} spec
-    */
-    function template(spec) {
-      var t = originalTemplate(spec);
-      t.isTop = true;
-      return t;
-    };
-
-    __exports__.normalizePath = normalizePath;
-    __exports__.template = template;
-    __exports__.makeBoundHelper = makeBoundHelper;
-    __exports__.registerBoundHelper = registerBoundHelper;
-    __exports__.resolveHash = resolveHash;
-    __exports__.resolveParams = resolveParams;
-    __exports__.handlebarsGet = handlebarsGet;
-    __exports__.getEscaped = getEscaped;
-    __exports__.evaluateUnboundHelper = evaluateUnboundHelper;
-    __exports__.helperMissingHelper = helperMissingHelper;
-    __exports__.blockHelperMissingHelper = blockHelperMissingHelper;
-  });
-define("ember-handlebars/helpers/binding", 
-  ["ember-metal/core","ember-handlebars-compiler","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-metal/platform","ember-metal/is_none","ember-metal/enumerable_utils","ember-metal/array","ember-views/views/view","ember-metal/run_loop","ember-handlebars/views/handlebars_bound_view","ember-metal/observer","ember-metal/binding","ember-metal/utils","ember-views/system/jquery","ember-handlebars/ext","ember-runtime/keys","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.warn, uuid
-    // var emberAssert = Ember.assert, Ember.warn = Ember.warn;
-
-    var EmberHandlebars = __dependency2__["default"];
-    var helpers = EmberHandlebars.helpers;
-    var SafeString = EmberHandlebars.SafeString;
-
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var fmt = __dependency5__.fmt;
-    var o_create = __dependency6__.create;
-    var isNone = __dependency7__["default"];
-    var EnumerableUtils = __dependency8__["default"];
-    var forEach = __dependency9__.forEach;
-    var View = __dependency10__.View;
-    var run = __dependency11__["default"];
-    var _HandlebarsBoundView = __dependency12__._HandlebarsBoundView;
-    var SimpleHandlebarsView = __dependency12__.SimpleHandlebarsView;
-    var removeObserver = __dependency13__.removeObserver;
-    var isGlobalPath = __dependency14__.isGlobalPath;
-    var emberBind = __dependency14__.bind;
-    var guidFor = __dependency15__.guidFor;
-    var typeOf = __dependency15__.typeOf;
-    var jQuery = __dependency16__["default"];
-    var isArray = __dependency15__.isArray;
-    var normalizePath = __dependency17__.normalizePath;
-    var handlebarsGet = __dependency17__.handlebarsGet;
-    var getEscaped = __dependency17__.getEscaped;
-    var handlebarsGetEscaped = __dependency17__.getEscaped;
-    var keys = __dependency18__["default"];
-
-    function exists(value) {
-      return !isNone(value);
-    }
-
-    // Binds a property into the DOM. This will create a hook in DOM that the
-    // KVO system will look for and update if the property changes.
-    function bind(property, options, preserveContext, shouldDisplay, valueNormalizer, childProperties) {
-      var data = options.data,
-          fn = options.fn,
-          inverse = options.inverse,
-          view = data.view,
-          normalized, observer, i;
-
-      // we relied on the behavior of calling without
-      // context to mean this === window, but when running
-      // "use strict", it's possible for this to === undefined;
-      var currentContext = this || window;
-
-      normalized = normalizePath(currentContext, property, data);
-
-      // Set up observers for observable objects
-      if ('object' === typeof this) {
-        if (data.insideGroup) {
-          observer = function() {
-            run.once(view, 'rerender');
-          };
-
-          var template, context, result = handlebarsGet(currentContext, property, options);
-
-          result = valueNormalizer ? valueNormalizer(result) : result;
-
-          context = preserveContext ? currentContext : result;
-          if (shouldDisplay(result)) {
-            template = fn;
-          } else if (inverse) {
-            template = inverse;
-          }
-
-          template(context, { data: options.data });
-        } else {
-          // Create the view that will wrap the output of this template/property
-          // and add it to the nearest view's childViews array.
-          // See the documentation of Ember._HandlebarsBoundView for more.
-          var bindView = view.createChildView(Ember._HandlebarsBoundView, {
-            preserveContext: preserveContext,
-            shouldDisplayFunc: shouldDisplay,
-            valueNormalizerFunc: valueNormalizer,
-            displayTemplate: fn,
-            inverseTemplate: inverse,
-            path: property,
-            pathRoot: currentContext,
-            previousContext: currentContext,
-            isEscaped: !options.hash.unescaped,
-            templateData: options.data
-          });
-
-          if (options.hash.controller) {
-            bindView.set('_contextController', this.container.lookupFactory('controller:'+options.hash.controller).create({
-              container: currentContext.container,
-              parentController: currentContext,
-              target: currentContext
-            }));
-          }
-
-          view.appendChild(bindView);
-
-          observer = function() {
-            run.scheduleOnce('render', bindView, 'rerenderIfNeeded');
-          };
-        }
-
-        // Observes the given property on the context and
-        // tells the Ember._HandlebarsBoundView to re-render. If property
-        // is an empty string, we are printing the current context
-        // object ({{this}}) so updating it is not our responsibility.
-        if (normalized.path !== '') {
-          view.registerObserver(normalized.root, normalized.path, observer);
-          if (childProperties) {
-            for (i=0; i<childProperties.length; i++) {
-              view.registerObserver(normalized.root, normalized.path+'.'+childProperties[i], observer);
-            }
-          }
-        }
-      } else {
-        // The object is not observable, so just render it out and
-        // be done with it.
-        data.buffer.push(handlebarsGetEscaped(currentContext, property, options));
-      }
-    }
-
-    function simpleBind(currentContext, property, options) {
-      var data = options.data,
-          view = data.view,
-          normalized, observer, pathRoot, output;
-
-      normalized = normalizePath(currentContext, property, data);
-      pathRoot = normalized.root;
-
-      // Set up observers for observable objects
-      if (pathRoot && ('object' === typeof pathRoot)) {
-        if (data.insideGroup) {
-          observer = function() {
-            run.once(view, 'rerender');
-          };
-
-          output = handlebarsGetEscaped(currentContext, property, options);
-
-          data.buffer.push(output);
-        } else {
-          var bindView = new SimpleHandlebarsView(
-            property, currentContext, !options.hash.unescaped, options.data
-          );
-
-          bindView._parentView = view;
-          view.appendChild(bindView);
-
-          observer = function() {
-            run.scheduleOnce('render', bindView, 'rerender');
-          };
-        }
-
-        // Observes the given property on the context and
-        // tells the Ember._HandlebarsBoundView to re-render. If property
-        // is an empty string, we are printing the current context
-        // object ({{this}}) so updating it is not our responsibility.
-        if (normalized.path !== '') {
-          view.registerObserver(normalized.root, normalized.path, observer);
-        }
-      } else {
-        // The object is not observable, so just render it out and
-        // be done with it.
-        output = handlebarsGetEscaped(currentContext, property, options);
-        data.buffer.push(output);
-      }
-    }
-
-    function shouldDisplayIfHelperContent(result) {
-      var truthy = result && get(result, 'isTruthy');
-      if (typeof truthy === 'boolean') { return truthy; }
-
-      if (isArray(result)) {
-        return get(result, 'length') !== 0;
-      } else {
-        return !!result;
-      }
-    }
-
-    /**
-      '_triageMustache' is used internally select between a binding, helper, or component for
-      the given context. Until this point, it would be hard to determine if the
-      mustache is a property reference or a regular helper reference. This triage
-      helper resolves that.
-
-      This would not be typically invoked by directly.
-
-      @private
-      @method _triageMustache
-      @for Ember.Handlebars.helpers
-      @param {String} property Property/helperID to triage
-      @param {Object} options hash of template/rendering options
-      @return {String} HTML string
-    */
-    function _triageMustacheHelper(property, options) {
-      Ember.assert("You cannot pass more than one argument to the _triageMustache helper", arguments.length <= 2);
-
-      if (helpers[property]) {
-        return helpers[property].call(this, options);
-      }
-
-      var helper = EmberHandlebars.resolveHelper(options.data.view.container, property);
-      if (helper) {
-        return helper.call(this, options);
-      }
-
-      return helpers.bind.call(this, property, options);
-    }
-
-    function resolveHelper(container, name) {
-      if (!container || name.indexOf('-') === -1) {
-        return;
-      }
-
-      var helper = container.lookup('helper:' + name);
-      if (!helper) {
-        var componentLookup = container.lookup('component-lookup:main');
-        Ember.assert("Could not find 'component-lookup:main' on the provided container, which is necessary for performing component lookups", componentLookup);
-
-        var Component = componentLookup.lookupFactory(name, container);
-        if (Component) {
-          helper = EmberHandlebars.makeViewHelper(Component);
-          container.register('helper:' + name, helper);
-        }
-      }
-      return helper;
-    }
-
-
-    /**
-      `bind` can be used to display a value, then update that value if it
-      changes. For example, if you wanted to print the `title` property of
-      `content`:
-
-      ```handlebars
-      {{bind "content.title"}}
-      ```
-
-      This will return the `title` property as a string, then create a new observer
-      at the specified path. If it changes, it will update the value in DOM. Note
-      that if you need to support IE7 and IE8 you must modify the model objects
-      properties using `Ember.get()` and `Ember.set()` for this to work as it
-      relies on Ember's KVO system. For all other browsers this will be handled for
-      you automatically.
-
-      @private
-      @method bind
-      @for Ember.Handlebars.helpers
-      @param {String} property Property to bind
-      @param {Function} fn Context to provide for rendering
-      @return {String} HTML string
-    */
-    function bindHelper(property, options) {
-      Ember.assert("You cannot pass more than one argument to the bind helper", arguments.length <= 2);
-
-      var context = (options.contexts && options.contexts.length) ? options.contexts[0] : this;
-
-      if (!options.fn) {
-        return simpleBind(context, property, options);
-      }
-
-      return bind.call(context, property, options, false, exists);
-    }
-
-    /**
-      Use the `boundIf` helper to create a conditional that re-evaluates
-      whenever the truthiness of the bound value changes.
-
-      ```handlebars
-      {{#boundIf "content.shouldDisplayTitle"}}
-        {{content.title}}
-      {{/boundIf}}
-      ```
-
-      @private
-      @method boundIf
-      @for Ember.Handlebars.helpers
-      @param {String} property Property to bind
-      @param {Function} fn Context to provide for rendering
-      @return {String} HTML string
-    */
-    function boundIfHelper(property, fn) {
-      var context = (fn.contexts && fn.contexts.length) ? fn.contexts[0] : this;
-
-      return bind.call(context, property, fn, true, shouldDisplayIfHelperContent, shouldDisplayIfHelperContent, ['isTruthy', 'length']);
-    }
-
-
-    /**
-      @private
-
-      Use the `unboundIf` helper to create a conditional that evaluates once.
-
-      ```handlebars
-      {{#unboundIf "content.shouldDisplayTitle"}}
-        {{content.title}}
-      {{/unboundIf}}
-      ```
-
-      @method unboundIf
-      @for Ember.Handlebars.helpers
-      @param {String} property Property to bind
-      @param {Function} fn Context to provide for rendering
-      @return {String} HTML string
-    */
-    function unboundIfHelper(property, fn) {
-      var context = (fn.contexts && fn.contexts.length) ? fn.contexts[0] : this,
-          data = fn.data,
-          template = fn.fn,
-          inverse = fn.inverse,
-          normalized, propertyValue, result;
-
-      normalized = normalizePath(context, property, data);
-      propertyValue = handlebarsGet(context, property, fn);
-
-      if (!shouldDisplayIfHelperContent(propertyValue)) {
-        template = inverse;
-      }
-
-      template(context, { data: data });
-    }
-
-    /**
-      Use the `{{with}}` helper when you want to scope context. Take the following code as an example:
-
-      ```handlebars
-      <h5>{{user.name}}</h5>
-
-      <div class="role">
-        <h6>{{user.role.label}}</h6>
-        <span class="role-id">{{user.role.id}}</span>
-
-        <p class="role-desc">{{user.role.description}}</p>
-      </div>
-      ```
-
-      `{{with}}` can be our best friend in these cases,
-      instead of writing `user.role.*` over and over, we use `{{#with user.role}}`.
-      Now the context within the `{{#with}} .. {{/with}}` block is `user.role` so you can do the following:
-
-      ```handlebars
-      <h5>{{user.name}}</h5>
-
-      <div class="role">
-        {{#with user.role}}
-          <h6>{{label}}</h6>
-          <span class="role-id">{{id}}</span>
-
-          <p class="role-desc">{{description}}</p>
-        {{/with}}
-      </div>
-      ```
-
-      ### `as` operator
-
-      This operator aliases the scope to a new name. It's helpful for semantic clarity and to retain
-      default scope or to reference from another `{{with}}` block.
-
-      ```handlebars
-      // posts might not be
-      {{#with user.posts as blogPosts}}
-        <div class="notice">
-          There are {{blogPosts.length}} blog posts written by {{user.name}}.
-        </div>
-
-        {{#each post in blogPosts}}
-          <li>{{post.title}}</li>
-        {{/each}}
-      {{/with}}
-      ```
-
-      Without the `as` operator, it would be impossible to reference `user.name` in the example above.
-
-      NOTE: The alias should not reuse a name from the bound property path.
-      For example: `{{#with foo.bar as foo}}` is not supported because it attempts to alias using
-      the first part of the property path, `foo`. Instead, use `{{#with foo.bar as baz}}`.
-
-      ### `controller` option
-
-      Adding `controller='something'` instructs the `{{with}}` helper to create and use an instance of
-      the specified controller with the new context as its content.
-
-      This is very similar to using an `itemController` option with the `{{each}}` helper.
-
-      ```handlebars
-      {{#with users.posts controller='userBlogPosts'}}
-        {{!- The current context is wrapped in our controller instance }}
-      {{/with}}
-      ```
-
-      In the above example, the template provided to the `{{with}}` block is now wrapped in the
-      `userBlogPost` controller, which provides a very elegant way to decorate the context with custom
-      functions/properties.
-
-      @method with
-      @for Ember.Handlebars.helpers
-      @param {Function} context
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function withHelper(context, options) {
-      if (arguments.length === 4) {
-        var keywordName, path, rootPath, normalized, contextPath;
-
-        Ember.assert("If you pass more than one argument to the with helper, it must be in the form #with foo as bar", arguments[1] === "as");
-        options = arguments[3];
-        keywordName = arguments[2];
-        path = arguments[0];
-
-        Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
-
-        var localizedOptions = o_create(options);
-        localizedOptions.data = o_create(options.data);
-        localizedOptions.data.keywords = o_create(options.data.keywords || {});
-
-        if (isGlobalPath(path)) {
-          contextPath = path;
-        } else {
-          normalized = normalizePath(this, path, options.data);
-          path = normalized.path;
-          rootPath = normalized.root;
-
-          // This is a workaround for the fact that you cannot bind separate objects
-          // together. When we implement that functionality, we should use it here.
-          var contextKey = jQuery.expando + guidFor(rootPath);
-          localizedOptions.data.keywords[contextKey] = rootPath;
-          // if the path is '' ("this"), just bind directly to the current context
-          contextPath = path ? contextKey + '.' + path : contextKey;
-        }
-
-        emberBind(localizedOptions.data.keywords, keywordName, contextPath);
-
-        return bind.call(this, path, localizedOptions, true, exists);
-      } else {
-        Ember.assert("You must pass exactly one argument to the with helper", arguments.length === 2);
-        Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
-        return helpers.bind.call(options.contexts[0], context, options);
-      }
-    }
-
-
-    /**
-      See [boundIf](/api/classes/Ember.Handlebars.helpers.html#method_boundIf)
-      and [unboundIf](/api/classes/Ember.Handlebars.helpers.html#method_unboundIf)
-
-      @method if
-      @for Ember.Handlebars.helpers
-      @param {Function} context
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function ifHelper(context, options) {
-      Ember.assert("You must pass exactly one argument to the if helper", arguments.length === 2);
-      Ember.assert("You must pass a block to the if helper", options.fn && options.fn !== Handlebars.VM.noop);
-      if (options.data.isUnbound) {
-        return helpers.unboundIf.call(options.contexts[0], context, options);
-      } else {
-        return helpers.boundIf.call(options.contexts[0], context, options);
-      }
-    }
-
-    /**
-      @method unless
-      @for Ember.Handlebars.helpers
-      @param {Function} context
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function unlessHelper(context, options) {
-      Ember.assert("You must pass exactly one argument to the unless helper", arguments.length === 2);
-      Ember.assert("You must pass a block to the unless helper", options.fn && options.fn !== Handlebars.VM.noop);
-
-      var fn = options.fn, inverse = options.inverse;
-
-      options.fn = inverse;
-      options.inverse = fn;
-
-      if (options.data.isUnbound) {
-        return helpers.unboundIf.call(options.contexts[0], context, options);
-      } else {
-        return helpers.boundIf.call(options.contexts[0], context, options);
-      }
-    }
-
-    /**
-      `bind-attr` allows you to create a binding between DOM element attributes and
-      Ember objects. For example:
-
-      ```handlebars
-      <img {{bind-attr src="imageUrl" alt="imageTitle"}}>
-      ```
-
-      The above handlebars template will fill the `<img>`'s `src` attribute will
-      the value of the property referenced with `"imageUrl"` and its `alt`
-      attribute with the value of the property referenced with `"imageTitle"`.
-
-      If the rendering context of this template is the following object:
-
-      ```javascript
-      {
-        imageUrl: 'http://lolcats.info/haz-a-funny',
-        imageTitle: 'A humorous image of a cat'
-      }
-      ```
-
-      The resulting HTML output will be:
-
-      ```html
-      <img src="http://lolcats.info/haz-a-funny" alt="A humorous image of a cat">
-      ```
-
-      `bind-attr` cannot redeclare existing DOM element attributes. The use of `src`
-      in the following `bind-attr` example will be ignored and the hard coded value
-      of `src="/failwhale.gif"` will take precedence:
-
-      ```handlebars
-      <img src="/failwhale.gif" {{bind-attr src="imageUrl" alt="imageTitle"}}>
-      ```
-
-      ### `bind-attr` and the `class` attribute
-
-      `bind-attr` supports a special syntax for handling a number of cases unique
-      to the `class` DOM element attribute. The `class` attribute combines
-      multiple discrete values into a single attribute as a space-delimited
-      list of strings. Each string can be:
-
-      * a string return value of an object's property.
-      * a boolean return value of an object's property
-      * a hard-coded value
-
-      A string return value works identically to other uses of `bind-attr`. The
-      return value of the property will become the value of the attribute. For
-      example, the following view and template:
-
-      ```javascript
-        AView = View.extend({
-          someProperty: function() {
-            return "aValue";
-          }.property()
-        })
-      ```
-
-      ```handlebars
-      <img {{bind-attr class="view.someProperty}}>
-      ```
-
-      Result in the following rendered output:
-
-      ```html
-      <img class="aValue">
-      ```
-
-      A boolean return value will insert a specified class name if the property
-      returns `true` and remove the class name if the property returns `false`.
-
-      A class name is provided via the syntax
-      `somePropertyName:class-name-if-true`.
-
-      ```javascript
-      AView = View.extend({
-        someBool: true
-      })
-      ```
-
-      ```handlebars
-      <img {{bind-attr class="view.someBool:class-name-if-true"}}>
-      ```
-
-      Result in the following rendered output:
-
-      ```html
-      <img class="class-name-if-true">
-      ```
-
-      An additional section of the binding can be provided if you want to
-      replace the existing class instead of removing it when the boolean
-      value changes:
-
-      ```handlebars
-      <img {{bind-attr class="view.someBool:class-name-if-true:class-name-if-false"}}>
-      ```
-
-      A hard-coded value can be used by prepending `:` to the desired
-      class name: `:class-name-to-always-apply`.
-
-      ```handlebars
-      <img {{bind-attr class=":class-name-to-always-apply"}}>
-      ```
-
-      Results in the following rendered output:
-
-      ```html
-      <img class="class-name-to-always-apply">
-      ```
-
-      All three strategies - string return value, boolean return value, and
-      hard-coded value – can be combined in a single declaration:
-
-      ```handlebars
-      <img {{bind-attr class=":class-name-to-always-apply view.someBool:class-name-if-true view.someProperty"}}>
-      ```
-
-      @method bind-attr
-      @for Ember.Handlebars.helpers
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function bindAttrHelper(options) {
-      var attrs = options.hash;
-
-      Ember.assert("You must specify at least one hash argument to bind-attr", !!keys(attrs).length);
-
-      var view = options.data.view;
-      var ret = [];
-
-      // we relied on the behavior of calling without
-      // context to mean this === window, but when running
-      // "use strict", it's possible for this to === undefined;
-      var ctx = this || window;
-
-      // Generate a unique id for this element. This will be added as a
-      // data attribute to the element so it can be looked up when
-      // the bound property changes.
-      var dataId = ++Ember.uuid;
-
-      // Handle classes differently, as we can bind multiple classes
-      var classBindings = attrs['class'];
-      if (classBindings != null) {
-        var classResults = bindClasses(ctx, classBindings, view, dataId, options);
-
-        ret.push('class="' + Handlebars.Utils.escapeExpression(classResults.join(' ')) + '"');
-        delete attrs['class'];
-      }
-
-      var attrKeys = keys(attrs);
-
-      // For each attribute passed, create an observer and emit the
-      // current value of the property as an attribute.
-      forEach.call(attrKeys, function(attr) {
-        var path = attrs[attr],
-            normalized;
-
-        Ember.assert(fmt("You must provide an expression as the value of bound attribute. You specified: %@=%@", [attr, path]), typeof path === 'string');
-
-        normalized = normalizePath(ctx, path, options.data);
-
-        var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options),
-            type = typeOf(value);
-
-        Ember.assert(fmt("Attributes must be numbers, strings or booleans, not %@", [value]), value === null || value === undefined || type === 'number' || type === 'string' || type === 'boolean');
-
-        var observer, invoker;
-
-        observer = function observer() {
-          var result = handlebarsGet(ctx, path, options);
-
-          Ember.assert(fmt("Attributes must be numbers, strings or booleans, not %@", [result]),
-                       result === null || result === undefined || typeof result === 'number' ||
-                         typeof result === 'string' || typeof result === 'boolean');
-
-          var elem = view.$("[data-bindattr-" + dataId + "='" + dataId + "']");
-
-          // If we aren't able to find the element, it means the element
-          // to which we were bound has been removed from the view.
-          // In that case, we can assume the template has been re-rendered
-          // and we need to clean up the observer.
-          if (!elem || elem.length === 0) {
-            removeObserver(normalized.root, normalized.path, invoker);
-            return;
-          }
-
-          View.applyAttributeBindings(elem, attr, result);
-        };
-
-        // Add an observer to the view for when the property changes.
-        // When the observer fires, find the element using the
-        // unique data id and update the attribute to the new value.
-        // Note: don't add observer when path is 'this' or path
-        // is whole keyword e.g. {{#each x in list}} ... {{bind-attr attr="x"}}
-        if (path !== 'this' && !(normalized.isKeyword && normalized.path === '' )) {
-          view.registerObserver(normalized.root, normalized.path, observer);
-        }
-
-        // if this changes, also change the logic in ember-views/lib/views/view.js
-        if ((type === 'string' || (type === 'number' && !isNaN(value)))) {
-          ret.push(attr + '="' + Handlebars.Utils.escapeExpression(value) + '"');
-        } else if (value && type === 'boolean') {
-          // The developer controls the attr name, so it should always be safe
-          ret.push(attr + '="' + attr + '"');
-        }
-      }, this);
-
-      // Add the unique identifier
-      // NOTE: We use all lower-case since Firefox has problems with mixed case in SVG
-      ret.push('data-bindattr-' + dataId + '="' + dataId + '"');
-      return new SafeString(ret.join(' '));
-    }
-
-    /**
-      See `bind-attr`
-
-      @method bindAttr
-      @for Ember.Handlebars.helpers
-      @deprecated
-      @param {Function} context
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function bindAttrHelperDeprecated() {
-      Ember.warn("The 'bindAttr' view helper is deprecated in favor of 'bind-attr'");
-      return helpers['bind-attr'].apply(this, arguments);
-    }
-
-    /**
-      Helper that, given a space-separated string of property paths and a context,
-      returns an array of class names. Calling this method also has the side
-      effect of setting up observers at those property paths, such that if they
-      change, the correct class name will be reapplied to the DOM element.
-
-      For example, if you pass the string "fooBar", it will first look up the
-      "fooBar" value of the context. If that value is true, it will add the
-      "foo-bar" class to the current element (i.e., the dasherized form of
-      "fooBar"). If the value is a string, it will add that string as the class.
-      Otherwise, it will not add any new class name.
-
-      @private
-      @method bindClasses
-      @for Ember.Handlebars
-      @param {Ember.Object} context The context from which to lookup properties
-      @param {String} classBindings A string, space-separated, of class bindings
-        to use
-      @param {View} view The view in which observers should look for the
-        element to update
-      @param {Srting} bindAttrId Optional bindAttr id used to lookup elements
-      @return {Array} An array of class names to add
-    */
-    function bindClasses(context, classBindings, view, bindAttrId, options) {
-      var ret = [], newClass, value, elem;
-
-      // Helper method to retrieve the property from the context and
-      // determine which class string to return, based on whether it is
-      // a Boolean or not.
-      var classStringForPath = function(root, parsedPath, options) {
-        var val,
-            path = parsedPath.path;
-
-        if (path === 'this') {
-          val = root;
-        } else if (path === '') {
-          val = true;
-        } else {
-          val = handlebarsGet(root, path, options);
-        }
-
-        return View._classStringForValue(path, val, parsedPath.className, parsedPath.falsyClassName);
-      };
-
-      // For each property passed, loop through and setup
-      // an observer.
-      forEach.call(classBindings.split(' '), function(binding) {
-
-        // Variable in which the old class value is saved. The observer function
-        // closes over this variable, so it knows which string to remove when
-        // the property changes.
-        var oldClass;
-
-        var observer, invoker;
-
-        var parsedPath = View._parsePropertyPath(binding),
-            path = parsedPath.path,
-            pathRoot = context,
-            normalized;
-
-        if (path !== '' && path !== 'this') {
-          normalized = normalizePath(context, path, options.data);
-
-          pathRoot = normalized.root;
-          path = normalized.path;
-        }
-
-        // Set up an observer on the context. If the property changes, toggle the
-        // class name.
-        observer = function() {
-          // Get the current value of the property
-          newClass = classStringForPath(context, parsedPath, options);
-          elem = bindAttrId ? view.$("[data-bindattr-" + bindAttrId + "='" + bindAttrId + "']") : view.$();
-
-          // If we can't find the element anymore, a parent template has been
-          // re-rendered and we've been nuked. Remove the observer.
-          if (!elem || elem.length === 0) {
-            removeObserver(pathRoot, path, invoker);
-          } else {
-            // If we had previously added a class to the element, remove it.
-            if (oldClass) {
-              elem.removeClass(oldClass);
-            }
-
-            // If necessary, add a new class. Make sure we keep track of it so
-            // it can be removed in the future.
-            if (newClass) {
-              elem.addClass(newClass);
-              oldClass = newClass;
-            } else {
-              oldClass = null;
-            }
-          }
-        };
-
-        if (path !== '' && path !== 'this') {
-          view.registerObserver(pathRoot, path, observer);
-        }
-
-        // We've already setup the observer; now we just need to figure out the
-        // correct behavior right now on the first pass through.
-        value = classStringForPath(context, parsedPath, options);
-
-        if (value) {
-          ret.push(value);
-
-          // Make sure we save the current value so that it can be removed if the
-          // observer fires.
-          oldClass = value;
-        }
-      });
-
-      return ret;
-    };
-
-    __exports__.bind = bind;
-    __exports__._triageMustacheHelper = _triageMustacheHelper;
-    __exports__.resolveHelper = resolveHelper;
-    __exports__.bindHelper = bindHelper;
-    __exports__.boundIfHelper = boundIfHelper;
-    __exports__.unboundIfHelper = unboundIfHelper;
-    __exports__.withHelper = withHelper;
-    __exports__.ifHelper = ifHelper;
-    __exports__.unlessHelper = unlessHelper;
-    __exports__.bindAttrHelper = bindAttrHelper;
-    __exports__.bindAttrHelperDeprecated = bindAttrHelperDeprecated;
-    __exports__.bindClasses = bindClasses;
-  });
-define("ember-handlebars/helpers/collection", 
-  ["ember-metal/core","ember-metal/utils","ember-handlebars-compiler","ember-runtime/system/string","ember-metal/property_get","ember-handlebars/ext","ember-handlebars/helpers/view","ember-metal/computed","ember-views/views/collection_view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert, Ember.deprecate
-    var inspect = __dependency2__.inspect;
-
-    // var emberAssert = Ember.assert;
-        // emberDeprecate = Ember.deprecate;
-
-    var EmberHandlebars = __dependency3__["default"];
-    var helpers = EmberHandlebars.helpers;
-
-    var fmt = __dependency4__.fmt;
-    var get = __dependency5__.get;
-    var handlebarsGet = __dependency6__.handlebarsGet;
-    var ViewHelper = __dependency7__.ViewHelper;
-    var computed = __dependency8__.computed;
-    var CollectionView = __dependency9__["default"];
-
-    var alias = computed.alias;
-    /**
-      `{{collection}}` is a `Ember.Handlebars` helper for adding instances of
-      `Ember.CollectionView` to a template. See [Ember.CollectionView](/api/classes/Ember.CollectionView.html)
-       for additional information on how a `CollectionView` functions.
-
-      `{{collection}}`'s primary use is as a block helper with a `contentBinding`
-      option pointing towards an `Ember.Array`-compatible object. An `Ember.View`
-      instance will be created for each item in its `content` property. Each view
-      will have its own `content` property set to the appropriate item in the
-      collection.
-
-      The provided block will be applied as the template for each item's view.
-
-      Given an empty `<body>` the following template:
-
-      ```handlebars
-      {{#collection contentBinding="App.items"}}
-        Hi {{view.content.name}}
-      {{/collection}}
-      ```
-
-      And the following application code
-
-      ```javascript
-      App = Ember.Application.create()
-      App.items = [
-        Ember.Object.create({name: 'Dave'}),
-        Ember.Object.create({name: 'Mary'}),
-        Ember.Object.create({name: 'Sara'})
-      ]
-      ```
-
-      Will result in the HTML structure below
-
-      ```html
-      <div class="ember-view">
-        <div class="ember-view">Hi Dave</div>
-        <div class="ember-view">Hi Mary</div>
-        <div class="ember-view">Hi Sara</div>
-      </div>
-      ```
-
-      ### Blockless use in a collection
-
-      If you provide an `itemViewClass` option that has its own `template` you can
-      omit the block.
-
-      The following template:
-
-      ```handlebars
-      {{collection contentBinding="App.items" itemViewClass="App.AnItemView"}}
-      ```
-
-      And application code
-
-      ```javascript
-      App = Ember.Application.create();
-      App.items = [
-        Ember.Object.create({name: 'Dave'}),
-        Ember.Object.create({name: 'Mary'}),
-        Ember.Object.create({name: 'Sara'})
-      ];
-
-      App.AnItemView = Ember.View.extend({
-        template: Ember.Handlebars.compile("Greetings {{view.content.name}}")
-      });
-      ```
-
-      Will result in the HTML structure below
-
-      ```html
-      <div class="ember-view">
-        <div class="ember-view">Greetings Dave</div>
-        <div class="ember-view">Greetings Mary</div>
-        <div class="ember-view">Greetings Sara</div>
-      </div>
-      ```
-
-      ### Specifying a CollectionView subclass
-
-      By default the `{{collection}}` helper will create an instance of
-      `Ember.CollectionView`. You can supply a `Ember.CollectionView` subclass to
-      the helper by passing it as the first argument:
-
-      ```handlebars
-      {{#collection App.MyCustomCollectionClass contentBinding="App.items"}}
-        Hi {{view.content.name}}
-      {{/collection}}
-      ```
-
-      ### Forwarded `item.*`-named Options
-
-      As with the `{{view}}`, helper options passed to the `{{collection}}` will be
-      set on the resulting `Ember.CollectionView` as properties. Additionally,
-      options prefixed with `item` will be applied to the views rendered for each
-      item (note the camelcasing):
-
-      ```handlebars
-      {{#collection contentBinding="App.items"
-                    itemTagName="p"
-                    itemClassNames="greeting"}}
-        Howdy {{view.content.name}}
-      {{/collection}}
-      ```
-
-      Will result in the following HTML structure:
-
-      ```html
-      <div class="ember-view">
-        <p class="ember-view greeting">Howdy Dave</p>
-        <p class="ember-view greeting">Howdy Mary</p>
-        <p class="ember-view greeting">Howdy Sara</p>
-      </div>
-      ```
-
-      @method collection
-      @for Ember.Handlebars.helpers
-      @param {String} path
-      @param {Hash} options
-      @return {String} HTML string
-      @deprecated Use `{{each}}` helper instead.
-    */
-    function collectionHelper(path, options) {
-      Ember.deprecate("Using the {{collection}} helper without specifying a class has been deprecated as the {{each}} helper now supports the same functionality.", path !== 'collection');
-
-      // If no path is provided, treat path param as options.
-      if (path && path.data && path.data.isRenderData) {
-        options = path;
-        path = undefined;
-        Ember.assert("You cannot pass more than one argument to the collection helper", arguments.length === 1);
-      } else {
-        Ember.assert("You cannot pass more than one argument to the collection helper", arguments.length === 2);
-      }
-
-      var fn = options.fn;
-      var data = options.data;
-      var inverse = options.inverse;
-      var view = options.data.view;
-
-
-      var controller, container;
-      // If passed a path string, convert that into an object.
-      // Otherwise, just default to the standard class.
-      var collectionClass;
-      if (path) {
-        controller = data.keywords.controller;
-        container = controller && controller.container;
-        collectionClass = handlebarsGet(this, path, options) || container.lookupFactory('view:' + path);
-        Ember.assert(fmt("%@ #collection: Could not find collection class %@", [data.view, path]), !!collectionClass);
-      }
-      else {
-        collectionClass = CollectionView;
-      }
-
-      var hash = options.hash, itemHash = {}, match;
-
-      // Extract item view class if provided else default to the standard class
-      var collectionPrototype = collectionClass.proto(), itemViewClass;
-
-      if (hash.itemView) {
-        controller = data.keywords.controller;
-        Ember.assert('You specified an itemView, but the current context has no ' +
-                     'container to look the itemView up in. This probably means ' +
-                     'that you created a view manually, instead of through the ' +
-                     'container. Instead, use container.lookup("view:viewName"), ' +
-                     'which will properly instantiate your view.',
-                     controller && controller.container);
-        container = controller.container;
-        itemViewClass = container.lookupFactory('view:' + hash.itemView);
-        Ember.assert('You specified the itemView ' + hash.itemView + ", but it was " +
-                     "not found at " + container.describe("view:" + hash.itemView) +
-                     " (and it was not registered in the container)", !!itemViewClass);
-      } else if (hash.itemViewClass) {
-        itemViewClass = handlebarsGet(collectionPrototype, hash.itemViewClass, options);
-      } else {
-        itemViewClass = collectionPrototype.itemViewClass;
-      }
-
-      Ember.assert(fmt("%@ #collection: Could not find itemViewClass %@", [data.view, itemViewClass]), !!itemViewClass);
-
-      delete hash.itemViewClass;
-      delete hash.itemView;
-
-      // Go through options passed to the {{collection}} helper and extract options
-      // that configure item views instead of the collection itself.
-      for (var prop in hash) {
-        if (hash.hasOwnProperty(prop)) {
-          match = prop.match(/^item(.)(.*)$/);
-
-          if (match && prop !== 'itemController') {
-            // Convert itemShouldFoo -> shouldFoo
-            itemHash[match[1].toLowerCase() + match[2]] = hash[prop];
-            // Delete from hash as this will end up getting passed to the
-            // {{view}} helper method.
-            delete hash[prop];
-          }
-        }
-      }
-
-      if (fn) {
-        itemHash.template = fn;
-        delete options.fn;
-      }
-
-      var emptyViewClass;
-      if (inverse && inverse !== EmberHandlebars.VM.noop) {
-        emptyViewClass = get(collectionPrototype, 'emptyViewClass');
-        emptyViewClass = emptyViewClass.extend({
-              template: inverse,
-              tagName: itemHash.tagName
-        });
-      } else if (hash.emptyViewClass) {
-        emptyViewClass = handlebarsGet(this, hash.emptyViewClass, options);
-      }
-      if (emptyViewClass) { hash.emptyView = emptyViewClass; }
-
-      if (!hash.keyword) {
-        itemHash._context = alias('content');
-      }
-
-      var viewOptions = ViewHelper.propertiesFromHTMLOptions({ data: data, hash: itemHash }, this);
-      hash.itemViewClass = itemViewClass.extend(viewOptions);
-
-      return helpers.view.call(this, collectionClass, options);
-    }
-
-    __exports__["default"] = collectionHelper;
-  });
-define("ember-handlebars/helpers/debug", 
-  ["ember-metal/core","ember-metal/utils","ember-metal/logger","ember-metal/property_get","ember-handlebars/ext","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    /*jshint debug:true*/
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.FEATURES,
-    var inspect = __dependency2__.inspect;
-    var Logger = __dependency3__["default"];
-
-    var get = __dependency4__.get;
-    var normalizePath = __dependency5__.normalizePath;
-    var handlebarsGet = __dependency5__.handlebarsGet;
-
-    var a_slice = [].slice;
-
-    /**
-      `log` allows you to output the value of variables in the current rendering
-      context. `log` also accepts primitive types such as strings or numbers.
-
-      ```handlebars
-      {{log "myVariable:" myVariable }}
-      ```
-
-      @method log
-      @for Ember.Handlebars.helpers
-      @param {String} property
-    */
-    function logHelper() {
-      var params = a_slice.call(arguments, 0, -1),
-          options = arguments[arguments.length - 1],
-          logger = Logger.log,
-          values = [],
-          allowPrimitives = true;
-
-      for (var i = 0; i < params.length; i++) {
-        var type = options.types[i];
-
-        if (type === 'ID' || !allowPrimitives) {
-          var context = (options.contexts && options.contexts[i]) || this,
-              normalized = normalizePath(context, params[i], options.data);
-
-          if (normalized.path === 'this') {
-            values.push(normalized.root);
-          } else {
-            values.push(handlebarsGet(normalized.root, normalized.path, options));
-          }
-        } else {
-          values.push(params[i]);
-        }
-      }
-
-      logger.apply(logger, values);
-    };
-
-    /**
-      Execute the `debugger` statement in the current context.
-
-      ```handlebars
-      {{debugger}}
-      ```
-
-      Before invoking the `debugger` statement, there
-      are a few helpful variables defined in the
-      body of this helper that you can inspect while
-      debugging that describe how and where this
-      helper was invoked:
-
-      - templateContext: this is most likely a controller
-        from which this template looks up / displays properties
-      - typeOfTemplateContext: a string description of
-        what the templateContext is
-
-      For example, if you're wondering why a value `{{foo}}`
-      isn't rendering as expected within a template, you
-      could place a `{{debugger}}` statement, and when
-      the `debugger;` breakpoint is hit, you can inspect
-      `templateContext`, determine if it's the object you
-      expect, and/or evaluate expressions in the console
-      to perform property lookups on the `templateContext`:
-
-      ```
-        > templateContext.get('foo') // -> "<value of {{foo}}>"
-      ```
-
-      @method debugger
-      @for Ember.Handlebars.helpers
-      @param {String} property
-    */
-    function debuggerHelper(options) {
-
-      // These are helpful values you can inspect while debugging.
-      var templateContext = this;
-      var typeOfTemplateContext = inspect(templateContext);
-
-      debugger;
-    }
-
-    __exports__.logHelper = logHelper;
-    __exports__.debuggerHelper = debuggerHelper;
-  });
-define("ember-handlebars/helpers/each", 
-  ["ember-metal/core","ember-handlebars-compiler","ember-runtime/system/string","ember-metal/property_get","ember-metal/property_set","ember-handlebars/views/metamorph_view","ember-views/views/collection_view","ember-metal/binding","ember-runtime/controllers/controller","ember-runtime/controllers/array_controller","ember-runtime/mixins/array","ember-runtime/copy","ember-metal/run_loop","ember-metal/observer","ember-metal/events","ember-handlebars/ext","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) {
-    "use strict";
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-    var Ember = __dependency1__["default"];
-    // Ember.assert;, Ember.K
-    // var emberAssert = Ember.assert,
-    var K = Ember.K;
-
-    var EmberHandlebars = __dependency2__["default"];
-    var helpers = EmberHandlebars.helpers;
-
-    var fmt = __dependency3__.fmt;
-    var get = __dependency4__.get;
-    var set = __dependency5__.set;
-    var _Metamorph = __dependency6__._Metamorph;
-    var _MetamorphView = __dependency6__._MetamorphView;
-    var CollectionView = __dependency7__["default"];
-    var Binding = __dependency8__.Binding;
-    var ControllerMixin = __dependency9__.ControllerMixin;
-    var ArrayController = __dependency10__["default"];
-    var EmberArray = __dependency11__["default"];
-    var copy = __dependency12__["default"];
-    var run = __dependency13__["default"];
-    var addObserver = __dependency14__.addObserver;
-    var removeObserver = __dependency14__.removeObserver;
-    var addBeforeObserver = __dependency14__.addBeforeObserver;
-    var removeBeforeObserver = __dependency14__.removeBeforeObserver;
-    var on = __dependency15__.on;
-
-    var handlebarsGet = __dependency16__.handlebarsGet;
-
-    var EachView = CollectionView.extend(_Metamorph, {
-      init: function() {
-        var itemController = get(this, 'itemController');
-        var binding;
-
-        if (itemController) {
-          var controller = get(this, 'controller.container').lookupFactory('controller:array').create({
-            _isVirtual: true,
-            parentController: get(this, 'controller'),
-            itemController: itemController,
-            target: get(this, 'controller'),
-            _eachView: this
-          });
-
-          this.disableContentObservers(function() {
-            set(this, 'content', controller);
-            binding = new Binding('content', '_eachView.dataSource').oneWay();
-            binding.connect(controller);
-          });
-
-          set(this, '_arrayController', controller);
-        } else {
-          this.disableContentObservers(function() {
-            binding = new Binding('content', 'dataSource').oneWay();
-            binding.connect(this);
-          });
-        }
-
-        return this._super();
-      },
-
-      _assertArrayLike: function(content) {
-        Ember.assert(fmt("The value that #each loops over must be an Array. You " +
-                         "passed %@, but it should have been an ArrayController",
-                         [content.constructor]),
-                         !ControllerMixin.detect(content) ||
-                           (content && content.isGenerated) ||
-                           content instanceof ArrayController);
-        Ember.assert(fmt("The value that #each loops over must be an Array. You passed %@", [(ControllerMixin.detect(content) && content.get('model') !== undefined) ? fmt("'%@' (wrapped in %@)", [content.get('model'), content]) : content]), EmberArray.detect(content));
-      },
-
-      disableContentObservers: function(callback) {
-        removeBeforeObserver(this, 'content', null, '_contentWillChange');
-        removeObserver(this, 'content', null, '_contentDidChange');
-
-        callback.call(this);
-
-        addBeforeObserver(this, 'content', null, '_contentWillChange');
-        addObserver(this, 'content', null, '_contentDidChange');
-      },
-
-      itemViewClass: _MetamorphView,
-      emptyViewClass: _MetamorphView,
-
-      createChildView: function(view, attrs) {
-        view = this._super(view, attrs);
-
-        // At the moment, if a container view subclass wants
-        // to insert keywords, it is responsible for cloning
-        // the keywords hash. This will be fixed momentarily.
-        var keyword = get(this, 'keyword');
-        var content = get(view, 'content');
-
-        if (keyword) {
-          var data = get(view, 'templateData');
-
-          data = copy(data);
-          data.keywords = view.cloneKeywords();
-          set(view, 'templateData', data);
-
-          // In this case, we do not bind, because the `content` of
-          // a #each item cannot change.
-          data.keywords[keyword] = content;
-        }
-
-        // If {{#each}} is looping over an array of controllers,
-        // point each child view at their respective controller.
-        if (content && content.isController) {
-          set(view, 'controller', content);
-        }
-
-        return view;
-      },
-
-      destroy: function() {
-        if (!this._super()) { return; }
-
-        var arrayController = get(this, '_arrayController');
-
-        if (arrayController) {
-          arrayController.destroy();
-        }
-
-        return this;
-      }
-    });
-
-    // Defeatureify doesn't seem to like nested functions that need to be removed
-    function _addMetamorphCheck() {
-      EachView.reopen({
-        _checkMetamorph: on('didInsertElement', function() {
-          Ember.assert("The metamorph tags, " +
-                       this.morph.start + " and " + this.morph.end +
-                       ", have different parents.\nThe browser has fixed your template to output valid HTML (for example, check that you have properly closed all tags and have used a TBODY tag when creating a table with '{{#each}}')",
-            document.getElementById( this.morph.start ).parentNode ===
-            document.getElementById( this.morph.end ).parentNode
-          );
-        })
-      });
-    }
-
-    // until ember-debug is es6ed
-    var runInDebug = function(f){f()};
-    runInDebug( function() {
-      _addMetamorphCheck();
-    });
-
-    var GroupedEach = EmberHandlebars.GroupedEach = function(context, path, options) {
-      var self = this,
-          normalized = EmberHandlebars.normalizePath(context, path, options.data);
-
-      this.context = context;
-      this.path = path;
-      this.options = options;
-      this.template = options.fn;
-      this.containingView = options.data.view;
-      this.normalizedRoot = normalized.root;
-      this.normalizedPath = normalized.path;
-      this.content = this.lookupContent();
-
-      this.addContentObservers();
-      this.addArrayObservers();
-
-      this.containingView.on('willClearRender', function() {
-        self.destroy();
-      });
-    };
-
-    GroupedEach.prototype = {
-      contentWillChange: function() {
-        this.removeArrayObservers();
-      },
-
-      contentDidChange: function() {
-        this.content = this.lookupContent();
-        this.addArrayObservers();
-        this.rerenderContainingView();
-      },
-
-      contentArrayWillChange: K,
-
-      contentArrayDidChange: function() {
-        this.rerenderContainingView();
-      },
-
-      lookupContent: function() {
-        return handlebarsGet(this.normalizedRoot, this.normalizedPath, this.options);
-      },
-
-      addArrayObservers: function() {
-        if (!this.content) { return; }
-
-        this.content.addArrayObserver(this, {
-          willChange: 'contentArrayWillChange',
-          didChange: 'contentArrayDidChange'
-        });
-      },
-
-      removeArrayObservers: function() {
-        if (!this.content) { return; }
-
-        this.content.removeArrayObserver(this, {
-          willChange: 'contentArrayWillChange',
-          didChange: 'contentArrayDidChange'
-        });
-      },
-
-      addContentObservers: function() {
-        addBeforeObserver(this.normalizedRoot, this.normalizedPath, this, this.contentWillChange);
-        addObserver(this.normalizedRoot, this.normalizedPath, this, this.contentDidChange);
-      },
-
-      removeContentObservers: function() {
-        removeBeforeObserver(this.normalizedRoot, this.normalizedPath, this.contentWillChange);
-        removeObserver(this.normalizedRoot, this.normalizedPath, this.contentDidChange);
-      },
-
-      render: function() {
-        if (!this.content) { return; }
-
-        var content = this.content,
-            contentLength = get(content, 'length'),
-            data = this.options.data,
-            template = this.template;
-
-        data.insideEach = true;
-        for (var i = 0; i < contentLength; i++) {
-          template(content.objectAt(i), { data: data });
-        }
-      },
-
-      rerenderContainingView: function() {
-        var self = this;
-        run.scheduleOnce('render', this, function() {
-          // It's possible it's been destroyed after we enqueued a re-render call.
-          if (!self.destroyed) {
-            self.containingView.rerender();
-          }
-        });
-      },
-
-      destroy: function() {
-        this.removeContentObservers();
-        if (this.content) {
-          this.removeArrayObservers();
-        }
-        this.destroyed = true;
-      }
-    };
-
-    /**
-      The `{{#each}}` helper loops over elements in a collection, rendering its
-      block once for each item. It is an extension of the base Handlebars `{{#each}}`
-      helper:
-
-      ```javascript
-      Developers = [{name: 'Yehuda'},{name: 'Tom'}, {name: 'Paul'}];
-      ```
-
-      ```handlebars
-      {{#each Developers}}
-        {{name}}
-      {{/each}}
-      ```
-
-      `{{each}}` supports an alternative syntax with element naming:
-
-      ```handlebars
-      {{#each person in Developers}}
-        {{person.name}}
-      {{/each}}
-      ```
-
-      When looping over objects that do not have properties, `{{this}}` can be used
-      to render the object:
-
-      ```javascript
-      DeveloperNames = ['Yehuda', 'Tom', 'Paul']
-      ```
-
-      ```handlebars
-      {{#each DeveloperNames}}
-        {{this}}
-      {{/each}}
-      ```
-      ### {{else}} condition
-      `{{#each}}` can have a matching `{{else}}`. The contents of this block will render
-      if the collection is empty.
-
-      ```
-      {{#each person in Developers}}
-        {{person.name}}
-      {{else}}
-        <p>Sorry, nobody is available for this task.</p>
-      {{/each}}
-      ```
-      ### Specifying a View class for items
-      If you provide an `itemViewClass` option that references a view class
-      with its own `template` you can omit the block.
-
-      The following template:
-
-      ```handlebars
-      {{#view App.MyView }}
-        {{each view.items itemViewClass="App.AnItemView"}}
-      {{/view}}
-      ```
-
-      And application code
-
-      ```javascript
-      App = Ember.Application.create({
-        MyView: Ember.View.extend({
-          items: [
-            Ember.Object.create({name: 'Dave'}),
-            Ember.Object.create({name: 'Mary'}),
-            Ember.Object.create({name: 'Sara'})
-          ]
-        })
-      });
-
-      App.AnItemView = Ember.View.extend({
-        template: Ember.Handlebars.compile("Greetings {{name}}")
-      });
-      ```
-
-      Will result in the HTML structure below
-
-      ```html
-      <div class="ember-view">
-        <div class="ember-view">Greetings Dave</div>
-        <div class="ember-view">Greetings Mary</div>
-        <div class="ember-view">Greetings Sara</div>
-      </div>
-      ```
-
-      If an `itemViewClass` is defined on the helper, and therefore the helper is not
-      being used as a block, an `emptyViewClass` can also be provided optionally.
-      The `emptyViewClass` will match the behavior of the `{{else}}` condition
-      described above. That is, the `emptyViewClass` will render if the collection
-      is empty.
-
-      ### Representing each item with a Controller.
-      By default the controller lookup within an `{{#each}}` block will be
-      the controller of the template where the `{{#each}}` was used. If each
-      item needs to be presented by a custom controller you can provide a
-      `itemController` option which references a controller by lookup name.
-      Each item in the loop will be wrapped in an instance of this controller
-      and the item itself will be set to the `content` property of that controller.
-
-      This is useful in cases where properties of model objects need transformation
-      or synthesis for display:
-
-      ```javascript
-      App.DeveloperController = Ember.ObjectController.extend({
-        isAvailableForHire: function() {
-          return !this.get('content.isEmployed') && this.get('content.isSeekingWork');
-        }.property('isEmployed', 'isSeekingWork')
-      })
-      ```
-
-      ```handlebars
-      {{#each person in developers itemController="developer"}}
-        {{person.name}} {{#if person.isAvailableForHire}}Hire me!{{/if}}
-      {{/each}}
-      ```
-
-      Each itemController will receive a reference to the current controller as
-      a `parentController` property.
-
-      ### (Experimental) Grouped Each
-
-      When used in conjunction with the experimental [group helper](https://github.com/emberjs/group-helper),
-      you can inform Handlebars to re-render an entire group of items instead of
-      re-rendering them one at a time (in the event that they are changed en masse
-      or an item is added/removed).
-
-      ```handlebars
-      {{#group}}
-        {{#each people}}
-          {{firstName}} {{lastName}}
-        {{/each}}
-      {{/group}}
-      ```
-
-      This can be faster than the normal way that Handlebars re-renders items
-      in some cases.
-
-      If for some reason you have a group with more than one `#each`, you can make
-      one of the collections be updated in normal (non-grouped) fashion by setting
-      the option `groupedRows=true` (counter-intuitive, I know).
-
-      For example,
-
-      ```handlebars
-      {{dealershipName}}
-
-      {{#group}}
-        {{#each dealers}}
-          {{firstName}} {{lastName}}
-        {{/each}}
-
-        {{#each car in cars groupedRows=true}}
-          {{car.make}} {{car.model}} {{car.color}}
-        {{/each}}
-      {{/group}}
-      ```
-      Any change to `dealershipName` or the `dealers` collection will cause the
-      entire group to be re-rendered. However, changes to the `cars` collection
-      will be re-rendered individually (as normal).
-
-      Note that `group` behavior is also disabled by specifying an `itemViewClass`.
-
-      @method each
-      @for Ember.Handlebars.helpers
-      @param [name] {String} name for item (used with `in`)
-      @param [path] {String} path
-      @param [options] {Object} Handlebars key/value pairs of options
-      @param [options.itemViewClass] {String} a path to a view class used for each item
-      @param [options.itemController] {String} name of a controller to be created for each item
-      @param [options.groupedRows] {boolean} enable normal item-by-item rendering when inside a `#group` helper
-    */
-    function eachHelper(path, options) {
-      var ctx;
-
-      if (arguments.length === 4) {
-        Ember.assert("If you pass more than one argument to the each helper, it must be in the form #each foo in bar", arguments[1] === "in");
-
-        var keywordName = arguments[0];
-
-        options = arguments[3];
-        path = arguments[2];
-        if (path === '') { path = "this"; }
-
-        options.hash.keyword = keywordName;
-      }
-
-      if (arguments.length === 1) {
-        options = path;
-        path = 'this';
-      }
-
-      options.hash.dataSourceBinding = path;
-      // Set up emptyView as a metamorph with no tag
-      //options.hash.emptyViewClass = Ember._MetamorphView;
-
-      // can't rely on this default behavior when use strict
-      ctx = this || window;
-      if (options.data.insideGroup && !options.hash.groupedRows && !options.hash.itemViewClass) {
-        new GroupedEach(ctx, path, options).render();
-      } else {
-        // ES6TODO: figure out how to do this without global lookup.
-        return helpers.collection.call(ctx, 'Ember.Handlebars.EachView', options);
-      }
-    }
-
-    __exports__.EachView = EachView;
-    __exports__.GroupedEach = GroupedEach;
-    __exports__.eachHelper = eachHelper;
-  });
-define("ember-handlebars/helpers/loc", 
-  ["ember-runtime/system/string","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var loc = __dependency1__.loc;
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    // ES6TODO:
-    // Pretty sure this can be expressed as
-    // var locHelper EmberStringUtils.loc ?
-
-    /**
-      `loc` looks up the string in the localized strings hash.
-      This is a convenient way to localize text. For example:
-
-      ```html
-      <script type="text/x-handlebars" data-template-name="home">
-        {{loc "welcome"}}
-      </script>
-      ```
-
-      Take note that `"welcome"` is a string and not an object
-      reference.
-
-      @method loc
-      @for Ember.Handlebars.helpers
-      @param {String} str The string to format
-    */
-    function locHelper(str) {
-      return loc(str);
-    }
-
-    __exports__["default"] = locHelper;
-  });
-define("ember-handlebars/helpers/partial", 
-  ["ember-metal/core","ember-metal/is_none","ember-handlebars/ext","ember-handlebars/helpers/binding","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    // var emberAssert = Ember.assert;
-
-    var isNone = __dependency2__.isNone;
-    var handlebarsGet = __dependency3__.handlebarsGet;
-    var bind = __dependency4__.bind;
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    /**
-      The `partial` helper renders another template without
-      changing the template context:
-
-      ```handlebars
-      {{foo}}
-      {{partial "nav"}}
-      ```
-
-      The above example template will render a template named
-      "_nav", which has the same context as the parent template
-      it's rendered into, so if the "_nav" template also referenced
-      `{{foo}}`, it would print the same thing as the `{{foo}}`
-      in the above example.
-
-      If a "_nav" template isn't found, the `partial` helper will
-      fall back to a template named "nav".
-
-      ## Bound template names
-
-      The parameter supplied to `partial` can also be a path
-      to a property containing a template name, e.g.:
-
-      ```handlebars
-      {{partial someTemplateName}}
-      ```
-
-      The above example will look up the value of `someTemplateName`
-      on the template context (e.g. a controller) and use that
-      value as the name of the template to render. If the resolved
-      value is falsy, nothing will be rendered. If `someTemplateName`
-      changes, the partial will be re-rendered using the new template
-      name.
-
-      ## Setting the partial's context with `with`
-
-      The `partial` helper can be used in conjunction with the `with`
-      helper to set a context that will be used by the partial:
-
-      ```handlebars
-      {{#with currentUser}}
-        {{partial "user_info"}}
-      {{/with}}
-      ```
-
-      @method partial
-      @for Ember.Handlebars.helpers
-      @param {String} partialName the name of the template to render minus the leading underscore
-    */
-
-    function partialHelper(name, options) {
-
-      var context = (options.contexts && options.contexts.length) ? options.contexts[0] : this;
-
-      if (options.types[0] === "ID") {
-        // Helper was passed a property path; we need to
-        // create a binding that will re-render whenever
-        // this property changes.
-        options.fn = function(context, fnOptions) {
-          var partialName = handlebarsGet(context, name, fnOptions);
-          renderPartial(context, partialName, fnOptions);
-        };
-
-        return bind.call(context, name, options, true, exists);
-      } else {
-        // Render the partial right into parent template.
-        renderPartial(context, name, options);
-      }
-    }
-
-    function exists(value) {
-      return !isNone(value);
-    }
-
-    function renderPartial(context, name, options) {
-      var nameParts = name.split("/"),
-          lastPart = nameParts[nameParts.length - 1];
-
-      nameParts[nameParts.length - 1] = "_" + lastPart;
-
-      var view = options.data.view,
-          underscoredName = nameParts.join("/"),
-          template = view.templateForName(underscoredName),
-          deprecatedTemplate = !template && view.templateForName(name);
-
-      Ember.assert("Unable to find partial with name '"+name+"'.", template || deprecatedTemplate);
-
-      template = template || deprecatedTemplate;
-
-      template(context, { data: options.data });
-    }
-
-    __exports__["default"] = partialHelper;
-  });
-define("ember-handlebars/helpers/shared", 
-  ["ember-handlebars/ext","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var handlebarsGet = __dependency1__.handlebarsGet;
-
-    function resolvePaths(options) {
-      var ret = [],
-          contexts = options.contexts,
-          roots = options.roots,
-          data = options.data;
-
-      for (var i=0, l=contexts.length; i<l; i++) {
-        ret.push( handlebarsGet(roots[i], contexts[i], { data: data }) );
-      }
-
-      return ret;
-    }
-
-    __exports__["default"] = resolvePaths;
-  });
-define("ember-handlebars/helpers/template", 
-  ["ember-metal/core","ember-handlebars-compiler","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // var emberDeprecate = Ember.deprecate;
-
-    var EmberHandlebars = __dependency2__["default"];
-    var helpers = EmberHandlebars.helpers;
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    /**
-      `template` allows you to render a template from inside another template.
-      This allows you to re-use the same template in multiple places. For example:
-
-      ```html
-      <script type="text/x-handlebars" data-template-name="logged_in_user">
-        {{#with loggedInUser}}
-          Last Login: {{lastLogin}}
-          User Info: {{template "user_info"}}
-        {{/with}}
-      </script>
-      ```
-
-      ```html
-      <script type="text/x-handlebars" data-template-name="user_info">
-        Name: <em>{{name}}</em>
-        Karma: <em>{{karma}}</em>
-      </script>
-      ```
-
-      ```handlebars
-      {{#if isUser}}
-        {{template "user_info"}}
-      {{else}}
-        {{template "unlogged_user_info"}}
-      {{/if}}
-      ```
-
-      This helper looks for templates in the global `Ember.TEMPLATES` hash. If you
-      add `<script>` tags to your page with the `data-template-name` attribute set,
-      they will be compiled and placed in this hash automatically.
-
-      You can also manually register templates by adding them to the hash:
-
-      ```javascript
-      Ember.TEMPLATES["my_cool_template"] = Ember.Handlebars.compile('<b>{{user}}</b>');
-      ```
-
-      @deprecated
-      @method template
-      @for Ember.Handlebars.helpers
-      @param {String} templateName the template to render
-    */
-    function templateHelper(name, options) {
-      Ember.deprecate("The `template` helper has been deprecated in favor of the `partial` helper. Please use `partial` instead, which will work the same way.");
-      return helpers.partial.apply(this, arguments);
-    }
-
-    __exports__["default"] = templateHelper;
-  });
-define("ember-handlebars/helpers/unbound", 
-  ["ember-handlebars-compiler","ember-handlebars/ext","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    /*globals Handlebars */
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var EmberHandlebars = __dependency1__["default"];
-    var helpers = EmberHandlebars.helpers;
-
-    var handlebarsGet = __dependency2__.handlebarsGet;
-
-    var slice = [].slice;
-
-    /**
-      `unbound` allows you to output a property without binding. *Important:* The
-      output will not be updated if the property changes. Use with caution.
-
-      ```handlebars
-      <div>{{unbound somePropertyThatDoesntChange}}</div>
-      ```
-
-      `unbound` can also be used in conjunction with a bound helper to
-      render it in its unbound form:
-
-      ```handlebars
-      <div>{{unbound helperName somePropertyThatDoesntChange}}</div>
-      ```
-
-      @method unbound
-      @for Ember.Handlebars.helpers
-      @param {String} property
-      @return {String} HTML string
-    */
-    function unboundHelper(property, fn) {
-      var options = arguments[arguments.length - 1], helper, context, out, ctx;
-
-      ctx = this || window;
-      if (arguments.length > 2) {
-        // Unbound helper call.
-        options.data.isUnbound = true;
-        helper = helpers[arguments[0]] || helpers.helperMissing;
-        out = helper.apply(ctx, slice.call(arguments, 1));
-        delete options.data.isUnbound;
-        return out;
-      }
-
-      context = (fn.contexts && fn.contexts.length) ? fn.contexts[0] : ctx;
-      return handlebarsGet(context, property, fn);
-    }
-
-    __exports__["default"] = unboundHelper;
-  });
-define("ember-handlebars/helpers/view", 
-  ["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-views/system/jquery","ember-views/views/view","ember-metal/binding","ember-handlebars/ext","ember-runtime/system/string","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
-    "use strict";
-    /*globals Handlebars */
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.warn, Ember.assert
-    // var emberWarn = Ember.warn, emberAssert = Ember.assert;
-
-    var EmberObject = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var IS_BINDING = __dependency5__.IS_BINDING;
-    var jQuery = __dependency6__["default"];
-    var View = __dependency7__.View;
-    var isGlobalPath = __dependency8__.isGlobalPath;
-    var normalizePath = __dependency9__.normalizePath;
-    var handlebarsGet = __dependency9__.handlebarsGet;
-    var EmberString = __dependency10__["default"];
-
-
-    var LOWERCASE_A_Z = /^[a-z]/,
-        VIEW_PREFIX = /^view\./;
-
-    function makeBindings(thisContext, options) {
-      var hash = options.hash,
-          hashType = options.hashTypes;
-
-      for (var prop in hash) {
-        if (hashType[prop] === 'ID') {
-
-          var value = hash[prop];
-
-          if (IS_BINDING.test(prop)) {
-            Ember.warn("You're attempting to render a view by passing " + prop + "=" + value + " to a view helper, but this syntax is ambiguous. You should either surround " + value + " in quotes or remove `Binding` from " + prop + ".");
-          } else {
-            hash[prop + 'Binding'] = value;
-            hashType[prop + 'Binding'] = 'STRING';
-            delete hash[prop];
-            delete hashType[prop];
-          }
-        }
-      }
-
-      if (hash.hasOwnProperty('idBinding')) {
-        // id can't be bound, so just perform one-time lookup.
-        hash.id = handlebarsGet(thisContext, hash.idBinding, options);
-        hashType.id = 'STRING';
-        delete hash.idBinding;
-        delete hashType.idBinding;
-      }
-    }
-
-    var ViewHelper = EmberObject.create({
-
-      propertiesFromHTMLOptions: function(options) {
-        var hash = options.hash, data = options.data;
-        var extensions = {},
-            classes = hash['class'],
-            dup = false;
-
-        if (hash.id) {
-          extensions.elementId = hash.id;
-          dup = true;
-        }
-
-        if (hash.tag) {
-          extensions.tagName = hash.tag;
-          dup = true;
-        }
-
-        if (classes) {
-          classes = classes.split(' ');
-          extensions.classNames = classes;
-          dup = true;
-        }
-
-        if (hash.classBinding) {
-          extensions.classNameBindings = hash.classBinding.split(' ');
-          dup = true;
-        }
-
-        if (hash.classNameBindings) {
-          if (extensions.classNameBindings === undefined) extensions.classNameBindings = [];
-          extensions.classNameBindings = extensions.classNameBindings.concat(hash.classNameBindings.split(' '));
-          dup = true;
-        }
-
-        if (hash.attributeBindings) {
-          Ember.assert("Setting 'attributeBindings' via Handlebars is not allowed. Please subclass Ember.View and set it there instead.");
-          extensions.attributeBindings = null;
-          dup = true;
-        }
-
-        if (dup) {
-          hash = jQuery.extend({}, hash);
-          delete hash.id;
-          delete hash.tag;
-          delete hash['class'];
-          delete hash.classBinding;
-        }
-
-        // Set the proper context for all bindings passed to the helper. This applies to regular attribute bindings
-        // as well as class name bindings. If the bindings are local, make them relative to the current context
-        // instead of the view.
-        var path;
-
-        // Evaluate the context of regular attribute bindings:
-        for (var prop in hash) {
-          if (!hash.hasOwnProperty(prop)) { continue; }
-
-          // Test if the property ends in "Binding"
-          if (IS_BINDING.test(prop) && typeof hash[prop] === 'string') {
-            path = this.contextualizeBindingPath(hash[prop], data);
-            if (path) { hash[prop] = path; }
-          }
-        }
-
-        // Evaluate the context of class name bindings:
-        if (extensions.classNameBindings) {
-          for (var b in extensions.classNameBindings) {
-            var full = extensions.classNameBindings[b];
-            if (typeof full === 'string') {
-              // Contextualize the path of classNameBinding so this:
-              //
-              //     classNameBinding="isGreen:green"
-              //
-              // is converted to this:
-              //
-              //     classNameBinding="_parentView.context.isGreen:green"
-              var parsedPath = View._parsePropertyPath(full);
-              path = this.contextualizeBindingPath(parsedPath.path, data);
-              if (path) { extensions.classNameBindings[b] = path + parsedPath.classNames; }
-            }
-          }
-        }
-
-        return jQuery.extend(hash, extensions);
-      },
-
-      // Transform bindings from the current context to a context that can be evaluated within the view.
-      // Returns null if the path shouldn't be changed.
-      //
-      // TODO: consider the addition of a prefix that would allow this method to return `path`.
-      contextualizeBindingPath: function(path, data) {
-        var normalized = normalizePath(null, path, data);
-        if (normalized.isKeyword) {
-          return 'templateData.keywords.' + path;
-        } else if (isGlobalPath(path)) {
-          return null;
-        } else if (path === 'this' || path === '') {
-          return '_parentView.context';
-        } else {
-          return '_parentView.context.' + path;
-        }
-      },
-
-      helper: function(thisContext, path, options) {
-        var data = options.data,
-            fn = options.fn,
-            newView;
-
-        makeBindings(thisContext, options);
-
-        if ('string' === typeof path) {
-
-          // TODO: this is a lame conditional, this should likely change
-          // but something along these lines will likely need to be added
-          // as deprecation warnings
-          //
-          if (options.types[0] === 'STRING' && LOWERCASE_A_Z.test(path) && !VIEW_PREFIX.test(path)) {
-            Ember.assert("View requires a container", !!data.view.container);
-            newView = data.view.container.lookupFactory('view:' + path);
-          } else {
-            newView = handlebarsGet(thisContext, path, options);
-          }
-
-          Ember.assert("Unable to find view at path '" + path + "'", !!newView);
-        } else {
-          newView = path;
-        }
-
-        Ember.assert(EmberString.fmt('You must pass a view to the #view helper, not %@ (%@)', [path, newView]), View.detect(newView) || View.detectInstance(newView));
-
-        var viewOptions = this.propertiesFromHTMLOptions(options, thisContext);
-        var currentView = data.view;
-        viewOptions.templateData = data;
-        var newViewProto = newView.proto ? newView.proto() : newView;
-
-        if (fn) {
-          Ember.assert("You cannot provide a template block if you also specified a templateName", !get(viewOptions, 'templateName') && !get(newViewProto, 'templateName'));
-          viewOptions.template = fn;
-        }
-
-        // We only want to override the `_context` computed property if there is
-        // no specified controller. See View#_context for more information.
-        if (!newViewProto.controller && !newViewProto.controllerBinding && !viewOptions.controller && !viewOptions.controllerBinding) {
-          viewOptions._context = thisContext;
-        }
-
-        currentView.appendChild(newView, viewOptions);
-      }
-    });
-
-    /**
-      `{{view}}` inserts a new instance of `Ember.View` into a template passing its
-      options to the `Ember.View`'s `create` method and using the supplied block as
-      the view's own template.
-
-      An empty `<body>` and the following template:
-
-      ```handlebars
-      A span:
-      {{#view tagName="span"}}
-        hello.
-      {{/view}}
-      ```
-
-      Will result in HTML structure:
-
-      ```html
-      <body>
-        <!-- Note: the handlebars template script
-             also results in a rendered Ember.View
-             which is the outer <div> here -->
-
-        <div class="ember-view">
-          A span:
-          <span id="ember1" class="ember-view">
-            Hello.
-          </span>
-        </div>
-      </body>
-      ```
-
-      ### `parentView` setting
-
-      The `parentView` property of the new `Ember.View` instance created through
-      `{{view}}` will be set to the `Ember.View` instance of the template where
-      `{{view}}` was called.
-
-      ```javascript
-      aView = Ember.View.create({
-        template: Ember.Handlebars.compile("{{#view}} my parent: {{parentView.elementId}} {{/view}}")
-      });
-
-      aView.appendTo('body');
-      ```
-
-      Will result in HTML structure:
-
-      ```html
-      <div id="ember1" class="ember-view">
-        <div id="ember2" class="ember-view">
-          my parent: ember1
-        </div>
-      </div>
-      ```
-
-      ### Setting CSS id and class attributes
-
-      The HTML `id` attribute can be set on the `{{view}}`'s resulting element with
-      the `id` option. This option will _not_ be passed to `Ember.View.create`.
-
-      ```handlebars
-      {{#view tagName="span" id="a-custom-id"}}
-        hello.
-      {{/view}}
-      ```
-
-      Results in the following HTML structure:
-
-      ```html
-      <div class="ember-view">
-        <span id="a-custom-id" class="ember-view">
-          hello.
-        </span>
-      </div>
-      ```
-
-      The HTML `class` attribute can be set on the `{{view}}`'s resulting element
-      with the `class` or `classNameBindings` options. The `class` option will
-      directly set the CSS `class` attribute and will not be passed to
-      `Ember.View.create`. `classNameBindings` will be passed to `create` and use
-      `Ember.View`'s class name binding functionality:
-
-      ```handlebars
-      {{#view tagName="span" class="a-custom-class"}}
-        hello.
-      {{/view}}
-      ```
-
-      Results in the following HTML structure:
-
-      ```html
-      <div class="ember-view">
-        <span id="ember2" class="ember-view a-custom-class">
-          hello.
-        </span>
-      </div>
-      ```
-
-      ### Supplying a different view class
-
-      `{{view}}` can take an optional first argument before its supplied options to
-      specify a path to a custom view class.
-
-      ```handlebars
-      {{#view "MyApp.CustomView"}}
-        hello.
-      {{/view}}
-      ```
-
-      The first argument can also be a relative path accessible from the current
-      context.
-
-      ```javascript
-      MyApp = Ember.Application.create({});
-      MyApp.OuterView = Ember.View.extend({
-        innerViewClass: Ember.View.extend({
-          classNames: ['a-custom-view-class-as-property']
-        }),
-        template: Ember.Handlebars.compile('{{#view "view.innerViewClass"}} hi {{/view}}')
-      });
-
-      MyApp.OuterView.create().appendTo('body');
-      ```
-
-      Will result in the following HTML:
-
-      ```html
-      <div id="ember1" class="ember-view">
-        <div id="ember2" class="ember-view a-custom-view-class-as-property">
-          hi
-        </div>
-      </div>
-      ```
-
-      ### Blockless use
-
-      If you supply a custom `Ember.View` subclass that specifies its own template
-      or provide a `templateName` option to `{{view}}` it can be used without
-      supplying a block. Attempts to use both a `templateName` option and supply a
-      block will throw an error.
-
-      ```handlebars
-      {{view "MyApp.ViewWithATemplateDefined"}}
-      ```
-
-      ### `viewName` property
-
-      You can supply a `viewName` option to `{{view}}`. The `Ember.View` instance
-      will be referenced as a property of its parent view by this name.
-
-      ```javascript
-      aView = Ember.View.create({
-        template: Ember.Handlebars.compile('{{#view viewName="aChildByName"}} hi {{/view}}')
-      });
-
-      aView.appendTo('body');
-      aView.get('aChildByName') // the instance of Ember.View created by {{view}} helper
-      ```
-
-      @method view
-      @for Ember.Handlebars.helpers
-      @param {String} path
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function viewHelper(path, options) {
-      Ember.assert("The view helper only takes a single argument", arguments.length <= 2);
-
-      // If no path is provided, treat path param as options.
-      // ES6TODO: find a way to do this without global lookup
-      if (path && path.data && path.data.isRenderData) {
-        options = path;
-        path = "Ember.View";
-      }
-
-      return ViewHelper.helper(this, path, options);
-    }
-
-    __exports__.ViewHelper = ViewHelper;
-    __exports__.viewHelper = viewHelper;
-  });
-define("ember-handlebars/helpers/yield", 
-  ["ember-metal/core","ember-metal/property_get","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var Ember = __dependency1__["default"];
-    // var emberAssert = Ember.assert;
-
-    var get = __dependency2__.get;
-
-    /**
-      `{{yield}}` denotes an area of a template that will be rendered inside
-      of another template. It has two main uses:
-
-      ### Use with `layout`
-      When used in a Handlebars template that is assigned to an `Ember.View`
-      instance's `layout` property Ember will render the layout template first,
-      inserting the view's own rendered output at the `{{yield}}` location.
-
-      An empty `<body>` and the following application code:
-
-      ```javascript
-      AView = Ember.View.extend({
-        classNames: ['a-view-with-layout'],
-        layout: Ember.Handlebars.compile('<div class="wrapper">{{yield}}</div>'),
-        template: Ember.Handlebars.compile('<span>I am wrapped</span>')
-      });
-
-      aView = AView.create();
-      aView.appendTo('body');
-      ```
-
-      Will result in the following HTML output:
-
-      ```html
-      <body>
-        <div class='ember-view a-view-with-layout'>
-          <div class="wrapper">
-            <span>I am wrapped</span>
-          </div>
-        </div>
-      </body>
-      ```
-
-      The `yield` helper cannot be used outside of a template assigned to an
-      `Ember.View`'s `layout` property and will throw an error if attempted.
-
-      ```javascript
-      BView = Ember.View.extend({
-        classNames: ['a-view-with-layout'],
-        template: Ember.Handlebars.compile('{{yield}}')
-      });
-
-      bView = BView.create();
-      bView.appendTo('body');
-
-      // throws
-      // Uncaught Error: assertion failed:
-      // You called yield in a template that was not a layout
-      ```
-
-      ### Use with Ember.Component
-      When designing components `{{yield}}` is used to denote where, inside the component's
-      template, an optional block passed to the component should render:
-
-      ```handlebars
-      <!-- application.hbs -->
-      {{#labeled-textfield value=someProperty}}
-        First name:
-      {{/labeled-textfield}}
-      ```
-
-      ```handlebars
-      <!-- components/labeled-textfield.hbs -->
-      <label>
-        {{yield}} {{input value=value}}
-      </label>
-      ```
-
-      Result:
-
-      ```html
-      <label>
-        First name: <input type="text" />
-      </label>
-      ```
-
-      @method yield
-      @for Ember.Handlebars.helpers
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function yieldHelper(options) {
-      var view = options.data.view;
-
-      while (view && !get(view, 'layout')) {
-        if (view._contextView) {
-          view = view._contextView;
-        } else {
-          view = get(view, 'parentView');
-        }
-      }
-
-      Ember.assert("You called yield in a template that was not a layout", !!view);
-
-      view._yield(this, options);
-    }
-
-    __exports__["default"] = yieldHelper;
-  });
-define("ember-handlebars/loader", 
-  ["ember-handlebars/component_lookup","ember-views/system/jquery","ember-metal/error","ember-runtime/system/lazy_load","ember-handlebars-compiler","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    /*globals Handlebars */
-
-    var ComponentLookup = __dependency1__["default"];
-    var jQuery = __dependency2__["default"];
-    var EmberError = __dependency3__["default"];
-    var onLoad = __dependency4__.onLoad;
-
-    var EmberHandlebars = __dependency5__["default"];
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    /**
-      Find templates stored in the head tag as script tags and make them available
-      to `Ember.CoreView` in the global `Ember.TEMPLATES` object. This will be run
-      as as jQuery DOM-ready callback.
-
-      Script tags with `text/x-handlebars` will be compiled
-      with Ember's Handlebars and are suitable for use as a view's template.
-      Those with type `text/x-raw-handlebars` will be compiled with regular
-      Handlebars and are suitable for use in views' computed properties.
-
-      @private
-      @method bootstrap
-      @for Ember.Handlebars
-      @static
-      @param ctx
-    */
-    function bootstrap(ctx) {
-      var selectors = 'script[type="text/x-handlebars"], script[type="text/x-raw-handlebars"]';
-
-      jQuery(selectors, ctx)
-        .each(function() {
-        // Get a reference to the script tag
-        var script = jQuery(this);
-
-        var compile = (script.attr('type') === 'text/x-raw-handlebars') ?
-                      jQuery.proxy(Handlebars.compile, Handlebars) :
-                      jQuery.proxy(EmberHandlebars.compile, EmberHandlebars),
-          // Get the name of the script, used by Ember.View's templateName property.
-          // First look for data-template-name attribute, then fall back to its
-          // id if no name is found.
-          templateName = script.attr('data-template-name') || script.attr('id') || 'application',
-          template = compile(script.html());
-
-        // Check if template of same name already exists
-        if (Ember.TEMPLATES[templateName] !== undefined) {
-          throw new EmberError('Template named "' + templateName  + '" already exists.');
-        }
-
-        // For templates which have a name, we save them and then remove them from the DOM
-        Ember.TEMPLATES[templateName] = template;
-
-        // Remove script tag from DOM
-        script.remove();
-      });
-    };
-
-    function _bootstrap() {
-      bootstrap( jQuery(document) );
-    }
-
-    function registerComponentLookup(container) {
-      container.register('component-lookup:main', ComponentLookup);
-    }
-
-    /*
-      We tie this to application.load to ensure that we've at least
-      attempted to bootstrap at the point that the application is loaded.
-
-      We also tie this to document ready since we're guaranteed that all
-      the inline templates are present at this point.
-
-      There's no harm to running this twice, since we remove the templates
-      from the DOM after processing.
-    */
-
-    onLoad('Ember.Application', function(Application) {
-      Application.initializer({
-        name: 'domTemplates',
-        initialize: _bootstrap
-      });
-
-      Application.initializer({
-        name: 'registerComponentLookup',
-        after: 'domTemplates',
-        initialize: registerComponentLookup
-      });
-    });
-
-    __exports__["default"] = bootstrap;
-  });
-define("ember-handlebars", 
-  ["ember-handlebars-compiler","ember-metal/core","ember-runtime/system/lazy_load","ember-handlebars/loader","ember-handlebars/ext","ember-handlebars/string","ember-handlebars/helpers/shared","ember-handlebars/helpers/binding","ember-handlebars/helpers/collection","ember-handlebars/helpers/view","ember-handlebars/helpers/unbound","ember-handlebars/helpers/debug","ember-handlebars/helpers/each","ember-handlebars/helpers/template","ember-handlebars/helpers/partial","ember-handlebars/helpers/yield","ember-handlebars/helpers/loc","ember-handlebars/controls/checkbox","ember-handlebars/controls/select","ember-handlebars/controls/text_area","ember-handlebars/controls/text_field","ember-handlebars/controls/text_support","ember-handlebars/controls","ember-handlebars/component_lookup","ember-handlebars/views/handlebars_bound_view","ember-handlebars/views/metamorph_view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __exports__) {
-    "use strict";
-    var EmberHandlebars = __dependency1__["default"];
-    var Ember = __dependency2__["default"];
-    // to add to globals
-
-    var runLoadHooks = __dependency3__.runLoadHooks;
-    var bootstrap = __dependency4__["default"];
-
-    var normalizePath = __dependency5__.normalizePath;
-    var template = __dependency5__.template;
-    var makeBoundHelper = __dependency5__.makeBoundHelper;
-    var registerBoundHelper = __dependency5__.registerBoundHelper;
-    var resolveHash = __dependency5__.resolveHash;
-    var resolveParams = __dependency5__.resolveParams;
-    var getEscaped = __dependency5__.getEscaped;
-    var handlebarsGet = __dependency5__.handlebarsGet;
-    var evaluateUnboundHelper = __dependency5__.evaluateUnboundHelper;
-    var helperMissingHelper = __dependency5__.helperMissingHelper;
-    var blockHelperMissingHelper = __dependency5__.blockHelperMissingHelper;
-
-
-    // side effect of extending StringUtils of htmlSafe
-
-    var resolvePaths = __dependency7__["default"];
-    var bind = __dependency8__.bind;
-    var _triageMustacheHelper = __dependency8__._triageMustacheHelper;
-    var resolveHelper = __dependency8__.resolveHelper;
-    var bindHelper = __dependency8__.bindHelper;
-    var boundIfHelper = __dependency8__.boundIfHelper;
-    var unboundIfHelper = __dependency8__.unboundIfHelper;
-    var withHelper = __dependency8__.withHelper;
-    var ifHelper = __dependency8__.ifHelper;
-    var unlessHelper = __dependency8__.unlessHelper;
-    var bindAttrHelper = __dependency8__.bindAttrHelper;
-    var bindAttrHelperDeprecated = __dependency8__.bindAttrHelperDeprecated;
-    var bindClasses = __dependency8__.bindClasses;
-
-    var collectionHelper = __dependency9__["default"];
-    var ViewHelper = __dependency10__.ViewHelper;
-    var viewHelper = __dependency10__.viewHelper;
-    var unboundHelper = __dependency11__["default"];
-    var logHelper = __dependency12__.logHelper;
-    var debuggerHelper = __dependency12__.debuggerHelper;
-    var EachView = __dependency13__.EachView;
-    var GroupedEach = __dependency13__.GroupedEach;
-    var eachHelper = __dependency13__.eachHelper;
-
-    var templateHelper = __dependency14__["default"];
-    var partialHelper = __dependency15__["default"];
-    var yieldHelper = __dependency16__["default"];
-    var locHelper = __dependency17__["default"];
-
-
-    var Checkbox = __dependency18__["default"];
-    var Select = __dependency19__.Select;
-    var SelectOption = __dependency19__.SelectOption;
-    var SelectOptgroup = __dependency19__.SelectOptgroup;
-    var TextArea = __dependency20__["default"];
-    var TextField = __dependency21__["default"];
-    var TextSupport = __dependency22__["default"];
-    var TextSupport = __dependency22__["default"];
-    var inputHelper = __dependency23__.inputHelper;
-    var textareaHelper = __dependency23__.textareaHelper;var ComponentLookup = __dependency24__["default"];
-    var _HandlebarsBoundView = __dependency25__._HandlebarsBoundView;
-    var SimpleHandlebarsView = __dependency25__.SimpleHandlebarsView;
-    var _SimpleMetamorphView = __dependency26__._SimpleMetamorphView;
-    var _MetamorphView = __dependency26__._MetamorphView;
-    var _Metamorph = __dependency26__._Metamorph;
-
-    /**
-    Ember Handlebars
-
-    @module ember
-    @submodule ember-handlebars
-    @requires ember-views
-    */
-
-    // Ember.Handlebars.Globals
-    EmberHandlebars.bootstrap = bootstrap;
-    EmberHandlebars.template = template;
-    EmberHandlebars.makeBoundHelper = makeBoundHelper;
-    EmberHandlebars.registerBoundHelper = registerBoundHelper;
-    EmberHandlebars.resolveHash = resolveHash;
-    EmberHandlebars.resolveParams = resolveParams;
-    EmberHandlebars.resolveHelper = resolveHelper;
-    EmberHandlebars.get = handlebarsGet;
-    EmberHandlebars.getEscaped = getEscaped;
-    EmberHandlebars.evaluateUnboundHelper = evaluateUnboundHelper;
-    EmberHandlebars.bind = bind;
-    EmberHandlebars.bindClasses = bindClasses;
-    EmberHandlebars.EachView = EachView;
-    EmberHandlebars.GroupedEach = GroupedEach;
-    EmberHandlebars.resolvePaths = resolvePaths;
-    EmberHandlebars.ViewHelper = ViewHelper;
-    EmberHandlebars.normalizePath = normalizePath;
-
-
-    // Ember Globals
-    Ember.Handlebars = EmberHandlebars;
-    Ember.ComponentLookup = ComponentLookup;
-    Ember._SimpleHandlebarsView = SimpleHandlebarsView;
-    Ember._HandlebarsBoundView = _HandlebarsBoundView;
-    Ember._SimpleMetamorphView = _SimpleMetamorphView;
-    Ember._MetamorphView = _MetamorphView;
-    Ember._Metamorph = _Metamorph;
-    Ember.TextSupport = TextSupport;
-    Ember.Checkbox = Checkbox;
-    Ember.Select = Select;
-    Ember.SelectOption = SelectOption;
-    Ember.SelectOptgroup = SelectOptgroup;
-    Ember.TextArea = TextArea;
-    Ember.TextField = TextField;
-    Ember.TextSupport = TextSupport;
-
-    // register helpers
-    EmberHandlebars.registerHelper('helperMissing', helperMissingHelper);
-    EmberHandlebars.registerHelper('blockHelperMissing', blockHelperMissingHelper);
-    EmberHandlebars.registerHelper('bind', bindHelper);
-    EmberHandlebars.registerHelper('boundIf', boundIfHelper);
-    EmberHandlebars.registerHelper('_triageMustache', _triageMustacheHelper);
-    EmberHandlebars.registerHelper('unboundIf', unboundIfHelper);
-    EmberHandlebars.registerHelper('with', withHelper);
-    EmberHandlebars.registerHelper('if', ifHelper);
-    EmberHandlebars.registerHelper('unless', unlessHelper);
-    EmberHandlebars.registerHelper('bind-attr', bindAttrHelper);
-    EmberHandlebars.registerHelper('bindAttr', bindAttrHelperDeprecated);
-    EmberHandlebars.registerHelper('collection', collectionHelper);
-    EmberHandlebars.registerHelper("log", logHelper);
-    EmberHandlebars.registerHelper("debugger", debuggerHelper);
-    EmberHandlebars.registerHelper("each", eachHelper);
-    EmberHandlebars.registerHelper("loc", locHelper);
-    EmberHandlebars.registerHelper("partial", partialHelper);
-    EmberHandlebars.registerHelper("template", templateHelper);
-    EmberHandlebars.registerHelper("yield", yieldHelper);
-    EmberHandlebars.registerHelper("view", viewHelper);
-    EmberHandlebars.registerHelper("unbound", unboundHelper);
-    EmberHandlebars.registerHelper("input", inputHelper);
-    EmberHandlebars.registerHelper("textarea", textareaHelper);
-
-    // run load hooks
-    runLoadHooks('Ember.Handlebars', EmberHandlebars);
-
-    __exports__["default"] = EmberHandlebars;
-  });
-define("ember-handlebars/string", 
-  ["ember-runtime/system/string","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    // required so we can extend this object.
-    var EmberStringUtils = __dependency1__["default"];
-
-    /**
-      Mark a string as safe for unescaped output with Handlebars. If you
-      return HTML from a Handlebars helper, use this function to
-      ensure Handlebars does not escape the HTML.
-
-      ```javascript
-      Ember.String.htmlSafe('<div>someString</div>')
-      ```
-
-      @method htmlSafe
-      @for Ember.String
-      @static
-      @return {Handlebars.SafeString} a string that will not be html escaped by Handlebars
-    */
-    function htmlSafe(str) {
-      return new Handlebars.SafeString(str);
-    };
-
-    EmberStringUtils.htmlSafe = htmlSafe;
-    if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
-
-      /**
-        Mark a string as being safe for unescaped output with Handlebars.
-
-        ```javascript
-        '<div>someString</div>'.htmlSafe()
-        ```
-
-        See [Ember.String.htmlSafe](/api/classes/Ember.String.html#method_htmlSafe).
-
-        @method htmlSafe
-        @for String
-        @return {Handlebars.SafeString} a string that will not be html escaped by Handlebars
-      */
-      String.prototype.htmlSafe = function() {
-        return htmlSafe(this);
-      };
-    }
-
-    __exports__["default"] = htmlSafe;
-  });
-define("ember-handlebars/views/handlebars_bound_view", 
-  ["ember-handlebars-compiler","ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-views/views/view","ember-views/views/states","ember-handlebars/views/metamorph_view","ember-handlebars/ext","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
-    "use strict";
-    /*globals Handlebars */
-    /*jshint newcap:false*/
-
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var EmberHandlebars = __dependency1__["default"];
-    // EmberHandlebars.SafeString;
-    var SafeString = EmberHandlebars.SafeString;
-
-    var Ember = __dependency2__["default"];
-    // Ember.K
-    var K = Ember.K
-
-    var Metamorph = requireModule('metamorph');
-
-    var EmberError = __dependency3__["default"];
-    var get = __dependency4__.get;
-    var set = __dependency5__.set;
-    var merge = __dependency6__["default"];
-    var run = __dependency7__["default"];
-    var View = __dependency8__.View;
-    var cloneStates = __dependency9__.cloneStates;
-    var states = __dependency9__.states;
-    var viewStates = states;
-
-    var _MetamorphView = __dependency10__._MetamorphView;
-    var handlebarsGet = __dependency11__.handlebarsGet;
-
-    function SimpleHandlebarsView(path, pathRoot, isEscaped, templateData) {
-      this.path = path;
-      this.pathRoot = pathRoot;
-      this.isEscaped = isEscaped;
-      this.templateData = templateData;
-
-      this.morph = Metamorph();
-      this.state = 'preRender';
-      this.updateId = null;
-      this._parentView = null;
-      this.buffer = null;
-    }
-
-    SimpleHandlebarsView.prototype = {
-      isVirtual: true,
-      isView: true,
-
-      destroy: function () {
-        if (this.updateId) {
-          run.cancel(this.updateId);
-          this.updateId = null;
-        }
-        if (this._parentView) {
-          this._parentView.removeChild(this);
-        }
-        this.morph = null;
-        this.state = 'destroyed';
-      },
-
-      propertyWillChange: K,
-
-      propertyDidChange: K,
-
-      normalizedValue: function() {
-        var path = this.path,
-            pathRoot = this.pathRoot,
-            result, templateData;
-
-        // Use the pathRoot as the result if no path is provided. This
-        // happens if the path is `this`, which gets normalized into
-        // a `pathRoot` of the current Handlebars context and a path
-        // of `''`.
-        if (path === '') {
-          result = pathRoot;
-        } else {
-          templateData = this.templateData;
-          result = handlebarsGet(pathRoot, path, { data: templateData });
-        }
-
-        return result;
-      },
-
-      renderToBuffer: function(buffer) {
-        var string = '';
-
-        string += this.morph.startTag();
-        string += this.render();
-        string += this.morph.endTag();
-
-        buffer.push(string);
-      },
-
-      render: function() {
-        // If not invoked via a triple-mustache ({{{foo}}}), escape
-        // the content of the template.
-        var escape = this.isEscaped;
-        var result = this.normalizedValue();
-
-        if (result === null || result === undefined) {
-          result = "";
-        } else if (!(result instanceof SafeString)) {
-          result = String(result);
-        }
-
-        if (escape) { result = Handlebars.Utils.escapeExpression(result); }
-        return result;
-      },
-
-      rerender: function() {
-        switch(this.state) {
-          case 'preRender':
-          case 'destroyed':
-            break;
-          case 'inBuffer':
-            throw new EmberError("Something you did tried to replace an {{expression}} before it was inserted into the DOM.");
-          case 'hasElement':
-          case 'inDOM':
-            this.updateId = run.scheduleOnce('render', this, 'update');
-            break;
-        }
-
-        return this;
-      },
-
-      update: function () {
-        this.updateId = null;
-        this.morph.html(this.render());
-      },
-
-      transitionTo: function(state) {
-        this.state = state;
-      }
-    };
-
-    var states = cloneStates(viewStates);
-
-    merge(states._default, {
-      rerenderIfNeeded: K
-    });
-
-    merge(states.inDOM, {
-      rerenderIfNeeded: function(view) {
-        if (view.normalizedValue() !== view._lastNormalizedValue) {
-          view.rerender();
-        }
-      }
-    });
-
-    /**
-      `Ember._HandlebarsBoundView` is a private view created by the Handlebars
-      `{{bind}}` helpers that is used to keep track of bound properties.
-
-      Every time a property is bound using a `{{mustache}}`, an anonymous subclass
-      of `Ember._HandlebarsBoundView` is created with the appropriate sub-template
-      and context set up. When the associated property changes, just the template
-      for this view will re-render.
-
-      @class _HandlebarsBoundView
-      @namespace Ember
-      @extends Ember._MetamorphView
-      @private
-    */
-    var _HandlebarsBoundView = _MetamorphView.extend({
-      instrumentName: 'boundHandlebars',
-      states: states,
-
-      /**
-        The function used to determine if the `displayTemplate` or
-        `inverseTemplate` should be rendered. This should be a function that takes
-        a value and returns a Boolean.
-
-        @property shouldDisplayFunc
-        @type Function
-        @default null
-      */
-      shouldDisplayFunc: null,
-
-      /**
-        Whether the template rendered by this view gets passed the context object
-        of its parent template, or gets passed the value of retrieving `path`
-        from the `pathRoot`.
-
-        For example, this is true when using the `{{#if}}` helper, because the
-        template inside the helper should look up properties relative to the same
-        object as outside the block. This would be `false` when used with `{{#with
-        foo}}` because the template should receive the object found by evaluating
-        `foo`.
-
-        @property preserveContext
-        @type Boolean
-        @default false
-      */
-      preserveContext: false,
-
-      /**
-        If `preserveContext` is true, this is the object that will be used
-        to render the template.
-
-        @property previousContext
-        @type Object
-      */
-      previousContext: null,
-
-      /**
-        The template to render when `shouldDisplayFunc` evaluates to `true`.
-
-        @property displayTemplate
-        @type Function
-        @default null
-      */
-      displayTemplate: null,
-
-      /**
-        The template to render when `shouldDisplayFunc` evaluates to `false`.
-
-        @property inverseTemplate
-        @type Function
-        @default null
-      */
-      inverseTemplate: null,
-
-
-      /**
-        The path to look up on `pathRoot` that is passed to
-        `shouldDisplayFunc` to determine which template to render.
-
-        In addition, if `preserveContext` is `false,` the object at this path will
-        be passed to the template when rendering.
-
-        @property path
-        @type String
-        @default null
-      */
-      path: null,
-
-      /**
-        The object from which the `path` will be looked up. Sometimes this is the
-        same as the `previousContext`, but in cases where this view has been
-        generated for paths that start with a keyword such as `view` or
-        `controller`, the path root will be that resolved object.
-
-        @property pathRoot
-        @type Object
-      */
-      pathRoot: null,
-
-      normalizedValue: function() {
-        var path = get(this, 'path'),
-            pathRoot  = get(this, 'pathRoot'),
-            valueNormalizer = get(this, 'valueNormalizerFunc'),
-            result, templateData;
-
-        // Use the pathRoot as the result if no path is provided. This
-        // happens if the path is `this`, which gets normalized into
-        // a `pathRoot` of the current Handlebars context and a path
-        // of `''`.
-        if (path === '') {
-          result = pathRoot;
-        } else {
-          templateData = get(this, 'templateData');
-          result = handlebarsGet(pathRoot, path, { data: templateData });
-        }
-
-        return valueNormalizer ? valueNormalizer(result) : result;
-      },
-
-      rerenderIfNeeded: function() {
-        this.currentState.rerenderIfNeeded(this);
-      },
-
-      /**
-        Determines which template to invoke, sets up the correct state based on
-        that logic, then invokes the default `Ember.View` `render` implementation.
-
-        This method will first look up the `path` key on `pathRoot`,
-        then pass that value to the `shouldDisplayFunc` function. If that returns
-        `true,` the `displayTemplate` function will be rendered to DOM. Otherwise,
-        `inverseTemplate`, if specified, will be rendered.
-
-        For example, if this `Ember._HandlebarsBoundView` represented the `{{#with
-        foo}}` helper, it would look up the `foo` property of its context, and
-        `shouldDisplayFunc` would always return true. The object found by looking
-        up `foo` would be passed to `displayTemplate`.
-
-        @method render
-        @param {Ember.RenderBuffer} buffer
-      */
-      render: function(buffer) {
-        // If not invoked via a triple-mustache ({{{foo}}}), escape
-        // the content of the template.
-        var escape = get(this, 'isEscaped');
-
-        var shouldDisplay = get(this, 'shouldDisplayFunc'),
-            preserveContext = get(this, 'preserveContext'),
-            context = get(this, 'previousContext');
-
-        var _contextController = get(this, '_contextController');
-
-        var inverseTemplate = get(this, 'inverseTemplate'),
-            displayTemplate = get(this, 'displayTemplate');
-
-        var result = this.normalizedValue();
-        this._lastNormalizedValue = result;
-
-        // First, test the conditional to see if we should
-        // render the template or not.
-        if (shouldDisplay(result)) {
-          set(this, 'template', displayTemplate);
-
-          // If we are preserving the context (for example, if this
-          // is an #if block, call the template with the same object.
-          if (preserveContext) {
-            set(this, '_context', context);
-          } else {
-          // Otherwise, determine if this is a block bind or not.
-          // If so, pass the specified object to the template
-            if (displayTemplate) {
-              if (_contextController) {
-                set(_contextController, 'content', result);
-                result = _contextController;
-              }
-              set(this, '_context', result);
-            } else {
-            // This is not a bind block, just push the result of the
-            // expression to the render context and return.
-              if (result === null || result === undefined) {
-                result = "";
-              } else if (!(result instanceof SafeString)) {
-                result = String(result);
-              }
-
-              if (escape) { result = Handlebars.Utils.escapeExpression(result); }
-              buffer.push(result);
-              return;
-            }
-          }
-        } else if (inverseTemplate) {
-          set(this, 'template', inverseTemplate);
-
-          if (preserveContext) {
-            set(this, '_context', context);
-          } else {
-            set(this, '_context', result);
-          }
-        } else {
-          set(this, 'template', function() { return ''; });
-        }
-
-        return this._super(buffer);
-      }
-    });
-
-    __exports__._HandlebarsBoundView = _HandlebarsBoundView;
-    __exports__.SimpleHandlebarsView = SimpleHandlebarsView;
-  });
-define("ember-handlebars/views/metamorph_view", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-views/views/view","ember-metal/mixin","ember-metal/run_loop","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    /*jshint newcap:false*/
-    var Ember = __dependency1__["default"];
-    // Ember.deprecate
-    // var emberDeprecate = Ember.deprecate;
-
-    var get = __dependency2__.get;
-    var set = __dependency3__["default"];
-
-    var CoreView = __dependency4__.CoreView;
-    var View = __dependency4__.View;
-    var Mixin = __dependency5__.Mixin;
-    var run = __dependency6__["default"];
-
-    /**
-    @module ember
-    @submodule ember-handlebars
-    */
-
-    var Metamorph = requireModule('metamorph');
-
-    function notifyMutationListeners() {
-      run.once(View, 'notifyMutationListeners');
-    }
-
-    // DOMManager should just abstract dom manipulation between jquery and metamorph
-    var DOMManager = {
-      remove: function(view) {
-        view.morph.remove();
-        notifyMutationListeners();
-      },
-
-      prepend: function(view, html) {
-        view.morph.prepend(html);
-        notifyMutationListeners();
-      },
-
-      after: function(view, html) {
-        view.morph.after(html);
-        notifyMutationListeners();
-      },
-
-      html: function(view, html) {
-        view.morph.html(html);
-        notifyMutationListeners();
-      },
-
-      // This is messed up.
-      replace: function(view) {
-        var morph = view.morph;
-
-        view.transitionTo('preRender');
-
-        run.schedule('render', this, function renderMetamorphView() {
-          if (view.isDestroying) { return; }
-
-          view.clearRenderedChildren();
-          var buffer = view.renderToBuffer();
-
-          view.invokeRecursively(function(view) {
-            view.propertyWillChange('element');
-          });
-          view.triggerRecursively('willInsertElement');
-
-          morph.replaceWith(buffer.string());
-          view.transitionTo('inDOM');
-
-          view.invokeRecursively(function(view) {
-            view.propertyDidChange('element');
-          });
-          view.triggerRecursively('didInsertElement');
-
-          notifyMutationListeners();
-        });
-      },
-
-      empty: function(view) {
-        view.morph.html("");
-        notifyMutationListeners();
-      }
-    };
-
-    // The `morph` and `outerHTML` properties are internal only
-    // and not observable.
-
-    /**
-      @class _Metamorph
-      @namespace Ember
-      @private
-    */
-    var _Metamorph = Mixin.create({
-      isVirtual: true,
-      tagName: '',
-
-      instrumentName: 'metamorph',
-
-      init: function() {
-        this._super();
-        this.morph = Metamorph();
-        Ember.deprecate('Supplying a tagName to Metamorph views is unreliable and is deprecated. You may be setting the tagName on a Handlebars helper that creates a Metamorph.', !this.tagName);
-      },
-
-      beforeRender: function(buffer) {
-        buffer.push(this.morph.startTag());
-        buffer.pushOpeningTag();
-      },
-
-      afterRender: function(buffer) {
-        buffer.pushClosingTag();
-        buffer.push(this.morph.endTag());
-      },
-
-      createElement: function() {
-        var buffer = this.renderToBuffer();
-        this.outerHTML = buffer.string();
-        this.clearBuffer();
-      },
-
-      domManager: DOMManager
-    });
-
-    /**
-      @class _MetamorphView
-      @namespace Ember
-      @extends Ember.View
-      @uses Ember._Metamorph
-      @private
-    */
-    var _MetamorphView = View.extend(_Metamorph);
-
-    /**
-      @class _SimpleMetamorphView
-      @namespace Ember
-      @extends Ember.CoreView
-      @uses Ember._Metamorph
-      @private
-    */
-    var _SimpleMetamorphView = CoreView.extend(_Metamorph);
-
-    __exports__._SimpleMetamorphView = _SimpleMetamorphView;
-    __exports__._MetamorphView = _MetamorphView;
-    __exports__._Metamorph = _Metamorph;
-  });
-})();
-
-(function() {
-define("ember-routing/ext/controller", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-runtime/controllers/controller","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES, deprecate
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var EnumerableUtils = __dependency4__["default"];
-    var map = EnumerableUtils.map;
-
-    var ControllerMixin = __dependency5__.ControllerMixin;
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-
-    ControllerMixin.reopen({
-      /**
-        Transition the application into another route. The route may
-        be either a single route or route path:
-
-        ```javascript
-        aController.transitionToRoute('blogPosts');
-        aController.transitionToRoute('blogPosts.recentEntries');
-        ```
-
-        Optionally supply a model for the route in question. The model
-        will be serialized into the URL using the `serialize` hook of
-        the route:
-
-        ```javascript
-        aController.transitionToRoute('blogPost', aPost);
-        ```
-
-        If a literal is passed (such as a number or a string), it will
-        be treated as an identifier instead. In this case, the `model`
-        hook of the route will be triggered:
-
-        ```javascript
-        aController.transitionToRoute('blogPost', 1);
-        ```
-
-        Multiple models will be applied last to first recursively up the
-        resource tree.
-
-        ```javascript
-        App.Router.map(function() {
-          this.resource('blogPost', {path:':blogPostId'}, function(){
-            this.resource('blogComment', {path: ':blogCommentId'});
-          });
-        });
-
-        aController.transitionToRoute('blogComment', aPost, aComment);
-        aController.transitionToRoute('blogComment', 1, 13);
-        ```
-
-        It is also possible to pass a URL (a string that starts with a
-        `/`). This is intended for testing and debugging purposes and
-        should rarely be used in production code.
-
-        ```javascript
-        aController.transitionToRoute('/');
-        aController.transitionToRoute('/blog/post/1/comment/13');
-        ```
-
-        See also [replaceRoute](/api/classes/Ember.ControllerMixin.html#method_replaceRoute).
-
-        @param {String} name the name of the route or a URL
-        @param {...Object} models the model(s) or identifier(s) to be used
-        while transitioning to the route.
-        @for Ember.ControllerMixin
-        @method transitionToRoute
-      */
-      transitionToRoute: function() {
-        // target may be either another controller or a router
-        var target = get(this, 'target'),
-            method = target.transitionToRoute || target.transitionTo;
-        return method.apply(target, arguments);
-      },
-
-      /**
-        @deprecated
-        @for Ember.ControllerMixin
-        @method transitionTo
-      */
-      transitionTo: function() {
-        Ember.deprecate("transitionTo is deprecated. Please use transitionToRoute.");
-        return this.transitionToRoute.apply(this, arguments);
-      },
-
-      /**
-        Transition into another route while replacing the current URL, if possible.
-        This will replace the current history entry instead of adding a new one.
-        Beside that, it is identical to `transitionToRoute` in all other respects.
-
-        ```javascript
-        aController.replaceRoute('blogPosts');
-        aController.replaceRoute('blogPosts.recentEntries');
-        ```
-
-        Optionally supply a model for the route in question. The model
-        will be serialized into the URL using the `serialize` hook of
-        the route:
-
-        ```javascript
-        aController.replaceRoute('blogPost', aPost);
-        ```
-
-        If a literal is passed (such as a number or a string), it will
-        be treated as an identifier instead. In this case, the `model`
-        hook of the route will be triggered:
-
-        ```javascript
-        aController.replaceRoute('blogPost', 1);
-        ```
-
-        Multiple models will be applied last to first recursively up the
-        resource tree.
-
-        ```javascript
-        App.Router.map(function() {
-          this.resource('blogPost', {path:':blogPostId'}, function(){
-            this.resource('blogComment', {path: ':blogCommentId'});
-          });
-        });
-
-        aController.replaceRoute('blogComment', aPost, aComment);
-        aController.replaceRoute('blogComment', 1, 13);
-        ```
-
-        It is also possible to pass a URL (a string that starts with a
-        `/`). This is intended for testing and debugging purposes and
-        should rarely be used in production code.
-
-        ```javascript
-        aController.replaceRoute('/');
-        aController.replaceRoute('/blog/post/1/comment/13');
-        ```
-
-        @param {String} name the name of the route or a URL
-        @param {...Object} models the model(s) or identifier(s) to be used
-        while transitioning to the route.
-        @for Ember.ControllerMixin
-        @method replaceRoute
-      */
-      replaceRoute: function() {
-        // target may be either another controller or a router
-        var target = get(this, 'target'),
-            method = target.replaceRoute || target.replaceWith;
-        return method.apply(target, arguments);
-      },
-
-      /**
-        @deprecated
-        @for Ember.ControllerMixin
-        @method replaceWith
-      */
-      replaceWith: function() {
-        Ember.deprecate("replaceWith is deprecated. Please use replaceRoute.");
-        return this.replaceRoute.apply(this, arguments);
-      }
-    });
-
-    if (Ember.FEATURES.isEnabled("query-params-new")) {
-      ControllerMixin.reopen({
-        concatenatedProperties: ['queryParams'],
-        queryParams: null,
-        _finalizingQueryParams: false,
-        _queryParamChangesDuringSuspension: null
-      });
-    }
-
-    __exports__["default"] = ControllerMixin;
-  });
-define("ember-routing/ext/run_loop", 
-  ["ember-metal/run_loop"],
-  function(__dependency1__) {
-    "use strict";
-    var run = __dependency1__["default"];
-
-    /**
-    @module ember
-    @submodule ember-views
-    */
-
-    // Add a new named queue after the 'actions' queue (where RSVP promises
-    // resolve), which is used in router transitions to prevent unnecessary
-    // loading state entry if all context promises resolve on the 
-    // 'actions' queue first.
-
-    var queues = run.queues;
-    run._addQueue('routerTransitions', 'actions');
-  });
-define("ember-routing/ext/view", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","ember-views/views/view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var run = __dependency3__["default"];
-    var EmberView = __dependency4__.View;
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    EmberView.reopen({
-
-      /**
-        Sets the private `_outlets` object on the view.
-
-        @method init
-       */
-      init: function() {
-        set(this, '_outlets', {});
-        this._super();
-      },
-
-      /**
-        Manually fill any of a view's `{{outlet}}` areas with the
-        supplied view.
-
-        Example
-
-        ```javascript
-        var MyView = Ember.View.extend({
-          template: Ember.Handlebars.compile('Child view: {{outlet "main"}} ')
-        });
-        var myView = MyView.create();
-        myView.appendTo('body');
-        // The html for myView now looks like:
-        // <div id="ember228" class="ember-view">Child view: </div>
-
-        var FooView = Ember.View.extend({
-          template: Ember.Handlebars.compile('<h1>Foo</h1> ')
-        });
-        var fooView = FooView.create();
-        myView.connectOutlet('main', fooView);
-        // The html for myView now looks like:
-        // <div id="ember228" class="ember-view">Child view:
-        //   <div id="ember234" class="ember-view"><h1>Foo</h1> </div>
-        // </div>
-        ```
-        @method connectOutlet
-        @param  {String} outletName A unique name for the outlet
-        @param  {Object} view       An Ember.View
-       */
-      connectOutlet: function(outletName, view) {
-        if (this._pendingDisconnections) {
-          delete this._pendingDisconnections[outletName];
-        }
-
-        if (this._hasEquivalentView(outletName, view)) {
-          view.destroy();
-          return;
-        }
-
-        var outlets = get(this, '_outlets'),
-            container = get(this, 'container'),
-            router = container && container.lookup('router:main'),
-            renderedName = get(view, 'renderedName');
-
-        set(outlets, outletName, view);
-
-        if (router && renderedName) {
-          router._connectActiveView(renderedName, view);
-        }
-      },
-
-      /**
-        Determines if the view has already been created by checking if
-        the view has the same constructor, template, and context as the
-        view in the `_outlets` object.
-
-        @private
-        @method _hasEquivalentView
-        @param  {String} outletName The name of the outlet we are checking
-        @param  {Object} view       An Ember.View
-        @return {Boolean}
-       */
-      _hasEquivalentView: function(outletName, view) {
-        var existingView = get(this, '_outlets.'+outletName);
-        return existingView &&
-          existingView.constructor === view.constructor &&
-          existingView.get('template') === view.get('template') &&
-          existingView.get('context') === view.get('context');
-      },
-
-      /**
-        Removes an outlet from the view.
-
-        Example
-
-        ```javascript
-        var MyView = Ember.View.extend({
-          template: Ember.Handlebars.compile('Child view: {{outlet "main"}} ')
-        });
-        var myView = MyView.create();
-        myView.appendTo('body');
-        // myView's html:
-        // <div id="ember228" class="ember-view">Child view: </div>
-
-        var FooView = Ember.View.extend({
-          template: Ember.Handlebars.compile('<h1>Foo</h1> ')
-        });
-        var fooView = FooView.create();
-        myView.connectOutlet('main', fooView);
-        // myView's html:
-        // <div id="ember228" class="ember-view">Child view:
-        //   <div id="ember234" class="ember-view"><h1>Foo</h1> </div>
-        // </div>
-
-        myView.disconnectOutlet('main');
-        // myView's html:
-        // <div id="ember228" class="ember-view">Child view: </div>
-        ```
-
-        @method disconnectOutlet
-        @param  {String} outletName The name of the outlet to be removed
-       */
-      disconnectOutlet: function(outletName) {
-        if (!this._pendingDisconnections) {
-          this._pendingDisconnections = {};
-        }
-        this._pendingDisconnections[outletName] = true;
-        run.once(this, '_finishDisconnections');
-      },
-
-      /**
-        Gets an outlet that is pending disconnection and then
-        nullifys the object on the `_outlet` object.
-
-        @private
-        @method _finishDisconnections
-       */
-      _finishDisconnections: function() {
-        if (this.isDestroyed) return; // _outlets will be gone anyway
-        var outlets = get(this, '_outlets');
-        var pendingDisconnections = this._pendingDisconnections;
-        this._pendingDisconnections = null;
-
-        for (var outletName in pendingDisconnections) {
-          set(outlets, outletName, null);
-        }
-      }
-    });
-
-    __exports__["default"] = EmberView;
-  });
-define("ember-routing/helpers/action", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/run_loop","ember-views/system/utils","ember-handlebars","ember-routing/system/router","ember-handlebars/ext","ember-handlebars/helpers/view","ember-routing/helpers/shared","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Handlebars, uuid, FEATURES, assert, deprecate
-    var get = __dependency2__.get;
-    var forEach = __dependency3__.forEach;
-    var run = __dependency4__["default"];
-
-    var isSimpleClick = __dependency5__.isSimpleClick;
-    var EmberHandlebars = __dependency6__["default"];
-    var EmberRouter = __dependency7__["default"];
-
-
-    var EmberHandlebars = __dependency6__["default"];
-    var handlebarsGet = __dependency8__.handlebarsGet;
-    var viewHelper = __dependency9__.viewHelper;
-    var resolveParams = __dependency10__.resolveParams;
-    var resolvePath = __dependency10__.resolvePath;
-
-    // requireModule('ember-handlebars');
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    var SafeString = EmberHandlebars.SafeString,
-        a_slice = Array.prototype.slice;
-
-    function args(options, actionName) {
-      var ret = [];
-      if (actionName) { ret.push(actionName); }
-
-      var types = options.options.types.slice(1),
-          data = options.options.data;
-
-      return ret.concat(resolveParams(options.context, options.params, { types: types, data: data }));
-    }
-
-    var ActionHelper = {
-      registeredActions: {}
-    };
-
-    var keys = ["alt", "shift", "meta", "ctrl"];
-
-    var POINTER_EVENT_TYPE_REGEX = /^click|mouse|touch/;
-
-    var isAllowedEvent = function(event, allowedKeys) {
-      if (typeof allowedKeys === "undefined") {
-        if (POINTER_EVENT_TYPE_REGEX.test(event.type)) {
-          return isSimpleClick(event);
-        } else {
-          allowedKeys = '';
-        }
-      }
-
-      if (allowedKeys.indexOf("any") >= 0) {
-        return true;
-      }
-
-      var allowed = true;
-
-      forEach.call(keys, function(key) {
-        if (event[key + "Key"] && allowedKeys.indexOf(key) === -1) {
-          allowed = false;
-        }
-      });
-
-      return allowed;
-    };
-
-    ActionHelper.registerAction = function(actionNameOrPath, options, allowedKeys) {
-      var actionId = ++Ember.uuid;
-
-      ActionHelper.registeredActions[actionId] = {
-        eventName: options.eventName,
-        handler: function handleRegisteredAction(event) {
-          if (!isAllowedEvent(event, allowedKeys)) { return true; }
-
-          if (options.preventDefault !== false) {
-            event.preventDefault();
-          }
-
-          if (options.bubbles === false) {
-            event.stopPropagation();
-          }
-
-          var target = options.target,
-              actionName;
-
-          if (target.target) {
-            target = handlebarsGet(target.root, target.target, target.options);
-          } else {
-            target = target.root;
-          }
-
-          if (options.boundProperty) {
-            actionName = handlebarsGet(target, actionNameOrPath, options.options);
-
-            if(typeof actionName === 'undefined' || typeof actionName === 'function') {
-              Ember.assert("You specified a quoteless path to the {{action}} helper '" + actionNameOrPath + "' which did not resolve to an actionName. Perhaps you meant to use a quoted actionName? (e.g. {{action '" + actionNameOrPath + "'}}).", true);
-              actionName = actionNameOrPath;
-            }
-          }
-
-          if (!actionName) {
-            actionName = actionNameOrPath;
-          }
-
-          run(function runRegisteredAction() {
-            if (target.send) {
-              target.send.apply(target, args(options.parameters, actionName));
-            } else {
-              Ember.assert("The action '" + actionName + "' did not exist on " + target, typeof target[actionName] === 'function');
-              target[actionName].apply(target, args(options.parameters));
-            }
-          });
-        }
-      };
-
-      options.view.on('willClearRender', function() {
-        delete ActionHelper.registeredActions[actionId];
-      });
-
-      return actionId;
-    };
-
-    /**
-      The `{{action}}` helper registers an HTML element within a template for DOM
-      event handling and forwards that interaction to the templates's controller
-      or supplied `target` option (see 'Specifying a Target').
-
-      If the controller does not implement the event, the event is sent
-      to the current route, and it bubbles up the route hierarchy from there.
-
-      User interaction with that element will invoke the supplied action name on
-      the appropriate target. Specifying a non-quoted action name will result in
-      a bound property lookup at the time the event will be triggered.
-
-      Given the following application Handlebars template on the page
-
-      ```handlebars
-      <div {{action 'anActionName'}}>
-        click me
-      </div>
-      ```
-
-      And application code
-
-      ```javascript
-      App.ApplicationController = Ember.Controller.extend({
-        actions: {
-          anActionName: function() {
-          }
-        }
-      });
-      ```
-
-      Will result in the following rendered HTML
-
-      ```html
-      <div class="ember-view">
-        <div data-ember-action="1">
-          click me
-        </div>
-      </div>
-      ```
-
-      Clicking "click me" will trigger the `anActionName` action of the
-      `App.ApplicationController`. In this case, no additional parameters will be passed.
-
-      If you provide additional parameters to the helper:
-
-      ```handlebars
-      <button {{action 'edit' post}}>Edit</button>
-      ```
-
-      Those parameters will be passed along as arguments to the JavaScript
-      function implementing the action.
-
-      ### Event Propagation
-
-      Events triggered through the action helper will automatically have
-      `.preventDefault()` called on them. You do not need to do so in your event
-      handlers. If you need to allow event propagation (to handle file inputs for
-      example) you can supply the `preventDefault=false` option to the `{{action}}` helper:
-
-      ```handlebars
-      <div {{action "sayHello" preventDefault=false}}>
-        <input type="file" />
-        <input type="checkbox" />
-      </div>
-      ```
-
-      To disable bubbling, pass `bubbles=false` to the helper:
-
-      ```handlebars
-      <button {{action 'edit' post bubbles=false}}>Edit</button>
-      ```
-
-      If you need the default handler to trigger you should either register your
-      own event handler, or use event methods on your view class. See [Ember.View](/api/classes/Ember.View.html)
-      'Responding to Browser Events' for more information.
-
-      ### Specifying DOM event type
-
-      By default the `{{action}}` helper registers for DOM `click` events. You can
-      supply an `on` option to the helper to specify a different DOM event name:
-
-      ```handlebars
-      <div {{action "anActionName" on="doubleClick"}}>
-        click me
-      </div>
-      ```
-
-      See `Ember.View` 'Responding to Browser Events' for a list of
-      acceptable DOM event names.
-
-      NOTE: Because `{{action}}` depends on Ember's event dispatch system it will
-      only function if an `Ember.EventDispatcher` instance is available. An
-      `Ember.EventDispatcher` instance will be created when a new `Ember.Application`
-      is created. Having an instance of `Ember.Application` will satisfy this
-      requirement.
-
-      ### Specifying whitelisted modifier keys
-
-      By default the `{{action}}` helper will ignore click event with pressed modifier
-      keys. You can supply an `allowedKeys` option to specify which keys should not be ignored.
-
-      ```handlebars
-      <div {{action "anActionName" allowedKeys="alt"}}>
-        click me
-      </div>
-      ```
-
-      This way the `{{action}}` will fire when clicking with the alt key pressed down.
-
-      Alternatively, supply "any" to the `allowedKeys` option to accept any combination of modifier keys.
-
-      ```handlebars
-      <div {{action "anActionName" allowedKeys="any"}}>
-        click me with any key pressed
-      </div>
-      ```
-
-      ### Specifying a Target
-
-      There are several possible target objects for `{{action}}` helpers:
-
-      In a typical Ember application, where views are managed through use of the
-      `{{outlet}}` helper, actions will bubble to the current controller, then
-      to the current route, and then up the route hierarchy.
-
-      Alternatively, a `target` option can be provided to the helper to change
-      which object will receive the method call. This option must be a path
-      to an object, accessible in the current context:
-
-      ```handlebars
-      {{! the application template }}
-      <div {{action "anActionName" target=view}}>
-        click me
-      </div>
-      ```
-
-      ```javascript
-      App.ApplicationView = Ember.View.extend({
-        actions: {
-          anActionName: function(){}
-        }
-      });
-
-      ```
-
-      ### Additional Parameters
-
-      You may specify additional parameters to the `{{action}}` helper. These
-      parameters are passed along as the arguments to the JavaScript function
-      implementing the action.
-
-      ```handlebars
-      {{#each person in people}}
-        <div {{action "edit" person}}>
-          click me
-        </div>
-      {{/each}}
-      ```
-
-      Clicking "click me" will trigger the `edit` method on the current controller
-      with the value of `person` as a parameter.
-
-      @method action
-      @for Ember.Handlebars.helpers
-      @param {String} actionName
-      @param {Object} [context]*
-      @param {Hash} options
-    */
-    function actionHelper(actionName) {
-      var options = arguments[arguments.length - 1],
-          contexts = a_slice.call(arguments, 1, -1);
-
-      var hash = options.hash,
-          controller = options.data.keywords.controller;
-
-      // create a hash to pass along to registerAction
-      var action = {
-        eventName: hash.on || "click",
-        parameters: {
-          context: this,
-          options: options,
-          params: contexts
-        },
-        view: options.data.view,
-        bubbles: hash.bubbles,
-        preventDefault: hash.preventDefault,
-        target: { options: options },
-        boundProperty: options.types[0] === "ID"
-      };
-
-      if (hash.target) {
-        action.target.root = this;
-        action.target.target = hash.target;
-      } else if (controller) {
-        action.target.root = controller;
-      }
-
-      var actionId = ActionHelper.registerAction(actionName, action, hash.allowedKeys);
-      return new SafeString('data-ember-action="' + actionId + '"');
-    };
-
-    __exports__.ActionHelper = ActionHelper;
-    __exports__.actionHelper = actionHelper;
-  });
-define("ember-routing/helpers/link_to", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-runtime/system/lazy_load","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/keys","ember-views/system/utils","ember-views/views/view","ember-handlebars","ember-handlebars/helpers/view","ember-routing/system/router","ember-routing/helpers/shared","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES, Logger, Handlebars, warn, assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var merge = __dependency4__["default"];
-    var run = __dependency5__["default"];
-    var computed = __dependency6__.computed;
-
-    var onLoad = __dependency7__.onLoad;
-    var fmt = __dependency8__.fmt;
-    var EmberObject = __dependency9__["default"];
-    var keys = __dependency10__["default"];
-    var isSimpleClick = __dependency11__.isSimpleClick;
-    var EmberView = __dependency12__.View;
-    var EmberHandlebars = __dependency13__["default"];
-    var viewHelper = __dependency14__.viewHelper;
-    var EmberRouter = __dependency15__["default"];
-    var resolveParams = __dependency16__.resolveParams;
-    var resolvePaths = __dependency16__.resolvePaths;
-
-    // requireModule('ember-handlebars');
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    var slice = [].slice;
-
-    requireModule('ember-handlebars');
-
-    var numberOfContextsAcceptedByHandler = function(handler, handlerInfos) {
-      var req = 0;
-      for (var i = 0, l = handlerInfos.length; i < l; i++) {
-        req = req + handlerInfos[i].names.length;
-        if (handlerInfos[i].handler === handler)
-          break;
-      }
-
-      // query params adds an additional context
-      if (Ember.FEATURES.isEnabled("query-params-new")) {
-        req = req + 1;
-      }
-      return req;
-    };
-
-    var QueryParams = EmberObject.extend({
-      values: null
-    });
-
-    function computeQueryParams(linkView, stripDefaultValues) {
-      var helperParameters = linkView.parameters,
-          queryParamsObject = get(linkView, 'queryParamsObject'),
-          suppliedParams = {};
-
-      if (queryParamsObject) {
-        merge(suppliedParams, queryParamsObject.values);
-      }
-
-      var resolvedParams = get(linkView, 'resolvedParams'),
-          router = get(linkView, 'router'),
-          routeName = resolvedParams[0],
-          paramsForRoute = router._queryParamsFor(routeName),
-          qps = paramsForRoute.qps,
-          paramsForRecognizer = {};
-
-      // We need to collect all non-default query params for this route.
-      for (var i = 0, len = qps.length; i < len; ++i) {
-        var qp = qps[i];
-
-        // Check if the link-to provides a value for this qp.
-        var providedType = null, value;
-        if (qp.prop in suppliedParams) {
-          value = suppliedParams[qp.prop];
-          providedType = queryParamsObject.types[qp.prop];
-          delete suppliedParams[qp.prop];
-        } else if (qp.urlKey in suppliedParams) {
-          value = suppliedParams[qp.urlKey];
-          providedType = queryParamsObject.types[qp.urlKey];
-          delete suppliedParams[qp.urlKey];
-        }
-
-        if (providedType) {
-          if (providedType === 'ID') {
-            var normalizedPath = EmberHandlebars.normalizePath(helperParameters.context, value, helperParameters.options.data);
-            value = EmberHandlebars.get(normalizedPath.root, normalizedPath.path, helperParameters.options);
-          }
-
-          value = qp.route.serializeQueryParam(value, qp.urlKey, qp.type);
-        } else {
-          value = qp.svalue;
-        }
-
-        if (stripDefaultValues && value === qp.sdef) {
-          continue;
-        }
-
-        paramsForRecognizer[qp.urlKey] = value;
-      }
-
-      return paramsForRecognizer;
-    }
-
-    function routeArgsWithoutDefaultQueryParams(linkView) {
-      var routeArgs = linkView.get('routeArgs');
-
-      if (!routeArgs[routeArgs.length-1].queryParams) {
-        return routeArgs;
-      }
-
-      routeArgs = routeArgs.slice();
-      routeArgs[routeArgs.length-1] = {
-        queryParams: computeQueryParams(linkView, true)
-      };
-      return routeArgs;
-    }
-
-    function getResolvedPaths(options) {
-
-      var types = options.options.types,
-          data = options.options.data;
-
-      return resolvePaths(options.context, options.params, { types: types, data: data });
-    }
-
-    /**
-      `Ember.LinkView` renders an element whose `click` event triggers a
-      transition of the application's instance of `Ember.Router` to
-      a supplied route by name.
-
-      Instances of `LinkView` will most likely be created through
-      the `link-to` Handlebars helper, but properties of this class
-      can be overridden to customize application-wide behavior.
-
-      @class LinkView
-      @namespace Ember
-      @extends Ember.View
-      @see {Handlebars.helpers.link-to}
-    **/
-    var LinkView = Ember.LinkView = EmberView.extend({
-      tagName: 'a',
-      currentWhen: null,
-
-      /**
-        Sets the `title` attribute of the `LinkView`'s HTML element.
-
-        @property title
-        @default null
-      **/
-      title: null,
-
-      /**
-        Sets the `rel` attribute of the `LinkView`'s HTML element.
-
-        @property rel
-        @default null
-      **/
-      rel: null,
-
-      /**
-        The CSS class to apply to `LinkView`'s element when its `active`
-        property is `true`.
-
-        @property activeClass
-        @type String
-        @default active
-      **/
-      activeClass: 'active',
-
-      /**
-        The CSS class to apply to `LinkView`'s element when its `loading`
-        property is `true`.
-
-        @property loadingClass
-        @type String
-        @default loading
-      **/
-      loadingClass: 'loading',
-
-      /**
-        The CSS class to apply to a `LinkView`'s element when its `disabled`
-        property is `true`.
-
-        @property disabledClass
-        @type String
-        @default disabled
-      **/
-      disabledClass: 'disabled',
-      _isDisabled: false,
-
-      /**
-        Determines whether the `LinkView` will trigger routing via
-        the `replaceWith` routing strategy.
-
-        @property replace
-        @type Boolean
-        @default false
-      **/
-      replace: false,
-
-      /**
-        By default the `{{link-to}}` helper will bind to the `href` and
-        `title` attributes. It's discourage that you override these defaults,
-        however you can push onto the array if needed.
-
-        @property attributeBindings
-        @type Array | String
-        @default ['href', 'title', 'rel']
-       **/
-      attributeBindings: ['href', 'title', 'rel'],
-
-      /**
-        By default the `{{link-to}}` helper will bind to the `active`, `loading`, and
-        `disabled` classes. It is discouraged to override these directly.
-
-        @property classNameBindings
-        @type Array
-        @default ['active', 'loading', 'disabled']
-       **/
-      classNameBindings: ['active', 'loading', 'disabled'],
-
-      /**
-        By default the `{{link-to}}` helper responds to the `click` event. You
-        can override this globally by setting this property to your custom
-        event name.
-
-        This is particularly useful on mobile when one wants to avoid the 300ms
-        click delay using some sort of custom `tap` event.
-
-        @property eventName
-        @type String
-        @default click
-      */
-      eventName: 'click',
-
-      // this is doc'ed here so it shows up in the events
-      // section of the API documentation, which is where
-      // people will likely go looking for it.
-      /**
-        Triggers the `LinkView`'s routing behavior. If
-        `eventName` is changed to a value other than `click`
-        the routing behavior will trigger on that custom event
-        instead.
-
-        @event click
-      **/
-
-      /**
-        An overridable method called when LinkView objects are instantiated.
-
-        Example:
-
-        ```javascript
-        App.MyLinkView = Ember.LinkView.extend({
-          init: function() {
-            this._super();
-            Ember.Logger.log('Event is ' + this.get('eventName'));
-          }
-        });
-        ```
-
-        NOTE: If you do override `init` for a framework class like `Ember.View` or
-        `Ember.ArrayController`, be sure to call `this._super()` in your
-        `init` declaration! If you don't, Ember may not have an opportunity to
-        do important setup work, and you'll see strange behavior in your
-        application.
-
-        @method init
-      */
-      init: function() {
-        this._super.apply(this, arguments);
-
-        // Map desired event name to invoke function
-        var eventName = get(this, 'eventName'), i;
-        this.on(eventName, this, this._invoke);
-      },
-
-      /**
-        This method is invoked by observers installed during `init` that fire
-        whenever the params change
-
-        @private
-        @method _paramsChanged
-       */
-      _paramsChanged: function() {
-        this.notifyPropertyChange('resolvedParams');
-      },
-
-      /**
-       This is called to setup observers that will trigger a rerender.
-
-       @private
-       @method _setupPathObservers
-      **/
-      _setupPathObservers: function(){
-        var helperParameters = this.parameters,
-            linkTextPath     = helperParameters.options.linkTextPath,
-            paths = getResolvedPaths(helperParameters),
-            length = paths.length,
-            path, i, normalizedPath;
-
-        if (linkTextPath) {
-          normalizedPath = EmberHandlebars.normalizePath(helperParameters.context, linkTextPath, helperParameters.options.data);
-          this.registerObserver(normalizedPath.root, normalizedPath.path, this, this.rerender);
-        }
-
-        for(i=0; i < length; i++) {
-          path = paths[i];
-          if (null === path) {
-            // A literal value was provided, not a path, so nothing to observe.
-            continue;
-          }
-
-          normalizedPath = EmberHandlebars.normalizePath(helperParameters.context, path, helperParameters.options.data);
-          this.registerObserver(normalizedPath.root, normalizedPath.path, this, this._paramsChanged);
-        }
-
-        var queryParamsObject = this.queryParamsObject;
-        if (queryParamsObject) {
-          var values = queryParamsObject.values;
-
-          // Install observers for all of the hash options
-          // provided in the (query-params) subexpression.
-          for (var k in values) {
-            if (!values.hasOwnProperty(k)) { continue; }
-
-            if (queryParamsObject.types[k] === 'ID') {
-              normalizedPath = EmberHandlebars.normalizePath(helperParameters.context, values[k], helperParameters.options.data);
-              this.registerObserver(normalizedPath.root, normalizedPath.path, this, this._paramsChanged);
-            }
-          }
-        }
-      },
-
-      afterRender: function(){
-        this._super.apply(this, arguments);
-        this._setupPathObservers();
-      },
-
-      /**
-        Even though this isn't a virtual view, we want to treat it as if it is
-        so that you can access the parent with {{view.prop}}
-
-        @private
-        @method concreteView
-      **/
-      concreteView: computed(function() {
-        return get(this, 'parentView');
-      }).property('parentView'),
-
-      /**
-
-        Accessed as a classname binding to apply the `LinkView`'s `disabledClass`
-        CSS `class` to the element when the link is disabled.
-
-        When `true` interactions with the element will not trigger route changes.
-        @property disabled
-      */
-      disabled: computed(function computeLinkViewDisabled(key, value) {
-        if (value !== undefined) { this.set('_isDisabled', value); }
-
-        return value ? get(this, 'disabledClass') : false;
-      }),
-
-      /**
-        Accessed as a classname binding to apply the `LinkView`'s `activeClass`
-        CSS `class` to the element when the link is active.
-
-        A `LinkView` is considered active when its `currentWhen` property is `true`
-        or the application's current route is the route the `LinkView` would trigger
-        transitions into.
-
-        @property active
-      **/
-      active: computed(function computeLinkViewActive() {
-        if (get(this, 'loading')) { return false; }
-
-        var router = get(this, 'router'),
-            routeArgs = get(this, 'routeArgs'),
-            contexts = routeArgs.slice(1),
-            resolvedParams = get(this, 'resolvedParams'),
-            currentWhen = this.currentWhen || routeArgs[0],
-            maximumContexts = numberOfContextsAcceptedByHandler(currentWhen, router.router.recognizer.handlersFor(currentWhen));
-
-        // if we don't have enough contexts revert back to full route name
-        // this is because the leaf route will use one of the contexts
-        if (contexts.length > maximumContexts)
-          currentWhen = routeArgs[0];
-
-        var isActive = router.isActive.apply(router, [currentWhen].concat(contexts));
-
-        if (isActive) { return get(this, 'activeClass'); }
-      }).property('resolvedParams', 'routeArgs'),
-
-      /**
-        Accessed as a classname binding to apply the `LinkView`'s `loadingClass`
-        CSS `class` to the element when the link is loading.
-
-        A `LinkView` is considered loading when it has at least one
-        parameter whose value is currently null or undefined. During
-        this time, clicking the link will perform no transition and
-        emit a warning that the link is still in a loading state.
-
-        @property loading
-      **/
-      loading: computed(function computeLinkViewLoading() {
-        if (!get(this, 'routeArgs')) { return get(this, 'loadingClass'); }
-      }).property('routeArgs'),
-
-      /**
-        Returns the application's main router from the container.
-
-        @private
-        @property router
-      **/
-      router: computed(function() {
-        return get(this, 'controller').container.lookup('router:main');
-      }),
-
-      /**
-        Event handler that invokes the link, activating the associated route.
-
-        @private
-        @method _invoke
-        @param {Event} event
-      */
-      _invoke: function(event) {
-        if (!isSimpleClick(event)) { return true; }
-
-        if (this.preventDefault !== false) { event.preventDefault(); }
-        if (this.bubbles === false) { event.stopPropagation(); }
-
-        if (get(this, '_isDisabled')) { return false; }
-
-        if (get(this, 'loading')) {
-          Ember.Logger.warn("This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.");
-          return false;
-        }
-
-        var router = get(this, 'router'),
-            routeArgs = get(this, 'routeArgs');
-
-        var transition;
-        if (get(this, 'replace')) {
-          transition = router.replaceWith.apply(router, routeArgs);
-        } else {
-          transition = router.transitionTo.apply(router, routeArgs);
-        }
-
-        // Schedule eager URL update, but after we've given the transition
-        // a chance to synchronously redirect.
-        // We need to always generate the URL instead of using the href because
-        // the href will include any rootURL set, but the router expects a URL
-        // without it! Note that we don't use the first level router because it
-        // calls location.formatURL(), which also would add the rootURL!
-        var url = router.router.generate.apply(router.router, routeArgsWithoutDefaultQueryParams(this));
-        run.scheduleOnce('routerTransitions', this, this._eagerUpdateUrl, transition, url);
-      },
-
-      /**
-        @private
-       */
-      _eagerUpdateUrl: function(transition, href) {
-        if (!transition.isActive || !transition.urlMethod) {
-          // transition was aborted, already ran to completion,
-          // or it has a null url-updated method.
-          return;
-        }
-
-        if (href.indexOf('#') === 0) {
-          href = href.slice(1);
-        }
-
-        // Re-use the routerjs hooks set up by the Ember router.
-        var routerjs = get(this, 'router.router');
-        if (transition.urlMethod === 'update') {
-          routerjs.updateURL(href);
-        } else if (transition.urlMethod === 'replace') {
-          routerjs.replaceURL(href);
-        }
-
-        // Prevent later update url refire.
-        transition.method(null);
-      },
-
-      /**
-        Computed property that returns an array of the
-        resolved parameters passed to the `link-to` helper,
-        e.g.:
-
-        ```hbs
-        {{link-to a b '123' c}}
-        ```
-
-        will generate a `resolvedParams` of:
-
-        ```js
-        [aObject, bObject, '123', cObject]
-        ```
-
-        @private
-        @property
-        @return {Array}
-       */
-      resolvedParams: computed(function() {
-        var parameters = this.parameters,
-            options = parameters.options,
-            types = options.types,
-            data = options.data;
-
-        if (parameters.params.length === 0) {
-          var appController = this.container.lookup('controller:application');
-          return [get(appController, 'currentRouteName')];
-        } else {
-          return resolveParams(parameters.context, parameters.params, { types: types, data: data });
-        }
-      }).property('router.url'),
-
-      /**
-        Computed property that returns the current route name and
-        any dynamic segments.
-
-        @private
-        @property
-        @return {Array} An array with the route name and any dynamic segments
-       */
-      routeArgs: computed(function computeLinkViewRouteArgs() {
-        var resolvedParams = get(this, 'resolvedParams').slice(0),
-            router = get(this, 'router'),
-            namedRoute = resolvedParams[0];
-
-        if (!namedRoute) { return; }
-
-        Ember.assert(fmt("The attempt to link-to route '%@' failed. " +
-                         "The router did not find '%@' in its possible routes: '%@'",
-                         [namedRoute, namedRoute, keys(router.router.recognizer.names).join("', '")]),
-                         router.hasRoute(namedRoute));
-
-        //normalize route name
-        var handlers = router.router.recognizer.handlersFor(namedRoute);
-        var normalizedPath = handlers[handlers.length - 1].handler;
-        if (namedRoute !== normalizedPath) {
-          this.set('currentWhen', namedRoute);
-          namedRoute = handlers[handlers.length - 1].handler;
-          resolvedParams[0] = namedRoute;
-        }
-
-        for (var i = 1, len = resolvedParams.length; i < len; ++i) {
-          var param = resolvedParams[i];
-          if (param === null || typeof param === 'undefined') {
-            // If contexts aren't present, consider the linkView unloaded.
-            return;
-          }
-        }
-
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          resolvedParams.push({ queryParams: get(this, 'queryParams') });
-        }
-
-        return resolvedParams;
-      }).property('resolvedParams', 'queryParams'),
-
-      queryParamsObject: null,
-      queryParams: computed(function computeLinkViewQueryParams() {
-        return computeQueryParams(this, false);
-      }).property('resolvedParams.[]'),
-
-      /**
-        Sets the element's `href` attribute to the url for
-        the `LinkView`'s targeted route.
-
-        If the `LinkView`'s `tagName` is changed to a value other
-        than `a`, this property will be ignored.
-
-        @property href
-      **/
-      href: computed(function computeLinkViewHref() {
-        if (get(this, 'tagName') !== 'a') { return; }
-
-        var router = get(this, 'router'),
-            routeArgs = get(this, 'routeArgs');
-
-        if (!routeArgs) {
-          return get(this, 'loadingHref');
-        }
-
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          routeArgs = routeArgsWithoutDefaultQueryParams(this);
-        }
-
-        return router.generate.apply(router, routeArgs);
-      }).property('routeArgs'),
-
-      /**
-        The default href value to use while a link-to is loading.
-        Only applies when tagName is 'a'
-
-        @property loadingHref
-        @type String
-        @default #
-      */
-      loadingHref: '#'
-    });
-
-    LinkView.toString = function() { return "LinkView"; };
-
-    /**
-      The `{{link-to}}` helper renders a link to the supplied
-      `routeName` passing an optionally supplied model to the
-      route as its `model` context of the route. The block
-      for `{{link-to}}` becomes the innerHTML of the rendered
-      element:
-
-      ```handlebars
-      {{#link-to 'photoGallery'}}
-        Great Hamster Photos
-      {{/link-to}}
-      ```
-
-      ```html
-      <a href="/hamster-photos">
-        Great Hamster Photos
-      </a>
-      ```
-
-      ### Supplying a tagName
-      By default `{{link-to}}` renders an `<a>` element. This can
-      be overridden for a single use of `{{link-to}}` by supplying
-      a `tagName` option:
-
-      ```handlebars
-      {{#link-to 'photoGallery' tagName="li"}}
-        Great Hamster Photos
-      {{/link-to}}
-      ```
-
-      ```html
-      <li>
-        Great Hamster Photos
-      </li>
-      ```
-
-      To override this option for your entire application, see
-      "Overriding Application-wide Defaults".
-
-      ### Disabling the `link-to` helper
-      By default `{{link-to}}` is enabled.
-      any passed value to `disabled` helper property will disable the `link-to` helper.
-
-      static use: the `disabled` option:
-
-      ```handlebars
-      {{#link-to 'photoGallery' disabled=true}}
-        Great Hamster Photos
-      {{/link-to}}
-      ```
-
-      dynamic use: the `disabledWhen` option:
-
-      ```handlebars
-      {{#link-to 'photoGallery' disabledWhen=controller.someProperty}}
-        Great Hamster Photos
-      {{/link-to}}
-      ```
-
-      any passed value to `disabled` will disable it except `undefined`.
-      to ensure that only `true` disable the `link-to` helper you can
-      override the global behaviour of `Ember.LinkView`.
-
-      ```javascript
-      Ember.LinkView.reopen({
-        disabled: Ember.computed(function(key, value) {
-          if (value !== undefined) {
-            this.set('_isDisabled', value === true);
-          }
-          return value === true ? get(this, 'disabledClass') : false;
-        })
-      });
-      ```
-
-      see "Overriding Application-wide Defaults" for more.
-
-      ### Handling `href`
-      `{{link-to}}` will use your application's Router to
-      fill the element's `href` property with a url that
-      matches the path to the supplied `routeName` for your
-      routers's configured `Location` scheme, which defaults
-      to Ember.HashLocation.
-
-      ### Handling current route
-      `{{link-to}}` will apply a CSS class name of 'active'
-      when the application's current route matches
-      the supplied routeName. For example, if the application's
-      current route is 'photoGallery.recent' the following
-      use of `{{link-to}}`:
-
-      ```handlebars
-      {{#link-to 'photoGallery.recent'}}
-        Great Hamster Photos from the last week
-      {{/link-to}}
-      ```
-
-      will result in
-
-      ```html
-      <a href="/hamster-photos/this-week" class="active">
-        Great Hamster Photos
-      </a>
-      ```
-
-      The CSS class name used for active classes can be customized
-      for a single use of `{{link-to}}` by passing an `activeClass`
-      option:
-
-      ```handlebars
-      {{#link-to 'photoGallery.recent' activeClass="current-url"}}
-        Great Hamster Photos from the last week
-      {{/link-to}}
-      ```
-
-      ```html
-      <a href="/hamster-photos/this-week" class="current-url">
-        Great Hamster Photos
-      </a>
-      ```
-
-      To override this option for your entire application, see
-      "Overriding Application-wide Defaults".
-
-      ### Supplying a model
-      An optional model argument can be used for routes whose
-      paths contain dynamic segments. This argument will become
-      the model context of the linked route:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource("photoGallery", {path: "hamster-photos/:photo_id"});
-      });
-      ```
-
-      ```handlebars
-      {{#link-to 'photoGallery' aPhoto}}
-        {{aPhoto.title}}
-      {{/link-to}}
-      ```
-
-      ```html
-      <a href="/hamster-photos/42">
-        Tomster
-      </a>
-      ```
-
-      ### Supplying multiple models
-      For deep-linking to route paths that contain multiple
-      dynamic segments, multiple model arguments can be used.
-      As the router transitions through the route path, each
-      supplied model argument will become the context for the
-      route with the dynamic segments:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource("photoGallery", {path: "hamster-photos/:photo_id"}, function() {
-          this.route("comment", {path: "comments/:comment_id"});
-        });
-      });
-      ```
-      This argument will become the model context of the linked route:
-
-      ```handlebars
-      {{#link-to 'photoGallery.comment' aPhoto comment}}
-        {{comment.body}}
-      {{/link-to}}
-      ```
-
-      ```html
-      <a href="/hamster-photos/42/comment/718">
-        A+++ would snuggle again.
-      </a>
-      ```
-
-      ### Supplying an explicit dynamic segment value
-      If you don't have a model object available to pass to `{{link-to}}`,
-      an optional string or integer argument can be passed for routes whose
-      paths contain dynamic segments. This argument will become the value
-      of the dynamic segment:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource("photoGallery", {path: "hamster-photos/:photo_id"});
-      });
-      ```
-
-      ```handlebars
-      {{#link-to 'photoGallery' aPhotoId}}
-        {{aPhoto.title}}
-      {{/link-to}}
-      ```
-
-      ```html
-      <a href="/hamster-photos/42">
-        Tomster
-      </a>
-      ```
-
-      When transitioning into the linked route, the `model` hook will
-      be triggered with parameters including this passed identifier.
-
-      ### Allowing Default Action
-
-     By default the `{{link-to}}` helper prevents the default browser action
-     by calling `preventDefault()` as this sort of action bubbling is normally
-     handled internally and we do not want to take the browser to a new URL (for
-     example).
-
-     If you need to override this behavior specify `preventDefault=false` in
-     your template:
-
-      ```handlebars
-      {{#link-to 'photoGallery' aPhotoId preventDefault=false}}
-        {{aPhotoId.title}}
-      {{/link-to}}
-      ```
-
-      ### Overriding attributes
-      You can override any given property of the Ember.LinkView
-      that is generated by the `{{link-to}}` helper by passing
-      key/value pairs, like so:
-
-      ```handlebars
-      {{#link-to  aPhoto tagName='li' title='Following this link will change your life' classNames='pic sweet'}}
-        Uh-mazing!
-      {{/link-to}}
-      ```
-
-      See [Ember.LinkView](/api/classes/Ember.LinkView.html) for a
-      complete list of overrideable properties. Be sure to also
-      check out inherited properties of `LinkView`.
-
-      ### Overriding Application-wide Defaults
-      ``{{link-to}}`` creates an instance of Ember.LinkView
-      for rendering. To override options for your entire
-      application, reopen Ember.LinkView and supply the
-      desired values:
-
-      ``` javascript
-      Ember.LinkView.reopen({
-        activeClass: "is-active",
-        tagName: 'li'
-      })
-      ```
-
-      It is also possible to override the default event in
-      this manner:
-
-      ``` javascript
-      Ember.LinkView.reopen({
-        eventName: 'customEventName'
-      });
-      ```
-
-      @method link-to
-      @for Ember.Handlebars.helpers
-      @param {String} routeName
-      @param {Object} [context]*
-      @param [options] {Object} Handlebars key/value pairs of options, you can override any property of Ember.LinkView
-      @return {String} HTML string
-      @see {Ember.LinkView}
-    */
-    function linkToHelper(name) {
-      var options = slice.call(arguments, -1)[0],
-          params = slice.call(arguments, 0, -1),
-          hash = options.hash;
-
-      if (params[params.length - 1] instanceof QueryParams) {
-        hash.queryParamsObject = params.pop();
-      }
-
-      hash.disabledBinding = hash.disabledWhen;
-
-      if (!options.fn) {
-        var linkTitle = params.shift();
-        var linkType = options.types.shift();
-        var context = this;
-        if (linkType === 'ID') {
-          options.linkTextPath = linkTitle;
-          options.fn = function() {
-            return EmberHandlebars.getEscaped(context, linkTitle, options);
-          };
-        } else {
-          options.fn = function() {
-            return linkTitle;
-          };
-        }
-      }
-
-      hash.parameters = {
-        context: this,
-        options: options,
-        params: params
-      };
-
-      return viewHelper.call(this, LinkView, options);
-    };
-
-
-    if (Ember.FEATURES.isEnabled("query-params-new")) {
-      EmberHandlebars.registerHelper('query-params', function queryParamsHelper(options) {
-        Ember.assert(fmt("The `query-params` helper only accepts hash parameters, e.g. (query-params queryParamPropertyName='%@') as opposed to just (query-params '%@')", [options, options]), arguments.length === 1);
-
-        return QueryParams.create({
-          values: options.hash,
-          types: options.hashTypes
-        });
-      });
-    }
-
-    /**
-      See [link-to](/api/classes/Ember.Handlebars.helpers.html#method_link-to)
-
-      @method linkTo
-      @for Ember.Handlebars.helpers
-      @deprecated
-      @param {String} routeName
-      @param {Object} [context]*
-      @return {String} HTML string
-    */
-    function deprecatedLinkToHelper() {
-      Ember.warn("The 'linkTo' view helper is deprecated in favor of 'link-to'");
-      return linkToHelper.apply(this, arguments);
-    };
-
-    __exports__.LinkView = LinkView;
-    __exports__.deprecatedLinkToHelper = deprecatedLinkToHelper;
-    __exports__.linkToHelper = linkToHelper;
-  });
-define("ember-routing/helpers/outlet", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-views/views/container_view","ember-handlebars/views/metamorph_view","ember-handlebars/helpers/view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var onLoad = __dependency4__.onLoad;
-    var ContainerView = __dependency5__["default"];
-    var _Metamorph = __dependency6__._Metamorph;
-    var viewHelper = __dependency7__.viewHelper;
-
-    // requireModule('ember-handlebars');
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-      /**
-      @module ember
-      @submodule ember-routing
-      */
-
-    var OutletView = ContainerView.extend(_Metamorph);
-
-    /**
-      The `outlet` helper is a placeholder that the router will fill in with
-      the appropriate template based on the current state of the application.
-
-      ``` handlebars
-      {{outlet}}
-      ```
-
-      By default, a template based on Ember's naming conventions will be rendered
-      into the `outlet` (e.g. `App.PostsRoute` will render the `posts` template).
-
-      You can render a different template by using the `render()` method in the
-      route's `renderTemplate` hook. The following will render the `favoritePost`
-      template into the `outlet`.
-
-      ``` javascript
-      App.PostsRoute = Ember.Route.extend({
-        renderTemplate: function() {
-          this.render('favoritePost');
-        }
-      });
-      ```
-
-      You can create custom named outlets for more control.
-
-      ``` handlebars
-      {{outlet 'favoritePost'}}
-      {{outlet 'posts'}}
-      ```
-
-      Then you can define what template is rendered into each outlet in your
-      route.
-
-
-      ``` javascript
-      App.PostsRoute = Ember.Route.extend({
-        renderTemplate: function() {
-          this.render('favoritePost', { outlet: 'favoritePost' });
-          this.render('posts', { outlet: 'posts' });
-        }
-      });
-      ```
-
-      You can specify the view that the outlet uses to contain and manage the
-      templates rendered into it.
-
-      ``` handlebars
-      {{outlet view='sectionContainer'}}
-      ```
-
-      ``` javascript
-      App.SectionContainer = Ember.ContainerView.extend({
-        tagName: 'section',
-        classNames: ['special']
-      });
-      ```
-
-      @method outlet
-      @for Ember.Handlebars.helpers
-      @param {String} property the property on the controller
-        that holds the view for this outlet
-      @return {String} HTML string
-    */
-    function outletHelper(property, options) {
-
-      var outletSource,
-          container,
-          viewName,
-          viewClass,
-          viewFullName;
-
-      if (property && property.data && property.data.isRenderData) {
-        options = property;
-        property = 'main';
-      }
-
-      container = options.data.view.container;
-
-      outletSource = options.data.view;
-      while (!outletSource.get('template.isTop')) {
-        outletSource = outletSource.get('_parentView');
-      }
-
-      // provide controller override
-      viewName = options.hash.view;
-
-      if (viewName) {
-        viewFullName = 'view:' + viewName;
-        Ember.assert("Using a quoteless view parameter with {{outlet}} is not supported. Please update to quoted usage '{{outlet \"" + viewName + "\"}}.", options.hashTypes.view !== 'ID');
-        Ember.assert("The view name you supplied '" + viewName + "' did not resolve to a view.", container.has(viewFullName));
-      }
-
-      viewClass = viewName ? container.lookupFactory(viewFullName) : options.hash.viewClass || OutletView;
-
-      options.data.view.set('outletSource', outletSource);
-      options.hash.currentViewBinding = '_view.outletSource._outlets.' + property;
-
-      return viewHelper.call(this, viewClass, options);
-    };
-
-    __exports__.outletHelper = outletHelper;
-    __exports__.OutletView = OutletView;
-  });
-define("ember-routing/helpers/render", 
-  ["ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-routing/system/controller_for","ember-handlebars/ext","ember-handlebars/helpers/view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // assert, deprecate
-    var EmberError = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var camelize = __dependency5__.camelize;
-    var generateControllerFactory = __dependency6__.generateControllerFactory;
-    var generateController = __dependency6__.generateController;
-    var handlebarsGet = __dependency7__.handlebarsGet;
-    var viewHelper = __dependency8__.viewHelper;
-
-
-    // requireModule('ember-handlebars');
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-      Calling ``{{render}}`` from within a template will insert another
-      template that matches the provided name. The inserted template will
-      access its properties on its own controller (rather than the controller
-      of the parent template).
-
-      If a view class with the same name exists, the view class also will be used.
-
-      Note: A given controller may only be used *once* in your app in this manner.
-      A singleton instance of the controller will be created for you.
-
-      Example:
-
-      ```javascript
-      App.NavigationController = Ember.Controller.extend({
-        who: "world"
-      });
-      ```
-
-      ```handlebars
-      <!-- navigation.hbs -->
-      Hello, {{who}}.
-      ```
-
-      ```handelbars
-      <!-- application.hbs -->
-      <h1>My great app</h1>
-      {{render "navigation"}}
-      ```
-
-      ```html
-      <h1>My great app</h1>
-      <div class='ember-view'>
-        Hello, world.
-      </div>
-      ```
-
-      Optionally you may provide a second argument: a property path
-      that will be bound to the `model` property of the controller.
-
-      If a `model` property path is specified, then a new instance of the
-      controller will be created and `{{render}}` can be used multiple times
-      with the same name.
-
-     For example if you had this `author` template.
-
-     ```handlebars
-    <div class="author">
-    Written by {{firstName}} {{lastName}}.
-    Total Posts: {{postCount}}
-    </div>
-    ```
-
-    You could render it inside the `post` template using the `render` helper.
-
-    ```handlebars
-    <div class="post">
-    <h1>{{title}}</h1>
-    <div>{{body}}</div>
-    {{render "author" author}}
-    </div>
-     ```
-
-      @method render
-      @for Ember.Handlebars.helpers
-      @param {String} name
-      @param {Object?} contextString
-      @param {Hash} options
-      @return {String} HTML string
-    */
-    function renderHelper(name, contextString, options) {
-      var length = arguments.length;
-
-      var contextProvided = length === 3,
-          container, router, controller, view, context, lookupOptions;
-
-      container = (options || contextString).data.keywords.controller.container;
-      router = container.lookup('router:main');
-
-      if (length === 2) {
-        // use the singleton controller
-        options = contextString;
-        contextString = undefined;
-        Ember.assert("You can only use the {{render}} helper once without a model object as its second argument, as in {{render \"post\" post}}.", !router || !router._lookupActiveView(name));
-      } else if (length === 3) {
-        // create a new controller
-        context = handlebarsGet(options.contexts[1], contextString, options);
-      } else {
-        throw EmberError("You must pass a templateName to render");
-      }
-
-      Ember.deprecate("Using a quoteless parameter with {{render}} is deprecated. Please update to quoted usage '{{render \"" + name + "\"}}.", options.types[0] !== 'ID');
-
-      // # legacy namespace
-      name = name.replace(/\//g, '.');
-      // \ legacy slash as namespace support
-
-
-      view = container.lookup('view:' + name) || container.lookup('view:default');
-
-      // provide controller override
-      var controllerName = options.hash.controller || name;
-      var controllerFullName = 'controller:' + controllerName;
-
-      if (options.hash.controller) {
-        Ember.assert("The controller name you supplied '" + controllerName + "' did not resolve to a controller.", container.has(controllerFullName));
-      }
-
-      var parentController = options.data.keywords.controller;
-
-      // choose name
-      if (length > 2) {
-        var factory = container.lookupFactory(controllerFullName) ||
-                      generateControllerFactory(container, controllerName, context);
-
-        controller = factory.create({
-          model: context,
-          parentController: parentController,
-          target: parentController
-        });
-
-      } else {
-        controller = container.lookup(controllerFullName) ||
-                     generateController(container, controllerName);
-
-        controller.setProperties({
-          target: parentController,
-          parentController: parentController
-        });
-      }
-
-      var root = options.contexts[1];
-
-      if (root) {
-        view.registerObserver(root, contextString, function() {
-          controller.set('model', handlebarsGet(root, contextString, options));
-        });
-      }
-
-      options.hash.viewName = camelize(name);
-
-      var templateName = 'template:' + name;
-      Ember.assert("You used `{{render '" + name + "'}}`, but '" + name + "' can not be found as either a template or a view.", container.has("view:" + name) || container.has(templateName) || options.fn);
-      options.hash.template = container.lookup(templateName);
-
-      options.hash.controller = controller;
-
-      if (router && !context) {
-        router._connectActiveView(name, view);
-      }
-
-      viewHelper.call(this, view, options);
-    };
-
-    __exports__["default"] = renderHelper;
-  });
-define("ember-routing/helpers/shared", 
-  ["ember-metal/property_get","ember-metal/array","ember-runtime/system/lazy_load","ember-runtime/controllers/controller","ember-routing/system/router","ember-handlebars/ext","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var map = __dependency2__.map;
-    var onLoad = __dependency3__.onLoad;
-    var ControllerMixin = __dependency4__.ControllerMixin;
-    var EmberRouter = __dependency5__["default"];
-    var handlebarsResolve = __dependency6__.resolveParams;
-    var handlebarsGet = __dependency6__.handlebarsGet;
-
-    function resolveParams(context, params, options) {
-      return map.call(resolvePaths(context, params, options), function(path, i) {
-        if (null === path) {
-          // Param was string/number, not a path, so just return raw string/number.
-          return params[i];
-        } else {
-          return handlebarsGet(context, path, options);
-        }
-      });
-    }
-
-    function resolvePaths(context, params, options) {
-      var resolved = handlebarsResolve(context, params, options),
-          types = options.types;
-
-      return map.call(resolved, function(object, i) {
-        if (types[i] === 'ID') {
-          return unwrap(object, params[i]);
-        } else {
-          return null;
-        }
-      });
-
-      function unwrap(object, path) {
-        if (path === 'controller') { return path; }
-
-        if (ControllerMixin.detect(object)) {
-          return unwrap(get(object, 'model'), path ? path + '.model' : 'model');
-        } else {
-          return path;
-        }
-      }
-    }
-
-    __exports__.resolveParams = resolveParams;
-    __exports__.resolvePaths = resolvePaths;
-  });
-define("ember-routing/location/api", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // deprecate, assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-      Ember.Location returns an instance of the correct implementation of
-      the `location` API.
-
-      ## Implementations
-
-      You can pass an implementation name (`hash`, `history`, `none`) to force a
-      particular implementation to be used in your application.
-
-      ### HashLocation
-
-      Using `HashLocation` results in URLs with a `#` (hash sign) separating the
-      server side URL portion of the URL from the portion that is used by Ember.
-      This relies upon the `hashchange` event existing in the browser.
-
-      Example:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource('posts', function() {
-          this.route('new');
-        });
-      });
-
-      App.Router.reopen({
-        location: 'hash'
-      });
-      ```
-
-      This will result in a posts.new url of `/#/posts/new`.
-
-      ### HistoryLocation
-
-      Using `HistoryLocation` results in URLs that are indistinguishable from a
-      standard URL. This relies upon the browser's `history` API.
-
-      Example:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource('posts', function() {
-          this.route('new');
-        });
-      });
-
-      App.Router.reopen({
-        location: 'history'
-      });
-      ```
-
-      This will result in a posts.new url of `/posts/new`.
-
-      Keep in mind that your server must serve the Ember app at all the routes you
-      define.
-
-      ### AutoLocation
-
-      Using `AutoLocation`, the router will use the best Location class supported by
-      the browser it is running in.
-
-      Browsers that support the `history` API will use `HistoryLocation`, those that
-      do not, but still support the `hashchange` event will use `HashLocation`, and
-      in the rare case neither is supported will use `NoneLocation`.
-
-      Example:
-
-      ```javascript
-      App.Router.map(function() {
-        this.resource('posts', function() {
-          this.route('new');
-        });
-      });
-
-      App.Router.reopen({
-        location: 'auto'
-      });
-      ```
-
-      This will result in a posts.new url of `/posts/new` for modern browsers that
-      support the `history` api or `/#/posts/new` for older ones, like Internet
-      Explorer 9 and below.
-
-      When a user visits a link to your application, they will be automatically
-      upgraded or downgraded to the appropriate `Location` class, with the URL
-      transformed accordingly, if needed.
-
-      Keep in mind that since some of your users will use `HistoryLocation`, your
-      server must serve the Ember app at all the routes you define.
-
-      ### NoneLocation
-
-      Using `NoneLocation` causes Ember to not store the applications URL state
-      in the actual URL. This is generally used for testing purposes, and is one
-      of the changes made when calling `App.setupForTesting()`.
-
-      ## Location API
-
-      Each location implementation must provide the following methods:
-
-      * implementation: returns the string name used to reference the implementation.
-      * getURL: returns the current URL.
-      * setURL(path): sets the current URL.
-      * replaceURL(path): replace the current URL (optional).
-      * onUpdateURL(callback): triggers the callback when the URL changes.
-      * formatURL(url): formats `url` to be placed into `href` attribute.
-
-      Calling setURL or replaceURL will not trigger onUpdateURL callbacks.
-
-      @class Location
-      @namespace Ember
-      @static
-    */
-    var EmberLocation = {
-      /**
-       This is deprecated in favor of using the container to lookup the location
-       implementation as desired.
-
-       For example:
-
-       ```javascript
-       // Given a location registered as follows:
-       container.register('location:history-test', HistoryTestLocation);
-
-       // You could create a new instance via:
-       container.lookup('location:history-test');
-       ```
-
-        @method create
-        @param {Object} options
-        @return {Object} an instance of an implementation of the `location` API
-        @deprecated Use the container to lookup the location implementation that you
-        need.
-      */
-      create: function(options) {
-        var implementation = options && options.implementation;
-        Ember.assert("Ember.Location.create: you must specify a 'implementation' option", !!implementation);
-
-        var implementationClass = this.implementations[implementation];
-        Ember.assert("Ember.Location.create: " + implementation + " is not a valid implementation", !!implementationClass);
-
-        return implementationClass.create.apply(implementationClass, arguments);
-      },
-
-      /**
-       This is deprecated in favor of using the container to register the
-       location implementation as desired.
-
-       Example:
-
-       ```javascript
-       Application.initializer({
-        name: "history-test-location",
-
-        initialize: function(container, application) {
-          application.register('location:history-test', HistoryTestLocation);
-        }
-       });
-       ```
-
-       @method registerImplementation
-       @param {String} name
-       @param {Object} implementation of the `location` API
-       @deprecated Register your custom location implementation with the
-       container directly.
-      */
-      registerImplementation: function(name, implementation) {
-        Ember.deprecate('Using the Ember.Location.registerImplementation is no longer supported. Register your custom location implementation with the container instead.', false);
-
-        this.implementations[name] = implementation;
-      },
-
-      implementations: {},
-      _location: window.location,
-
-      /**
-        Returns the current `location.hash` by parsing location.href since browsers
-        inconsistently URL-decode `location.hash`.
-      
-        https://bugzilla.mozilla.org/show_bug.cgi?id=483304
-
-        @private
-        @method getHash
-      */
-      _getHash: function () {
-        // AutoLocation has it at _location, HashLocation at .location.
-        // Being nice and not changing 
-        var href = (this._location || this.location).href,
-            hashIndex = href.indexOf('#');
-
-        if (hashIndex === -1) {
-          return '';
-        } else {
-          return href.substr(hashIndex);
-        }
-      }
-    };
-
-    __exports__["default"] = EmberLocation;
-  });
-define("ember-routing/location/auto_location", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-routing/location/api","ember-routing/location/history_location","ember-routing/location/hash_location","ember-routing/location/none_location","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-
-    var EmberLocation = __dependency4__["default"];
-    var HistoryLocation = __dependency5__["default"];
-    var HashLocation = __dependency6__["default"];
-    var NoneLocation = __dependency7__["default"];
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-      Ember.AutoLocation will select the best location option based off browser
-      support with the priority order: history, hash, none.
-
-      Clean pushState paths accessed by hashchange-only browsers will be redirected
-      to the hash-equivalent and vice versa so future transitions are consistent.
-
-      Keep in mind that since some of your users will use `HistoryLocation`, your
-      server must serve the Ember app at all the routes you define.
-
-      @class AutoLocation
-      @namespace Ember
-      @static
-    */
-    var AutoLocation = {
-
-      /**
-        @private
-
-        Will be pre-pended to path upon state change.
-
-        @property rootURL
-        @default '/'
-      */
-      _rootURL: '/',
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property _window
-        @default window
-      */
-      _window: window,
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property location
-        @default window.location
-      */
-      _location: window.location,
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property _history
-        @default window.history
-      */
-      _history: window.history,
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property _HistoryLocation
-        @default Ember.HistoryLocation
-      */
-      _HistoryLocation: HistoryLocation,
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property _HashLocation
-        @default Ember.HashLocation
-      */
-      _HashLocation: HashLocation,
-
-      /**
-        @private
-
-        Attached for mocking in tests
-
-        @property _NoneLocation
-        @default Ember.NoneLocation
-      */
-      _NoneLocation: NoneLocation,
-
-      /**
-        @private
-
-        Returns location.origin or builds it if device doesn't support it.
-
-        @method _getOrigin
-      */
-      _getOrigin: function () {
-        var location = this._location,
-            origin = location.origin;
-
-        // Older browsers, especially IE, don't have origin
-        if (!origin) {
-          origin = location.protocol + '//' + location.hostname;
-          
-          if (location.port) {
-            origin += ':' + location.port;
-          }
-        }
-
-        return origin;
-      },
-
-      /**
-        @private
-
-        We assume that if the history object has a pushState method, the host should
-        support HistoryLocation.
-
-        @method _getSupportsHistory
-      */
-      _getSupportsHistory: function () {
-        // Boosted from Modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
-        // The stock browser on Android 2.2 & 2.3 returns positive on history support
-        // Unfortunately support is really buggy and there is no clean way to detect
-        // these bugs, so we fall back to a user agent sniff :(
-        var userAgent = this._window.navigator.userAgent;
-
-        // We only want Android 2, stock browser, and not Chrome which identifies
-        // itself as 'Mobile Safari' as well
-        if (userAgent.indexOf('Android 2') !== -1 &&
-            userAgent.indexOf('Mobile Safari') !== -1 &&
-            userAgent.indexOf('Chrome') === -1) {
-          return false;
-        }
-
-        return !!(this._history && 'pushState' in this._history);
-      },
-
-      /**
-        @private
-
-        IE8 running in IE7 compatibility mode gives false positive, so we must also
-        check documentMode.
-
-        @method _getSupportsHashChange
-      */
-      _getSupportsHashChange: function () {
-        var window = this._window,
-            documentMode = window.document.documentMode;
-
-        return ('onhashchange' in window && (documentMode === undefined || documentMode > 7 ));
-      },
-
-      /**
-        @private
-
-        Redirects the browser using location.replace, prepending the locatin.origin
-        to prevent phishing attempts
-
-        @method _replacePath
-      */
-      _replacePath: function (path) {
-        this._location.replace(this._getOrigin() + path);
-      },
-
-      /**
-        @private
-        @method _getRootURL
-      */
-      _getRootURL: function () {
-        return this._rootURL;
-      },
-
-      /**
-        @private
-
-        Returns the current `location.pathname`, normalized for IE inconsistencies.
-
-        @method _getPath
-      */
-      _getPath: function () {
-        var pathname = this._location.pathname;
-        // Various versions of IE/Opera don't always return a leading slash
-        if (pathname.charAt(0) !== '/') {
-          pathname = '/' + pathname;
-        }
-
-        return pathname;
-      },
-
-      /**
-        @private
-
-        Returns normalized location.hash as an alias to Ember.Location._getHash
-
-        @method _getHash
-      */
-      _getHash: EmberLocation._getHash,
-
-      /**
-        @private
-
-        Returns location.search
-
-        @method _getQuery
-      */
-      _getQuery: function () {
-        return this._location.search;
-      },
-
-      /**
-        @private
-
-        Returns the full pathname including query and hash
-
-        @method _getFullPath
-      */
-      _getFullPath: function () {
-        return this._getPath() + this._getQuery() + this._getHash();
-      },
-
-      /**
-        @private
-
-        Returns the current path as it should appear for HistoryLocation supported
-        browsers. This may very well differ from the real current path (e.g. if it 
-        starts off as a hashed URL)
-
-        @method _getHistoryPath
-      */
-      _getHistoryPath: function () {
-        var rootURL = this._getRootURL(),
-            path = this._getPath(),
-            hash = this._getHash(),
-            query = this._getQuery(),
-            rootURLIndex = path.indexOf(rootURL),
-            routeHash, hashParts;
-
-        Ember.assert('Path ' + path + ' does not start with the provided rootURL ' + rootURL, rootURLIndex === 0);
-
-        // By convention, Ember.js routes using HashLocation are required to start
-        // with `#/`. Anything else should NOT be considered a route and should
-        // be passed straight through, without transformation.
-        if (hash.substr(0, 2) === '#/') {
-          // There could be extra hash segments after the route
-          hashParts = hash.substr(1).split('#');
-          // The first one is always the route url
-          routeHash = hashParts.shift();
-
-          // If the path already has a trailing slash, remove the one
-          // from the hashed route so we don't double up.
-          if (path.slice(-1) === '/') {
-              routeHash = routeHash.substr(1);
-          }
-
-          // This is the "expected" final order
-          path += routeHash;
-          path += query;
-
-          if (hashParts.length) {
-            path += '#' + hashParts.join('#');
-          }
-        } else {
-          path += query;
-          path += hash;
-        }
-
-        return path;
-      },
-
-      /**
-        @private
-
-        Returns the current path as it should appear for HashLocation supported
-        browsers. This may very well differ from the real current path.
-
-        @method _getHashPath
-      */
-      _getHashPath: function () {
-        var rootURL = this._getRootURL(),
-            path = rootURL,
-            historyPath = this._getHistoryPath(),
-            routePath = historyPath.substr(rootURL.length);
-
-        if (routePath !== '') {
-          if (routePath.charAt(0) !== '/') {
-            routePath = '/' + routePath;
-          }
-
-          path += '#' + routePath;
-        }
-
-        return path;
-      },
-
-      /**
-        Selects the best location option based off browser support and returns an
-        instance of that Location class.
-      
-        @see Ember.AutoLocation
-        @method create
-      */
-      create: function (options) {
-        if (options && options.rootURL) {
-          this._rootURL = options.rootURL;
-        }
-
-        var historyPath, hashPath,
-            cancelRouterSetup = false,
-            implementationClass = this._NoneLocation,
-            currentPath = this._getFullPath();
-
-        if (this._getSupportsHistory()) {
-          historyPath = this._getHistoryPath();
-
-          // Since we support history paths, let's be sure we're using them else 
-          // switch the location over to it.
-          if (currentPath === historyPath) {
-            implementationClass = this._HistoryLocation;
-          } else {
-            cancelRouterSetup = true;
-            this._replacePath(historyPath);
-          }
-
-        } else if (this._getSupportsHashChange()) {
-          hashPath = this._getHashPath();
-
-          // Be sure we're using a hashed path, otherwise let's switch over it to so
-          // we start off clean and consistent. We'll count an index path with no
-          // hash as "good enough" as well.
-          if (currentPath === hashPath || (currentPath === '/' && hashPath === '/#/')) {
-            implementationClass = this._HashLocation;
-          } else {
-            // Our URL isn't in the expected hash-supported format, so we want to
-            // cancel the router setup and replace the URL to start off clean
-            cancelRouterSetup = true;
-            this._replacePath(hashPath);
-          }
-        }
-
-        var implementation = implementationClass.create.apply(implementationClass, arguments);
-
-        if (cancelRouterSetup) {
-          set(implementation, 'cancelRouterSetup', true);
-        }
-
-        return implementation;
-      }
-    };
-
-    __exports__["default"] = AutoLocation;
-  });
-define("ember-routing/location/hash_location", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","ember-metal/utils","ember-runtime/system/object","ember-routing/location/api","ember-views/system/jquery","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var run = __dependency3__["default"];
-    var guidFor = __dependency4__.guidFor;
-
-    var EmberObject = __dependency5__["default"];
-    var EmberLocation = __dependency6__["default"];
-    var jQuery = __dependency7__["default"];
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-      `Ember.HashLocation` implements the location API using the browser's
-      hash. At present, it relies on a `hashchange` event existing in the
-      browser.
-
-      @class HashLocation
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var HashLocation = EmberObject.extend({
-      implementation: 'hash',
-
-      init: function() {
-        set(this, 'location', get(this, '_location') || window.location);
-      },
-
-      /**
-        @private
-
-        Returns normalized location.hash
-
-        @method getHash
-      */
-      getHash: EmberLocation._getHash,
-
-      /**
-        Returns the current `location.hash`, minus the '#' at the front.
-
-        @private
-        @method getURL
-      */
-      getURL: function() {
-        return this.getHash().substr(1);
-      },
-
-      /**
-        Set the `location.hash` and remembers what was set. This prevents
-        `onUpdateURL` callbacks from triggering when the hash was set by
-        `HashLocation`.
-
-        @private
-        @method setURL
-        @param path {String}
-      */
-      setURL: function(path) {
-        get(this, 'location').hash = path;
-        set(this, 'lastSetURL', path);
-      },
-
-      /**
-        Uses location.replace to update the url without a page reload
-        or history modification.
-
-        @private
-        @method replaceURL
-        @param path {String}
-      */
-      replaceURL: function(path) {
-        get(this, 'location').replace('#' + path);
-        set(this, 'lastSetURL', path);
-      },
-
-      /**
-        Register a callback to be invoked when the hash changes. These
-        callbacks will execute when the user presses the back or forward
-        button, but not after `setURL` is invoked.
-
-        @private
-        @method onUpdateURL
-        @param callback {Function}
-      */
-      onUpdateURL: function(callback) {
-        var self = this;
-        var guid = guidFor(this);
-
-        jQuery(window).on('hashchange.ember-location-'+guid, function() {
-          run(function() {
-            var path = self.getURL();
-            if (get(self, 'lastSetURL') === path) { return; }
-
-            set(self, 'lastSetURL', null);
-
-            callback(path);
-          });
-        });
-      },
-
-      /**
-        Given a URL, formats it to be placed into the page as part
-        of an element's `href` attribute.
-
-        This is used, for example, when using the {{action}} helper
-        to generate a URL based on an event.
-
-        @private
-        @method formatURL
-        @param url {String}
-      */
-      formatURL: function(url) {
-        return '#'+url;
-      },
-
-      /**
-        Cleans up the HashLocation event listener.
-
-        @private
-        @method willDestroy
-      */
-      willDestroy: function() {
-        var guid = guidFor(this);
-
-        jQuery(window).off('hashchange.ember-location-'+guid);
-      }
-    });
-
-    __exports__["default"] = HashLocation;
-  });
-define("ember-routing/location/history_location", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-runtime/system/object","ember-views/system/jquery","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var guidFor = __dependency4__.guidFor;
-
-    var EmberObject = __dependency5__["default"];
-    var jQuery = __dependency6__["default"];
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    var popstateFired = false;
-    var supportsHistoryState = window.history && 'state' in window.history;
-
-    /**
-      Ember.HistoryLocation implements the location API using the browser's
-      history.pushState API.
-
-      @class HistoryLocation
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var HistoryLocation = EmberObject.extend({
-      implementation: 'history',
-
-      init: function() {
-        set(this, 'location', get(this, 'location') || window.location);
-        set(this, 'baseURL', jQuery('base').attr('href') || '');
-      },
-
-      /**
-        Used to set state on first call to setURL
-
-        @private
-        @method initState
-      */
-      initState: function() {
-        set(this, 'history', get(this, 'history') || window.history);
-        this.replaceState(this.formatURL(this.getURL()));
-      },
-
-      /**
-        Will be pre-pended to path upon state change
-
-        @property rootURL
-        @default '/'
-      */
-      rootURL: '/',
-
-      /**
-        Returns the current `location.pathname` without `rootURL` or `baseURL`
-
-        @private
-        @method getURL
-        @return url {String}
-      */
-      getURL: function() {
-        var rootURL = get(this, 'rootURL'),
-            location = get(this, 'location'),
-            path = location.pathname,
-            baseURL = get(this, 'baseURL');
-
-        rootURL = rootURL.replace(/\/$/, '');
-        baseURL = baseURL.replace(/\/$/, '');
-        var url = path.replace(baseURL, '').replace(rootURL, '');
-
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          var search = location.search || '';
-          url += search;
-        }
-
-        return url;
-      },
-
-      /**
-        Uses `history.pushState` to update the url without a page reload.
-
-        @private
-        @method setURL
-        @param path {String}
-      */
-      setURL: function(path) {
-        var state = this.getState();
-        path = this.formatURL(path);
-
-        if (!state || state.path !== path) {
-          this.pushState(path);
-        }
-      },
-
-      /**
-        Uses `history.replaceState` to update the url without a page reload
-        or history modification.
-
-        @private
-        @method replaceURL
-        @param path {String}
-      */
-      replaceURL: function(path) {
-        var state = this.getState();
-        path = this.formatURL(path);
-
-        if (!state || state.path !== path) {
-          this.replaceState(path);
-        }
-      },
-
-      /**
-       Get the current `history.state`. Checks for if a polyfill is
-       required and if so fetches this._historyState. The state returned
-       from getState may be null if an iframe has changed a window's
-       history.
-
-       @private
-       @method getState
-       @return state {Object}
-      */
-      getState: function() {
-        return supportsHistoryState ? get(this, 'history').state : this._historyState;
-      },
-
-      /**
-       Pushes a new state.
-
-       @private
-       @method pushState
-       @param path {String}
-      */
-      pushState: function(path) {
-        var state = { path: path };
-
-        get(this, 'history').pushState(state, null, path);
-
-        // store state if browser doesn't support `history.state`
-        if (!supportsHistoryState) {
-          this._historyState = state;
-        }
-
-        // used for webkit workaround
-        this._previousURL = this.getURL();
-      },
-
-      /**
-       Replaces the current state.
-
-       @private
-       @method replaceState
-       @param path {String}
-      */
-      replaceState: function(path) {
-        var state = { path: path };
-
-        get(this, 'history').replaceState(state, null, path);
-
-        // store state if browser doesn't support `history.state`
-        if (!supportsHistoryState) {
-          this._historyState = state;
-        }
-
-        // used for webkit workaround
-        this._previousURL = this.getURL();
-      },
-
-      /**
-        Register a callback to be invoked whenever the browser
-        history changes, including using forward and back buttons.
-
-        @private
-        @method onUpdateURL
-        @param callback {Function}
-      */
-      onUpdateURL: function(callback) {
-        var guid = guidFor(this),
-            self = this;
-
-        jQuery(window).on('popstate.ember-location-'+guid, function(e) {
-          // Ignore initial page load popstate event in Chrome
-          if (!popstateFired) {
-            popstateFired = true;
-            if (self.getURL() === self._previousURL) { return; }
-          }
-          callback(self.getURL());
-        });
-      },
-
-      /**
-        Used when using `{{action}}` helper.  The url is always appended to the rootURL.
-
-        @private
-        @method formatURL
-        @param url {String}
-        @return formatted url {String}
-      */
-      formatURL: function(url) {
-        var rootURL = get(this, 'rootURL'),
-            baseURL = get(this, 'baseURL');
-
-        if (url !== '') {
-          rootURL = rootURL.replace(/\/$/, '');
-          baseURL = baseURL.replace(/\/$/, '');
-        } else if(baseURL.match(/^\//) && rootURL.match(/^\//)) {
-          baseURL = baseURL.replace(/\/$/, '');
-        }
-
-        return baseURL + rootURL + url;
-      },
-
-      /**
-        Cleans up the HistoryLocation event listener.
-
-        @private
-        @method willDestroy
-      */
-      willDestroy: function() {
-        var guid = guidFor(this);
-
-        jQuery(window).off('popstate.ember-location-'+guid);
-      }
-    });
-
-    __exports__["default"] = HistoryLocation;
-  });
-define("ember-routing/location/none_location", 
-  ["ember-metal/property_get","ember-metal/property_set","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var set = __dependency2__.set;
-    var EmberObject = __dependency3__["default"];
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-      Ember.NoneLocation does not interact with the browser. It is useful for
-      testing, or when you need to manage state with your Router, but temporarily
-      don't want it to muck with the URL (for example when you embed your
-      application in a larger page).
-
-      @class NoneLocation
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var NoneLocation = EmberObject.extend({
-      implementation: 'none',
-      path: '',
-
-      /**
-        Returns the current path.
-
-        @private
-        @method getURL
-        @return {String} path
-      */
-      getURL: function() {
-        return get(this, 'path');
-      },
-
-      /**
-        Set the path and remembers what was set. Using this method
-        to change the path will not invoke the `updateURL` callback.
-
-        @private
-        @method setURL
-        @param path {String}
-      */
-      setURL: function(path) {
-        set(this, 'path', path);
-      },
-
-      /**
-        Register a callback to be invoked when the path changes. These
-        callbacks will execute when the user presses the back or forward
-        button, but not after `setURL` is invoked.
-
-        @private
-        @method onUpdateURL
-        @param callback {Function}
-      */
-      onUpdateURL: function(callback) {
-        this.updateCallback = callback;
-      },
-
-      /**
-        Sets the path and calls the `updateURL` callback.
-
-        @private
-        @method handleURL
-        @param callback {Function}
-      */
-      handleURL: function(url) {
-        set(this, 'path', url);
-        this.updateCallback(url);
-      },
-
-      /**
-        Given a URL, formats it to be placed into the page as part
-        of an element's `href` attribute.
-
-        This is used, for example, when using the {{action}} helper
-        to generate a URL based on an event.
-
-        @private
-        @method formatURL
-        @param url {String}
-        @return {String} url
-      */
-      formatURL: function(url) {
-        // The return value is not overly meaningful, but we do not want to throw
-        // errors when test code renders templates containing {{action href=true}}
-        // helpers.
-        return url;
-      }
-    });
-
-    __exports__["default"] = NoneLocation;
-  });
-define("ember-routing", 
-  ["ember-handlebars","ember-metal/core","ember-routing/ext/run_loop","ember-routing/ext/controller","ember-routing/ext/view","ember-routing/helpers/shared","ember-routing/helpers/link_to","ember-routing/location/api","ember-routing/location/none_location","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/system/controller_for","ember-routing/system/dsl","ember-routing/system/router","ember-routing/system/route","ember-routing/helpers/outlet","ember-routing/helpers/render","ember-routing/helpers/action","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __exports__) {
-    "use strict";
-    // require('ember-runtime');
-    // require('ember-views');
-    // require('ember-handlebars');
-
-    /**
-    Ember Routing
-
-    @module ember
-    @submodule ember-routing
-    @requires ember-views
-    */
-
-    var EmberHandlebars = __dependency1__["default"];
-    var Ember = __dependency2__["default"];
-
-    // ES6TODO: Cleanup modules with side-effects below
-
-    var resolvePaths = __dependency6__.resolvePaths;
-    var resolveParams = __dependency6__.resolveParams;
-    var deprecatedLinkToHelper = __dependency7__.deprecatedLinkToHelper;
-    var linkToHelper = __dependency7__.linkToHelper;
-    var LinkView = __dependency7__.LinkView;
-
-
-    // require('ember-views');
-    var EmberLocation = __dependency8__["default"];
-    var NoneLocation = __dependency9__["default"];
-    var HashLocation = __dependency10__["default"];
-    var HistoryLocation = __dependency11__["default"];
-    var AutoLocation = __dependency12__["default"];
-
-    var controllerFor = __dependency13__.controllerFor;
-    var generateControllerFactory = __dependency13__.generateControllerFactory;
-    var generateController = __dependency13__.generateController;
-    var RouterDSL = __dependency14__["default"];
-    var Router = __dependency15__["default"];
-    var Route = __dependency16__["default"];
-    var outletHelper = __dependency17__.outletHelper;
-    var OutletView = __dependency17__.OutletView;
-    var renderHelper = __dependency18__["default"];
-    var ActionHelper = __dependency19__.ActionHelper;
-    var actionHelper = __dependency19__.actionHelper;
-
-
-    Ember.Location = EmberLocation;
-    Ember.AutoLocation = AutoLocation;
-    Ember.HashLocation = HashLocation;
-    Ember.HistoryLocation = HistoryLocation;
-    Ember.NoneLocation = NoneLocation;
-
-    Ember.controllerFor = controllerFor;
-    Ember.generateControllerFactory = generateControllerFactory;
-    Ember.generateController = generateController;
-    Ember.RouterDSL = RouterDSL;
-    Ember.Router = Router;
-    Ember.Route = Route;
-    Ember.LinkView = LinkView;
-
-    Router.resolveParams = resolveParams;
-    Router.resolvePaths = resolvePaths;
-
-    EmberHandlebars.ActionHelper = ActionHelper;
-    EmberHandlebars.OutletView = OutletView;
-
-    EmberHandlebars.registerHelper('render', renderHelper)
-    EmberHandlebars.registerHelper('action', actionHelper);
-    EmberHandlebars.registerHelper('outlet', outletHelper);
-    EmberHandlebars.registerHelper('link-to', linkToHelper);
-    EmberHandlebars.registerHelper('linkTo', deprecatedLinkToHelper);
-
-    __exports__["default"] = Ember;
-  });
-define("ember-routing/system/controller_for", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Logger
-    var get = __dependency2__.get;
-    var isArray = __dependency3__.isArray;
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    /**
-
-      Finds a controller instance.
-
-      @for Ember
-      @method controllerFor
-      @private
-    */
-    var controllerFor = function(container, controllerName, lookupOptions) {
-      return container.lookup('controller:' + controllerName, lookupOptions);
-    };
-
-    /**
-      Generates a controller factory
-
-      The type of the generated controller factory is derived
-      from the context. If the context is an array an array controller
-      is generated, if an object, an object controller otherwise, a basic
-      controller is generated.
-
-      You can customize your generated controllers by defining
-      `App.ObjectController` or `App.ArrayController`.
-
-      @for Ember
-      @method generateControllerFactory
-      @private
-    */
-    var generateControllerFactory = function(container, controllerName, context) {
-      var Factory, fullName, instance, name, factoryName, controllerType;
-
-      if (context && isArray(context)) {
-        controllerType = 'array';
-      } else if (context) {
-        controllerType = 'object';
-      } else {
-        controllerType = 'basic';
-      }
-
-      factoryName = 'controller:' + controllerType;
-
-      Factory = container.lookupFactory(factoryName).extend({
-        isGenerated: true,
-        toString: function() {
-          return "(generated " + controllerName + " controller)";
-        }
-      });
-
-      fullName = 'controller:' + controllerName;
-
-      container.register(fullName,  Factory);
-
-      return Factory;
-    };
-
-    /**
-      Generates and instantiates a controller.
-
-      The type of the generated controller factory is derived
-      from the context. If the context is an array an array controller
-      is generated, if an object, an object controller otherwise, a basic
-      controller is generated.
-
-      @for Ember
-      @method generateController
-      @private
-    */
-    var generateController = function(container, controllerName, context) {
-      generateControllerFactory(container, controllerName, context);
-      var fullName = 'controller:' + controllerName;
-      var instance = container.lookup(fullName);
-
-      if (get(instance, 'namespace.LOG_ACTIVE_GENERATION')) {
-        Ember.Logger.info("generated -> " + fullName, { fullName: fullName });
-      }
-
-      return instance;
-    };
-
-    __exports__.controllerFor = controllerFor;
-    __exports__.generateControllerFactory = generateControllerFactory;
-    __exports__.generateController = generateController;
-  });
-define("ember-routing/system/dsl", 
-  ["ember-metal/core","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES, assert
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    function DSL(name) {
-      this.parent = name;
-      this.matches = [];
-    }
-
-    DSL.prototype = {
-      resource: function(name, options, callback) {
-        Ember.assert("'basic' cannot be used as a resource name.", name !== 'basic');
-
-        if (arguments.length === 2 && typeof options === 'function') {
-          callback = options;
-          options = {};
-        }
-
-        if (arguments.length === 1) {
-          options = {};
-        }
-
-        if (typeof options.path !== 'string') {
-          options.path = "/" + name;
-        }
-
-        if (callback) {
-          var dsl = new DSL(name);
-          route(dsl, 'loading');
-          route(dsl, 'error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" });
-          callback.call(dsl);
-          this.push(options.path, name, dsl.generate());
-        } else {
-          this.push(options.path, name, null);
-        }
-
-
-        if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) {
-          // For namespace-preserving nested resource (e.g. resource('foo.bar') within
-          // resource('foo')) we only want to use the last route name segment to determine
-          // the names of the error/loading substates (e.g. 'bar_loading')
-          name = name.split('.').pop();
-          route(this, name + '_loading');
-          route(this, name + '_error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" });
-        }
-      },
-
-      push: function(url, name, callback) {
-        var parts = name.split('.');
-        if (url === "" || url === "/" || parts[parts.length-1] === "index") { this.explicitIndex = true; }
-
-        this.matches.push([url, name, callback]);
-      },
-
-      route: function(name, options) {
-        Ember.assert("'basic' cannot be used as a route name.", name !== 'basic');
-
-        route(this, name, options);
-        if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) {
-          route(this, name + '_loading');
-          route(this, name + '_error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" });
-        }
-      },
-
-      generate: function() {
-        var dslMatches = this.matches;
-
-        if (!this.explicitIndex) {
-          this.route("index", { path: "/" });
-        }
-
-        return function(match) {
-          for (var i=0, l=dslMatches.length; i<l; i++) {
-            var dslMatch = dslMatches[i];
-            var matchObj = match(dslMatch[0]).to(dslMatch[1], dslMatch[2]);
-          }
-        };
-      }
-    };
-
-    function route(dsl, name, options) {
-      Ember.assert("You must use `this.resource` to nest", typeof options !== 'function');
-
-      options = options || {};
-
-      if (typeof options.path !== 'string') {
-        options.path = "/" + name;
-      }
-
-      if (dsl.parent && dsl.parent !== 'application') {
-        name = dsl.parent + "." + name;
-      }
-
-      dsl.push(options.path, name, null);
-    }
-
-    DSL.map = function(callback) {
-      var dsl = new DSL();
-      callback.call(dsl);
-      return dsl;
-    };
-
-    __exports__["default"] = DSL;
-  });
-define("ember-routing/system/route", 
-  ["ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/get_properties","ember-metal/enumerable_utils","ember-metal/is_none","ember-metal/computed","ember-metal/utils","ember-metal/run_loop","ember-runtime/keys","ember-runtime/copy","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/mixins/action_handler","ember-routing/system/controller_for","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES, K, A, deprecate, assert, Logger
-    var EmberError = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var getProperties = __dependency5__["default"];
-    var EnumerableUtils = __dependency6__["default"];
-    var isNone = __dependency7__.isNone;
-    var computed = __dependency8__.computed;
-    var typeOf = __dependency9__.typeOf;
-    var run = __dependency10__["default"];
-
-    var keys = __dependency11__["default"];
-    var copy = __dependency12__["default"];
-    var classify = __dependency13__.classify;
-    var fmt = __dependency13__.fmt;
-    var EmberObject = __dependency14__["default"];
-    var ActionHandler = __dependency15__["default"];
-    var generateController = __dependency16__.generateController;
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    var a_forEach = EnumerableUtils.forEach,
-        a_replace = EnumerableUtils.replace;
-
-    /**
-      The `Ember.Route` class is used to define individual routes. Refer to
-      the [routing guide](http://emberjs.com/guides/routing/) for documentation.
-
-      @class Route
-      @namespace Ember
-      @extends Ember.Object
-      @uses Ember.ActionHandler
-    */
-    var Route = EmberObject.extend(ActionHandler, {
-
-      /**
-        @private
-
-        @method exit
-      */
-      exit: function() {
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          toggleQueryParamObservers(this, this.controller, false);
-        }
-        this.deactivate();
-        this.teardownViews();
-      },
-
-      /**
-        @private
-
-        @method enter
-      */
-      enter: function() {
-        this.activate();
-      },
-
-      /**
-        The name of the view to use by default when rendering this routes template.
-
-        When rendering a template, the route will, by default, determine the
-        template and view to use from the name of the route itself. If you need to
-        define a specific view, set this property.
-
-        This is useful when multiple routes would benefit from using the same view
-        because it doesn't require a custom `renderTemplate` method. For example,
-        the following routes will all render using the `App.PostsListView` view:
-
-        ```js
-        var PostsList = Ember.Route.extend({
-          viewName: 'postsList',
-        });
-
-        App.PostsIndexRoute = PostsList.extend();
-        App.PostsArchivedRoute = PostsList.extend();
-        ```
-
-        @property viewName
-        @type String
-        @default null
-      */
-      viewName: null,
-
-      /**
-        The name of the template to use by default when rendering this routes
-        template.
-
-        This is similar with `viewName`, but is useful when you just want a custom
-        template without a view.
-
-        ```js
-        var PostsList = Ember.Route.extend({
-          templateName: 'posts/list'
-        });
-
-        App.PostsIndexRoute = PostsList.extend();
-        App.PostsArchivedRoute = PostsList.extend();
-        ```
-
-        @property templateName
-        @type String
-        @default null
-      */
-      templateName: null,
-
-      /**
-        The name of the controller to associate with this route.
-
-        By default, Ember will lookup a route's controller that matches the name
-        of the route (i.e. `App.PostController` for `App.PostRoute`). However,
-        if you would like to define a specific controller to use, you can do so
-        using this property.
-
-        This is useful in many ways, as the controller specified will be:
-
-        * passed to the `setupController` method.
-        * used as the controller for the view being rendered by the route.
-        * returned from a call to `controllerFor` for the route.
-
-        @property controllerName
-        @type String
-        @default null
-      */
-      controllerName: null,
-
-      /**
-        The collection of functions, keyed by name, available on this route as
-        action targets.
-
-        These functions will be invoked when a matching `{{action}}` is triggered
-        from within a template and the application's current route is this route.
-
-        Actions can also be invoked from other parts of your application via `Route#send`
-        or `Controller#send`.
-
-        The `actions` hash will inherit action handlers from
-        the `actions` hash defined on extended Route parent classes
-        or mixins rather than just replace the entire hash, e.g.:
-
-        ```js
-        App.CanDisplayBanner = Ember.Mixin.create({
-          actions: {
-            displayBanner: function(msg) {
-              // ...
-            }
-          }
-        });
-
-        App.WelcomeRoute = Ember.Route.extend(App.CanDisplayBanner, {
-          actions: {
-            playMusic: function() {
-              // ...
-            }
-          }
-        });
-
-        // `WelcomeRoute`, when active, will be able to respond
-        // to both actions, since the actions hash is merged rather
-        // then replaced when extending mixins / parent classes.
-        this.send('displayBanner');
-        this.send('playMusic');
-        ```
-
-        Within a route's action handler, the value of the `this` context
-        is the Route object:
-
-        ```js
-        App.SongRoute = Ember.Route.extend({
-          actions: {
-            myAction: function() {
-              this.controllerFor("song");
-              this.transitionTo("other.route");
-              ...
-            }
-          }
-        });
-        ```
-
-        It is also possible to call `this._super()` from within an
-        action handler if it overrides a handler defined on a parent
-        class or mixin:
-
-        Take for example the following routes:
-
-        ```js
-        App.DebugRoute = Ember.Mixin.create({
-          actions: {
-            debugRouteInformation: function() {
-              console.debug("trololo");
-            }
-          }
-        });
-
-        App.AnnoyingDebugRoute = Ember.Route.extend(App.DebugRoute, {
-          actions: {
-            debugRouteInformation: function() {
-              // also call the debugRouteInformation of mixed in App.DebugRoute
-              this._super();
-
-              // show additional annoyance
-              window.alert(...);
-            }
-          }
-        });
-        ```
-
-        ## Bubbling
-
-        By default, an action will stop bubbling once a handler defined
-        on the `actions` hash handles it. To continue bubbling the action,
-        you must return `true` from the handler:
-
-        ```js
-        App.Router.map(function() {
-          this.resource("album", function() {
-            this.route("song");
-          });
-        });
-
-        App.AlbumRoute = Ember.Route.extend({
-          actions: {
-            startPlaying: function() {
-            }
-          }
-        });
-
-        App.AlbumSongRoute = Ember.Route.extend({
-          actions: {
-            startPlaying: function() {
-              // ...
-
-              if (actionShouldAlsoBeTriggeredOnParentRoute) {
-                return true;
-              }
-            }
-          }
-        });
-        ```
-
-        ## Built-in actions
-
-        There are a few built-in actions pertaining to transitions that you
-        can use to customize transition behavior: `willTransition` and
-        `error`.
-
-        ### `willTransition`
-
-        The `willTransition` action is fired at the beginning of any
-        attempted transition with a `Transition` object as the sole
-        argument. This action can be used for aborting, redirecting,
-        or decorating the transition from the currently active routes.
-
-        A good example is preventing navigation when a form is
-        half-filled out:
-
-        ```js
-        App.ContactFormRoute = Ember.Route.extend({
-          actions: {
-            willTransition: function(transition) {
-              if (this.controller.get('userHasEnteredData')) {
-                this.controller.displayNavigationConfirm();
-                transition.abort();
-              }
-            }
-          }
-        });
-        ```
-
-        You can also redirect elsewhere by calling
-        `this.transitionTo('elsewhere')` from within `willTransition`.
-        Note that `willTransition` will not be fired for the
-        redirecting `transitionTo`, since `willTransition` doesn't
-        fire when there is already a transition underway. If you want
-        subsequent `willTransition` actions to fire for the redirecting
-        transition, you must first explicitly call
-        `transition.abort()`.
-
-        ### `error`
-
-        When attempting to transition into a route, any of the hooks
-        may return a promise that rejects, at which point an `error`
-        action will be fired on the partially-entered routes, allowing
-        for per-route error handling logic, or shared error handling
-        logic defined on a parent route.
-
-        Here is an example of an error handler that will be invoked
-        for rejected promises from the various hooks on the route,
-        as well as any unhandled errors from child routes:
-
-        ```js
-        App.AdminRoute = Ember.Route.extend({
-          beforeModel: function() {
-            return Ember.RSVP.reject("bad things!");
-          },
-
-          actions: {
-            error: function(error, transition) {
-              // Assuming we got here due to the error in `beforeModel`,
-              // we can expect that error === "bad things!",
-              // but a promise model rejecting would also
-              // call this hook, as would any errors encountered
-              // in `afterModel`.
-
-              // The `error` hook is also provided the failed
-              // `transition`, which can be stored and later
-              // `.retry()`d if desired.
-
-              this.transitionTo('login');
-            }
-          }
-        });
-        ```
-
-        `error` actions that bubble up all the way to `ApplicationRoute`
-        will fire a default error handler that logs the error. You can
-        specify your own global default error handler by overriding the
-        `error` handler on `ApplicationRoute`:
-
-        ```js
-        App.ApplicationRoute = Ember.Route.extend({
-          actions: {
-            error: function(error, transition) {
-              this.controllerFor('banner').displayError(error.message);
-            }
-          }
-        });
-        ```
-
-        @property actions
-        @type Hash
-        @default null
-      */
-      _actions: {
-
-        queryParamsDidChange: function(changed, totalPresent, removed) {
-          if (Ember.FEATURES.isEnabled("query-params-new")) {
-            var totalChanged = keys(changed).concat(keys(removed));
-            for (var i = 0, len = totalChanged.length; i < len; ++i) {
-              var urlKey = totalChanged[i],
-                  options = get(this.queryParams, urlKey) || {};
-              if (get(options, 'refreshModel')) {
-                this.refresh();
-              }
-            }
-            return true;
-          }
-        },
-
-        finalizeQueryParamChange: function(params, finalParams, transition) {
-          if (Ember.FEATURES.isEnabled("query-params-new")) {
-            // In this hook we receive all the current values of
-            // serialized query params. We need to take these values
-            // and distribute them in their deserialized form into
-            // controllers and remove any that no longer belong in
-            // this route hierarchy.
-
-            var controller = this.controller,
-                changes = controller._queryParamChangesDuringSuspension,
-                qpMeta = get(this, '_qp');
-
-            // Loop through all the query params that
-            // this controller knows about.
-
-            if (qpMeta) {
-              for (var i = 0, len = qpMeta.qps.length; i < len; ++i) {
-                var qp = qpMeta.qps[i],
-                    qpProvided = qp.urlKey in params;
-
-                // Do a reverse lookup to see if the changed query
-                // param URL key corresponds to a QP property on
-                // this controller.
-                var value, svalue;
-                if (changes && qp.urlKey in changes) {
-                  // Controller overrode this value in setupController
-                  svalue = get(controller, qp.prop);
-                  value = this.deserializeQueryParam(svalue, qp.urlKey, qp.type);
-                } else {
-                  if (qpProvided) {
-                    svalue = params[qp.urlKey];
-                    value = this.deserializeQueryParam(svalue, qp.urlKey, qp.type);
-                  } else {
-                    // No QP provided; use default value.
-                    svalue = qp.sdef;
-                    value = qp.def;
-                  }
-                }
-
-                // Delete from params so that parent routes
-                // don't also try to respond to changes to
-                // non-fully-qualified query param name changes
-                // (e.g. if two controllers in the same hiearchy
-                // specify a `page` query param)
-                delete params[qp.urlKey];
-
-                // Now check if this value actually changed.
-                if (svalue !== qp.svalue) {
-                  var options = get(this.queryParams, qp.urlKey) || {};
-                  if (get(options, 'replace')) {
-                    transition.method('replace');
-                  }
-
-                  // Update QP cache
-                  qp.svalue = svalue;
-                  qp.value = value;
-
-                  // Update controller without firing QP observers.
-                  controller._finalizingQueryParams = true;
-                  set(controller, qp.prop, qp.value);
-                  controller._finalizingQueryParams = false;
-                }
-
-                finalParams.push({
-                  value: qp.svalue,
-                  visible: qp.svalue !== qp.sdef,
-                  key: qp.urlKey
-                });
-              }
-              controller._queryParamChangesDuringSuspension = null;
-            }
-            // Bubble so that parent routes can claim QPs.
-            return true;
-          }
-        }
-      },
-
-      /**
-        @deprecated
-
-        Please use `actions` instead.
-        @method events
-      */
-      events: null,
-
-      mergedProperties: ['events'],
-
-      /**
-        This hook is executed when the router completely exits this route. It is
-        not executed when the model for the route changes.
-
-        @method deactivate
-      */
-      deactivate: Ember.K,
-
-      /**
-        This hook is executed when the router enters the route. It is not executed
-        when the model for the route changes.
-
-        @method activate
-      */
-      activate: Ember.K,
-
-      /**
-        Transition the application into another route. The route may
-        be either a single route or route path:
-
-        ```javascript
-        this.transitionTo('blogPosts');
-        this.transitionTo('blogPosts.recentEntries');
-        ```
-
-        Optionally supply a model for the route in question. The model
-        will be serialized into the URL using the `serialize` hook of
-        the route:
-
-        ```javascript
-        this.transitionTo('blogPost', aPost);
-        ```
-
-        If a literal is passed (such as a number or a string), it will
-        be treated as an identifier instead. In this case, the `model`
-        hook of the route will be triggered:
-
-        ```javascript
-        this.transitionTo('blogPost', 1);
-        ```
-
-        Multiple models will be applied last to first recursively up the
-        resource tree.
-
-        ```javascript
-        App.Router.map(function() {
-          this.resource('blogPost', {path:':blogPostId'}, function(){
-            this.resource('blogComment', {path: ':blogCommentId'});
-          });
-        });
-
-        this.transitionTo('blogComment', aPost, aComment);
-        this.transitionTo('blogComment', 1, 13);
-        ```
-
-        It is also possible to pass a URL (a string that starts with a
-        `/`). This is intended for testing and debugging purposes and
-        should rarely be used in production code.
-
-        ```javascript
-        this.transitionTo('/');
-        this.transitionTo('/blog/post/1/comment/13');
-        ```
-
-        See also 'replaceWith'.
-
-        Simple Transition Example
-
-        ```javascript
-        App.Router.map(function() {
-          this.route("index");
-          this.route("secret");
-          this.route("fourOhFour", { path: "*:"});
-        });
-
-        App.IndexRoute = Ember.Route.extend({
-          actions: {
-            moveToSecret: function(context){
-              if (authorized()){
-                this.transitionTo('secret', context);
-              }
-                this.transitionTo('fourOhFour');
-            }
-          }
-        });
-        ```
-
-        Transition to a nested route
-
-        ```javascript
-        App.Router.map(function() {
-          this.resource('articles', { path: '/articles' }, function() {
-            this.route('new');
-          });
-        });
-
-        App.IndexRoute = Ember.Route.extend({
-          actions: {
-            transitionToNewArticle: function() {
-              this.transitionTo('articles.new');
-            }
-          }
-        });
-        ```
-
-        Multiple Models Example
-
-        ```javascript
-        App.Router.map(function() {
-          this.route("index");
-          this.resource('breakfast', {path:':breakfastId'}, function(){
-            this.resource('cereal', {path: ':cerealId'});
-          });
-        });
-
-        App.IndexRoute = Ember.Route.extend({
-          actions: {
-            moveToChocolateCereal: function(){
-              var cereal = { cerealId: "ChocolateYumminess"},
-                  breakfast = {breakfastId: "CerealAndMilk"};
-
-              this.transitionTo('cereal', breakfast, cereal);
-            }
-          }
-        });
-        ```
-
-        @method transitionTo
-        @param {String} name the name of the route or a URL
-        @param {...Object} models the model(s) or identifier(s) to be used while
-          transitioning to the route.
-        @return {Transition} the transition object associated with this
-          attempted transition
-      */
-      transitionTo: function(name, context) {
-        var router = this.router;
-        return router.transitionTo.apply(router, arguments);
-      },
-
-      /**
-        Perform a synchronous transition into another route without attempting
-        to resolve promises, update the URL, or abort any currently active
-        asynchronous transitions (i.e. regular transitions caused by
-        `transitionTo` or URL changes).
-
-        This method is handy for performing intermediate transitions on the
-        way to a final destination route, and is called internally by the
-        default implementations of the `error` and `loading` handlers.
-
-        @method intermediateTransitionTo
-        @param {String} name the name of the route
-        @param {...Object} models the model(s) to be used while transitioning
-        to the route.
-       */
-      intermediateTransitionTo: function() {
-        var router = this.router;
-        router.intermediateTransitionTo.apply(router, arguments);
-      },
-
-      /**
-        Refresh the model on this route and any child routes, firing the
-        `beforeModel`, `model`, and `afterModel` hooks in a similar fashion
-        to how routes are entered when transitioning in from other route.
-        The current route params (e.g. `article_id`) will be passed in
-        to the respective model hooks, and if a different model is returned,
-        `setupController` and associated route hooks will re-fire as well.
-
-        An example usage of this method is re-querying the server for the
-        latest information using the same parameters as when the route
-        was first entered.
-
-        Note that this will cause `model` hooks to fire even on routes
-        that were provided a model object when the route was initially
-        entered.
-
-        @method refresh
-        @return {Transition} the transition object associated with this
-          attempted transition
-       */
-      refresh: function() {
-        return this.router.router.refresh(this);
-      },
-
-      /**
-        Transition into another route while replacing the current URL, if possible.
-        This will replace the current history entry instead of adding a new one.
-        Beside that, it is identical to `transitionTo` in all other respects. See
-        'transitionTo' for additional information regarding multiple models.
-
-        Example
-
-        ```javascript
-        App.Router.map(function() {
-          this.route("index");
-          this.route("secret");
-        });
-
-        App.SecretRoute = Ember.Route.extend({
-          afterModel: function() {
-            if (!authorized()){
-              this.replaceWith('index');
-            }
-          }
-        });
-        ```
-
-        @method replaceWith
-        @param {String} name the name of the route or a URL
-        @param {...Object} models the model(s) or identifier(s) to be used while
-          transitioning to the route.
-        @return {Transition} the transition object associated with this
-          attempted transition
-      */
-      replaceWith: function() {
-        var router = this.router;
-        return router.replaceWith.apply(router, arguments);
-      },
-
-      /**
-        Sends an action to the router, which will delegate it to the currently
-        active route hierarchy per the bubbling rules explained under `actions`.
-
-        Example
-
-        ```javascript
-        App.Router.map(function() {
-          this.route("index");
-        });
-
-        App.ApplicationRoute = Ember.Route.extend({
-          actions: {
-            track: function(arg) {
-              console.log(arg, 'was clicked');
-            }
-          }
-        });
-
-        App.IndexRoute = Ember.Route.extend({
-          actions: {
-            trackIfDebug: function(arg) {
-              if (debug) {
-                this.send('track', arg);
-              }
-            }
-          }
-        });
-        ```
-
-        @method send
-        @param {String} name the name of the action to trigger
-        @param {...*} args
-      */
-      send: function() {
-        return this.router.send.apply(this.router, arguments);
-      },
-
-      /**
-        This hook is the entry point for router.js
-
-        @private
-        @method setup
-      */
-      setup: function(context, transition) {
-        var controllerName = this.controllerName || this.routeName,
-            controller = this.controllerFor(controllerName, true);
-        if (!controller) {
-          controller =  this.generateController(controllerName, context);
-        }
-
-        // Assign the route's controller so that it can more easily be
-        // referenced in action handlers
-        this.controller = controller;
-
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          toggleQueryParamObservers(this, controller, true);
-        }
-
-        if (this.setupControllers) {
-          Ember.deprecate("Ember.Route.setupControllers is deprecated. Please use Ember.Route.setupController(controller, model) instead.");
-          this.setupControllers(controller, context);
-        } else {
-
-          if (Ember.FEATURES.isEnabled("query-params-new")) {
-            // Prevent updates to query params in setupController
-            // from firing another transition. Updating QPs in
-            // setupController will only affect the final
-            // generated URL.
-            controller._finalizingQueryParams = true;
-            controller._queryParamChangesDuringSuspension = {};
-            this.setupController(controller, context, transition);
-            controller._finalizingQueryParams = false;
-          } else {
-            this.setupController(controller, context);
-          }
-        }
-
-        if (this.renderTemplates) {
-          Ember.deprecate("Ember.Route.renderTemplates is deprecated. Please use Ember.Route.renderTemplate(controller, model) instead.");
-          this.renderTemplates(context);
-        } else {
-          this.renderTemplate(controller, context);
-        }
-      },
-
-      /**
-        This hook is the first of the route entry validation hooks
-        called when an attempt is made to transition into a route
-        or one of its children. It is called before `model` and
-        `afterModel`, and is appropriate for cases when:
-
-        1) A decision can be made to redirect elsewhere without
-           needing to resolve the model first.
-        2) Any async operations need to occur first before the
-           model is attempted to be resolved.
-
-        This hook is provided the current `transition` attempt
-        as a parameter, which can be used to `.abort()` the transition,
-        save it for a later `.retry()`, or retrieve values set
-        on it from a previous hook. You can also just call
-        `this.transitionTo` to another route to implicitly
-        abort the `transition`.
-
-        You can return a promise from this hook to pause the
-        transition until the promise resolves (or rejects). This could
-        be useful, for instance, for retrieving async code from
-        the server that is required to enter a route.
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          beforeModel: function(transition) {
-            if (!App.Post) {
-              return Ember.$.getScript('/models/post.js');
-            }
-          }
-        });
-        ```
-
-        If `App.Post` doesn't exist in the above example,
-        `beforeModel` will use jQuery's `getScript`, which
-        returns a promise that resolves after the server has
-        successfully retrieved and executed the code from the
-        server. Note that if an error were to occur, it would
-        be passed to the `error` hook on `Ember.Route`, but
-        it's also possible to handle errors specific to
-        `beforeModel` right from within the hook (to distinguish
-        from the shared error handling behavior of the `error`
-        hook):
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          beforeModel: function(transition) {
-            if (!App.Post) {
-              var self = this;
-              return Ember.$.getScript('post.js').then(null, function(e) {
-                self.transitionTo('help');
-
-                // Note that the above transitionTo will implicitly
-                // halt the transition. If you were to return
-                // nothing from this promise reject handler,
-                // according to promise semantics, that would
-                // convert the reject into a resolve and the
-                // transition would continue. To propagate the
-                // error so that it'd be handled by the `error`
-                // hook, you would have to either
-                return Ember.RSVP.reject(e);
-              });
-            }
-          }
-        });
-        ```
-
-        @method beforeModel
-        @param {Transition} transition
-        @param {Object} queryParams the active query params for this route
-        @return {Promise} if the value returned from this hook is
-          a promise, the transition will pause until the transition
-          resolves. Otherwise, non-promise return values are not
-          utilized in any way.
-      */
-      beforeModel: Ember.K,
-
-      /**
-        This hook is called after this route's model has resolved.
-        It follows identical async/promise semantics to `beforeModel`
-        but is provided the route's resolved model in addition to
-        the `transition`, and is therefore suited to performing
-        logic that can only take place after the model has already
-        resolved.
-
-        ```js
-        App.PostsRoute = Ember.Route.extend({
-          afterModel: function(posts, transition) {
-            if (posts.length === 1) {
-              this.transitionTo('post.show', posts[0]);
-            }
-          }
-        });
-        ```
-
-        Refer to documentation for `beforeModel` for a description
-        of transition-pausing semantics when a promise is returned
-        from this hook.
-
-        @method afterModel
-        @param {Object} resolvedModel the value returned from `model`,
-          or its resolved value if it was a promise
-        @param {Transition} transition
-        @param {Object} queryParams the active query params for this handler
-        @return {Promise} if the value returned from this hook is
-          a promise, the transition will pause until the transition
-          resolves. Otherwise, non-promise return values are not
-          utilized in any way.
-       */
-      afterModel: Ember.K,
-
-      /**
-        A hook you can implement to optionally redirect to another route.
-
-        If you call `this.transitionTo` from inside of this hook, this route
-        will not be entered in favor of the other hook.
-
-        `redirect` and `afterModel` behave very similarly and are
-        called almost at the same time, but they have an important
-        distinction in the case that, from one of these hooks, a
-        redirect into a child route of this route occurs: redirects
-        from `afterModel` essentially invalidate the current attempt
-        to enter this route, and will result in this route's `beforeModel`,
-        `model`, and `afterModel` hooks being fired again within
-        the new, redirecting transition. Redirects that occur within
-        the `redirect` hook, on the other hand, will _not_ cause
-        these hooks to be fired again the second time around; in
-        other words, by the time the `redirect` hook has been called,
-        both the resolved model and attempted entry into this route
-        are considered to be fully validated.
-
-        @method redirect
-        @param {Object} model the model for this route
-      */
-      redirect: Ember.K,
-
-      /**
-        Called when the context is changed by router.js.
-
-        @private
-        @method contextDidChange
-      */
-      contextDidChange: function() {
-        this.currentModel = this.context;
-      },
-
-      /**
-        A hook you can implement to convert the URL into the model for
-        this route.
-
-        ```js
-        App.Router.map(function() {
-          this.resource('post', {path: '/posts/:post_id'});
-        });
-        ```
-
-        The model for the `post` route is `App.Post.find(params.post_id)`.
-
-        By default, if your route has a dynamic segment ending in `_id`:
-
-        * The model class is determined from the segment (`post_id`'s
-          class is `App.Post`)
-        * The find method is called on the model class with the value of
-          the dynamic segment.
-
-        Note that for routes with dynamic segments, this hook is only
-        executed when entered via the URL. If the route is entered
-        through a transition (e.g. when using the `link-to` Handlebars
-        helper), then a model context is already provided and this hook
-        is not called. Routes without dynamic segments will always
-        execute the model hook.
-
-        This hook follows the asynchronous/promise semantics
-        described in the documentation for `beforeModel`. In particular,
-        if a promise returned from `model` fails, the error will be
-        handled by the `error` hook on `Ember.Route`.
-
-        Example
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          model: function(params) {
-            return App.Post.find(params.post_id);
-          }
-        });
-        ```
-
-        @method model
-        @param {Object} params the parameters extracted from the URL
-        @param {Transition} transition
-        @param {Object} queryParams the query params for this route
-        @return {Object|Promise} the model for this route. If
-          a promise is returned, the transition will pause until
-          the promise resolves, and the resolved value of the promise
-          will be used as the model for this route.
-      */
-      model: function(params, transition) {
-        var match, name, sawParams, value;
-
-        for (var prop in params) {
-          if (prop === 'queryParams') { continue; }
-
-          if (match = prop.match(/^(.*)_id$/)) {
-            name = match[1];
-            value = params[prop];
-          }
-          sawParams = true;
-        }
-
-        if (!name && sawParams) { return copy(params); }
-        else if (!name) {
-          if (transition.resolveIndex !== transition.state.handlerInfos.length-1) { return; }
-
-          var parentModel = transition.state.handlerInfos[transition.resolveIndex-1].context;
-
-          return parentModel;
-        }
-
-        return this.findModel(name, value);
-      },
-
-      /**
-        @private
-
-        Router.js hook.
-       */
-      deserialize: function(params, transition) {
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-          return this.model(this.paramsFor(this.routeName), transition);
-        } else {
-          return this.model(params, transition);
-        }
-      },
-
-      /**
-
-        @method findModel
-        @param {String} type the model type
-        @param {Object} value the value passed to find
-      */
-      findModel: function(){
-        var store = get(this, 'store');
-        return store.find.apply(store, arguments);
-      },
-
-      /**
-        Store property provides a hook for data persistence libraries to inject themselves.
-
-        By default, this store property provides the exact same functionality previously
-        in the model hook.
-
-        Currently, the required interface is:
-
-        `store.find(modelName, findArguments)`
-
-        @method store
-        @param {Object} store
-      */
-      store: computed(function(){
-        var container = this.container;
-        var routeName = this.routeName;
-        var namespace = get(this, 'router.namespace');
-
-        return {
-          find: function(name, value) {
-            var modelClass = container.lookupFactory('model:' + name);
-
-            Ember.assert("You used the dynamic segment " + name + "_id in your route " +
-                         routeName + ", but " + namespace + "." + classify(name) +
-                         " did not exist and you did not override your route's `model` " +
-                         "hook.", modelClass);
-
-            if (!modelClass) { return; }
-
-            Ember.assert(classify(name) + ' has no method `find`.', typeof modelClass.find === 'function');
-
-            return modelClass.find(value);
-          }
-        };
-      }),
-
-      /**
-        A hook you can implement to convert the route's model into parameters
-        for the URL.
-
-        ```js
-        App.Router.map(function() {
-          this.resource('post', {path: '/posts/:post_id'});
-        });
-
-        App.PostRoute = Ember.Route.extend({
-          model: function(params) {
-            // the server returns `{ id: 12 }`
-            return jQuery.getJSON("/posts/" + params.post_id);
-          },
-
-          serialize: function(model) {
-            // this will make the URL `/posts/12`
-            return { post_id: model.id };
-          }
-        });
-        ```
-
-        The default `serialize` method will insert the model's `id` into the
-        route's dynamic segment (in this case, `:post_id`) if the segment contains '_id'.
-        If the route has multiple dynamic segments or does not contain '_id', `serialize`
-        will return `Ember.getProperties(model, params)`
-
-        This method is called when `transitionTo` is called with a context
-        in order to populate the URL.
-
-        @method serialize
-        @param {Object} model the route's model
-        @param {Array} params an Array of parameter names for the current
-          route (in the example, `['post_id']`.
-        @return {Object} the serialized parameters
-      */
-      serialize: function(model, params) {
-        if (params.length < 1) { return; }
-        if (!model) { return; }
-
-        var name = params[0], object = {};
-
-        if (/_id$/.test(name) && params.length === 1) {
-          object[name] = get(model, "id");
-        } else {
-          object = getProperties(model, params);
-        }
-
-        return object;
-      },
-
-      /**
-        A hook you can use to setup the controller for the current route.
-
-        This method is called with the controller for the current route and the
-        model supplied by the `model` hook.
-
-        By default, the `setupController` hook sets the `content` property of
-        the controller to the `model`.
-
-        If you implement the `setupController` hook in your Route, it will
-        prevent this default behavior. If you want to preserve that behavior
-        when implementing your `setupController` function, make sure to call
-        `_super`:
-
-        ```js
-        App.PhotosRoute = Ember.Route.extend({
-          model: function() {
-            return App.Photo.find();
-          },
-
-          setupController: function (controller, model) {
-            // Call _super for default behavior
-            this._super(controller, model);
-            // Implement your custom setup after
-            this.controllerFor('application').set('showingPhotos', true);
-          }
-        });
-        ```
-
-        This means that your template will get a proxy for the model as its
-        context, and you can act as though the model itself was the context.
-
-        The provided controller will be one resolved based on the name
-        of this route.
-
-        If no explicit controller is defined, Ember will automatically create
-        an appropriate controller for the model.
-
-        * if the model is an `Ember.Array` (including record arrays from Ember
-          Data), the controller is an `Ember.ArrayController`.
-        * otherwise, the controller is an `Ember.ObjectController`.
-
-        As an example, consider the router:
-
-        ```js
-        App.Router.map(function() {
-          this.resource('post', {path: '/posts/:post_id'});
-        });
-        ```
-
-        For the `post` route, a controller named `App.PostController` would
-        be used if it is defined. If it is not defined, an `Ember.ObjectController`
-        instance would be used.
-
-        Example
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          setupController: function(controller, model) {
-            controller.set('model', model);
-          }
-        });
-        ```
-
-        @method setupController
-        @param {Controller} controller instance
-        @param {Object} model
-      */
-      setupController: function(controller, context, transition) {
-        if (controller && (context !== undefined)) {
-          set(controller, 'model', context);
-        }
-      },
-
-      /**
-        Returns the controller for a particular route or name.
-
-        The controller instance must already have been created, either through entering the
-        associated route or using `generateController`.
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          setupController: function(controller, post) {
-            this._super(controller, post);
-            this.controllerFor('posts').set('currentPost', post);
-          }
-        });
-        ```
-
-        @method controllerFor
-        @param {String} name the name of the route or controller
-        @return {Ember.Controller}
-      */
-      controllerFor: function(name, _skipAssert) {
-        var container = this.container,
-            route = container.lookup('route:'+name),
-            controller;
-
-        if (route && route.controllerName) {
-          name = route.controllerName;
-        }
-
-        controller = container.lookup('controller:' + name);
-
-        // NOTE: We're specifically checking that skipAssert is true, because according
-        //   to the old API the second parameter was model. We do not want people who
-        //   passed a model to skip the assertion.
-        Ember.assert("The controller named '"+name+"' could not be found. Make sure " +
-                     "that this route exists and has already been entered at least " +
-                     "once. If you are accessing a controller not associated with a " +
-                     "route, make sure the controller class is explicitly defined.",
-                     controller || _skipAssert === true);
-
-        return controller;
-      },
-
-      /**
-        Generates a controller for a route.
-
-        If the optional model is passed then the controller type is determined automatically,
-        e.g., an ArrayController for arrays.
-
-        Example
-
-        ```js
-        App.PostRoute = Ember.Route.extend({
-          setupController: function(controller, post) {
-            this._super(controller, post);
-            this.generateController('posts', post);
-          }
-        });
-        ```
-
-        @method generateController
-        @param {String} name the name of the controller
-        @param {Object} model the model to infer the type of the controller (optional)
-      */
-      generateController: function(name, model) {
-        var container = this.container;
-
-        model = model || this.modelFor(name);
-
-        return generateController(container, name, model);
-      },
-
-      /**
-        Returns the model of a parent (or any ancestor) route
-        in a route hierarchy.  During a transition, all routes
-        must resolve a model object, and if a route
-        needs access to a parent route's model in order to
-        resolve a model (or just reuse the model from a parent),
-        it can call `this.modelFor(theNameOfParentRoute)` to
-        retrieve it.
-
-        Example
-
-        ```js
-        App.Router.map(function() {
-            this.resource('post', { path: '/post/:post_id' }, function() {
-                this.resource('comments');
-            });
-        });
-
-        App.CommentsRoute = Ember.Route.extend({
-            afterModel: function() {
-                this.set('post', this.modelFor('post'));
-            }
-        });
-        ```
-
-        @method modelFor
-        @param {String} name the name of the route
-        @return {Object} the model object
-      */
-      modelFor: function(name) {
-
-        var route = this.container.lookup('route:' + name),
-            transition = this.router.router.activeTransition;
-
-        // If we are mid-transition, we want to try and look up
-        // resolved parent contexts on the current transitionEvent.
-        if (transition) {
-          var modelLookupName = (route && route.routeName) || name;
-          if (transition.resolvedModels.hasOwnProperty(modelLookupName)) {
-            return transition.resolvedModels[modelLookupName];
-          }
-        }
-
-        return route && route.currentModel;
-      },
-
-      /**
-        A hook you can use to render the template for the current route.
-
-        This method is called with the controller for the current route and the
-        model supplied by the `model` hook. By default, it renders the route's
-        template, configured with the controller for the route.
-
-        This method can be overridden to set up and render additional or
-        alternative templates.
-
-        ```js
-        App.PostsRoute = Ember.Route.extend({
-          renderTemplate: function(controller, model) {
-            var favController = this.controllerFor('favoritePost');
-
-            // Render the `favoritePost` template into
-            // the outlet `posts`, and display the `favoritePost`
-            // controller.
-            this.render('favoritePost', {
-              outlet: 'posts',
-              controller: favController
-            });
-          }
-        });
-        ```
-
-        @method renderTemplate
-        @param {Object} controller the route's controller
-        @param {Object} model the route's model
-      */
-      renderTemplate: function(controller, model) {
-        this.render();
-      },
-
-      /**
-        Renders a template into an outlet.
-
-        This method has a number of defaults, based on the name of the
-        route specified in the router.
-
-        For example:
-
-        ```js
-        App.Router.map(function() {
-          this.route('index');
-          this.resource('post', {path: '/posts/:post_id'});
-        });
-
-        App.PostRoute = App.Route.extend({
-          renderTemplate: function() {
-            this.render();
-          }
-        });
-        ```
-
-        The name of the `PostRoute`, as defined by the router, is `post`.
-
-        By default, render will:
-
-        * render the `post` template
-        * with the `post` view (`PostView`) for event handling, if one exists
-        * and the `post` controller (`PostController`), if one exists
-        * into the `main` outlet of the `application` template
-
-        You can override this behavior:
-
-        ```js
-        App.PostRoute = App.Route.extend({
-          renderTemplate: function() {
-            this.render('myPost', {   // the template to render
-              into: 'index',          // the template to render into
-              outlet: 'detail',       // the name of the outlet in that template
-              controller: 'blogPost'  // the controller to use for the template
-            });
-          }
-        });
-        ```
-
-        Remember that the controller's `content` will be the route's model. In
-        this case, the default model will be `App.Post.find(params.post_id)`.
-
-        @method render
-        @param {String} name the name of the template to render
-        @param {Object} options the options
-      */
-      render: function(name, options) {
-        Ember.assert("The name in the given arguments is undefined", arguments.length > 0 ? !isNone(arguments[0]) : true);
-
-        var namePassed = !!name;
-
-        if (typeof name === 'object' && !options) {
-          options = name;
-          name = this.routeName;
-        }
-
-        options = options || {};
-
-        var templateName;
-
-        if (name) {
-          name = name.replace(/\//g, '.');
-          templateName = name;
-        } else {
-          name = this.routeName;
-          templateName = this.templateName || name;
-        }
-
-        var viewName = options.view || this.viewName || name;
-
-        var container = this.container,
-            view = container.lookup('view:' + viewName),
-            template = view ? view.get('template') : null;
-
-        if (!template) {
-          template = container.lookup('template:' + templateName);
-        }
-
-        if (!view && !template) {
-          Ember.assert("Could not find \"" + name + "\" template or view.", !namePassed);
-          if (get(this.router, 'namespace.LOG_VIEW_LOOKUPS')) {
-            Ember.Logger.info("Could not find \"" + name + "\" template or view. Nothing will be rendered", { fullName: 'template:' + name });
-          }
-          return;
-        }
-
-        options = normalizeOptions(this, name, template, options);
-        view = setupView(view, container, options);
-
-        if (options.outlet === 'main') { this.lastRenderedTemplate = name; }
-
-        appendView(this, view, options);
-      },
-
-      /**
-        Disconnects a view that has been rendered into an outlet.
-
-        You may pass any or all of the following options to `disconnectOutlet`:
-
-        * `outlet`: the name of the outlet to clear (default: 'main')
-        * `parentView`: the name of the view containing the outlet to clear
-           (default: the view rendered by the parent route)
-
-        Example:
-
-        ```js
-        App.ApplicationRoute = App.Route.extend({
-          actions: {
-            showModal: function(evt) {
-              this.render(evt.modalName, {
-                outlet: 'modal',
-                into: 'application'
-              });
-            },
-            hideModal: function(evt) {
-              this.disconnectOutlet({
-                outlet: 'modal',
-                parentView: 'application'
-              });
-            }
-          }
-        });
-        ```
-
-        Alternatively, you can pass the `outlet` name directly as a string.
-
-        Example:
-
-        ```js
-        hideModal: function(evt) {
-          this.disconnectOutlet('modal');
-        }
-        ```
-
-        @method disconnectOutlet
-        @param {Object|String} options the options hash or outlet name
-      */
-      disconnectOutlet: function(options) {
-        if (!options || typeof options === "string") {
-          var outletName = options;
-          options = {};
-          options.outlet = outletName;
-        }
-        options.parentView = options.parentView ? options.parentView.replace(/\//g, '.') : parentTemplate(this);
-        options.outlet = options.outlet || 'main';
-
-        var parentView = this.router._lookupActiveView(options.parentView);
-        if (parentView) { parentView.disconnectOutlet(options.outlet); }
-      },
-
-      willDestroy: function() {
-        this.teardownViews();
-      },
-
-      /**
-        @private
-
-        @method teardownViews
-      */
-      teardownViews: function() {
-        // Tear down the top level view
-        if (this.teardownTopLevelView) { this.teardownTopLevelView(); }
-
-        // Tear down any outlets rendered with 'into'
-        var teardownOutletViews = this.teardownOutletViews || [];
-        a_forEach(teardownOutletViews, function(teardownOutletView) {
-          teardownOutletView();
-        });
-
-        delete this.teardownTopLevelView;
-        delete this.teardownOutletViews;
-        delete this.lastRenderedTemplate;
-      }
-    });
-
-
-    if (Ember.FEATURES.isEnabled("query-params-new")) {
-      Route.reopen({
-        /**
-          Configuration hash for this route's queryParams. The possible
-          configuration options and their defaults are as follows
-          (assuming a query param whose URL key is `page`):
-
-          ```js
-          queryParams: {
-            page: {
-              // By default, controller query param properties don't
-              // cause a full transition when they are changed, but
-              // rather only cause the URL to update. Setting
-              // `refreshModel` to true will cause an "in-place"
-              // transition to occur, whereby the model hooks for
-              // this route (and any child routes) will re-fire, allowing
-              // you to reload models (e.g., from the server) using the
-              // updated query param values.
-              refreshModel: false,
-
-              // By default, changes to controller query param properties
-              // cause the URL to update via `pushState`, which means an
-              // item will be added to the browser's history, allowing
-              // you to use the back button to restore the app to the
-              // previous state before the query param property was changed.
-              // Setting `replace` to true will use `replaceState` (or its
-              // hash location equivalent), which causes no browser history
-              // item to be added. This options name and default value are
-              // the same as the `link-to` helper's `replace` option.
-              replace: false
-            }
-          }
-          ```
-
-          @property queryParams
-          @for Ember.Route
-          @type Hash
-        */
-        queryParams: {},
-
-        _qp: computed(function() {
-          var controllerName = this.controllerName || this.routeName,
-              fullName = this.container.normalize('controller:' + controllerName),
-              controllerClass = this.container.lookupFactory(fullName);
-
-          if (!controllerClass) { return; }
-
-          var controllerProto = controllerClass.proto(),
-              queryParams = get(controllerProto, 'queryParams');
-
-          if (!queryParams || queryParams.length === 0) { return; }
-
-          var qps = [], map = {};
-          for (var i = 0, len = queryParams.length; i < len; ++i) {
-            var queryParamMapping = queryParams[i],
-                parts = queryParamMapping.split(':'),
-                propName = parts[0],
-                urlKey = parts[1] || propName,
-                defaultValue = get(controllerProto, propName),
-                type = typeOf(defaultValue),
-                defaultValueSerialized = this.serializeQueryParam(defaultValue, urlKey, type),
-                qp = {
-                  def: defaultValue,
-                  sdef: defaultValueSerialized,
-                  type: type,
-                  urlKey: urlKey,
-                  prop: propName,
-                  ctrl: controllerName,
-                  value: defaultValue,
-                  svalue: defaultValueSerialized,
-                  route: this
-                };
-
-            // Construct all the different ways this query param
-            // can be referenced, either from link-to or transitionTo:
-            // - {{link-to (query-params page=5)}}
-            // - {{link-to (query-params articles:page=5)}}
-            // - {{link-to (query-params articles_page=5)}}
-            // - {{link-to (query-params articles:articles_page=5)}}
-            // - transitionTo({ queryParams: { page: 5 } })
-            // ... etc.
-
-            map[propName] = map[urlKey] = map[controllerName + ':' + propName] = qp;
-            qps.push(qp);
-          }
-
-          return {
-            qps: qps,
-            map: map
-          };
-        }),
-
-        mergedProperties: ['queryParams'],
-
-        paramsFor: function(name) {
-          var route = this.container.lookup('route:' + name);
-
-          if (!route) {
-            return {};
-          }
-
-          var transition = this.router.router.activeTransition,
-              params, queryParams;
-
-          if (transition) {
-            params = transition.params[name] || {};
-            queryParams = transition.queryParams;
-          } else {
-            var state = this.router.router.state;
-            params = state.params[name] || {};
-            queryParams = state.queryParams;
-          }
-
-          var qpMeta = get(route, '_qp');
-
-          if (!qpMeta) {
-            // No query params specified on the controller.
-            return params;
-          }
-
-          var qps = qpMeta.qps, map = qpMeta.map, qp;
-
-          // Loop through all the query params defined on the controller
-          for (var i = 0, len = qps.length; i < len; ++i) {
-            // Put deserialized qp on params hash.
-            qp = qps[i];
-            params[qp.urlKey] = qp.value;
-          }
-
-          // Override params hash values with any input query params
-          // from the transition attempt.
-          for (var urlKey in queryParams) {
-            // Ignore any params not for this route.
-            if (!(urlKey in map)) { continue; }
-
-            var svalue = queryParams[urlKey];
-            qp = map[urlKey];
-            if (svalue === null) {
-              // Query param was removed from address bar.
-              svalue = qp.sdef;
-            }
-
-            // Deserialize and stash on params.
-            params[urlKey] = route.deserializeQueryParam(svalue, urlKey, qp.type);
-          }
-
-          return params;
-        },
-
-        serializeQueryParam: function(value, urlKey, defaultValueType) {
-          // urlKey isn't used here, but anyone overriding
-          // can use it to provide serialization specific
-          // to a certain query param.
-          if (defaultValueType === 'array') {
-            return JSON.stringify(value);
-          }
-          return '' + value;
-        },
-
-        deserializeQueryParam: function(value, urlKey, defaultValueType) {
-          // urlKey isn't used here, but anyone overriding
-          // can use it to provide deserialization specific
-          // to a certain query param.
-
-          // Use the defaultValueType of the default value (the initial value assigned to a
-          // controller query param property), to intelligently deserialize and cast.
-          if (defaultValueType === 'boolean') {
-            return (value === 'true') ? true : false;
-          } else if (defaultValueType === 'number') {
-            return (Number(value)).valueOf();
-          } else if (defaultValueType === 'array') {
-            return Ember.A(JSON.parse(value));
-          }
-          return value;
-        },
-
-        _qpChanged: function(controller, propName) {
-          // Normalize array observer firings.
-          if (propName.slice(propName.length - 3) === '.[]') {
-            propName = propName.substr(0, propName.length-3);
-          }
-
-          var qpMeta = get(this, '_qp'),
-              qp = qpMeta.map[propName];
-
-          if (controller._finalizingQueryParams) {
-            var changes = controller._queryParamChangesDuringSuspension;
-            if (changes) {
-              changes[qp.urlKey] = true;
-            }
-            return;
-          }
-
-          var value = copy(get(controller, propName));
-
-          this.router._queuedQPChanges[qp.prop] = value;
-          run.once(this, this._fireQueryParamTransition);
-        },
-
-        _fireQueryParamTransition: function() {
-          this.transitionTo({ queryParams: this.router._queuedQPChanges });
-          this.router._queuedQPChanges = {};
-        }
-      });
-    }
-
-    function parentRoute(route) {
-      var handlerInfos = route.router.router.state.handlerInfos;
-
-      if (!handlerInfos) { return; }
-
-      var parent, current;
-
-      for (var i=0, l=handlerInfos.length; i<l; i++) {
-        current = handlerInfos[i].handler;
-        if (current === route) { return parent; }
-        parent = current;
-      }
-    }
-
-    function parentTemplate(route) {
-      var parent = parentRoute(route), template;
-
-      if (!parent) { return; }
-
-      if (template = parent.lastRenderedTemplate) {
-        return template;
-      } else {
-        return parentTemplate(parent);
-      }
-    }
-
-    function normalizeOptions(route, name, template, options) {
-      options = options || {};
-      options.into = options.into ? options.into.replace(/\//g, '.') : parentTemplate(route);
-      options.outlet = options.outlet || 'main';
-      options.name = name;
-      options.template = template;
-      options.LOG_VIEW_LOOKUPS = get(route.router, 'namespace.LOG_VIEW_LOOKUPS');
-
-      Ember.assert("An outlet ("+options.outlet+") was specified but was not found.", options.outlet === 'main' || options.into);
-
-      var controller = options.controller,
-          model = options.model,
-          namedController;
-
-      if (options.controller) {
-        controller = options.controller;
-      } else if (namedController = route.container.lookup('controller:' + name)) {
-        controller = namedController;
-      } else {
-        controller = route.controllerName || route.routeName;
-      }
-
-      if (typeof controller === 'string') {
-        var controllerName = controller;
-        controller = route.container.lookup('controller:' + controllerName);
-        if (!controller) {
-          throw new EmberError("You passed `controller: '" + controllerName + "'` into the `render` method, but no such controller could be found.");
-        }
-      }
-
-      
-        if(model) {
-          controller.set('content', model);
-        }
-      
-
-      options.controller = controller;
-
-      return options;
-    }
-
-    function setupView(view, container, options) {
-      if (view) {
-        if (options.LOG_VIEW_LOOKUPS) {
-          Ember.Logger.info("Rendering " + options.name + " with " + view, { fullName: 'view:' + options.name });
-        }
-      } else {
-        var defaultView = options.into ? 'view:default' : 'view:toplevel';
-        view = container.lookup(defaultView);
-        if (options.LOG_VIEW_LOOKUPS) {
-          Ember.Logger.info("Rendering " + options.name + " with default view " + view, { fullName: 'view:' + options.name });
-        }
-      }
-
-      if (!get(view, 'templateName')) {
-        set(view, 'template', options.template);
-
-        set(view, '_debugTemplateName', options.name);
-      }
-
-      set(view, 'renderedName', options.name);
-      set(view, 'controller', options.controller);
-
-      return view;
-    }
-
-    function appendView(route, view, options) {
-      if (options.into) {
-        var parentView = route.router._lookupActiveView(options.into);
-        var teardownOutletView = generateOutletTeardown(parentView, options.outlet);
-        if (!route.teardownOutletViews) { route.teardownOutletViews = []; }
-        a_replace(route.teardownOutletViews, 0, 0, [teardownOutletView]);
-        parentView.connectOutlet(options.outlet, view);
-      } else {
-        var rootElement = get(route, 'router.namespace.rootElement');
-        // tear down view if one is already rendered
-        if (route.teardownTopLevelView) {
-          route.teardownTopLevelView();
-        }
-        route.router._connectActiveView(options.name, view);
-        route.teardownTopLevelView = generateTopLevelTeardown(view);
-        view.appendTo(rootElement);
-      }
-    }
-
-    function generateTopLevelTeardown(view) {
-      return function() { view.destroy(); };
-    }
-
-    function generateOutletTeardown(parentView, outlet) {
-      return function() { parentView.disconnectOutlet(outlet); };
-    }
-
-    function toggleQueryParamObservers(route, controller, enable) {
-      var queryParams = get(controller, 'queryParams'), i, len,
-          method = enable ? 'addObserver' : 'removeObserver';
-
-      for (i = 0, len = queryParams.length; i < len; ++i) {
-        var prop = queryParams[i].split(':')[0];
-        controller[method](prop,         route, route._qpChanged);
-        controller[method](prop + '.[]', route, route._qpChanged);
-      }
-    }
-
-    __exports__["default"] = Route;
-  });
-define("ember-routing/system/router", 
-  ["ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/array","ember-metal/properties","ember-metal/computed","ember-metal/merge","ember-metal/run_loop","ember-metal/enumerable_utils","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/mixins/evented","ember-routing/system/dsl","ember-views/views/view","ember-routing/location/api","ember-handlebars/views/metamorph_view","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // FEATURES, Logger, K, assert
-    var EmberError = __dependency2__["default"];
-    var get = __dependency3__.get;
-    var set = __dependency4__.set;
-    var forEach = __dependency5__.forEach;
-    var defineProperty = __dependency6__.defineProperty;
-    var computed = __dependency7__.computed;
-    var merge = __dependency8__["default"];
-    var run = __dependency9__["default"];
-    var EnumerableUtils = __dependency10__["default"];
-
-    var fmt = __dependency11__.fmt;
-    var EmberObject = __dependency12__["default"];
-    var Evented = __dependency13__["default"];
-    var EmberRouterDSL = __dependency14__["default"];
-    var EmberView = __dependency15__.View;
-    var EmberLocation = __dependency16__["default"];
-    var _MetamorphView = __dependency17__._MetamorphView;
-
-    // requireModule("ember-handlebars");
-    // requireModule("ember-runtime");
-    // requireModule("ember-views");
-
-    /**
-    @module ember
-    @submodule ember-routing
-    */
-
-    // // side effect of loading some Ember globals, for now
-    // requireModule("ember-handlebars");
-    // requireModule("ember-runtime");
-    // requireModule("ember-views");
-
-    var Router = requireModule("router")['default'];
-    var Transition = requireModule("router/transition").Transition;
-
-    var slice = [].slice;
-    var forEach = EnumerableUtils.forEach;
-
-    var DefaultView = _MetamorphView;
-
-    /**
-      The `Ember.Router` class manages the application state and URLs. Refer to
-      the [routing guide](http://emberjs.com/guides/routing/) for documentation.
-
-      @class Router
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var EmberRouter = EmberObject.extend(Evented, {
-      /**
-        The `location` property determines the type of URL's that your
-        application will use.
-
-        The following location types are currently available:
-
-        * `hash`
-        * `history`
-        * `none`
-
-        @property location
-        @default 'hash'
-        @see {Ember.Location}
-      */
-      location: 'hash',
-
-      init: function() {
-        this.router = this.constructor.router || this.constructor.map(Ember.K);
-        this._activeViews = {};
-        this._setupLocation();
-        this._qpCache = {};
-        this._queuedQPChanges = {};
-
-        if (get(this, 'namespace.LOG_TRANSITIONS_INTERNAL')) {
-          this.router.log = Ember.Logger.debug;
-        }
-      },
-
-      /**
-        Represents the current URL.
-
-        @method url
-        @returns {String} The current URL.
-      */
-      url: computed(function() {
-        return get(this, 'location').getURL();
-      }),
-
-      /**
-        Initializes the current router instance and sets up the change handling
-        event listeners used by the instances `location` implementation.
-
-        A property named `initialURL` will be used to determine the initial URL.
-        If no value is found `/` will be used.
-
-        @method startRouting
-        @private
-      */
-      startRouting: function() {
-        this.router = this.router || this.constructor.map(Ember.K);
-
-        var router = this.router,
-            location = get(this, 'location'),
-            container = this.container,
-            self = this,
-            initialURL = get(this, 'initialURL');
-
-        // Allow the Location class to cancel the router setup while it refreshes
-        // the page
-        if (get(location, 'cancelRouterSetup')) {
-          return;
-        }
-
-        this._setupRouter(router, location);
-
-        container.register('view:default', DefaultView);
-        container.register('view:toplevel', EmberView.extend());
-
-        location.onUpdateURL(function(url) {
-          self.handleURL(url);
-        });
-
-        if (typeof initialURL === "undefined") {
-          initialURL = location.getURL();
-        }
-
-        this.handleURL(initialURL);
-      },
-
-      /**
-        Handles updating the paths and notifying any listeners of the URL
-        change.
-
-        Triggers the router level `didTransition` hook.
-
-        @method didTransition
-        @private
-      */
-      didTransition: function(infos) {
-        updatePaths(this);
-
-        this._cancelLoadingEvent();
-
-        this.notifyPropertyChange('url');
-
-        // Put this in the runloop so url will be accurate. Seems
-        // less surprising than didTransition being out of sync.
-        run.once(this, this.trigger, 'didTransition');
-
-        if (get(this, 'namespace').LOG_TRANSITIONS) {
-          Ember.Logger.log("Transitioned into '" + EmberRouter._routePath(infos) + "'");
-        }
-      },
-
-      handleURL: function(url) {
-        return this._doTransition('handleURL', [url]);
-      },
-
-      transitionTo: function() {
-        return this._doTransition('transitionTo', arguments);
-      },
-
-      intermediateTransitionTo: function() {
-        this.router.intermediateTransitionTo.apply(this.router, arguments);
-
-        updatePaths(this);
-
-        var infos = this.router.currentHandlerInfos;
-        if (get(this, 'namespace').LOG_TRANSITIONS) {
-          Ember.Logger.log("Intermediate-transitioned into '" + EmberRouter._routePath(infos) + "'");
-        }
-      },
-
-      replaceWith: function() {
-        return this._doTransition('replaceWith', arguments);
-      },
-
-      generate: function() {
-        var url = this.router.generate.apply(this.router, arguments);
-        return this.location.formatURL(url);
-      },
-
-      /**
-        Determines if the supplied route is currently active.
-
-        @method isActive
-        @param routeName
-        @returns {Boolean}
-        @private
-      */
-      isActive: function(routeName) {
-        var router = this.router;
-        return router.isActive.apply(router, arguments);
-      },
-
-      send: function(name, context) {
-        this.router.trigger.apply(this.router, arguments);
-      },
-
-      /**
-        Does this router instance have the given route.
-
-        @method hasRoute
-        @returns {Boolean}
-        @private
-      */
-      hasRoute: function(route) {
-        return this.router.hasRoute(route);
-      },
-
-      /**
-        Resets the state of the router by clearing the current route
-        handlers and deactivating them.
-
-        @private
-        @method reset
-       */
-      reset: function() {
-        this.router.reset();
-      },
-
-      _lookupActiveView: function(templateName) {
-        var active = this._activeViews[templateName];
-        return active && active[0];
-      },
-
-      _connectActiveView: function(templateName, view) {
-        var existing = this._activeViews[templateName];
-
-        if (existing) {
-          existing[0].off('willDestroyElement', this, existing[1]);
-        }
-
-        var disconnect = function() {
-          delete this._activeViews[templateName];
-        };
-
-        this._activeViews[templateName] = [view, disconnect];
-        view.one('willDestroyElement', this, disconnect);
-      },
-
-      _setupLocation: function() {
-        var location = get(this, 'location'),
-            rootURL = get(this, 'rootURL');
-
-        if ('string' === typeof location && this.container) {
-          var resolvedLocation = this.container.lookup('location:' + location);
-
-          if ('undefined' !== typeof resolvedLocation) {
-            location = set(this, 'location', resolvedLocation);
-          } else {
-            // Allow for deprecated registration of custom location API's
-            var options = {implementation: location};
-
-            location = set(this, 'location', EmberLocation.create(options));
-          }
-        }
-
-        if (typeof rootURL === 'string') {
-          location.rootURL = rootURL;
-        }
-
-        // ensure that initState is called AFTER the rootURL is set on
-        // the location instance
-        if (typeof location.initState === 'function') { location.initState(); }
-      },
-
-      _getHandlerFunction: function() {
-        var seen = {}, container = this.container,
-            DefaultRoute = container.lookupFactory('route:basic'),
-            self = this;
-
-        return function(name) {
-          var routeName = 'route:' + name,
-              handler = container.lookup(routeName);
-
-          if (seen[name]) { return handler; }
-
-          seen[name] = true;
-
-          if (!handler) {
-            container.register(routeName, DefaultRoute.extend());
-            handler = container.lookup(routeName);
-
-            if (get(self, 'namespace.LOG_ACTIVE_GENERATION')) {
-              Ember.Logger.info("generated -> " + routeName, { fullName: routeName });
-            }
-          }
-
-          handler.routeName = name;
-          return handler;
-        };
-      },
-
-      _setupRouter: function(router, location) {
-        var lastURL, emberRouter = this;
-
-        router.getHandler = this._getHandlerFunction();
-
-        var doUpdateURL = function() {
-          location.setURL(lastURL);
-        };
-
-        router.updateURL = function(path) {
-          lastURL = path;
-          run.once(doUpdateURL);
-        };
-
-        if (location.replaceURL) {
-          var doReplaceURL = function() {
-            location.replaceURL(lastURL);
-          };
-
-          router.replaceURL = function(path) {
-            lastURL = path;
-            run.once(doReplaceURL);
-          };
-        }
-
-        router.didTransition = function(infos) {
-          emberRouter.didTransition(infos);
-        };
-      },
-
-      _doTransition: function(method, args) {
-        // Normalize blank route to root URL.
-        args = slice.call(args);
-        args[0] = args[0] || '/';
-
-        var name = args[0], self = this,
-          isQueryParamsOnly = false, queryParams;
-
-        if (Ember.FEATURES.isEnabled("query-params-new")) {
-
-          var possibleQueryParamArg = args[args.length - 1];
-          if (possibleQueryParamArg && possibleQueryParamArg.hasOwnProperty('queryParams')) {
-            if (args.length === 1) {
-              isQueryParamsOnly = true;
-              name = null;
-            }
-            queryParams = args[args.length - 1].queryParams;
-          }
-        }
-
-        if (!isQueryParamsOnly && name.charAt(0) !== '/') {
-          Ember.assert("The route " + name + " was not found", this.router.hasRoute(name));
-        }
-
-        if (queryParams) {
-          // router.js expects queryParams to be passed in in
-          // their final serialized form, so we need to translate.
-
-          if (!name) {
-            // Need to determine destination route name.
-            var handlerInfos = this.router.activeTransition ?
-                               this.router.activeTransition.state.handlerInfos :
-                               this.router.state.handlerInfos;
-            name = handlerInfos[handlerInfos.length - 1].name;
-            args.unshift(name);
-          }
-
-          var qpCache = this._queryParamsFor(name), qps = qpCache.qps;
-
-          var finalParams = {};
-          for (var key in queryParams) {
-            if (!queryParams.hasOwnProperty(key)) { continue; }
-            var inputValue = queryParams[key],
-                qp = qpCache.map[key];
-
-            if (!qp) {
-              throw new EmberError("Unrecognized query param " + key + " provided as transition argument");
-            }
-            finalParams[qp.urlKey] = qp.route.serializeQueryParam(inputValue, qp.urlKey, qp.type);
-          }
-
-          // Perform any necessary serialization.
-          args[args.length-1].queryParams = finalParams;
-        }
-
-        var transitionPromise = this.router[method].apply(this.router, args);
-
-        transitionPromise.then(null, function(error) {
-          if (error && error.name === "UnrecognizedURLError") {
-            Ember.assert("The URL '" + error.message + "' did not match any routes in your application");
-          }
-        }, 'Ember: Check for Router unrecognized URL error');
-
-        // We want to return the configurable promise object
-        // so that callers of this function can use `.method()` on it,
-        // which obviously doesn't exist for normal RSVP promises.
-        return transitionPromise;
-      },
-
-      _queryParamsFor: function(leafRouteName) {
-        if (this._qpCache[leafRouteName]) {
-          return this._qpCache[leafRouteName];
-        }
-
-        var map = {}, qps = [], qpCache = this._qpCache[leafRouteName] = {
-          map: map,
-          qps: qps
-        };
-
-        var routerjs = this.router,
-            recogHandlerInfos = routerjs.recognizer.handlersFor(leafRouteName);
-
-        for (var i = 0, len = recogHandlerInfos.length; i < len; ++i) {
-          var recogHandler = recogHandlerInfos[i],
-              route = routerjs.getHandler(recogHandler.handler),
-              qpMeta = get(route, '_qp');
-
-          if (!qpMeta) { continue; }
-
-          merge(map, qpMeta.map);
-          qps.push.apply(qps, qpMeta.qps);
-        }
-
-        return {
-          qps: qps,
-          map: map
-        };
-      },
-
-      _scheduleLoadingEvent: function(transition, originRoute) {
-        this._cancelLoadingEvent();
-        this._loadingStateTimer = run.scheduleOnce('routerTransitions', this, '_fireLoadingEvent', transition, originRoute);
-      },
-
-      _fireLoadingEvent: function(transition, originRoute) {
-        if (!this.router.activeTransition) {
-          // Don't fire an event if we've since moved on from
-          // the transition that put us in a loading state.
-          return;
-        }
-
-        transition.trigger(true, 'loading', transition, originRoute);
-      },
-
-      _cancelLoadingEvent: function () {
-        if (this._loadingStateTimer) {
-          run.cancel(this._loadingStateTimer);
-        }
-        this._loadingStateTimer = null;
-      }
-    });
-
-    function controllerOrProtoFor(controllerName, container, getProto) {
-      var fullName = container.normalize('controller:' + controllerName);
-      if (!getProto && container.cache.has(fullName)) {
-        return container.lookup(fullName);
-      } else {
-        // Controller hasn't been instantiated yet; just return its proto.
-        var controllerClass = container.lookupFactory(fullName);
-        if (controllerClass && typeof controllerClass.proto === 'function') {
-          return controllerClass.proto();
-        } else {
-          return {};
-        }
-      }
-    }
-
-    /**
-      Helper function for iterating root-ward, starting
-      from (but not including) the provided `originRoute`.
-
-      Returns true if the last callback fired requested
-      to bubble upward.
-
-      @private
-     */
-    function forEachRouteAbove(originRoute, transition, callback) {
-      var handlerInfos = transition.state.handlerInfos,
-          originRouteFound = false;
-
-      for (var i = handlerInfos.length - 1; i >= 0; --i) {
-        var handlerInfo = handlerInfos[i],
-            route = handlerInfo.handler;
-
-        if (!originRouteFound) {
-          if (originRoute === route) {
-            originRouteFound = true;
-          }
-          continue;
-        }
-
-        if (callback(route, handlerInfos[i + 1].handler) !== true) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    // These get invoked when an action bubbles above ApplicationRoute
-    // and are not meant to be overridable.
-    var defaultActionHandlers = {
-
-      willResolveModel: function(transition, originRoute) {
-        originRoute.router._scheduleLoadingEvent(transition, originRoute);
-      },
-
-      error: function(error, transition, originRoute) {
-        // Attempt to find an appropriate error substate to enter.
-        var router = originRoute.router;
-
-        var tryTopLevel = forEachRouteAbove(originRoute, transition, function(route, childRoute) {
-          var childErrorRouteName = findChildRouteName(route, childRoute, 'error');
-          if (childErrorRouteName) {
-            router.intermediateTransitionTo(childErrorRouteName, error);
-            return;
-          }
-          return true;
-        });
-
-        if (tryTopLevel) {
-          // Check for top-level error state to enter.
-          if (routeHasBeenDefined(originRoute.router, 'application_error')) {
-            router.intermediateTransitionTo('application_error', error);
-            return;
-          }
-        } else {
-          // Don't fire an assertion if we found an error substate.
-          return;
-        }
-
-        Ember.Logger.error('Error while loading route: ' + (error && error.stack));
-      },
-
-      loading: function(transition, originRoute) {
-        // Attempt to find an appropriate loading substate to enter.
-        var router = originRoute.router;
-
-        var tryTopLevel = forEachRouteAbove(originRoute, transition, function(route, childRoute) {
-          var childLoadingRouteName = findChildRouteName(route, childRoute, 'loading');
-
-          if (childLoadingRouteName) {
-            router.intermediateTransitionTo(childLoadingRouteName);
-            return;
-          }
-
-          // Don't bubble above pivot route.
-          if (transition.pivotHandler !== route) {
-            return true;
-          }
-        });
-
-        if (tryTopLevel) {
-          // Check for top-level loading state to enter.
-          if (routeHasBeenDefined(originRoute.router, 'application_loading')) {
-            router.intermediateTransitionTo('application_loading');
-            return;
-          }
-        }
-      }
-    };
-
-    function findChildRouteName(parentRoute, originatingChildRoute, name) {
-      var router = parentRoute.router,
-          childName,
-          targetChildRouteName = originatingChildRoute.routeName.split('.').pop(),
-          namespace = parentRoute.routeName === 'application' ? '' : parentRoute.routeName + '.';
-
-      if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) {
-        // First, try a named loading state, e.g. 'foo_loading'
-        childName = namespace + targetChildRouteName + '_' + name;
-        if (routeHasBeenDefined(router, childName)) {
-          return childName;
-        }
-      }
-
-      // Second, try general loading state, e.g. 'loading'
-      childName = namespace + name;
-      if (routeHasBeenDefined(router, childName)) {
-        return childName;
-      }
-    }
-
-    function routeHasBeenDefined(router, name) {
-      var container = router.container;
-      return router.hasRoute(name) &&
-             (container.has('template:' + name) || container.has('route:' + name));
-    }
-
-    function triggerEvent(handlerInfos, ignoreFailure, args) {
-      var name = args.shift();
-
-      if (!handlerInfos) {
-        if (ignoreFailure) { return; }
-        throw new EmberError("Can't trigger action '" + name + "' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call `.send()` on the `Transition` object passed to the `model/beforeModel/afterModel` hooks.");
-      }
-
-      var eventWasHandled = false;
-
-      for (var i = handlerInfos.length - 1; i >= 0; i--) {
-        var handlerInfo = handlerInfos[i],
-            handler = handlerInfo.handler;
-
-        if (handler._actions && handler._actions[name]) {
-          if (handler._actions[name].apply(handler, args) === true) {
-            eventWasHandled = true;
-          } else {
-            return;
-          }
-        }
-      }
-
-      if (defaultActionHandlers[name]) {
-        defaultActionHandlers[name].apply(null, args);
-        return;
-      }
-
-      if (!eventWasHandled && !ignoreFailure) {
-        throw new EmberError("Nothing handled the action '" + name + "'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.");
-      }
-    }
-
-    function updatePaths(router) {
-      var appController = router.container.lookup('controller:application');
-
-      if (!appController) {
-        // appController might not exist when top-level loading/error
-        // substates have been entered since ApplicationRoute hasn't
-        // actually been entered at that point.
-        return;
-      }
-
-      var infos = router.router.currentHandlerInfos,
-          path = EmberRouter._routePath(infos);
-
-      if (!('currentPath' in appController)) {
-        defineProperty(appController, 'currentPath');
-      }
-
-      set(appController, 'currentPath', path);
-
-      if (!('currentRouteName' in appController)) {
-        defineProperty(appController, 'currentRouteName');
-      }
-
-      set(appController, 'currentRouteName', infos[infos.length - 1].name);
-    }
-
-    EmberRouter.reopenClass({
-      router: null,
-      map: function(callback) {
-        var router = this.router;
-        if (!router) {
-          router = new Router();
-          router.callbacks = [];
-          router.triggerEvent = triggerEvent;
-          this.reopenClass({ router: router });
-        }
-
-        var dsl = EmberRouterDSL.map(function() {
-          this.resource('application', { path: "/" }, function() {
-            for (var i=0; i < router.callbacks.length; i++) {
-              router.callbacks[i].call(this);
-            }
-            callback.call(this);
-          });
-        });
-
-        router.callbacks.push(callback);
-        router.map(dsl.generate());
-        return router;
-      },
-
-      _routePath: function(handlerInfos) {
-        var path = [];
-
-        // We have to handle coalescing resource names that
-        // are prefixed with their parent's names, e.g.
-        // ['foo', 'foo.bar.baz'] => 'foo.bar.baz', not 'foo.foo.bar.baz'
-
-        function intersectionMatches(a1, a2) {
-          for (var i = 0, len = a1.length; i < len; ++i) {
-            if (a1[i] !== a2[i]) {
-              return false;
-            }
-          }
-          return true;
-        }
-
-        for (var i=1, l=handlerInfos.length; i<l; i++) {
-          var name = handlerInfos[i].name,
-              nameParts = name.split("."),
-              oldNameParts = slice.call(path);
-
-          while (oldNameParts.length) {
-            if (intersectionMatches(oldNameParts, nameParts)) {
-              break;
-            }
-            oldNameParts.shift();
-          }
-
-          path.push.apply(path, nameParts.slice(oldNameParts.length));
-        }
-
-        return path.join(".");
-      }
-    });
-
-    __exports__["default"] = EmberRouter;
-  });
-define("route-recognizer", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    var specials = [
-      '/', '.', '*', '+', '?', '|',
-      '(', ')', '[', ']', '{', '}', '\\'
-    ];
-
-    var escapeRegex = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
-
-    function isArray(test) {
-      return Object.prototype.toString.call(test) === "[object Array]";
-    }
-
-    // A Segment represents a segment in the original route description.
-    // Each Segment type provides an `eachChar` and `regex` method.
-    //
-    // The `eachChar` method invokes the callback with one or more character
-    // specifications. A character specification consumes one or more input
-    // characters.
-    //
-    // The `regex` method returns a regex fragment for the segment. If the
-    // segment is a dynamic of star segment, the regex fragment also includes
-    // a capture.
-    //
-    // A character specification contains:
-    //
-    // * `validChars`: a String with a list of all valid characters, or
-    // * `invalidChars`: a String with a list of all invalid characters
-    // * `repeat`: true if the character specification can repeat
-
-    function StaticSegment(string) { this.string = string; }
-    StaticSegment.prototype = {
-      eachChar: function(callback) {
-        var string = this.string, ch;
-
-        for (var i=0, l=string.length; i<l; i++) {
-          ch = string.charAt(i);
-          callback({ validChars: ch });
-        }
-      },
-
-      regex: function() {
-        return this.string.replace(escapeRegex, '\\$1');
-      },
-
-      generate: function() {
-        return this.string;
-      }
-    };
-
-    function DynamicSegment(name) { this.name = name; }
-    DynamicSegment.prototype = {
-      eachChar: function(callback) {
-        callback({ invalidChars: "/", repeat: true });
-      },
-
-      regex: function() {
-        return "([^/]+)";
-      },
-
-      generate: function(params) {
-        return params[this.name];
-      }
-    };
-
-    function StarSegment(name) { this.name = name; }
-    StarSegment.prototype = {
-      eachChar: function(callback) {
-        callback({ invalidChars: "", repeat: true });
-      },
-
-      regex: function() {
-        return "(.+)";
-      },
-
-      generate: function(params) {
-        return params[this.name];
-      }
-    };
-
-    function EpsilonSegment() {}
-    EpsilonSegment.prototype = {
-      eachChar: function() {},
-      regex: function() { return ""; },
-      generate: function() { return ""; }
-    };
-
-    function parse(route, names, types) {
-      // normalize route as not starting with a "/". Recognition will
-      // also normalize.
-      if (route.charAt(0) === "/") { route = route.substr(1); }
-
-      var segments = route.split("/"), results = [];
-
-      for (var i=0, l=segments.length; i<l; i++) {
-        var segment = segments[i], match;
-
-        if (match = segment.match(/^:([^\/]+)$/)) {
-          results.push(new DynamicSegment(match[1]));
-          names.push(match[1]);
-          types.dynamics++;
-        } else if (match = segment.match(/^\*([^\/]+)$/)) {
-          results.push(new StarSegment(match[1]));
-          names.push(match[1]);
-          types.stars++;
-        } else if(segment === "") {
-          results.push(new EpsilonSegment());
-        } else {
-          results.push(new StaticSegment(segment));
-          types.statics++;
-        }
-      }
-
-      return results;
-    }
-
-    // A State has a character specification and (`charSpec`) and a list of possible
-    // subsequent states (`nextStates`).
-    //
-    // If a State is an accepting state, it will also have several additional
-    // properties:
-    //
-    // * `regex`: A regular expression that is used to extract parameters from paths
-    //   that reached this accepting state.
-    // * `handlers`: Information on how to convert the list of captures into calls
-    //   to registered handlers with the specified parameters
-    // * `types`: How many static, dynamic or star segments in this route. Used to
-    //   decide which route to use if multiple registered routes match a path.
-    //
-    // Currently, State is implemented naively by looping over `nextStates` and
-    // comparing a character specification against a character. A more efficient
-    // implementation would use a hash of keys pointing at one or more next states.
-
-    function State(charSpec) {
-      this.charSpec = charSpec;
-      this.nextStates = [];
-    }
-
-    State.prototype = {
-      get: function(charSpec) {
-        var nextStates = this.nextStates;
-
-        for (var i=0, l=nextStates.length; i<l; i++) {
-          var child = nextStates[i];
-
-          var isEqual = child.charSpec.validChars === charSpec.validChars;
-          isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;
-
-          if (isEqual) { return child; }
-        }
-      },
-
-      put: function(charSpec) {
-        var state;
-
-        // If the character specification already exists in a child of the current
-        // state, just return that state.
-        if (state = this.get(charSpec)) { return state; }
-
-        // Make a new state for the character spec
-        state = new State(charSpec);
-
-        // Insert the new state as a child of the current state
-        this.nextStates.push(state);
-
-        // If this character specification repeats, insert the new state as a child
-        // of itself. Note that this will not trigger an infinite loop because each
-        // transition during recognition consumes a character.
-        if (charSpec.repeat) {
-          state.nextStates.push(state);
-        }
-
-        // Return the new state
-        return state;
-      },
-
-      // Find a list of child states matching the next character
-      match: function(ch) {
-        // DEBUG "Processing `" + ch + "`:"
-        var nextStates = this.nextStates,
-            child, charSpec, chars;
-
-        // DEBUG "  " + debugState(this)
-        var returned = [];
-
-        for (var i=0, l=nextStates.length; i<l; i++) {
-          child = nextStates[i];
-
-          charSpec = child.charSpec;
-
-          if (typeof (chars = charSpec.validChars) !== 'undefined') {
-            if (chars.indexOf(ch) !== -1) { returned.push(child); }
-          } else if (typeof (chars = charSpec.invalidChars) !== 'undefined') {
-            if (chars.indexOf(ch) === -1) { returned.push(child); }
-          }
-        }
-
-        return returned;
-      }
-
-      /** IF DEBUG
-      , debug: function() {
-        var charSpec = this.charSpec,
-            debug = "[",
-            chars = charSpec.validChars || charSpec.invalidChars;
-
-        if (charSpec.invalidChars) { debug += "^"; }
-        debug += chars;
-        debug += "]";
-
-        if (charSpec.repeat) { debug += "+"; }
-
-        return debug;
-      }
-      END IF **/
-    };
-
-    /** IF DEBUG
-    function debug(log) {
-      console.log(log);
-    }
-
-    function debugState(state) {
-      return state.nextStates.map(function(n) {
-        if (n.nextStates.length === 0) { return "( " + n.debug() + " [accepting] )"; }
-        return "( " + n.debug() + " <then> " + n.nextStates.map(function(s) { return s.debug() }).join(" or ") + " )";
-      }).join(", ")
-    }
-    END IF **/
-
-    // This is a somewhat naive strategy, but should work in a lot of cases
-    // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.
-    //
-    // This strategy generally prefers more static and less dynamic matching.
-    // Specifically, it
-    //
-    //  * prefers fewer stars to more, then
-    //  * prefers using stars for less of the match to more, then
-    //  * prefers fewer dynamic segments to more, then
-    //  * prefers more static segments to more
-    function sortSolutions(states) {
-      return states.sort(function(a, b) {
-        if (a.types.stars !== b.types.stars) { return a.types.stars - b.types.stars; }
-
-        if (a.types.stars) {
-          if (a.types.statics !== b.types.statics) { return b.types.statics - a.types.statics; }
-          if (a.types.dynamics !== b.types.dynamics) { return b.types.dynamics - a.types.dynamics; }
-        }
-
-        if (a.types.dynamics !== b.types.dynamics) { return a.types.dynamics - b.types.dynamics; }
-        if (a.types.statics !== b.types.statics) { return b.types.statics - a.types.statics; }
-
-        return 0;
-      });
-    }
-
-    function recognizeChar(states, ch) {
-      var nextStates = [];
-
-      for (var i=0, l=states.length; i<l; i++) {
-        var state = states[i];
-
-        nextStates = nextStates.concat(state.match(ch));
-      }
-
-      return nextStates;
-    }
-
-    var oCreate = Object.create || function(proto) {
-      function F() {}
-      F.prototype = proto;
-      return new F();
-    };
-
-    function RecognizeResults(queryParams) {
-      this.queryParams = queryParams || {};
-    }
-    RecognizeResults.prototype = oCreate({
-      splice: Array.prototype.splice,
-      slice:  Array.prototype.slice,
-      push:   Array.prototype.push,
-      length: 0,
-      queryParams: null
-    });
-
-    function findHandler(state, path, queryParams) {
-      var handlers = state.handlers, regex = state.regex;
-      var captures = path.match(regex), currentCapture = 1;
-      var result = new RecognizeResults(queryParams);
-
-      for (var i=0, l=handlers.length; i<l; i++) {
-        var handler = handlers[i], names = handler.names, params = {};
-
-        for (var j=0, m=names.length; j<m; j++) {
-          params[names[j]] = captures[currentCapture++];
-        }
-
-        result.push({ handler: handler.handler, params: params, isDynamic: !!names.length });
-      }
-
-      return result;
-    }
-
-    function addSegment(currentState, segment) {
-      segment.eachChar(function(ch) {
-        var state;
-
-        currentState = currentState.put(ch);
-      });
-
-      return currentState;
-    }
-
-    // The main interface
-
-    var RouteRecognizer = function() {
-      this.rootState = new State();
-      this.names = {};
-    };
-
-
-    RouteRecognizer.prototype = {
-      add: function(routes, options) {
-        var currentState = this.rootState, regex = "^",
-            types = { statics: 0, dynamics: 0, stars: 0 },
-            handlers = [], allSegments = [], name;
-
-        var isEmpty = true;
-
-        for (var i=0, l=routes.length; i<l; i++) {
-          var route = routes[i], names = [];
-
-          var segments = parse(route.path, names, types);
-
-          allSegments = allSegments.concat(segments);
-
-          for (var j=0, m=segments.length; j<m; j++) {
-            var segment = segments[j];
-
-            if (segment instanceof EpsilonSegment) { continue; }
-
-            isEmpty = false;
-
-            // Add a "/" for the new segment
-            currentState = currentState.put({ validChars: "/" });
-            regex += "/";
-
-            // Add a representation of the segment to the NFA and regex
-            currentState = addSegment(currentState, segment);
-            regex += segment.regex();
-          }
-
-          var handler = { handler: route.handler, names: names };
-          handlers.push(handler);
-        }
-
-        if (isEmpty) {
-          currentState = currentState.put({ validChars: "/" });
-          regex += "/";
-        }
-
-        currentState.handlers = handlers;
-        currentState.regex = new RegExp(regex + "$");
-        currentState.types = types;
-
-        if (name = options && options.as) {
-          this.names[name] = {
-            segments: allSegments,
-            handlers: handlers
-          };
-        }
-      },
-
-      handlersFor: function(name) {
-        var route = this.names[name], result = [];
-        if (!route) { throw new Error("There is no route named " + name); }
-
-        for (var i=0, l=route.handlers.length; i<l; i++) {
-          result.push(route.handlers[i]);
-        }
-
-        return result;
-      },
-
-      hasRoute: function(name) {
-        return !!this.names[name];
-      },
-
-      generate: function(name, params) {
-        var route = this.names[name], output = "";
-        if (!route) { throw new Error("There is no route named " + name); }
-
-        var segments = route.segments;
-
-        for (var i=0, l=segments.length; i<l; i++) {
-          var segment = segments[i];
-
-          if (segment instanceof EpsilonSegment) { continue; }
-
-          output += "/";
-          output += segment.generate(params);
-        }
-
-        if (output.charAt(0) !== '/') { output = '/' + output; }
-
-        if (params && params.queryParams) {
-          output += this.generateQueryString(params.queryParams, route.handlers);
-        }
-
-        return output;
-      },
-
-      generateQueryString: function(params, handlers) {
-        var pairs = [];
-        var keys = [];
-        for(var key in params) {
-          if (params.hasOwnProperty(key)) {
-            keys.push(key);
-          }
-        }
-        keys.sort();
-        for (var i = 0, len = keys.length; i < len; i++) {
-          key = keys[i];
-          var value = params[key];
-          if (value == null) {
-            continue;
-          }
-          var pair = key;
-          if (isArray(value)) {
-            for (var j = 0, l = value.length; j < l; j++) {
-              var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]);
-              pairs.push(arrayPair);
-            }
-          } else {
-            pair += "=" + encodeURIComponent(value);
-            pairs.push(pair);
-          }
-        }
-
-        if (pairs.length === 0) { return ''; }
-
-        return "?" + pairs.join("&");
-      },
-
-      parseQueryString: function(queryString) {
-        var pairs = queryString.split("&"), queryParams = {};
-        for(var i=0; i < pairs.length; i++) {
-          var pair      = pairs[i].split('='),
-              key       = decodeURIComponent(pair[0]),
-              keyLength = key.length,
-              isArray = false,
-              value;
-          if (pair.length === 1) {
-            value = 'true';
-          } else {
-            //Handle arrays
-            if (keyLength > 2 && key.slice(keyLength -2) === '[]') {
-              isArray = true;
-              key = key.slice(0, keyLength - 2);
-              if(!queryParams[key]) {
-                queryParams[key] = [];
-              }
-            }
-            value = pair[1] ? decodeURIComponent(pair[1]) : '';
-          }
-          if (isArray) {
-            queryParams[key].push(value);
-          } else {
-            queryParams[key] = decodeURIComponent(value);
-          }
-        }
-        return queryParams;
-      },
-
-      recognize: function(path) {
-        var states = [ this.rootState ],
-            pathLen, i, l, queryStart, queryParams = {},
-            isSlashDropped = false;
-
-        path = decodeURI(path);
-
-        queryStart = path.indexOf('?');
-        if (queryStart !== -1) {
-          var queryString = path.substr(queryStart + 1, path.length);
-          path = path.substr(0, queryStart);
-          queryParams = this.parseQueryString(queryString);
-        }
-
-        // DEBUG GROUP path
-
-        if (path.charAt(0) !== "/") { path = "/" + path; }
-
-        pathLen = path.length;
-        if (pathLen > 1 && path.charAt(pathLen - 1) === "/") {
-          path = path.substr(0, pathLen - 1);
-          isSlashDropped = true;
-        }
-
-        for (i=0, l=path.length; i<l; i++) {
-          states = recognizeChar(states, path.charAt(i));
-          if (!states.length) { break; }
-        }
-
-        // END DEBUG GROUP
-
-        var solutions = [];
-        for (i=0, l=states.length; i<l; i++) {
-          if (states[i].handlers) { solutions.push(states[i]); }
-        }
-
-        states = sortSolutions(solutions);
-
-        var state = solutions[0];
-
-        if (state && state.handlers) {
-          // if a trailing slash was dropped and a star segment is the last segment
-          // specified, put the trailing slash back
-          if (isSlashDropped && state.regex.source.slice(-5) === "(.+)$") {
-            path = path + "/";
-          }
-          return findHandler(state, path, queryParams);
-        }
-      }
-    };
-
-    __exports__["default"] = RouteRecognizer;
-
-    function Target(path, matcher, delegate) {
-      this.path = path;
-      this.matcher = matcher;
-      this.delegate = delegate;
-    }
-
-    Target.prototype = {
-      to: function(target, callback) {
-        var delegate = this.delegate;
-
-        if (delegate && delegate.willAddRoute) {
-          target = delegate.willAddRoute(this.matcher.target, target);
-        }
-
-        this.matcher.add(this.path, target);
-
-        if (callback) {
-          if (callback.length === 0) { throw new Error("You must have an argument in the function passed to `to`"); }
-          this.matcher.addChild(this.path, target, callback, this.delegate);
-        }
-        return this;
-      }
-    };
-
-    function Matcher(target) {
-      this.routes = {};
-      this.children = {};
-      this.target = target;
-    }
-
-    Matcher.prototype = {
-      add: function(path, handler) {
-        this.routes[path] = handler;
-      },
-
-      addChild: function(path, target, callback, delegate) {
-        var matcher = new Matcher(target);
-        this.children[path] = matcher;
-
-        var match = generateMatch(path, matcher, delegate);
-
-        if (delegate && delegate.contextEntered) {
-          delegate.contextEntered(target, match);
-        }
-
-        callback(match);
-      }
-    };
-
-    function generateMatch(startingPath, matcher, delegate) {
-      return function(path, nestedCallback) {
-        var fullPath = startingPath + path;
-
-        if (nestedCallback) {
-          nestedCallback(generateMatch(fullPath, matcher, delegate));
-        } else {
-          return new Target(startingPath + path, matcher, delegate);
-        }
-      };
-    }
-
-    function addRoute(routeArray, path, handler) {
-      var len = 0;
-      for (var i=0, l=routeArray.length; i<l; i++) {
-        len += routeArray[i].path.length;
-      }
-
-      path = path.substr(len);
-      var route = { path: path, handler: handler };
-      routeArray.push(route);
-    }
-
-    function eachRoute(baseRoute, matcher, callback, binding) {
-      var routes = matcher.routes;
-
-      for (var path in routes) {
-        if (routes.hasOwnProperty(path)) {
-          var routeArray = baseRoute.slice();
-          addRoute(routeArray, path, routes[path]);
-
-          if (matcher.children[path]) {
-            eachRoute(routeArray, matcher.children[path], callback, binding);
-          } else {
-            callback.call(binding, routeArray);
-          }
-        }
-      }
-    }
-
-    RouteRecognizer.prototype.map = function(callback, addRouteCallback) {
-      var matcher = new Matcher();
-
-      callback(generateMatch("", matcher, this.delegate));
-
-      eachRoute([], matcher, function(route) {
-        if (addRouteCallback) { addRouteCallback(this, route); }
-        else { this.add(route); }
-      }, this);
-    };
-  });
-
-define("router/handler-info", 
-  ["./utils","rsvp/promise","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var bind = __dependency1__.bind;
-    var merge = __dependency1__.merge;
-    var oCreate = __dependency1__.oCreate;
-    var serialize = __dependency1__.serialize;
-    var promiseLabel = __dependency1__.promiseLabel;
-    var Promise = __dependency2__["default"];
-
-    function HandlerInfo(props) {
-      if (props) {
-        merge(this, props);
-      }
-    }
-
-    HandlerInfo.prototype = {
-      name: null,
-      handler: null,
-      params: null,
-      context: null,
-
-      log: function(payload, message) {
-        if (payload.log) {
-          payload.log(this.name + ': ' + message);
-        }
-      },
-
-      promiseLabel: function(label) {
-        return promiseLabel("'" + this.name + "' " + label);
-      },
-
-      getUnresolved: function() {
-        return this;
-      },
-
-      resolve: function(async, shouldContinue, payload) {
-        var checkForAbort  = bind(this.checkForAbort,      this, shouldContinue),
-            beforeModel    = bind(this.runBeforeModelHook, this, async, payload),
-            model          = bind(this.getModel,           this, async, payload),
-            afterModel     = bind(this.runAfterModelHook,  this, async, payload),
-            becomeResolved = bind(this.becomeResolved,     this, payload);
-
-        return Promise.resolve(undefined, this.promiseLabel("Start handler"))
-               .then(checkForAbort, null, this.promiseLabel("Check for abort"))
-               .then(beforeModel, null, this.promiseLabel("Before model"))
-               .then(checkForAbort, null, this.promiseLabel("Check if aborted during 'beforeModel' hook"))
-               .then(model, null, this.promiseLabel("Model"))
-               .then(checkForAbort, null, this.promiseLabel("Check if aborted in 'model' hook"))
-               .then(afterModel, null, this.promiseLabel("After model"))
-               .then(checkForAbort, null, this.promiseLabel("Check if aborted in 'afterModel' hook"))
-               .then(becomeResolved, null, this.promiseLabel("Become resolved"));
-      },
-
-      runBeforeModelHook: function(async, payload) {
-        if (payload.trigger) {
-          payload.trigger(true, 'willResolveModel', payload, this.handler);
-        }
-        return this.runSharedModelHook(async, payload, 'beforeModel', []);
-      },
-
-      runAfterModelHook: function(async, payload, resolvedModel) {
-        // Stash the resolved model on the payload.
-        // This makes it possible for users to swap out
-        // the resolved model in afterModel.
-        var name = this.name;
-        this.stashResolvedModel(payload, resolvedModel);
-
-        return this.runSharedModelHook(async, payload, 'afterModel', [resolvedModel])
-                   .then(function() {
-                     // Ignore the fulfilled value returned from afterModel.
-                     // Return the value stashed in resolvedModels, which
-                     // might have been swapped out in afterModel.
-                     return payload.resolvedModels[name];
-                   }, null, this.promiseLabel("Ignore fulfillment value and return model value"));
-      },
-
-      runSharedModelHook: function(async, payload, hookName, args) {
-        this.log(payload, "calling " + hookName + " hook");
-
-        if (this.queryParams) {
-          args.push(this.queryParams);
-        }
-        args.push(payload);
-
-        var handler = this.handler;
-        return async(function() {
-          return handler[hookName] && handler[hookName].apply(handler, args);
-        }, this.promiseLabel("Handle " + hookName));
-      },
-
-      getModel: function(payload) {
-        throw new Error("This should be overridden by a subclass of HandlerInfo");
-      },
-
-      checkForAbort: function(shouldContinue, promiseValue) {
-        return Promise.resolve(shouldContinue(), this.promiseLabel("Check for abort")).then(function() {
-          // We don't care about shouldContinue's resolve value;
-          // pass along the original value passed to this fn.
-          return promiseValue;
-        }, null, this.promiseLabel("Ignore fulfillment value and continue"));
-      },
-
-      stashResolvedModel: function(payload, resolvedModel) {
-        payload.resolvedModels = payload.resolvedModels || {};
-        payload.resolvedModels[this.name] = resolvedModel;
-      },
-
-      becomeResolved: function(payload, resolvedContext) {
-        var params = this.params || serialize(this.handler, resolvedContext, this.names);
-
-        if (payload) {
-          this.stashResolvedModel(payload, resolvedContext);
-          payload.params = payload.params || {};
-          payload.params[this.name] = params;
-        }
-
-        return new ResolvedHandlerInfo({
-          context: resolvedContext,
-          name: this.name,
-          handler: this.handler,
-          params: params
-        });
-      },
-
-      shouldSupercede: function(other) {
-        // Prefer this newer handlerInfo over `other` if:
-        // 1) The other one doesn't exist
-        // 2) The names don't match
-        // 3) This handler has a context that doesn't match
-        //    the other one (or the other one doesn't have one).
-        // 4) This handler has parameters that don't match the other.
-        if (!other) { return true; }
-
-        var contextsMatch = (other.context === this.context);
-        return other.name !== this.name ||
-               (this.hasOwnProperty('context') && !contextsMatch) ||
-               (this.hasOwnProperty('params') && !paramsMatch(this.params, other.params));
-      }
-    };
-
-    function ResolvedHandlerInfo(props) {
-      HandlerInfo.call(this, props);
-    }
-
-    ResolvedHandlerInfo.prototype = oCreate(HandlerInfo.prototype);
-    ResolvedHandlerInfo.prototype.resolve = function(async, shouldContinue, payload) {
-      // A ResolvedHandlerInfo just resolved with itself.
-      if (payload && payload.resolvedModels) {
-        payload.resolvedModels[this.name] = this.context;
-      }
-      return Promise.resolve(this, this.promiseLabel("Resolve"));
-    };
-
-    ResolvedHandlerInfo.prototype.getUnresolved = function() {
-      return new UnresolvedHandlerInfoByParam({
-        name: this.name,
-        handler: this.handler,
-        params: this.params
-      });
-    };
-
-    // These are generated by URL transitions and
-    // named transitions for non-dynamic route segments.
-    function UnresolvedHandlerInfoByParam(props) {
-      HandlerInfo.call(this, props);
-      this.params = this.params || {};
-    }
-
-    UnresolvedHandlerInfoByParam.prototype = oCreate(HandlerInfo.prototype);
-    UnresolvedHandlerInfoByParam.prototype.getModel = function(async, payload) {
-      var fullParams = this.params;
-      if (payload && payload.queryParams) {
-        fullParams = {};
-        merge(fullParams, this.params);
-        fullParams.queryParams = payload.queryParams;
-      }
-
-      var hookName = typeof this.handler.deserialize === 'function' ?
-                     'deserialize' : 'model';
-
-      return this.runSharedModelHook(async, payload, hookName, [fullParams]);
-    };
-
-
-    // These are generated only for named transitions
-    // with dynamic route segments.
-    function UnresolvedHandlerInfoByObject(props) {
-      HandlerInfo.call(this, props);
-    }
-
-    UnresolvedHandlerInfoByObject.prototype = oCreate(HandlerInfo.prototype);
-    UnresolvedHandlerInfoByObject.prototype.getModel = function(async, payload) {
-      this.log(payload, this.name + ": resolving provided model");
-      return Promise.resolve(this.context);
-    };
-
-    function paramsMatch(a, b) {
-      if ((!a) ^ (!b)) {
-        // Only one is null.
-        return false;
-      }
-
-      if (!a) {
-        // Both must be null.
-        return true;
-      }
-
-      // Note: this assumes that both params have the same
-      // number of keys, but since we're comparing the
-      // same handlers, they should.
-      for (var k in a) {
-        if (a.hasOwnProperty(k) && a[k] !== b[k]) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    __exports__.HandlerInfo = HandlerInfo;
-    __exports__.ResolvedHandlerInfo = ResolvedHandlerInfo;
-    __exports__.UnresolvedHandlerInfoByParam = UnresolvedHandlerInfoByParam;
-    __exports__.UnresolvedHandlerInfoByObject = UnresolvedHandlerInfoByObject;
-  });
-define("router/router", 
-  ["route-recognizer","rsvp/promise","./utils","./transition-state","./transition","./transition-intent/named-transition-intent","./transition-intent/url-transition-intent","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var RouteRecognizer = __dependency1__["default"];
-    var Promise = __dependency2__["default"];
-    var trigger = __dependency3__.trigger;
-    var log = __dependency3__.log;
-    var slice = __dependency3__.slice;
-    var forEach = __dependency3__.forEach;
-    var merge = __dependency3__.merge;
-    var serialize = __dependency3__.serialize;
-    var extractQueryParams = __dependency3__.extractQueryParams;
-    var getChangelist = __dependency3__.getChangelist;
-    var promiseLabel = __dependency3__.promiseLabel;
-    var TransitionState = __dependency4__["default"];
-    var logAbort = __dependency5__.logAbort;
-    var Transition = __dependency5__.Transition;
-    var TransitionAborted = __dependency5__.TransitionAborted;
-    var NamedTransitionIntent = __dependency6__["default"];
-    var URLTransitionIntent = __dependency7__["default"];
-
-    var pop = Array.prototype.pop;
-
-    function Router() {
-      this.recognizer = new RouteRecognizer();
-      this.reset();
-    }
-
-    Router.prototype = {
-
-      /**
-        The main entry point into the router. The API is essentially
-        the same as the `map` method in `route-recognizer`.
-
-        This method extracts the String handler at the last `.to()`
-        call and uses it as the name of the whole route.
-
-        @param {Function} callback
-      */
-      map: function(callback) {
-        this.recognizer.delegate = this.delegate;
-
-        this.recognizer.map(callback, function(recognizer, routes) {
-          for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {
-            var route = routes[i];
-            recognizer.add(routes, { as: route.handler });
-            proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';
-          }
-        });
-      },
-
-      hasRoute: function(route) {
-        return this.recognizer.hasRoute(route);
-      },
-
-      // NOTE: this doesn't really belong here, but here
-      // it shall remain until our ES6 transpiler can
-      // handle cyclical deps.
-      transitionByIntent: function(intent, isIntermediate) {
-
-        var wasTransitioning = !!this.activeTransition;
-        var oldState = wasTransitioning ? this.activeTransition.state : this.state;
-        var newTransition;
-        var router = this;
-
-        try {
-          var newState = intent.applyToState(oldState, this.recognizer, this.getHandler, isIntermediate);
-
-          if (handlerInfosEqual(newState.handlerInfos, oldState.handlerInfos)) {
-
-            // This is a no-op transition. See if query params changed.
-            var queryParamChangelist = getChangelist(oldState.queryParams, newState.queryParams);
-            if (queryParamChangelist) {
-
-              // This is a little hacky but we need some way of storing
-              // changed query params given that no activeTransition
-              // is guaranteed to have occurred.
-              this._changedQueryParams = queryParamChangelist.changed;
-              for (var k in queryParamChangelist.removed) {
-                if (queryParamChangelist.removed.hasOwnProperty(k)) {
-                  this._changedQueryParams[k] = null;
-                }
-              }
-              trigger(this, newState.handlerInfos, true, ['queryParamsDidChange', queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);
-              this._changedQueryParams = null;
-
-              if (!wasTransitioning && this.activeTransition) {
-                // One of the handlers in queryParamsDidChange
-                // caused a transition. Just return that transition.
-                return this.activeTransition;
-              } else {
-                // Running queryParamsDidChange didn't change anything.
-                // Just update query params and be on our way.
-
-                // We have to return a noop transition that will
-                // perform a URL update at the end. This gives
-                // the user the ability to set the url update
-                // method (default is replaceState).
-                newTransition = new Transition(this);
-
-                oldState.queryParams = finalizeQueryParamChange(this, newState.handlerInfos, newState.queryParams, newTransition);
-
-                newTransition.promise = newTransition.promise.then(function(result) {
-                  updateURL(newTransition, oldState, true);
-                  if (router.didTransition) {
-                    router.didTransition(router.currentHandlerInfos);
-                  }
-                  return result;
-                }, null, promiseLabel("Transition complete"));
-                return newTransition;
-              }
-            }
-
-            // No-op. No need to create a new transition.
-            return new Transition(this);
-          }
-
-          if (isIntermediate) {
-            setupContexts(this, newState);
-            return;
-          }
-
-          // Create a new transition to the destination route.
-          newTransition = new Transition(this, intent, newState);
-
-          // Abort and usurp any previously active transition.
-          if (this.activeTransition) {
-            this.activeTransition.abort();
-          }
-          this.activeTransition = newTransition;
-
-          // Transition promises by default resolve with resolved state.
-          // For our purposes, swap out the promise to resolve
-          // after the transition has been finalized.
-          newTransition.promise = newTransition.promise.then(function(result) {
-            return router.async(function() {
-              return finalizeTransition(newTransition, result.state);
-            }, "Finalize transition");
-          }, null, promiseLabel("Settle transition promise when transition is finalized"));
-
-          if (!wasTransitioning) {
-            trigger(this, this.state.handlerInfos, true, ['willTransition', newTransition]);
-          }
-
-          return newTransition;
-        } catch(e) {
-          return new Transition(this, intent, null, e);
-        }
-      },
-
-      /**
-        Clears the current and target route handlers and triggers exit
-        on each of them starting at the leaf and traversing up through
-        its ancestors.
-      */
-      reset: function() {
-        if (this.state) {
-          forEach(this.state.handlerInfos, function(handlerInfo) {
-            var handler = handlerInfo.handler;
-            if (handler.exit) {
-              handler.exit();
-            }
-          });
-        }
-
-        this.state = new TransitionState();
-        this.currentHandlerInfos = null;
-      },
-
-      activeTransition: null,
-
-      /**
-        var handler = handlerInfo.handler;
-        The entry point for handling a change to the URL (usually
-        via the back and forward button).
-
-        Returns an Array of handlers and the parameters associated
-        with those parameters.
-
-        @param {String} url a URL to process
-
-        @return {Array} an Array of `[handler, parameter]` tuples
-      */
-      handleURL: function(url) {
-        // Perform a URL-based transition, but don't change
-        // the URL afterward, since it already happened.
-        var args = slice.call(arguments);
-        if (url.charAt(0) !== '/') { args[0] = '/' + url; }
-
-        return doTransition(this, args).method(null);
-      },
-
-      /**
-        Hook point for updating the URL.
-
-        @param {String} url a URL to update to
-      */
-      updateURL: function() {
-        throw new Error("updateURL is not implemented");
-      },
-
-      /**
-        Hook point for replacing the current URL, i.e. with replaceState
-
-        By default this behaves the same as `updateURL`
-
-        @param {String} url a URL to update to
-      */
-      replaceURL: function(url) {
-        this.updateURL(url);
-      },
-
-      /**
-        Transition into the specified named route.
-
-        If necessary, trigger the exit callback on any handlers
-        that are no longer represented by the target route.
-
-        @param {String} name the name of the route
-      */
-      transitionTo: function(name) {
-        return doTransition(this, arguments);
-      },
-
-      intermediateTransitionTo: function(name) {
-        doTransition(this, arguments, true);
-      },
-
-      refresh: function(pivotHandler) {
-
-
-        var state = this.activeTransition ? this.activeTransition.state : this.state;
-        var handlerInfos = state.handlerInfos;
-        var params = {};
-        for (var i = 0, len = handlerInfos.length; i < len; ++i) {
-          var handlerInfo = handlerInfos[i];
-          params[handlerInfo.name] = handlerInfo.params || {};
-        }
-
-        log(this, "Starting a refresh transition");
-        var intent = new NamedTransitionIntent({
-          name: handlerInfos[handlerInfos.length - 1].name,
-          pivotHandler: pivotHandler || handlerInfos[0].handler,
-          contexts: [], // TODO collect contexts...?
-          queryParams: this._changedQueryParams || state.queryParams || {}
-        });
-
-        return this.transitionByIntent(intent, false);
-      },
-
-      /**
-        Identical to `transitionTo` except that the current URL will be replaced
-        if possible.
-
-        This method is intended primarily for use with `replaceState`.
-
-        @param {String} name the name of the route
-      */
-      replaceWith: function(name) {
-        return doTransition(this, arguments).method('replace');
-      },
-
-      /**
-        Take a named route and context objects and generate a
-        URL.
-
-        @param {String} name the name of the route to generate
-          a URL for
-        @param {...Object} objects a list of objects to serialize
-
-        @return {String} a URL
-      */
-      generate: function(handlerName) {
-
-        var partitionedArgs = extractQueryParams(slice.call(arguments, 1)),
-          suppliedParams = partitionedArgs[0],
-          queryParams = partitionedArgs[1];
-
-        // Construct a TransitionIntent with the provided params
-        // and apply it to the present state of the router.
-        var intent = new NamedTransitionIntent({ name: handlerName, contexts: suppliedParams });
-        var state = intent.applyToState(this.state, this.recognizer, this.getHandler);
-        var params = {};
-
-        for (var i = 0, len = state.handlerInfos.length; i < len; ++i) {
-          var handlerInfo = state.handlerInfos[i];
-          var handlerParams = handlerInfo.params ||
-                              serialize(handlerInfo.handler, handlerInfo.context, handlerInfo.names);
-          merge(params, handlerParams);
-        }
-        params.queryParams = queryParams;
-
-        return this.recognizer.generate(handlerName, params);
-      },
-
-      isActive: function(handlerName) {
-
-        var partitionedArgs   = extractQueryParams(slice.call(arguments, 1)),
-            contexts          = partitionedArgs[0],
-            queryParams       = partitionedArgs[1],
-            activeQueryParams  = this.state.queryParams;
-
-        var targetHandlerInfos = this.state.handlerInfos,
-            found = false, names, object, handlerInfo, handlerObj, i, len;
-
-        if (!targetHandlerInfos.length) { return false; }
-
-        var targetHandler = targetHandlerInfos[targetHandlerInfos.length - 1].name;
-        var recogHandlers = this.recognizer.handlersFor(targetHandler);
-
-        var index = 0;
-        for (len = recogHandlers.length; index < len; ++index) {
-          handlerInfo = targetHandlerInfos[index];
-          if (handlerInfo.name === handlerName) { break; }
-        }
-
-        if (index === recogHandlers.length) {
-          // The provided route name isn't even in the route hierarchy.
-          return false;
-        }
-
-        var state = new TransitionState();
-        state.handlerInfos = targetHandlerInfos.slice(0, index + 1);
-        recogHandlers = recogHandlers.slice(0, index + 1);
-
-        var intent = new NamedTransitionIntent({
-          name: targetHandler,
-          contexts: contexts
-        });
-
-        var newState = intent.applyToHandlers(state, recogHandlers, this.getHandler, targetHandler, true, true);
-
-        // Get a hash of QPs that will still be active on new route
-        var activeQPsOnNewHandler = {};
-        merge(activeQPsOnNewHandler, queryParams);
-        for (var key in activeQueryParams) {
-          if (activeQueryParams.hasOwnProperty(key) &&
-              activeQPsOnNewHandler.hasOwnProperty(key)) {
-            activeQPsOnNewHandler[key] = activeQueryParams[key];
-          }
-        }
-
-        return handlerInfosEqual(newState.handlerInfos, state.handlerInfos) &&
-               !getChangelist(activeQPsOnNewHandler, queryParams);
-      },
-
-      trigger: function(name) {
-        var args = slice.call(arguments);
-        trigger(this, this.currentHandlerInfos, false, args);
-      },
-
-      /**
-        @private
-
-        Pluggable hook for possibly running route hooks
-        in a try-catch escaping manner.
-
-        @param {Function} callback the callback that will
-                          be asynchronously called
-
-        @return {Promise} a promise that fulfills with the
-                          value returned from the callback
-       */
-      async: function(callback, label) {
-        return new Promise(function(resolve) {
-          resolve(callback());
-        }, label);
-      },
-
-      /**
-        Hook point for logging transition status updates.
-
-        @param {String} message The message to log.
-      */
-      log: null
-    };
-
-    /**
-      @private
-
-      Takes an Array of `HandlerInfo`s, figures out which ones are
-      exiting, entering, or changing contexts, and calls the
-      proper handler hooks.
-
-      For example, consider the following tree of handlers. Each handler is
-      followed by the URL segment it handles.
-
-      ```
-      |~index ("/")
-      | |~posts ("/posts")
-      | | |-showPost ("/:id")
-      | | |-newPost ("/new")
-      | | |-editPost ("/edit")
-      | |~about ("/about/:id")
-      ```
-
-      Consider the following transitions:
-
-      1. A URL transition to `/posts/1`.
-         1. Triggers the `*model` callbacks on the
-            `index`, `posts`, and `showPost` handlers
-         2. Triggers the `enter` callback on the same
-         3. Triggers the `setup` callback on the same
-      2. A direct transition to `newPost`
-         1. Triggers the `exit` callback on `showPost`
-         2. Triggers the `enter` callback on `newPost`
-         3. Triggers the `setup` callback on `newPost`
-      3. A direct transition to `about` with a specified
-         context object
-         1. Triggers the `exit` callback on `newPost`
-            and `posts`
-         2. Triggers the `serialize` callback on `about`
-         3. Triggers the `enter` callback on `about`
-         4. Triggers the `setup` callback on `about`
-
-      @param {Router} transition
-      @param {TransitionState} newState
-    */
-    function setupContexts(router, newState, transition) {
-      var partition = partitionHandlers(router.state, newState);
-
-      forEach(partition.exited, function(handlerInfo) {
-        var handler = handlerInfo.handler;
-        delete handler.context;
-        if (handler.exit) { handler.exit(); }
-      });
-
-      var oldState = router.oldState = router.state;
-      router.state = newState;
-      var currentHandlerInfos = router.currentHandlerInfos = partition.unchanged.slice();
-
-      try {
-        forEach(partition.updatedContext, function(handlerInfo) {
-          return handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, false, transition);
-        });
-
-        forEach(partition.entered, function(handlerInfo) {
-          return handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, true, transition);
-        });
-      } catch(e) {
-        router.state = oldState;
-        router.currentHandlerInfos = oldState.handlerInfos;
-        throw e;
-      }
-
-      router.state.queryParams = finalizeQueryParamChange(router, currentHandlerInfos, newState.queryParams, transition);
-    }
-
-
-    /**
-      @private
-
-      Helper method used by setupContexts. Handles errors or redirects
-      that may happen in enter/setup.
-    */
-    function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transition) {
-
-      var handler = handlerInfo.handler,
-          context = handlerInfo.context;
-
-      if (enter && handler.enter) { handler.enter(transition); }
-      if (transition && transition.isAborted) {
-        throw new TransitionAborted();
-      }
-
-      handler.context = context;
-      if (handler.contextDidChange) { handler.contextDidChange(); }
-
-      if (handler.setup) { handler.setup(context, transition); }
-      if (transition && transition.isAborted) {
-        throw new TransitionAborted();
-      }
-
-      currentHandlerInfos.push(handlerInfo);
-
-      return true;
-    }
-
-
-    /**
-      @private
-
-      This function is called when transitioning from one URL to
-      another to determine which handlers are no longer active,
-      which handlers are newly active, and which handlers remain
-      active but have their context changed.
-
-      Take a list of old handlers and new handlers and partition
-      them into four buckets:
-
-      * unchanged: the handler was active in both the old and
-        new URL, and its context remains the same
-      * updated context: the handler was active in both the
-        old and new URL, but its context changed. The handler's
-        `setup` method, if any, will be called with the new
-        context.
-      * exited: the handler was active in the old URL, but is
-        no longer active.
-      * entered: the handler was not active in the old URL, but
-        is now active.
-
-      The PartitionedHandlers structure has four fields:
-
-      * `updatedContext`: a list of `HandlerInfo` objects that
-        represent handlers that remain active but have a changed
-        context
-      * `entered`: a list of `HandlerInfo` objects that represent
-        handlers that are newly active
-      * `exited`: a list of `HandlerInfo` objects that are no
-        longer active.
-      * `unchanged`: a list of `HanderInfo` objects that remain active.
-
-      @param {Array[HandlerInfo]} oldHandlers a list of the handler
-        information for the previous URL (or `[]` if this is the
-        first handled transition)
-      @param {Array[HandlerInfo]} newHandlers a list of the handler
-        information for the new URL
-
-      @return {Partition}
-    */
-    function partitionHandlers(oldState, newState) {
-      var oldHandlers = oldState.handlerInfos;
-      var newHandlers = newState.handlerInfos;
-
-      var handlers = {
-            updatedContext: [],
-            exited: [],
-            entered: [],
-            unchanged: []
-          };
-
-      var handlerChanged, contextChanged, queryParamsChanged, i, l;
-
-      for (i=0, l=newHandlers.length; i<l; i++) {
-        var oldHandler = oldHandlers[i], newHandler = newHandlers[i];
-
-        if (!oldHandler || oldHandler.handler !== newHandler.handler) {
-          handlerChanged = true;
-        }
-
-        if (handlerChanged) {
-          handlers.entered.push(newHandler);
-          if (oldHandler) { handlers.exited.unshift(oldHandler); }
-        } else if (contextChanged || oldHandler.context !== newHandler.context || queryParamsChanged) {
-          contextChanged = true;
-          handlers.updatedContext.push(newHandler);
-        } else {
-          handlers.unchanged.push(oldHandler);
-        }
-      }
-
-      for (i=newHandlers.length, l=oldHandlers.length; i<l; i++) {
-        handlers.exited.unshift(oldHandlers[i]);
-      }
-
-      return handlers;
-    }
-
-    function updateURL(transition, state, inputUrl) {
-      var urlMethod = transition.urlMethod;
-
-      if (!urlMethod) {
-        return;
-      }
-
-      var router = transition.router,
-          handlerInfos = state.handlerInfos,
-          handlerName = handlerInfos[handlerInfos.length - 1].name,
-          params = {};
-
-      for (var i = handlerInfos.length - 1; i >= 0; --i) {
-        var handlerInfo = handlerInfos[i];
-        merge(params, handlerInfo.params);
-        if (handlerInfo.handler.inaccessibleByURL) {
-          urlMethod = null;
-        }
-      }
-
-      if (urlMethod) {
-        params.queryParams = transition._visibleQueryParams || state.queryParams;
-        var url = router.recognizer.generate(handlerName, params);
-
-        if (urlMethod === 'replace') {
-          router.replaceURL(url);
-        } else {
-          router.updateURL(url);
-        }
-      }
-    }
-
-    /**
-      @private
-
-      Updates the URL (if necessary) and calls `setupContexts`
-      to update the router's array of `currentHandlerInfos`.
-     */
-    function finalizeTransition(transition, newState) {
-
-      try {
-        log(transition.router, transition.sequence, "Resolved all models on destination route; finalizing transition.");
-
-        var router = transition.router,
-            handlerInfos = newState.handlerInfos,
-            seq = transition.sequence;
-
-        // Run all the necessary enter/setup/exit hooks
-        setupContexts(router, newState, transition);
-
-        // Check if a redirect occurred in enter/setup
-        if (transition.isAborted) {
-          // TODO: cleaner way? distinguish b/w targetHandlerInfos?
-          router.state.handlerInfos = router.currentHandlerInfos;
-          return Promise.reject(logAbort(transition));
-        }
-
-        updateURL(transition, newState, transition.intent.url);
-
-        transition.isActive = false;
-        router.activeTransition = null;
-
-        trigger(router, router.currentHandlerInfos, true, ['didTransition']);
-
-        if (router.didTransition) {
-          router.didTransition(router.currentHandlerInfos);
-        }
-
-        log(router, transition.sequence, "TRANSITION COMPLETE.");
-
-        // Resolve with the final handler.
-        return handlerInfos[handlerInfos.length - 1].handler;
-      } catch(e) {
-        if (!(e instanceof TransitionAborted)) {
-          //var erroneousHandler = handlerInfos.pop();
-          var infos = transition.state.handlerInfos;
-          transition.trigger(true, 'error', e, transition, infos[infos.length-1].handler);
-          transition.abort();
-        }
-
-        throw e;
-      }
-    }
-
-    /**
-      @private
-
-      Begins and returns a Transition based on the provided
-      arguments. Accepts arguments in the form of both URL
-      transitions and named transitions.
-
-      @param {Router} router
-      @param {Array[Object]} args arguments passed to transitionTo,
-        replaceWith, or handleURL
-    */
-    function doTransition(router, args, isIntermediate) {
-      // Normalize blank transitions to root URL transitions.
-      var name = args[0] || '/';
-
-      var lastArg = args[args.length-1];
-      var queryParams = {};
-      if (lastArg && lastArg.hasOwnProperty('queryParams')) {
-        queryParams = pop.call(args).queryParams;
-      }
-
-      var intent;
-      if (args.length === 0) {
-
-        log(router, "Updating query params");
-
-        // A query param update is really just a transition
-        // into the route you're already on.
-        var handlerInfos = router.state.handlerInfos;
-        intent = new NamedTransitionIntent({
-          name: handlerInfos[handlerInfos.length - 1].name,
-          contexts: [],
-          queryParams: queryParams
-        });
-
-      } else if (name.charAt(0) === '/') {
-
-        log(router, "Attempting URL transition to " + name);
-        intent = new URLTransitionIntent({ url: name });
-
-      } else {
-
-        log(router, "Attempting transition to " + name);
-        intent = new NamedTransitionIntent({
-          name: args[0],
-          contexts: slice.call(args, 1),
-          queryParams: queryParams
-        });
-      }
-
-      return router.transitionByIntent(intent, isIntermediate);
-    }
-
-    function handlerInfosEqual(handlerInfos, otherHandlerInfos) {
-      if (handlerInfos.length !== otherHandlerInfos.length) {
-        return false;
-      }
-
-      for (var i = 0, len = handlerInfos.length; i < len; ++i) {
-        if (handlerInfos[i] !== otherHandlerInfos[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    function finalizeQueryParamChange(router, resolvedHandlers, newQueryParams, transition) {
-      // We fire a finalizeQueryParamChange event which
-      // gives the new route hierarchy a chance to tell
-      // us which query params it's consuming and what
-      // their final values are. If a query param is
-      // no longer consumed in the final route hierarchy,
-      // its serialized segment will be removed
-      // from the URL.
-
-      for (var k in newQueryParams) {
-        if (newQueryParams.hasOwnProperty(k) &&
-            newQueryParams[k] === null) {
-          delete newQueryParams[k];
-        }
-      }
-
-      var finalQueryParamsArray = [];
-      trigger(router, resolvedHandlers, true, ['finalizeQueryParamChange', newQueryParams, finalQueryParamsArray, transition]);
-
-      if (transition) {
-        transition._visibleQueryParams = {};
-      }
-
-      var finalQueryParams = {};
-      for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {
-        var qp = finalQueryParamsArray[i];
-        finalQueryParams[qp.key] = qp.value;
-        if (transition && qp.visible !== false) {
-          transition._visibleQueryParams[qp.key] = qp.value;
-        }
-      }
-      return finalQueryParams;
-    }
-
-    __exports__["default"] = Router;
-  });
-define("router/transition-intent", 
-  ["./utils","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var merge = __dependency1__.merge;
-
-    function TransitionIntent(props) {
-      if (props) {
-        merge(this, props);
-      }
-      this.data = this.data || {};
-    }
-
-    TransitionIntent.prototype.applyToState = function(oldState) {
-      // Default TransitionIntent is a no-op.
-      return oldState;
-    };
-
-    __exports__["default"] = TransitionIntent;
-  });
-define("router/transition-intent/named-transition-intent", 
-  ["../transition-intent","../transition-state","../handler-info","../utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var TransitionIntent = __dependency1__["default"];
-    var TransitionState = __dependency2__["default"];
-    var UnresolvedHandlerInfoByParam = __dependency3__.UnresolvedHandlerInfoByParam;
-    var UnresolvedHandlerInfoByObject = __dependency3__.UnresolvedHandlerInfoByObject;
-    var isParam = __dependency4__.isParam;
-    var forEach = __dependency4__.forEach;
-    var extractQueryParams = __dependency4__.extractQueryParams;
-    var oCreate = __dependency4__.oCreate;
-    var merge = __dependency4__.merge;
-
-    function NamedTransitionIntent(props) {
-      TransitionIntent.call(this, props);
-    }
-
-    NamedTransitionIntent.prototype = oCreate(TransitionIntent.prototype);
-    NamedTransitionIntent.prototype.applyToState = function(oldState, recognizer, getHandler, isIntermediate) {
-
-      var partitionedArgs     = extractQueryParams([this.name].concat(this.contexts)),
-        pureArgs              = partitionedArgs[0],
-        queryParams           = partitionedArgs[1],
-        handlers              = recognizer.handlersFor(pureArgs[0]);
-
-      var targetRouteName = handlers[handlers.length-1].handler;
-
-      return this.applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate);
-    };
-
-    NamedTransitionIntent.prototype.applyToHandlers = function(oldState, handlers, getHandler, targetRouteName, isIntermediate, checkingIfActive) {
-
-      var i;
-      var newState = new TransitionState();
-      var objects = this.contexts.slice(0);
-
-      var invalidateIndex = handlers.length;
-
-      // Pivot handlers are provided for refresh transitions
-      if (this.pivotHandler) {
-        for (i = 0; i < handlers.length; ++i) {
-          if (getHandler(handlers[i].handler) === this.pivotHandler) {
-            invalidateIndex = i;
-            break;
-          }
-        }
-      }
-
-      var pivotHandlerFound = !this.pivotHandler;
-
-      for (i = handlers.length - 1; i >= 0; --i) {
-        var result = handlers[i];
-        var name = result.handler;
-        var handler = getHandler(name);
-
-        var oldHandlerInfo = oldState.handlerInfos[i];
-        var newHandlerInfo = null;
-
-        if (result.names.length > 0) {
-          if (i >= invalidateIndex) {
-            newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
-          } else {
-            newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, handler, result.names, objects, oldHandlerInfo, targetRouteName);
-          }
-        } else {
-          // This route has no dynamic segment.
-          // Therefore treat as a param-based handlerInfo
-          // with empty params. This will cause the `model`
-          // hook to be called with empty params, which is desirable.
-          newHandlerInfo = this.createParamHandlerInfo(name, handler, result.names, objects, oldHandlerInfo);
-        }
-
-        if (checkingIfActive) {
-          // If we're performing an isActive check, we want to
-          // serialize URL params with the provided context, but
-          // ignore mismatches between old and new context.
-          newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);
-          var oldContext = oldHandlerInfo && oldHandlerInfo.context;
-          if (result.names.length > 0 && newHandlerInfo.context === oldContext) {
-            // If contexts match in isActive test, assume params also match.
-            // This allows for flexibility in not requiring that every last
-            // handler provide a `serialize` method
-            newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;
-          }
-          newHandlerInfo.context = oldContext;
-        }
-
-        var handlerToUse = oldHandlerInfo;
-        if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
-          invalidateIndex = Math.min(i, invalidateIndex);
-          handlerToUse = newHandlerInfo;
-        }
-
-        if (isIntermediate && !checkingIfActive) {
-          handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);
-        }
-
-        newState.handlerInfos.unshift(handlerToUse);
-      }
-
-      if (objects.length > 0) {
-        throw new Error("More context objects were passed than there are dynamic segments for the route: " + targetRouteName);
-      }
-
-      if (!isIntermediate) {
-        this.invalidateChildren(newState.handlerInfos, invalidateIndex);
-      }
-
-      merge(newState.queryParams, oldState.queryParams);
-      merge(newState.queryParams, this.queryParams || {});
-
-      return newState;
-    };
-
-    NamedTransitionIntent.prototype.invalidateChildren = function(handlerInfos, invalidateIndex) {
-      for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {
-        var handlerInfo = handlerInfos[i];
-        handlerInfos[i] = handlerInfos[i].getUnresolved();
-      }
-    };
-
-    NamedTransitionIntent.prototype.getHandlerInfoForDynamicSegment = function(name, handler, names, objects, oldHandlerInfo, targetRouteName) {
-
-      var numNames = names.length;
-      var objectToUse;
-      if (objects.length > 0) {
-
-        // Use the objects provided for this transition.
-        objectToUse = objects[objects.length - 1];
-        if (isParam(objectToUse)) {
-          return this.createParamHandlerInfo(name, handler, names, objects, oldHandlerInfo);
-        } else {
-          objects.pop();
-        }
-      } else if (oldHandlerInfo && oldHandlerInfo.name === name) {
-        // Reuse the matching oldHandlerInfo
-        return oldHandlerInfo;
-      } else {
-        // Ideally we should throw this error to provide maximal
-        // information to the user that not enough context objects
-        // were provided, but this proves too cumbersome in Ember
-        // in cases where inner template helpers are evaluated
-        // before parent helpers un-render, in which cases this
-        // error somewhat prematurely fires.
-        //throw new Error("Not enough context objects were provided to complete a transition to " + targetRouteName + ". Specifically, the " + name + " route needs an object that can be serialized into its dynamic URL segments [" + names.join(', ') + "]");
-        return oldHandlerInfo;
-      }
-
-      return new UnresolvedHandlerInfoByObject({
-        name: name,
-        handler: handler,
-        context: objectToUse,
-        names: names
-      });
-    };
-
-    NamedTransitionIntent.prototype.createParamHandlerInfo = function(name, handler, names, objects, oldHandlerInfo) {
-      var params = {};
-
-      // Soak up all the provided string/numbers
-      var numNames = names.length;
-      while (numNames--) {
-
-        // Only use old params if the names match with the new handler
-        var oldParams = (oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params) || {};
-
-        var peek = objects[objects.length - 1];
-        var paramName = names[numNames];
-        if (isParam(peek)) {
-          params[paramName] = "" + objects.pop();
-        } else {
-          // If we're here, this means only some of the params
-          // were string/number params, so try and use a param
-          // value from a previous handler.
-          if (oldParams.hasOwnProperty(paramName)) {
-            params[paramName] = oldParams[paramName];
-          } else {
-            throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route " + name);
-          }
-        }
-      }
-
-      return new UnresolvedHandlerInfoByParam({
-        name: name,
-        handler: handler,
-        params: params
-      });
-    };
-
-    __exports__["default"] = NamedTransitionIntent;
-  });
-define("router/transition-intent/url-transition-intent", 
-  ["../transition-intent","../transition-state","../handler-info","../utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) {
-    "use strict";
-    var TransitionIntent = __dependency1__["default"];
-    var TransitionState = __dependency2__["default"];
-    var UnresolvedHandlerInfoByParam = __dependency3__.UnresolvedHandlerInfoByParam;
-    var oCreate = __dependency4__.oCreate;
-    var merge = __dependency4__.merge;
-
-    function URLTransitionIntent(props) {
-      TransitionIntent.call(this, props);
-    }
-
-    URLTransitionIntent.prototype = oCreate(TransitionIntent.prototype);
-    URLTransitionIntent.prototype.applyToState = function(oldState, recognizer, getHandler) {
-      var newState = new TransitionState();
-
-      var results = recognizer.recognize(this.url),
-          queryParams = {},
-          i, len;
-
-      if (!results) {
-        throw new UnrecognizedURLError(this.url);
-      }
-
-      var statesDiffer = false;
-
-      for (i = 0, len = results.length; i < len; ++i) {
-        var result = results[i];
-        var name = result.handler;
-        var handler = getHandler(name);
-
-        if (handler.inaccessibleByURL) {
-          throw new UnrecognizedURLError(this.url);
-        }
-
-        var newHandlerInfo = new UnresolvedHandlerInfoByParam({
-          name: name,
-          handler: handler,
-          params: result.params
-        });
-
-        var oldHandlerInfo = oldState.handlerInfos[i];
-        if (statesDiffer || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
-          statesDiffer = true;
-          newState.handlerInfos[i] = newHandlerInfo;
-        } else {
-          newState.handlerInfos[i] = oldHandlerInfo;
-        }
-      }
-
-      merge(newState.queryParams, results.queryParams);
-
-      return newState;
-    };
-
-    /**
-      Promise reject reasons passed to promise rejection
-      handlers for failed transitions.
-     */
-    function UnrecognizedURLError(message) {
-      this.message = (message || "UnrecognizedURLError");
-      this.name = "UnrecognizedURLError";
-    }
-
-    __exports__["default"] = URLTransitionIntent;
-  });
-define("router/transition-state", 
-  ["./handler-info","./utils","rsvp/promise","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var ResolvedHandlerInfo = __dependency1__.ResolvedHandlerInfo;
-    var forEach = __dependency2__.forEach;
-    var promiseLabel = __dependency2__.promiseLabel;
-    var Promise = __dependency3__["default"];
-
-    function TransitionState(other) {
-      this.handlerInfos = [];
-      this.queryParams = {};
-      this.params = {};
-    }
-
-    TransitionState.prototype = {
-      handlerInfos: null,
-      queryParams: null,
-      params: null,
-
-      promiseLabel: function(label) {
-        var targetName = '';
-        forEach(this.handlerInfos, function(handlerInfo) {
-          if (targetName !== '') {
-            targetName += '.';
-          }
-          targetName += handlerInfo.name;
-        });
-        return promiseLabel("'" + targetName + "': " + label);
-      },
-
-      resolve: function(async, shouldContinue, payload) {
-        var self = this;
-        // First, calculate params for this state. This is useful
-        // information to provide to the various route hooks.
-        var params = this.params;
-        forEach(this.handlerInfos, function(handlerInfo) {
-          params[handlerInfo.name] = handlerInfo.params || {};
-        });
-
-        payload = payload || {};
-        payload.resolveIndex = 0;
-
-        var currentState = this;
-        var wasAborted = false;
-
-        // The prelude RSVP.resolve() asyncs us into the promise land.
-        return Promise.resolve(null, this.promiseLabel("Start transition"))
-        .then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler'))['catch'](handleError, this.promiseLabel('Handle error'));
-
-        function innerShouldContinue() {
-          return Promise.resolve(shouldContinue(), promiseLabel("Check if should continue"))['catch'](function(reason) {
-            // We distinguish between errors that occurred
-            // during resolution (e.g. beforeModel/model/afterModel),
-            // and aborts due to a rejecting promise from shouldContinue().
-            wasAborted = true;
-            return Promise.reject(reason);
-          }, promiseLabel("Handle abort"));
-        }
-
-        function handleError(error) {
-          // This is the only possible
-          // reject value of TransitionState#resolve
-          var handlerInfos = currentState.handlerInfos;
-          var errorHandlerIndex = payload.resolveIndex >= handlerInfos.length ?
-                                  handlerInfos.length - 1 : payload.resolveIndex;
-          return Promise.reject({
-            error: error,
-            handlerWithError: currentState.handlerInfos[errorHandlerIndex].handler,
-            wasAborted: wasAborted,
-            state: currentState
-          });
-        }
-
-        function proceed(resolvedHandlerInfo) {
-          // Swap the previously unresolved handlerInfo with
-          // the resolved handlerInfo
-          currentState.handlerInfos[payload.resolveIndex++] = resolvedHandlerInfo;
-
-          // Call the redirect hook. The reason we call it here
-          // vs. afterModel is so that redirects into child
-          // routes don't re-run the model hooks for this
-          // already-resolved route.
-          var handler = resolvedHandlerInfo.handler;
-          if (handler && handler.redirect) {
-            handler.redirect(resolvedHandlerInfo.context, payload);
-          }
-
-          // Proceed after ensuring that the redirect hook
-          // didn't abort this transition by transitioning elsewhere.
-          return innerShouldContinue().then(resolveOneHandlerInfo, null, promiseLabel('Resolve handler'));
-        }
-
-        function resolveOneHandlerInfo() {
-          if (payload.resolveIndex === currentState.handlerInfos.length) {
-            // This is is the only possible
-            // fulfill value of TransitionState#resolve
-            return {
-              error: null,
-              state: currentState
-            };
-          }
-
-          var handlerInfo = currentState.handlerInfos[payload.resolveIndex];
-
-          return handlerInfo.resolve(async, innerShouldContinue, payload)
-                            .then(proceed, null, promiseLabel('Proceed'));
-        }
-      }
-    };
-
-    __exports__["default"] = TransitionState;
-  });
-define("router/transition", 
-  ["rsvp/promise","./handler-info","./utils","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Promise = __dependency1__["default"];
-    var ResolvedHandlerInfo = __dependency2__.ResolvedHandlerInfo;
-    var trigger = __dependency3__.trigger;
-    var slice = __dependency3__.slice;
-    var log = __dependency3__.log;
-    var promiseLabel = __dependency3__.promiseLabel;
-
-    /**
-      @private
-
-      A Transition is a thennable (a promise-like object) that represents
-      an attempt to transition to another route. It can be aborted, either
-      explicitly via `abort` or by attempting another transition while a
-      previous one is still underway. An aborted transition can also
-      be `retry()`d later.
-     */
-    function Transition(router, intent, state, error) {
-      var transition = this;
-      this.state = state || router.state;
-      this.intent = intent;
-      this.router = router;
-      this.data = this.intent && this.intent.data || {};
-      this.resolvedModels = {};
-      this.queryParams = {};
-
-      if (error) {
-        this.promise = Promise.reject(error);
-        return;
-      }
-
-      if (state) {
-        this.params = state.params;
-        this.queryParams = state.queryParams;
-
-        var len = state.handlerInfos.length;
-        if (len) {
-          this.targetName = state.handlerInfos[state.handlerInfos.length-1].name;
-        }
-
-        for (var i = 0; i < len; ++i) {
-          var handlerInfo = state.handlerInfos[i];
-          if (!(handlerInfo instanceof ResolvedHandlerInfo)) {
-            break;
-          }
-          this.pivotHandler = handlerInfo.handler;
-        }
-
-        this.sequence = Transition.currentSequence++;
-        this.promise = state.resolve(router.async, checkForAbort, this)['catch'](function(result) {
-          if (result.wasAborted) {
-            return Promise.reject(logAbort(transition));
-          } else {
-            transition.trigger('error', result.error, transition, result.handlerWithError);
-            transition.abort();
-            return Promise.reject(result.error);
-          }
-        }, promiseLabel('Handle Abort'));
-      } else {
-        this.promise = Promise.resolve(this.state);
-        this.params = {};
-      }
-
-      function checkForAbort() {
-        if (transition.isAborted) {
-          return Promise.reject(undefined, promiseLabel("Transition aborted - reject"));
-        }
-      }
-    }
-
-    Transition.currentSequence = 0;
-
-    Transition.prototype = {
-      targetName: null,
-      urlMethod: 'update',
-      intent: null,
-      params: null,
-      pivotHandler: null,
-      resolveIndex: 0,
-      handlerInfos: null,
-      resolvedModels: null,
-      isActive: true,
-      state: null,
-
-      /**
-        @public
-
-        The Transition's internal promise. Calling `.then` on this property
-        is that same as calling `.then` on the Transition object itself, but
-        this property is exposed for when you want to pass around a
-        Transition's promise, but not the Transition object itself, since
-        Transition object can be externally `abort`ed, while the promise
-        cannot.
-       */
-      promise: null,
-
-      /**
-        @public
-
-        Custom state can be stored on a Transition's `data` object.
-        This can be useful for decorating a Transition within an earlier
-        hook and shared with a later hook. Properties set on `data` will
-        be copied to new transitions generated by calling `retry` on this
-        transition.
-       */
-      data: null,
-
-      /**
-        @public
-
-        A standard promise hook that resolves if the transition
-        succeeds and rejects if it fails/redirects/aborts.
-
-        Forwards to the internal `promise` property which you can
-        use in situations where you want to pass around a thennable,
-        but not the Transition itself.
-
-        @param {Function} success
-        @param {Function} failure
-       */
-      then: function(success, failure) {
-        return this.promise.then(success, failure);
-      },
-
-      /**
-        @public
-
-        Aborts the Transition. Note you can also implicitly abort a transition
-        by initiating another transition while a previous one is underway.
-       */
-      abort: function() {
-        if (this.isAborted) { return this; }
-        log(this.router, this.sequence, this.targetName + ": transition was aborted");
-        this.isAborted = true;
-        this.isActive = false;
-        this.router.activeTransition = null;
-        return this;
-      },
-
-      /**
-        @public
-
-        Retries a previously-aborted transition (making sure to abort the
-        transition if it's still active). Returns a new transition that
-        represents the new attempt to transition.
-       */
-      retry: function() {
-        // TODO: add tests for merged state retry()s
-        this.abort();
-        return this.router.transitionByIntent(this.intent, false);
-      },
-
-      /**
-        @public
-
-        Sets the URL-changing method to be employed at the end of a
-        successful transition. By default, a new Transition will just
-        use `updateURL`, but passing 'replace' to this method will
-        cause the URL to update using 'replaceWith' instead. Omitting
-        a parameter will disable the URL change, allowing for transitions
-        that don't update the URL at completion (this is also used for
-        handleURL, since the URL has already changed before the
-        transition took place).
-
-        @param {String} method the type of URL-changing method to use
-          at the end of a transition. Accepted values are 'replace',
-          falsy values, or any other non-falsy value (which is
-          interpreted as an updateURL transition).
-
-        @return {Transition} this transition
-       */
-      method: function(method) {
-        this.urlMethod = method;
-        return this;
-      },
-
-      /**
-        @public
-
-        Fires an event on the current list of resolved/resolving
-        handlers within this transition. Useful for firing events
-        on route hierarchies that haven't fully been entered yet.
-
-        Note: This method is also aliased as `send`
-
-        @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error
-        @param {String} name the name of the event to fire
-       */
-      trigger: function (ignoreFailure) {
-        var args = slice.call(arguments);
-        if (typeof ignoreFailure === 'boolean') {
-          args.shift();
-        } else {
-          // Throw errors on unhandled trigger events by default
-          ignoreFailure = false;
-        }
-        trigger(this.router, this.state.handlerInfos.slice(0, this.resolveIndex + 1), ignoreFailure, args);
-      },
-
-      /**
-        @public
-
-        Transitions are aborted and their promises rejected
-        when redirects occur; this method returns a promise
-        that will follow any redirects that occur and fulfill
-        with the value fulfilled by any redirecting transitions
-        that occur.
-
-        @return {Promise} a promise that fulfills with the same
-          value that the final redirecting transition fulfills with
-       */
-      followRedirects: function() {
-        var router = this.router;
-        return this.promise['catch'](function(reason) {
-          if (router.activeTransition) {
-            return router.activeTransition.followRedirects();
-          }
-          return Promise.reject(reason);
-        });
-      },
-
-      toString: function() {
-        return "Transition (sequence " + this.sequence + ")";
-      },
-
-      /**
-        @private
-       */
-      log: function(message) {
-        log(this.router, this.sequence, message);
-      }
-    };
-
-    // Alias 'trigger' as 'send'
-    Transition.prototype.send = Transition.prototype.trigger;
-
-    /**
-      @private
-
-      Logs and returns a TransitionAborted error.
-     */
-    function logAbort(transition) {
-      log(transition.router, transition.sequence, "detected abort.");
-      return new TransitionAborted();
-    }
-
-    function TransitionAborted(message) {
-      this.message = (message || "TransitionAborted");
-      this.name = "TransitionAborted";
-    }
-
-    __exports__.Transition = Transition;
-    __exports__.logAbort = logAbort;
-    __exports__.TransitionAborted = TransitionAborted;
-  });
-define("router/utils", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    var slice = Array.prototype.slice;
-
-    var _isArray;
-    if (!Array.isArray) {
-      _isArray = function (x) {
-        return Object.prototype.toString.call(x) === "[object Array]";
-      };
-    } else {
-      _isArray = Array.isArray;
-    }
-
-    var isArray = _isArray;
-    __exports__.isArray = isArray;
-    function merge(hash, other) {
-      for (var prop in other) {
-        if (other.hasOwnProperty(prop)) { hash[prop] = other[prop]; }
-      }
-    }
-
-    var oCreate = Object.create || function(proto) {
-      function F() {}
-      F.prototype = proto;
-      return new F();
-    };
-    __exports__.oCreate = oCreate;
-    /**
-      @private
-
-      Extracts query params from the end of an array
-    **/
-    function extractQueryParams(array) {
-      var len = (array && array.length), head, queryParams;
-
-      if(len && len > 0 && array[len - 1] && array[len - 1].hasOwnProperty('queryParams')) {
-        queryParams = array[len - 1].queryParams;
-        head = slice.call(array, 0, len - 1);
-        return [head, queryParams];
-      } else {
-        return [array, null];
-      }
-    }
-
-    __exports__.extractQueryParams = extractQueryParams;/**
-      @private
-
-      Coerces query param properties and array elements into strings.
-    **/
-    function coerceQueryParamsToString(queryParams) {
-      for (var key in queryParams) {
-        if (typeof queryParams[key] === 'number') {
-          queryParams[key] = '' + queryParams[key];
-        } else if (isArray(queryParams[key])) {
-          for (var i = 0, l = queryParams[key].length; i < l; i++) {
-            queryParams[key][i] = '' + queryParams[key][i];
-          }
-        }
-      }
-    }
-    /**
-      @private
-     */
-    function log(router, sequence, msg) {
-      if (!router.log) { return; }
-
-      if (arguments.length === 3) {
-        router.log("Transition #" + sequence + ": " + msg);
-      } else {
-        msg = sequence;
-        router.log(msg);
-      }
-    }
-
-    __exports__.log = log;function bind(fn, context) {
-      var boundArgs = arguments;
-      return function(value) {
-        var args = slice.call(boundArgs, 2);
-        args.push(value);
-        return fn.apply(context, args);
-      };
-    }
-
-    __exports__.bind = bind;function isParam(object) {
-      return (typeof object === "string" || object instanceof String || typeof object === "number" || object instanceof Number);
-    }
-
-
-    function forEach(array, callback) {
-      for (var i=0, l=array.length; i<l && false !== callback(array[i]); i++) { }
-    }
-
-    __exports__.forEach = forEach;/**
-      @private
-
-      Serializes a handler using its custom `serialize` method or
-      by a default that looks up the expected property name from
-      the dynamic segment.
-
-      @param {Object} handler a router handler
-      @param {Object} model the model to be serialized for this handler
-      @param {Array[Object]} names the names array attached to an
-        handler object returned from router.recognizer.handlersFor()
-    */
-    function serialize(handler, model, names) {
-      var object = {};
-      if (isParam(model)) {
-        object[names[0]] = model;
-        return object;
-      }
-
-      // Use custom serialize if it exists.
-      if (handler.serialize) {
-        return handler.serialize(model, names);
-      }
-
-      if (names.length !== 1) { return; }
-
-      var name = names[0];
-
-      if (/_id$/.test(name)) {
-        object[name] = model.id;
-      } else {
-        object[name] = model;
-      }
-      return object;
-    }
-
-    __exports__.serialize = serialize;function trigger(router, handlerInfos, ignoreFailure, args) {
-      if (router.triggerEvent) {
-        router.triggerEvent(handlerInfos, ignoreFailure, args);
-        return;
-      }
-
-      var name = args.shift();
-
-      if (!handlerInfos) {
-        if (ignoreFailure) { return; }
-        throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
-      }
-
-      var eventWasHandled = false;
-
-      for (var i=handlerInfos.length-1; i>=0; i--) {
-        var handlerInfo = handlerInfos[i],
-            handler = handlerInfo.handler;
-
-        if (handler.events && handler.events[name]) {
-          if (handler.events[name].apply(handler, args) === true) {
-            eventWasHandled = true;
-          } else {
-            return;
-          }
-        }
-      }
-
-      if (!eventWasHandled && !ignoreFailure) {
-        throw new Error("Nothing handled the event '" + name + "'.");
-      }
-    }
-
-    __exports__.trigger = trigger;function getChangelist(oldObject, newObject) {
-      var key;
-      var results = {
-        all: {},
-        changed: {},
-        removed: {}
-      };
-
-      merge(results.all, newObject);
-
-      var didChange = false;
-      coerceQueryParamsToString(oldObject);
-      coerceQueryParamsToString(newObject);
-
-      // Calculate removals
-      for (key in oldObject) {
-        if (oldObject.hasOwnProperty(key)) {
-          if (!newObject.hasOwnProperty(key)) {
-            didChange = true;
-            results.removed[key] = oldObject[key];
-          }
-        }
-      }
-
-      // Calculate changes
-      for (key in newObject) {
-        if (newObject.hasOwnProperty(key)) {
-          if (isArray(oldObject[key]) && isArray(newObject[key])) {
-            if (oldObject[key].length !== newObject[key].length) {
-              results.changed[key] = newObject[key];
-              didChange = true;
-            } else {
-              for (var i = 0, l = oldObject[key].length; i < l; i++) {
-                if (oldObject[key][i] !== newObject[key][i]) {
-                  results.changed[key] = newObject[key];
-                  didChange = true;
-                }
-              }
-            }
-          }
-          else {
-            if (oldObject[key] !== newObject[key]) {
-              results.changed[key] = newObject[key];
-              didChange = true;
-            }
-          }
-        }
-      }
-
-      return didChange && results;
-    }
-
-    __exports__.getChangelist = getChangelist;function promiseLabel(label) {
-      return 'Router: ' + label;
-    }
-
-    __exports__.promiseLabel = promiseLabel;__exports__.merge = merge;
-    __exports__.slice = slice;
-    __exports__.isParam = isParam;
-    __exports__.coerceQueryParamsToString = coerceQueryParamsToString;
-  });
-define("router", 
-  ["./router/router","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var Router = __dependency1__["default"];
-
-    __exports__["default"] = Router;
-  });
-})();
-
-(function() {
-define("ember-application/ext/controller", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/error","ember-metal/utils","ember-metal/computed","ember-runtime/controllers/controller","ember-routing/system/controller_for","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-application
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.assert
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var EmberError = __dependency4__["default"];
-    var inspect = __dependency5__.inspect;
-    var computed = __dependency6__.computed;
-    var ControllerMixin = __dependency7__.ControllerMixin;
-    var meta = __dependency5__.meta;
-    var controllerFor = __dependency8__.controllerFor;
-    var meta = __dependency5__.meta;
-
-    function verifyNeedsDependencies(controller, container, needs) {
-      var dependency, i, l, missing = [];
-
-      for (i=0, l=needs.length; i<l; i++) {
-        dependency = needs[i];
-
-        Ember.assert(inspect(controller) + "#needs must not specify dependencies with periods in their names (" + dependency + ")", dependency.indexOf('.') === -1);
-
-        if (dependency.indexOf(':') === -1) {
-          dependency = "controller:" + dependency;
-        }
-
-        // Structure assert to still do verification but not string concat in production
-        if (!container.has(dependency)) {
-          missing.push(dependency);
-        }
-      }
-      if (missing.length) {
-        throw new EmberError(inspect(controller) + " needs [ " + missing.join(', ') + " ] but " + (missing.length > 1 ? 'they' : 'it') + " could not be found");
-      }
-    }
-
-    var defaultControllersComputedProperty = computed(function() {
-      var controller = this;
-
-      return {
-        needs: get(controller, 'needs'),
-        container: get(controller, 'container'),
-        unknownProperty: function(controllerName) {
-          var needs = this.needs,
-            dependency, i, l;
-          for (i=0, l=needs.length; i<l; i++) {
-            dependency = needs[i];
-            if (dependency === controllerName) {
-              return this.container.lookup('controller:' + controllerName);
-            }
-          }
-
-          var errorMessage = inspect(controller) + '#needs does not include `' + controllerName + '`. To access the ' + controllerName + ' controller from ' + inspect(controller) + ', ' + inspect(controller) + ' should have a `needs` property that is an array of the controllers it has access to.';
-          throw new ReferenceError(errorMessage);
-        },
-        setUnknownProperty: function (key, value) {
-          throw new Error("You cannot overwrite the value of `controllers." + key + "` of " + inspect(controller));
-        }
-      };
-    });
-
-    /**
-      @class ControllerMixin
-      @namespace Ember
-    */
-    ControllerMixin.reopen({
-      concatenatedProperties: ['needs'],
-
-      /**
-        An array of other controller objects available inside
-        instances of this controller via the `controllers`
-        property:
-
-        For example, when you define a controller:
-
-        ```javascript
-        App.CommentsController = Ember.ArrayController.extend({
-          needs: ['post']
-        });
-        ```
-
-        The application's single instance of these other
-        controllers are accessible by name through the
-        `controllers` property:
-
-        ```javascript
-        this.get('controllers.post'); // instance of App.PostController
-        ```
-
-        Given that you have a nested controller (nested resource):
-
-        ```javascript
-        App.CommentsNewController = Ember.ObjectController.extend({
-        });
-        ```
-
-        When you define a controller that requires access to a nested one:
-
-        ```javascript
-        App.IndexController = Ember.ObjectController.extend({
-          needs: ['commentsNew']
-        });
-        ```
-
-        You will be able to get access to it:
-
-        ```javascript
-        this.get('controllers.commentsNew'); // instance of App.CommentsNewController
-        ```
-
-        This is only available for singleton controllers.
-
-        @property {Array} needs
-        @default []
-      */
-      needs: [],
-
-      init: function() {
-        var needs = get(this, 'needs'),
-        length = get(needs, 'length');
-
-        if (length > 0) {
-          Ember.assert(' `' + inspect(this) + ' specifies `needs`, but does ' +
-                       "not have a container. Please ensure this controller was " +
-                       "instantiated with a container.",
-                       this.container || meta(this, false).descs.controllers !== defaultControllersComputedProperty);
-
-          if (this.container) {
-            verifyNeedsDependencies(this, this.container, needs);
-          }
-
-          // if needs then initialize controllers proxy
-          get(this, 'controllers');
-        }
-
-        this._super.apply(this, arguments);
-      },
-
-      /**
-        @method controllerFor
-        @see {Ember.Route#controllerFor}
-        @deprecated Use `needs` instead
-      */
-      controllerFor: function(controllerName) {
-        Ember.deprecate("Controller#controllerFor is deprecated, please use Controller#needs instead");
-        return controllerFor(get(this, 'container'), controllerName);
-      },
-
-      /**
-        Stores the instances of other controllers available from within
-        this controller. Any controller listed by name in the `needs`
-        property will be accessible by name through this property.
-
-        ```javascript
-        App.CommentsController = Ember.ArrayController.extend({
-          needs: ['post'],
-          postTitle: function(){
-            var currentPost = this.get('controllers.post'); // instance of App.PostController
-            return currentPost.get('title');
-          }.property('controllers.post.title')
-        });
-        ```
-
-        @see {Ember.ControllerMixin#needs}
-        @property {Object} controllers
-        @default null
-      */
-      controllers: defaultControllersComputedProperty
-    });
-
-    __exports__["default"] = ControllerMixin;
-  });
-define("ember-application", 
-  ["ember-metal/core","ember-runtime/system/lazy_load","ember-application/system/dag","ember-application/system/resolver","ember-application/system/application","ember-application/ext/controller"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var runLoadHooks = __dependency2__.runLoadHooks;
-
-    /**
-    Ember Application
-
-    @module ember
-    @submodule ember-application
-    @requires ember-views, ember-routing
-    */
-
-    var DAG = __dependency3__["default"];var Resolver = __dependency4__.Resolver;
-    var DefaultResolver = __dependency4__.DefaultResolver;
-    var Application = __dependency5__["default"];
-    // side effect of extending ControllerMixin
-
-    Ember.Application = Application;
-    Ember.DAG = DAG;
-    Ember.Resolver = Resolver;
-    Ember.DefaultResolver = DefaultResolver;
-
-    runLoadHooks('Ember.Application', Application);
-  });
-define("ember-application/system/application", 
-  ["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-runtime/system/native_array","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-extension-support/container_debug_adapter","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-handlebars-compiler","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-application
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.FEATURES, Ember.deprecate, Ember.assert, Ember.libraries, LOG_VERSION, Namespace, BOOTED
-    var get = __dependency2__.get;
-    var set = __dependency3__.set;
-    var runLoadHooks = __dependency4__.runLoadHooks;
-    var DAG = __dependency5__["default"];var Namespace = __dependency6__["default"];
-    var DeferredMixin = __dependency7__["default"];
-    var DefaultResolver = __dependency8__.DefaultResolver;
-    var create = __dependency9__.create;
-    var run = __dependency10__["default"];
-    var canInvoke = __dependency11__.canInvoke;
-    var Container = __dependency12__["default"];
-    var Controller = __dependency13__.Controller;
-    var A = __dependency14__.A;
-    var ObjectController = __dependency15__["default"];
-    var ArrayController = __dependency16__["default"];
-    var EventDispatcher = __dependency17__["default"];
-    var ContainerDebugAdapter = __dependency18__["default"];
-    var jQuery = __dependency19__["default"];
-    var Route = __dependency20__["default"];
-    var Router = __dependency21__["default"];
-    var HashLocation = __dependency22__["default"];
-    var HistoryLocation = __dependency23__["default"];
-    var AutoLocation = __dependency24__["default"];
-    var NoneLocation = __dependency25__["default"];
-
-    var EmberHandlebars = __dependency26__["default"];
-
-    var K = Ember.K;
-
-    function DeprecatedContainer(container) {
-      this._container = container;
-    }
-
-    DeprecatedContainer.deprecate = function(method) {
-      return function() {
-        var container = this._container;
-
-        Ember.deprecate('Using the defaultContainer is no longer supported. [defaultContainer#' + method + '] see: http://git.io/EKPpnA', false);
-        return container[method].apply(container, arguments);
-      };
-    };
-
-    DeprecatedContainer.prototype = {
-      _container: null,
-      lookup: DeprecatedContainer.deprecate('lookup'),
-      resolve: DeprecatedContainer.deprecate('resolve'),
-      register: DeprecatedContainer.deprecate('register')
-    };
-
-    /**
-      An instance of `Ember.Application` is the starting point for every Ember
-      application. It helps to instantiate, initialize and coordinate the many
-      objects that make up your app.
-
-      Each Ember app has one and only one `Ember.Application` object. In fact, the
-      very first thing you should do in your application is create the instance:
-
-      ```javascript
-      window.App = Ember.Application.create();
-      ```
-
-      Typically, the application object is the only global variable. All other
-      classes in your app should be properties on the `Ember.Application` instance,
-      which highlights its first role: a global namespace.
-
-      For example, if you define a view class, it might look like this:
-
-      ```javascript
-      App.MyView = Ember.View.extend();
-      ```
-
-      By default, calling `Ember.Application.create()` will automatically initialize
-      your application by calling the `Ember.Application.initialize()` method. If
-      you need to delay initialization, you can call your app's `deferReadiness()`
-      method. When you are ready for your app to be initialized, call its
-      `advanceReadiness()` method.
-
-      You can define a `ready` method on the `Ember.Application` instance, which
-      will be run by Ember when the application is initialized.
-
-      Because `Ember.Application` inherits from `Ember.Namespace`, any classes
-      you create will have useful string representations when calling `toString()`.
-      See the `Ember.Namespace` documentation for more information.
-
-      While you can think of your `Ember.Application` as a container that holds the
-      other classes in your application, there are several other responsibilities
-      going on under-the-hood that you may want to understand.
-
-      ### Event Delegation
-
-      Ember uses a technique called _event delegation_. This allows the framework
-      to set up a global, shared event listener instead of requiring each view to
-      do it manually. For example, instead of each view registering its own
-      `mousedown` listener on its associated element, Ember sets up a `mousedown`
-      listener on the `body`.
-
-      If a `mousedown` event occurs, Ember will look at the target of the event and
-      start walking up the DOM node tree, finding corresponding views and invoking
-      their `mouseDown` method as it goes.
-
-      `Ember.Application` has a number of default events that it listens for, as
-      well as a mapping from lowercase events to camel-cased view method names. For
-      example, the `keypress` event causes the `keyPress` method on the view to be
-      called, the `dblclick` event causes `doubleClick` to be called, and so on.
-
-      If there is a bubbling browser event that Ember does not listen for by
-      default, you can specify custom events and their corresponding view method
-      names by setting the application's `customEvents` property:
-
-      ```javascript
-      App = Ember.Application.create({
-        customEvents: {
-          // add support for the paste event
-          paste: "paste"
-        }
-      });
-      ```
-
-      By default, the application sets up these event listeners on the document
-      body. However, in cases where you are embedding an Ember application inside
-      an existing page, you may want it to set up the listeners on an element
-      inside the body.
-
-      For example, if only events inside a DOM element with the ID of `ember-app`
-      should be delegated, set your application's `rootElement` property:
-
-      ```javascript
-      window.App = Ember.Application.create({
-        rootElement: '#ember-app'
-      });
-      ```
-
-      The `rootElement` can be either a DOM element or a jQuery-compatible selector
-      string. Note that *views appended to the DOM outside the root element will
-      not receive events.* If you specify a custom root element, make sure you only
-      append views inside it!
-
-      To learn more about the advantages of event delegation and the Ember view
-      layer, and a list of the event listeners that are setup by default, visit the
-      [Ember View Layer guide](http://emberjs.com/guides/understanding-ember/the-view-layer/#toc_event-delegation).
-
-      ### Initializers
-
-      Libraries on top of Ember can add initializers, like so:
-
-      ```javascript
-      Ember.Application.initializer({
-        name: 'api-adapter',
-
-        initialize: function(container, application) {
-          application.register('api-adapter:main', ApiAdapter);
-        }
-      });
-      ```
-
-      Initializers provide an opportunity to access the container, which
-      organizes the different components of an Ember application. Additionally
-      they provide a chance to access the instantiated application. Beyond
-      being used for libraries, initializers are also a great way to organize
-      dependency injection or setup in your own application.
-
-      ### Routing
-
-      In addition to creating your application's router, `Ember.Application` is
-      also responsible for telling the router when to start routing. Transitions
-      between routes can be logged with the `LOG_TRANSITIONS` flag, and more
-      detailed intra-transition logging can be logged with
-      the `LOG_TRANSITIONS_INTERNAL` flag:
-
-      ```javascript
-      window.App = Ember.Application.create({
-        LOG_TRANSITIONS: true, // basic logging of successful transitions
-        LOG_TRANSITIONS_INTERNAL: true // detailed logging of all routing steps
-      });
-      ```
-
-      By default, the router will begin trying to translate the current URL into
-      application state once the browser emits the `DOMContentReady` event. If you
-      need to defer routing, you can call the application's `deferReadiness()`
-      method. Once routing can begin, call the `advanceReadiness()` method.
-
-      If there is any setup required before routing begins, you can implement a
-      `ready()` method on your app that will be invoked immediately before routing
-      begins.
-      ```
-
-      @class Application
-      @namespace Ember
-      @extends Ember.Namespace
-    */
-
-    var Application = Namespace.extend(DeferredMixin, {
-
-      /**
-        The root DOM element of the Application. This can be specified as an
-        element or a
-        [jQuery-compatible selector string](http://api.jquery.com/category/selectors/).
-
-        This is the element that will be passed to the Application's,
-        `eventDispatcher`, which sets up the listeners for event delegation. Every
-        view in your application should be a child of the element you specify here.
-
-        @property rootElement
-        @type DOMElement
-        @default 'body'
-      */
-      rootElement: 'body',
-
-      /**
-        The `Ember.EventDispatcher` responsible for delegating events to this
-        application's views.
-
-        The event dispatcher is created by the application at initialization time
-        and sets up event listeners on the DOM element described by the
-        application's `rootElement` property.
-
-        See the documentation for `Ember.EventDispatcher` for more information.
-
-        @property eventDispatcher
-        @type Ember.EventDispatcher
-        @default null
-      */
-      eventDispatcher: null,
-
-      /**
-        The DOM events for which the event dispatcher should listen.
-
-        By default, the application's `Ember.EventDispatcher` listens
-        for a set of standard DOM events, such as `mousedown` and
-        `keyup`, and delegates them to your application's `Ember.View`
-        instances.
-
-        If you would like additional bubbling events to be delegated to your
-        views, set your `Ember.Application`'s `customEvents` property
-        to a hash containing the DOM event name as the key and the
-        corresponding view method name as the value. For example:
-
-        ```javascript
-        App = Ember.Application.create({
-          customEvents: {
-            // add support for the paste event
-            paste: "paste"
-          }
-        });
-        ```
-
-        @property customEvents
-        @type Object
-        @default null
-      */
-      customEvents: null,
-
-      // Start off the number of deferrals at 1. This will be
-      // decremented by the Application's own `initialize` method.
-      _readinessDeferrals: 1,
-
-      init: function() {
-        if (!this.$) { this.$ = jQuery; }
-        this.__container__ = this.buildContainer();
-
-        this.Router = this.defaultRouter();
-
-        this._super();
-
-        this.scheduleInitialize();
-
-        Ember.libraries.registerCoreLibrary('Handlebars', EmberHandlebars.VERSION);
-        Ember.libraries.registerCoreLibrary('jQuery', jQuery().jquery);
-
-        if ( Ember.LOG_VERSION ) {
-          Ember.LOG_VERSION = false; // we only need to see this once per Application#init
-          var maxNameLength = Math.max.apply(this, A(Ember.libraries).mapBy("name.length"));
-
-          Ember.debug('-------------------------------');
-          Ember.libraries.each(function(name, version) {
-            var spaces = new Array(maxNameLength - name.length + 1).join(" ");
-            Ember.debug([name, spaces, ' : ', version].join(""));
-          });
-          Ember.debug('-------------------------------');
-        }
-      },
-
-      /**
-        Build the container for the current application.
-
-        Also register a default application view in case the application
-        itself does not.
-
-        @private
-        @method buildContainer
-        @return {Ember.Container} the configured container
-      */
-      buildContainer: function() {
-        var container = this.__container__ = Application.buildContainer(this);
-
-        return container;
-      },
-
-      /**
-        If the application has not opted out of routing and has not explicitly
-        defined a router, supply a default router for the application author
-        to configure.
-
-        This allows application developers to do:
-
-        ```javascript
-        var App = Ember.Application.create();
-
-        App.Router.map(function() {
-          this.resource('posts');
-        });
-        ```
-
-        @private
-        @method defaultRouter
-        @return {Ember.Router} the default router
-      */
-
-      defaultRouter: function() {
-        if (this.Router === false) { return; }
-        var container = this.__container__;
-
-        if (this.Router) {
-          container.unregister('router:main');
-          container.register('router:main', this.Router);
-        }
-
-        return container.lookupFactory('router:main');
-      },
-
-      /**
-        Automatically initialize the application once the DOM has
-        become ready.
-
-        The initialization itself is scheduled on the actions queue
-        which ensures that application loading finishes before
-        booting.
-
-        If you are asynchronously loading code, you should call
-        `deferReadiness()` to defer booting, and then call
-        `advanceReadiness()` once all of your code has finished
-        loading.
-
-        @private
-        @method scheduleInitialize
-      */
-      scheduleInitialize: function() {
-        var self = this;
-
-        if (!this.$ || this.$.isReady) {
-          run.schedule('actions', self, '_initialize');
-        } else {
-          this.$().ready(function runInitialize() {
-            run(self, '_initialize');
-          });
-        }
-      },
-
-      /**
-        Use this to defer readiness until some condition is true.
-
-        Example:
-
-        ```javascript
-        App = Ember.Application.create();
-        App.deferReadiness();
-
-        jQuery.getJSON("/auth-token", function(token) {
-          App.token = token;
-          App.advanceReadiness();
-        });
-        ```
-
-        This allows you to perform asynchronous setup logic and defer
-        booting your application until the setup has finished.
-
-        However, if the setup requires a loading UI, it might be better
-        to use the router for this purpose.
-
-        @method deferReadiness
-      */
-      deferReadiness: function() {
-        Ember.assert("You must call deferReadiness on an instance of Ember.Application", this instanceof Application);
-        Ember.assert("You cannot defer readiness since the `ready()` hook has already been called.", this._readinessDeferrals > 0);
-        this._readinessDeferrals++;
-      },
-
-      /**
-        Call `advanceReadiness` after any asynchronous setup logic has completed.
-        Each call to `deferReadiness` must be matched by a call to `advanceReadiness`
-        or the application will never become ready and routing will not begin.
-
-        @method advanceReadiness
-        @see {Ember.Application#deferReadiness}
-      */
-      advanceReadiness: function() {
-        Ember.assert("You must call advanceReadiness on an instance of Ember.Application", this instanceof Application);
-        this._readinessDeferrals--;
-
-        if (this._readinessDeferrals === 0) {
-          run.once(this, this.didBecomeReady);
-        }
-      },
-
-      /**
-        Registers a factory that can be used for dependency injection (with
-        `App.inject`) or for service lookup. Each factory is registered with
-        a full name including two parts: `type:name`.
-
-        A simple example:
-
-        ```javascript
-        var App = Ember.Application.create();
-        App.Orange  = Ember.Object.extend();
-        App.register('fruit:favorite', App.Orange);
-        ```
-
-        Ember will resolve factories from the `App` namespace automatically.
-        For example `App.CarsController` will be discovered and returned if
-        an application requests `controller:cars`.
-
-        An example of registering a controller with a non-standard name:
-
-        ```javascript
-        var App = Ember.Application.create(),
-            Session  = Ember.Controller.extend();
-
-        App.register('controller:session', Session);
-
-        // The Session controller can now be treated like a normal controller,
-        // despite its non-standard name.
-        App.ApplicationController = Ember.Controller.extend({
-          needs: ['session']
-        });
-        ```
-
-        Registered factories are **instantiated** by having `create`
-        called on them. Additionally they are **singletons**, each time
-        they are looked up they return the same instance.
-
-        Some examples modifying that default behavior:
-
-        ```javascript
-        var App = Ember.Application.create();
-
-        App.Person  = Ember.Object.extend();
-        App.Orange  = Ember.Object.extend();
-        App.Email   = Ember.Object.extend();
-        App.session = Ember.Object.create();
-
-        App.register('model:user', App.Person, {singleton: false });
-        App.register('fruit:favorite', App.Orange);
-        App.register('communication:main', App.Email, {singleton: false});
-        App.register('session', App.session, {instantiate: false});
-        ```
-
-        @method register
-        @param  fullName {String} type:name (e.g., 'model:user')
-        @param  factory {Function} (e.g., App.Person)
-        @param  options {Object} (optional) disable instantiation or singleton usage
-      **/
-      register: function() {
-        var container = this.__container__;
-        container.register.apply(container, arguments);
-      },
-
-      /**
-        Define a dependency injection onto a specific factory or all factories
-        of a type.
-
-        When Ember instantiates a controller, view, or other framework component
-        it can attach a dependency to that component. This is often used to
-        provide services to a set of framework components.
-
-        An example of providing a session object to all controllers:
-
-        ```javascript
-        var App = Ember.Application.create(),
-            Session = Ember.Object.extend({ isAuthenticated: false });
-
-        // A factory must be registered before it can be injected
-        App.register('session:main', Session);
-
-        // Inject 'session:main' onto all factories of the type 'controller'
-        // with the name 'session'
-        App.inject('controller', 'session', 'session:main');
-
-        App.IndexController = Ember.Controller.extend({
-          isLoggedIn: Ember.computed.alias('session.isAuthenticated')
-        });
-        ```
-
-        Injections can also be performed on specific factories.
-
-        ```javascript
-        App.inject(<full_name or type>, <property name>, <full_name>)
-        App.inject('route', 'source', 'source:main')
-        App.inject('route:application', 'email', 'model:email')
-        ```
-
-        It is important to note that injections can only be performed on
-        classes that are instantiated by Ember itself. Instantiating a class
-        directly (via `create` or `new`) bypasses the dependency injection
-        system.
-
-        Ember-Data instantiates its models in a unique manner, and consequently
-        injections onto models (or all models) will not work as expected. Injections
-        on models can be enabled by setting `Ember.MODEL_FACTORY_INJECTIONS`
-        to `true`.
-
-        @method inject
-        @param  factoryNameOrType {String}
-        @param  property {String}
-        @param  injectionName {String}
-      **/
-      inject: function() {
-        var container = this.__container__;
-        container.injection.apply(container, arguments);
-      },
-
-      /**
-        Calling initialize manually is not supported.
-
-        Please see Ember.Application#advanceReadiness and
-        Ember.Application#deferReadiness.
-
-        @private
-        @deprecated
-        @method initialize
-       **/
-      initialize: function() {
-        Ember.deprecate('Calling initialize manually is not supported. Please see Ember.Application#advanceReadiness and Ember.Application#deferReadiness');
-      },
-
-      /**
-        Initialize the application. This happens automatically.
-
-        Run any initializers and run the application load hook. These hooks may
-        choose to defer readiness. For example, an authentication hook might want
-        to defer readiness until the auth token has been retrieved.
-
-        @private
-        @method _initialize
-      */
-      _initialize: function() {
-        if (this.isDestroyed) { return; }
-
-        // At this point, the App.Router must already be assigned
-        if (this.Router) {
-          var container = this.__container__;
-          container.unregister('router:main');
-          container.register('router:main', this.Router);
-        }
-
-        this.runInitializers();
-        runLoadHooks('application', this);
-
-        // At this point, any initializers or load hooks that would have wanted
-        // to defer readiness have fired. In general, advancing readiness here
-        // will proceed to didBecomeReady.
-        this.advanceReadiness();
-
-        return this;
-      },
-
-      /**
-        Reset the application. This is typically used only in tests. It cleans up
-        the application in the following order:
-
-        1. Deactivate existing routes
-        2. Destroy all objects in the container
-        3. Create a new application container
-        4. Re-route to the existing url
-
-        Typical Example:
-
-        ```javascript
-
-        var App;
-
-        run(function() {
-          App = Ember.Application.create();
-        });
-
-        module("acceptance test", {
-          setup: function() {
-            App.reset();
-          }
-        });
-
-        test("first test", function() {
-          // App is freshly reset
-        });
-
-        test("first test", function() {
-          // App is again freshly reset
-        });
-        ```
-
-        Advanced Example:
-
-        Occasionally you may want to prevent the app from initializing during
-        setup. This could enable extra configuration, or enable asserting prior
-        to the app becoming ready.
-
-        ```javascript
-
-        var App;
-
-        run(function() {
-          App = Ember.Application.create();
-        });
-
-        module("acceptance test", {
-          setup: function() {
-            run(function() {
-              App.reset();
-              App.deferReadiness();
-            });
-          }
-        });
-
-        test("first test", function() {
-          ok(true, 'something before app is initialized');
-
-          run(function() {
-            App.advanceReadiness();
-          });
-          ok(true, 'something after app is initialized');
-        });
-        ```
-
-        @method reset
-      **/
-      reset: function() {
-        this._readinessDeferrals = 1;
-
-        function handleReset() {
-          var router = this.__container__.lookup('router:main');
-          router.reset();
-
-          run(this.__container__, 'destroy');
-
-          this.buildContainer();
-
-          run.schedule('actions', this, function() {
-            this._initialize();
-          });
-        }
-
-        run.join(this, handleReset);
-      },
-
-      /**
-        @private
-        @method runInitializers
-      */
-      runInitializers: function() {
-        var initializers = get(this.constructor, 'initializers'),
-            container = this.__container__,
-            graph = new DAG(),
-            namespace = this,
-            name, initializer;
-
-        for (name in initializers) {
-          initializer = initializers[name];
-          graph.addEdges(initializer.name, initializer.initialize, initializer.before, initializer.after);
-        }
-
-        graph.topsort(function (vertex) {
-          var initializer = vertex.value;
-          Ember.assert("No application initializer named '"+vertex.name+"'", initializer);
-          initializer(container, namespace);
-        });
-      },
-
-      /**
-        @private
-        @method didBecomeReady
-      */
-      didBecomeReady: function() {
-        this.setupEventDispatcher();
-        this.ready(); // user hook
-        this.startRouting();
-
-        if (!Ember.testing) {
-          // Eagerly name all classes that are already loaded
-          Ember.Namespace.processAll();
-          Ember.BOOTED = true;
-        }
-
-        this.resolve(this);
-      },
-
-      /**
-        Setup up the event dispatcher to receive events on the
-        application's `rootElement` with any registered
-        `customEvents`.
-
-        @private
-        @method setupEventDispatcher
-      */
-      setupEventDispatcher: function() {
-        var customEvents = get(this, 'customEvents'),
-            rootElement = get(this, 'rootElement'),
-            dispatcher = this.__container__.lookup('event_dispatcher:main');
-
-        set(this, 'eventDispatcher', dispatcher);
-        dispatcher.setup(customEvents, rootElement);
-      },
-
-      /**
-        trigger a new call to `route` whenever the URL changes.
-        If the application has a router, use it to route to the current URL, and
-
-        @private
-        @method startRouting
-        @property router {Ember.Router}
-      */
-      startRouting: function() {
-        var router = this.__container__.lookup('router:main');
-        if (!router) { return; }
-
-        router.startRouting();
-      },
-
-      handleURL: function(url) {
-        var router = this.__container__.lookup('router:main');
-
-        router.handleURL(url);
-      },
-
-      /**
-        Called when the Application has become ready.
-        The call will be delayed until the DOM has become ready.
-
-        @event ready
-      */
-      ready: K,
-
-      /**
-        @deprecated Use 'Resolver' instead
-        Set this to provide an alternate class to `Ember.DefaultResolver`
-
-
-        @property resolver
-      */
-      resolver: null,
-
-      /**
-        Set this to provide an alternate class to `Ember.DefaultResolver`
-
-        @property resolver
-      */
-      Resolver: null,
-
-      willDestroy: function() {
-        Ember.BOOTED = false;
-        // Ensure deactivation of routes before objects are destroyed
-        this.__container__.lookup('router:main').reset();
-
-        this.__container__.destroy();
-      },
-
-      initializer: function(options) {
-        this.constructor.initializer(options);
-      }
-    });
-
-    Application.reopenClass({
-      initializers: {},
-      initializer: function(initializer) {
-        // If this is the first initializer being added to a subclass, we are going to reopen the class
-        // to make sure we have a new `initializers` object, which extends from the parent class' using
-        // prototypal inheritance. Without this, attempting to add initializers to the subclass would
-        // pollute the parent class as well as other subclasses.
-        if (this.superclass.initializers !== undefined && this.superclass.initializers === this.initializers) {
-          this.reopenClass({
-            initializers: create(this.initializers)
-          });
-        }
-
-        Ember.assert("The initializer '" + initializer.name + "' has already been registered", !this.initializers[initializer.name]);
-        Ember.assert("An initializer cannot be registered with both a before and an after", !(initializer.before && initializer.after));
-        Ember.assert("An initializer cannot be registered without an initialize function", canInvoke(initializer, 'initialize'));
-
-        this.initializers[initializer.name] = initializer;
-      },
-
-      /**
-        This creates a container with the default Ember naming conventions.
-
-        It also configures the container:
-
-        * registered views are created every time they are looked up (they are
-          not singletons)
-        * registered templates are not factories; the registered value is
-          returned directly.
-        * the router receives the application as its `namespace` property
-        * all controllers receive the router as their `target` and `controllers`
-          properties
-        * all controllers receive the application as their `namespace` property
-        * the application view receives the application controller as its
-          `controller` property
-        * the application view receives the application template as its
-          `defaultTemplate` property
-
-        @private
-        @method buildContainer
-        @static
-        @param {Ember.Application} namespace the application to build the
-          container for.
-        @return {Ember.Container} the built container
-      */
-      buildContainer: function(namespace) {
-        var container = new Container();
-
-        Container.defaultContainer = new DeprecatedContainer(container);
-
-        container.set = set;
-        container.resolver  = resolverFor(namespace);
-        container.normalize = container.resolver.normalize;
-        container.describe  = container.resolver.describe;
-        container.makeToString = container.resolver.makeToString;
-
-        container.optionsForType('component', { singleton: false });
-        container.optionsForType('view', { singleton: false });
-        container.optionsForType('template', { instantiate: false });
-        container.optionsForType('helper', { instantiate: false });
-
-        container.register('application:main', namespace, { instantiate: false });
-
-        container.register('controller:basic', Controller, { instantiate: false });
-        container.register('controller:object', ObjectController, { instantiate: false });
-        container.register('controller:array', ArrayController, { instantiate: false });
-        container.register('route:basic', Route, { instantiate: false });
-        container.register('event_dispatcher:main', EventDispatcher);
-
-        container.register('router:main',  Router);
-        container.injection('router:main', 'namespace', 'application:main');
-
-        container.register('location:auto', AutoLocation);
-        container.register('location:hash', HashLocation);
-        container.register('location:history', HistoryLocation);
-        container.register('location:none', NoneLocation);
-
-        container.injection('controller', 'target', 'router:main');
-        container.injection('controller', 'namespace', 'application:main');
-
-        container.injection('route', 'router', 'router:main');
-
-        // DEBUGGING
-        container.register('resolver-for-debugging:main', container.resolver.__resolver__, { instantiate: false });
-        container.injection('container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');
-        container.injection('data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');
-        // Custom resolver authors may want to register their own ContainerDebugAdapter with this key
-
-        // ES6TODO: resolve this via import once ember-application package is ES6'ed
-        requireModule('ember-extension-support');
-        container.register('container-debug-adapter:main', ContainerDebugAdapter);
-
-        return container;
-      }
-    });
-
-    /**
-      This function defines the default lookup rules for container lookups:
-
-      * templates are looked up on `Ember.TEMPLATES`
-      * other names are looked up on the application after classifying the name.
-        For example, `controller:post` looks up `App.PostController` by default.
-      * if the default lookup fails, look for registered classes on the container
-
-      This allows the application to register default injections in the container
-      that could be overridden by the normal naming convention.
-
-      @private
-      @method resolverFor
-      @param {Ember.Namespace} namespace the namespace to look for classes
-      @return {*} the resolved value for a given lookup
-    */
-    function resolverFor(namespace) {
-      if (namespace.get('resolver')) {
-        Ember.deprecate('Application.resolver is deprecated in favor of Application.Resolver', false);
-      }
-
-      var ResolverClass = namespace.get('resolver') || namespace.get('Resolver') || DefaultResolver;
-      var resolver = ResolverClass.create({
-        namespace: namespace
-      });
-
-      function resolve(fullName) {
-        return resolver.resolve(fullName);
-      }
-
-      resolve.describe = function(fullName) {
-        return resolver.lookupDescription(fullName);
-      };
-
-      resolve.makeToString = function(factory, fullName) {
-        return resolver.makeToString(factory, fullName);
-      };
-
-      resolve.normalize = function(fullName) {
-        if (resolver.normalize) {
-          return resolver.normalize(fullName);
-        } else {
-          Ember.deprecate('The Resolver should now provide a \'normalize\' function', false);
-          return fullName;
-        }
-      };
-
-      resolve.__resolver__ = resolver;
-
-      return resolve;
-    }
-
-    __exports__["default"] = Application;
-  });
-define("ember-application/system/dag", 
-  ["exports"],
-  function(__exports__) {
-    "use strict";
-    function visit(vertex, fn, visited, path) {
-      var name = vertex.name,
-        vertices = vertex.incoming,
-        names = vertex.incomingNames,
-        len = names.length,
-        i;
-      if (!visited) {
-        visited = {};
-      }
-      if (!path) {
-        path = [];
-      }
-      if (visited.hasOwnProperty(name)) {
-        return;
-      }
-      path.push(name);
-      visited[name] = true;
-      for (i = 0; i < len; i++) {
-        visit(vertices[names[i]], fn, visited, path);
-      }
-      fn(vertex, path);
-      path.pop();
-    }
-
-    function DAG() {
-      this.names = [];
-      this.vertices = {};
-    }
-
-    DAG.prototype.add = function(name) {
-      if (!name) { return; }
-      if (this.vertices.hasOwnProperty(name)) {
-        return this.vertices[name];
-      }
-      var vertex = {
-        name: name, incoming: {}, incomingNames: [], hasOutgoing: false, value: null
-      };
-      this.vertices[name] = vertex;
-      this.names.push(name);
-      return vertex;
-    };
-
-    DAG.prototype.map = function(name, value) {
-      this.add(name).value = value;
-    };
-
-    DAG.prototype.addEdge = function(fromName, toName) {
-      if (!fromName || !toName || fromName === toName) {
-        return;
-      }
-      var from = this.add(fromName), to = this.add(toName);
-      if (to.incoming.hasOwnProperty(fromName)) {
-        return;
-      }
-      function checkCycle(vertex, path) {
-        if (vertex.name === toName) {
-          throw new EmberError("cycle detected: " + toName + " <- " + path.join(" <- "));
-        }
-      }
-      visit(from, checkCycle);
-      from.hasOutgoing = true;
-      to.incoming[fromName] = from;
-      to.incomingNames.push(fromName);
-    };
-
-    DAG.prototype.topsort = function(fn) {
-      var visited = {},
-        vertices = this.vertices,
-        names = this.names,
-        len = names.length,
-        i, vertex;
-      for (i = 0; i < len; i++) {
-        vertex = vertices[names[i]];
-        if (!vertex.hasOutgoing) {
-          visit(vertex, fn, visited);
-        }
-      }
-    };
-
-    DAG.prototype.addEdges = function(name, value, before, after) {
-      var i;
-      this.map(name, value);
-      if (before) {
-        if (typeof before === 'string') {
-          this.addEdge(name, before);
-        } else {
-          for (i = 0; i < before.length; i++) {
-            this.addEdge(name, before[i]);
-          }
-        }
-      }
-      if (after) {
-        if (typeof after === 'string') {
-          this.addEdge(after, name);
-        } else {
-          for (i = 0; i < after.length; i++) {
-            this.addEdge(after[i], name);
-          }
-        }
-      }
-    };
-
-    __exports__["default"] = DAG;
-  });
-define("ember-application/system/resolver", 
-  ["ember-metal/core","ember-metal/property_get","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/system/namespace","ember-handlebars","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) {
-    "use strict";
-    /**
-    @module ember
-    @submodule ember-application
-    */
-
-    var Ember = __dependency1__["default"];
-    // Ember.TEMPLATES, Ember.assert
-    var get = __dependency2__.get;
-    var classify = __dependency3__.classify;
-    var capitalize = __dependency3__.capitalize;
-    var decamelize = __dependency3__.decamelize;
-    var EmberObject = __dependency4__["default"];
-    var Namespace = __dependency5__["default"];
-    var EmberHandlebars = __dependency6__["default"];
-
-    var Resolver = EmberObject.extend({
-      /**
-        This will be set to the Application instance when it is
-        created.
-
-        @property namespace
-      */
-      namespace: null,
-      normalize: function(fullName) {
-        throw new Error("Invalid call to `resolver.normalize(fullName)`. Please override the 'normalize' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      },
-      resolve: function(fullName) {
-       throw new Error("Invalid call to `resolver.resolve(parsedName)`. Please override the 'resolve' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      },
-      parseName: function(parsedName) {
-       throw new Error("Invalid call to `resolver.resolveByType(parsedName)`. Please override the 'resolveByType' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      },
-      lookupDescription: function(fullName) {
-        throw new Error("Invalid call to `resolver.lookupDescription(fullName)`. Please override the 'lookupDescription' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      },
-      makeToString: function(factory, fullName) {
-        throw new Error("Invalid call to `resolver.makeToString(factory, fullName)`. Please override the 'makeToString' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      },
-      resolveOther: function(parsedName) {
-       throw new Error("Invalid call to `resolver.resolveDefault(parsedName)`. Please override the 'resolveDefault' method in subclass of `Ember.AbstractResolver` to prevent falling through to this error.");
-      }
-    });
-
-
-
-    /**
-      The DefaultResolver defines the default lookup rules to resolve
-      container lookups before consulting the container for registered
-      items:
-
-      * templates are looked up on `Ember.TEMPLATES`
-      * other names are looked up on the application after converting
-        the name. For example, `controller:post` looks up
-        `App.PostController` by default.
-      * there are some nuances (see examples below)
-
-      ### How Resolving Works
-
-      The container calls this object's `resolve` method with the
-      `fullName` argument.
-
-      It first parses the fullName into an object using `parseName`.
-
-      Then it checks for the presence of a type-specific instance
-      method of the form `resolve[Type]` and calls it if it exists.
-      For example if it was resolving 'template:post', it would call
-      the `resolveTemplate` method.
-
-      Its last resort is to call the `resolveOther` method.
-
-      The methods of this object are designed to be easy to override
-      in a subclass. For example, you could enhance how a template
-      is resolved like so:
-
-      ```javascript
-      App = Ember.Application.create({
-        Resolver: Ember.DefaultResolver.extend({
-          resolveTemplate: function(parsedName) {
-            var resolvedTemplate = this._super(parsedName);
-            if (resolvedTemplate) { return resolvedTemplate; }
-            return Ember.TEMPLATES['not_found'];
-          }
-        })
-      });
-      ```
-
-      Some examples of how names are resolved:
-
-      ```
-      'template:post' //=> Ember.TEMPLATES['post']
-      'template:posts/byline' //=> Ember.TEMPLATES['posts/byline']
-      'template:posts.byline' //=> Ember.TEMPLATES['posts/byline']
-      'template:blogPost' //=> Ember.TEMPLATES['blogPost']
-                          //   OR
-                          //   Ember.TEMPLATES['blog_post']
-      'controller:post' //=> App.PostController
-      'controller:posts.index' //=> App.PostsIndexController
-      'controller:blog/post' //=> Blog.PostController
-      'controller:basic' //=> Ember.Controller
-      'route:post' //=> App.PostRoute
-      'route:posts.index' //=> App.PostsIndexRoute
-      'route:blog/post' //=> Blog.PostRoute
-      'route:basic' //=> Ember.Route
-      'view:post' //=> App.PostView
-      'view:posts.index' //=> App.PostsIndexView
-      'view:blog/post' //=> Blog.PostView
-      'view:basic' //=> Ember.View
-      'foo:post' //=> App.PostFoo
-      'model:post' //=> App.Post
-      ```
-
-      @class DefaultResolver
-      @namespace Ember
-      @extends Ember.Object
-    */
-    var DefaultResolver = EmberObject.extend({
-      /**
-        This will be set to the Application instance when it is
-        created.
-
-        @property namespace
-      */
-      namespace: null,
-
-      normalize: function(fullName) {
-        var split = fullName.split(':', 2),
-            type = split[0],
-            name = split[1];
-
-        Ember.assert("Tried to normalize a container name without a colon (:) in it. You probably tried to lookup a name that did not contain a type, a colon, and a name. A proper lookup name would be `view:post`.", split.length === 2);
-
-        if (type !== 'template') {
-          var result = name;
-
-          if (result.indexOf('.') > -1) {
-            result = result.replace(/\.(.)/g, function(m) { return m.charAt(1).toUpperCase(); });
-          }
-
-          if (name.indexOf('_') > -1) {
-            result = result.replace(/_(.)/g, function(m) { return m.charAt(1).toUpperCase(); });
-          }
-
-          return type + ':' + result;
-        } else {
-          return fullName;
-        }
-      },
-
-
-      /**
-        This method is called via the container's resolver method.
-        It parses the provided `fullName` and then looks up and
-        returns the appropriate template or class.
-
-        @method resolve
-        @param {String} fullName the lookup string
-        @return {Object} the resolved factory
-      */
-      resolve: function(fullName) {
-        var parsedName = this.parseName(fullName),
-            resolveMethodName = parsedName.resolveMethodName;
-
-        if (!(parsedName.name && parsedName.type)) {
-          throw new TypeError("Invalid fullName: `" + fullName + "`, must be of the form `type:name` ");
-        }
-
-        if (this[resolveMethodName]) {
-          var resolved = this[resolveMethodName](parsedName);
-          if (resolved) { return resolved; }
-        }
-        return this.resolveOther(parsedName);
-      },
-      /**
-        Convert the string name of the form "type:name" to
-        a Javascript object with the parsed aspects of the name
-        broken out.
-
-        @protected
-        @param {String} fullName the lookup string
-        @method parseName
-      */
-      parseName: function(fullName) {
-        var nameParts = fullName.split(":"),
-            type = nameParts[0], fullNameWithoutType = nameParts[1],
-            name = fullNameWithoutType,
-            namespace = get(this, 'namespace'),
-            root = namespace;
-
-        if (type !== 'template' && name.indexOf('/') !== -1) {
-          var parts = name.split('/');
-          name = parts[parts.length - 1];
-          var namespaceName = capitalize(parts.slice(0, -1).join('.'));
-          root = Namespace.byName(namespaceName);
-
-          Ember.assert('You are looking for a ' + name + ' ' + type + ' in the ' + namespaceName + ' namespace, but the namespace could not be found', root);
-        }
-
-        return {
-          fullName: fullName,
-          type: type,
-          fullNameWithoutType: fullNameWithoutType,
-          name: name,
-          root: root,
-          resolveMethodName: "resolve" + classify(type)
-        };
-      },
-
-      /**
-        Returns a human-readable description for a fullName. Used by the
-        Application namespace in assertions to describe the
-        precise name of the class that Ember is looking for, rather than
-        container keys.
-
-        @protected
-        @param {String} fullName the lookup string
-        @method lookupDescription
-      */
-      lookupDescription: function(fullName) {
-        var parsedName = this.parseName(fullName);
-
-        if (parsedName.type === 'template') {
-          return "template at " + parsedName.fullNameWithoutType.replace(/\./g, '/');
-        }
-
-        var description = parsedName.root + "." + classify(parsedName.name);
-        if (parsedName.type !== 'model') { description += classify(parsedName.type); }
-
-        return description;
-      },
-
-      makeToString: function(factory, fullName) {
-        return factory.toString();
-      },
-      /**
-        Given a parseName object (output from `parseName`), apply
-        the conventions expected by `Ember.Router`
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method useRouterNaming
-      */
-      useRouterNaming: function(parsedName) {
-        parsedName.name = parsedName.name.replace(/\./g, '_');
-        if (parsedName.name === 'basic') {
-          parsedName.name = '';
-        }
-      },
-      /**
-        Look up the template in Ember.TEMPLATES
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveTemplate
-      */
-      resolveTemplate: function(parsedName) {
-        var templateName = parsedName.fullNameWithoutType.replace(/\./g, '/');
-
-        if (Ember.TEMPLATES[templateName]) {
-          return Ember.TEMPLATES[templateName];
-        }
-
-        templateName = decamelize(templateName);
-        if (Ember.TEMPLATES[templateName]) {
-          return Ember.TEMPLATES[templateName];
-        }
-      },
-      /**
-        Lookup the view using `resolveOther`
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveView
-      */
-      resolveView: function(parsedName) {
-        this.useRouterNaming(parsedName);
-        return this.resolveOther(parsedName);
-      },
-      /**
-        Lookup the controller using `resolveOther`
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveController
-      */
-      resolveController: function(parsedName) {
-        this.useRouterNaming(parsedName);
-        return this.resolveOther(parsedName);
-      },
-      /**
-        Lookup the route using `resolveOther`
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveRoute
-      */
-      resolveRoute: function(parsedName) {
-        this.useRouterNaming(parsedName);
-        return this.resolveOther(parsedName);
-      },
-
-      /**
-        Lookup the model on the Application namespace
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveModel
-      */
-      resolveModel: function(parsedName) {
-        var className = classify(parsedName.name),
-            factory = get(parsedName.root, className);
-
-         if (factory) { return factory; }
-      },
-      /**
-        Look up the specified object (from parsedName) on the appropriate
-        namespace (usually on the Application)
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveHelper
-      */
-      resolveHelper: function(parsedName) {
-        return this.resolveOther(parsedName) || EmberHandlebars.helpers[parsedName.fullNameWithoutType];
-      },
-      /**
-        Look up the specified object (from parsedName) on the appropriate
-        namespace (usually on the Application)
-
-        @protected
-        @param {Object} parsedName a parseName object with the parsed
-          fullName lookup string
-        @method resolveOther
-      */
-      resolveOther: function(parsedName) {
-        var className = classify(parsedName.name) + classify(parsedName.type),
-            factory = get(parsedName.root, className);
-        if (factory) { return factory; }
-      }
-    });
-
-    __exports__.Resolver = Resolver;
-    __exports__.DefaultResolver = DefaultResolver;
-  });
-})();
-
-(function() {
-define("ember-extension-support/container_debug_adapter", 
-  ["ember-metal/core","ember-metal/utils","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var typeOf = __dependency2__.typeOf;
-    var dasherize = __dependency3__.dasherize;
-    var classify = __dependency3__.classify;
-    var Namespace = __dependency4__["default"];
-    var EmberObject = __dependency5__["default"];
-
-    /**
-    @module ember
-    @submodule ember-extension-support
-    */
-
-    /**
-      The `ContainerDebugAdapter` helps the container and resolver interface
-      with tools that debug Ember such as the
-      [Ember Extension](https://github.com/tildeio/ember-extension)
-      for Chrome and Firefox.
-
-      This class can be extended by a custom resolver implementer
-      to override some of the methods with library-specific code.
-
-      The methods likely to be overridden are:
-
-      * `canCatalogEntriesByType`
-      * `catalogEntriesByType`
-
-      The adapter will need to be registered
-      in the application's container as `container-debug-adapter:main`
-
-      Example:
-
-      ```javascript
-      Application.initializer({
-        name: "containerDebugAdapter",
-
-        initialize: function(container, application) {
-          application.register('container-debug-adapter:main', require('app/container-debug-adapter'));
-        }
-      });
-      ```
-
-      @class ContainerDebugAdapter
-      @namespace Ember
-      @extends EmberObject
-    */
-    var ContainerDebugAdapter = EmberObject.extend({
-      /**
-        The container of the application being debugged.
-        This property will be injected
-        on creation.
-
-        @property container
-        @default null
-      */
-      container: null,
-
-      /**
-        The resolver instance of the application
-        being debugged. This property will be injected
-        on creation.
-
-        @property resolver
-        @default null
-      */
-      resolver: null,
-
-      /**
-        Returns true if it is possible to catalog a list of available
-        classes in the resolver for a given type.
-
-        @method canCatalogEntriesByType
-        @param {string} type The type. e.g. "model", "controller", "route"
-        @return {boolean} whether a list is available for this type.
-      */
-      canCatalogEntriesByType: function(type) {
-        if (type === 'model' || type === 'template') return false;
-        return true;
-      },
-
-      /**
-        Returns the available classes a given type.
-
-        @method catalogEntriesByType
-        @param {string} type The type. e.g. "model", "controller", "route"
-        @return {Array} An array of strings.
-      */
-      catalogEntriesByType: function(type) {
-        var namespaces = Ember.A(Namespace.NAMESPACES), types = Ember.A(), self = this;
-        var typeSuffixRegex = new RegExp(classify(type) + "$");
-
-        namespaces.forEach(function(namespace) {
-          if (namespace !== Ember) {
-            for (var key in namespace) {
-              if (!namespace.hasOwnProperty(key)) { continue; }
-              if (typeSuffixRegex.test(key)) {
-                var klass = namespace[key];
-                if (typeOf(klass) === 'class') {
-                  types.push(dasherize(key.replace(typeSuffixRegex, '')));
-                }
-              }
-            }
-          }
-        });
-        return types;
-      }
-    });
-
-    __exports__["default"] = ContainerDebugAdapter;
-  });
-define("ember-extension-support/data_adapter", 
-  ["ember-metal/core","ember-metal/property_get","ember-metal/run_loop","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","ember-runtime/system/native_array","ember-application/system/application","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var get = __dependency2__.get;
-    var run = __dependency3__["default"];
-    var dasherize = __dependency4__.dasherize;
-    var Namespace = __dependency5__["default"];
-    var EmberObject = __dependency6__["default"];
-    var A = __dependency7__.A;
-    var Application = __dependency8__["default"];
-
-    /**
-    @module ember
-    @submodule ember-extension-support
-    */
-
-    /**
-      The `DataAdapter` helps a data persistence library
-      interface with tools that debug Ember such
-      as the [Ember Extension](https://github.com/tildeio/ember-extension)
-      for Chrome and Firefox.
-
-      This class will be extended by a persistence library
-      which will override some of the methods with
-      library-specific code.
-
-      The methods likely to be overridden are:
-
-      * `getFilters`
-      * `detect`
-      * `columnsForType`
-      * `getRecords`
-      * `getRecordColumnValues`
-      * `getRecordKeywords`
-      * `getRecordFilterValues`
-      * `getRecordColor`
-      * `observeRecord`
-
-      The adapter will need to be registered
-      in the application's container as `dataAdapter:main`
-
-      Example:
-
-      ```javascript
-      Application.initializer({
-        name: "data-adapter",
-
-        initialize: function(container, application) {
-          application.register('data-adapter:main', DS.DataAdapter);
-        }
-      });
-      ```
-
-      @class DataAdapter
-      @namespace Ember
-      @extends EmberObject
-    */
-    var DataAdapter = EmberObject.extend({
-      init: function() {
-        this._super();
-        this.releaseMethods = A();
-      },
-
-      /**
-        The container of the application being debugged.
-        This property will be injected
-        on creation.
-
-        @property container
-        @default null
-      */
-      container: null,
-
-
-      /**
-        The container-debug-adapter which is used
-        to list all models.
-
-        @property containerDebugAdapter
-        @default undefined
-      **/
-      containerDebugAdapter: undefined,
-
-      /**
-        Number of attributes to send
-        as columns. (Enough to make the record
-        identifiable).
-
-        @private
-        @property attributeLimit
-        @default 3
-      */
-      attributeLimit: 3,
-
-      /**
-        Stores all methods that clear observers.
-        These methods will be called on destruction.
-
-        @private
-        @property releaseMethods
-      */
-      releaseMethods: A(),
-
-      /**
-        Specifies how records can be filtered.
-        Records returned will need to have a `filterValues`
-        property with a key for every name in the returned array.
-
-        @public
-        @method getFilters
-        @return {Array} List of objects defining filters.
-         The object should have a `name` and `desc` property.
-      */
-      getFilters: function() {
-        return A();
-      },
-
-      /**
-        Fetch the model types and observe them for changes.
-
-        @public
-        @method watchModelTypes
-
-        @param {Function} typesAdded Callback to call to add types.
-        Takes an array of objects containing wrapped types (returned from `wrapModelType`).
-
-        @param {Function} typesUpdated Callback to call when a type has changed.
-        Takes an array of objects containing wrapped types.
-
-        @return {Function} Method to call to remove all observers
-      */
-      watchModelTypes: function(typesAdded, typesUpdated) {
-        var modelTypes = this.getModelTypes(),
-            self = this, typesToSend, releaseMethods = A();
-
-        typesToSend = modelTypes.map(function(type) {
-          var klass = type.klass;
-          var wrapped = self.wrapModelType(klass, type.name);
-          releaseMethods.push(self.observeModelType(klass, typesUpdated));
-          return wrapped;
-        });
-
-        typesAdded(typesToSend);
-
-        var release = function() {
-          releaseMethods.forEach(function(fn) { fn(); });
-          self.releaseMethods.removeObject(release);
-        };
-        this.releaseMethods.pushObject(release);
-        return release;
-      },
-
-      _nameToClass: function(type) {
-        if (typeof type === 'string') {
-          type = this.container.lookupFactory('model:' + type);
-        }
-        return type;
-      },
-
-      /**
-        Fetch the records of a given type and observe them for changes.
-
-        @public
-        @method watchRecords
-
-        @param {Function} recordsAdded Callback to call to add records.
-        Takes an array of objects containing wrapped records.
-        The object should have the following properties:
-          columnValues: {Object} key and value of a table cell
-          object: {Object} the actual record object
-
-        @param {Function} recordsUpdated Callback to call when a record has changed.
-        Takes an array of objects containing wrapped records.
-
-        @param {Function} recordsRemoved Callback to call when a record has removed.
-        Takes the following parameters:
-          index: the array index where the records were removed
-          count: the number of records removed
-
-        @return {Function} Method to call to remove all observers
-      */
-      watchRecords: function(type, recordsAdded, recordsUpdated, recordsRemoved) {
-        var self = this, releaseMethods = A(), records = this.getRecords(type), release;
-
-        var recordUpdated = function(updatedRecord) {
-          recordsUpdated([updatedRecord]);
-        };
-
-        var recordsToSend = records.map(function(record) {
-          releaseMethods.push(self.observeRecord(record, recordUpdated));
-          return self.wrapRecord(record);
-        });
-
-
-        var contentDidChange = function(array, idx, removedCount, addedCount) {
-          for (var i = idx; i < idx + addedCount; i++) {
-            var record = array.objectAt(i);
-            var wrapped = self.wrapRecord(record);
-            releaseMethods.push(self.observeRecord(record, recordUpdated));
-            recordsAdded([wrapped]);
-          }
-
-          if (removedCount) {
-            recordsRemoved(idx, removedCount);
-          }
-        };
-
-        var observer = { didChange: contentDidChange, willChange: Ember.K };
-        records.addArrayObserver(self, observer);
-
-        release = function() {
-          releaseMethods.forEach(function(fn) { fn(); });
-          records.removeArrayObserver(self, observer);
-          self.releaseMethods.removeObject(release);
-        };
-
-        recordsAdded(recordsToSend);
-
-        this.releaseMethods.pushObject(release);
-        return release;
-      },
-
-      /**
-        Clear all observers before destruction
-        @private
-      */
-      willDestroy: function() {
-        this._super();
-        this.releaseMethods.forEach(function(fn) {
-          fn();
-        });
-      },
-
-      /**
-        Detect whether a class is a model.
-
-        Test that against the model class
-        of your persistence library
-
-        @private
-        @method detect
-        @param {Class} klass The class to test
-        @return boolean Whether the class is a model class or not
-      */
-      detect: function(klass) {
-        return false;
-      },
-
-      /**
-        Get the columns for a given model type.
-
-        @private
-        @method columnsForType
-        @param {Class} type The model type
-        @return {Array} An array of columns of the following format:
-         name: {String} name of the column
-         desc: {String} Humanized description (what would show in a table column name)
-      */
-      columnsForType: function(type) {
-        return A();
-      },
-
-      /**
-        Adds observers to a model type class.
-
-        @private
-        @method observeModelType
-        @param {Class} type The model type class
-        @param {Function} typesUpdated Called when a type is modified.
-        @return {Function} The function to call to remove observers
-      */
-
-      observeModelType: function(type, typesUpdated) {
-        var self = this, records = this.getRecords(type);
-
-        var onChange = function() {
-          typesUpdated([self.wrapModelType(type)]);
-        };
-        var observer = {
-          didChange: function() {
-            run.scheduleOnce('actions', this, onChange);
-          },
-          willChange: Ember.K
-        };
-
-        records.addArrayObserver(this, observer);
-
-        var release = function() {
-          records.removeArrayObserver(self, observer);
-        };
-
-        return release;
-      },
-
-
-      /**
-        Wraps a given model type and observes changes to it.
-
-        @private
-        @method wrapModelType
-        @param {Class} type A model class
-        @param {String}  Optional name of the class
-        @return {Object} contains the wrapped type and the function to remove observers
-        Format:
-          type: {Object} the wrapped type
-            The wrapped type has the following format:
-              name: {String} name of the type
-              count: {Integer} number of records available
-              columns: {Columns} array of columns to describe the record
-              object: {Class} the actual Model type class
-          release: {Function} The function to remove observers
-      */
-      wrapModelType: function(type, name) {
-        var release, records = this.getRecords(type),
-            typeToSend, self = this;
-
-        typeToSend = {
-          name: name || type.toString(),
-          count: get(records, 'length'),
-          columns: this.columnsForType(type),
-          object: type
-        };
-
-
-        return typeToSend;
-      },
-
-
-      /**
-        Fetches all models defined in the application.
-
-        @private
-        @method getModelTypes
-        @return {Array} Array of model types
-      */
-      getModelTypes: function() {
-        var types, self = this,
-            containerDebugAdapter = this.get('containerDebugAdapter');
-
-        if (containerDebugAdapter.canCatalogEntriesByType('model')) {
-          types = containerDebugAdapter.catalogEntriesByType('model');
-        } else {
-          types = this._getObjectsOnNamespaces();
-        }
-        // New adapters return strings instead of classes
-        return types.map(function(name) {
-          return {
-            klass: self._nameToClass(name),
-            name: name
-          };
-        }).filter(function(type) {
-          return self.detect(type.klass);
-        });
-      },
-
-      /**
-        Loops over all namespaces and all objects
-        attached to them
-
-        @private
-        @method _getObjectsOnNamespaces
-        @return {Array} Array of model type strings
-      */
-      _getObjectsOnNamespaces: function() {
-        var namespaces = A(Namespace.NAMESPACES), types = A();
-
-        namespaces.forEach(function(namespace) {
-          for (var key in namespace) {
-            if (!namespace.hasOwnProperty(key)) { continue; }
-            var name = dasherize(key);
-            if (!(namespace instanceof Application) && namespace.toString()) {
-              name = namespace + '/' + name;
-            }
-            types.push(name);
-          }
-        });
-        return types;
-      },
-
-      /**
-        Fetches all loaded records for a given type.
-
-        @private
-        @method getRecords
-        @return {Array} An array of records.
-         This array will be observed for changes,
-         so it should update when new records are added/removed.
-      */
-      getRecords: function(type) {
-        return A();
-      },
-
-      /**
-        Wraps a record and observers changes to it.
-
-        @private
-        @method wrapRecord
-        @param {Object} record The record instance.
-        @return {Object} The wrapped record. Format:
-        columnValues: {Array}
-        searchKeywords: {Array}
-      */
-      wrapRecord: function(record) {
-        var recordToSend = { object: record }, columnValues = {}, self = this;
-
-        recordToSend.columnValues = this.getRecordColumnValues(record);
-        recordToSend.searchKeywords = this.getRecordKeywords(record);
-        recordToSend.filterValues = this.getRecordFilterValues(record);
-        recordToSend.color = this.getRecordColor(record);
-
-        return recordToSend;
-      },
-
-      /**
-        Gets the values for each column.
-
-        @private
-        @method getRecordColumnValues
-        @return {Object} Keys should match column names defined
-        by the model type.
-      */
-      getRecordColumnValues: function(record) {
-        return {};
-      },
-
-      /**
-        Returns keywords to match when searching records.
-
-        @private
-        @method getRecordKeywords
-        @return {Array} Relevant keywords for search.
-      */
-      getRecordKeywords: function(record) {
-        return A();
-      },
-
-      /**
-        Returns the values of filters defined by `getFilters`.
-
-        @private
-        @method getRecordFilterValues
-        @param {Object} record The record instance
-        @return {Object} The filter values
-      */
-      getRecordFilterValues: function(record) {
-        return {};
-      },
-
-      /**
-        Each record can have a color that represents its state.
-
-        @private
-        @method getRecordColor
-        @param {Object} record The record instance
-        @return {String} The record's color
-          Possible options: black, red, blue, green
-      */
-      getRecordColor: function(record) {
-        return null;
-      },
-
-      /**
-        Observes all relevant properties and re-sends the wrapped record
-        when a change occurs.
-
-        @private
-        @method observerRecord
-        @param {Object} record The record instance
-        @param {Function} recordUpdated The callback to call when a record is updated.
-        @return {Function} The function to call to remove all observers.
-      */
-      observeRecord: function(record, recordUpdated) {
-        return function(){};
-      }
-
-    });
-
-    __exports__["default"] = DataAdapter;
-  });
-define("ember-extension-support/initializers", 
-  [],
-  function() {
-    "use strict";
-
-  });
-define("ember-extension-support", 
-  ["ember-metal/core","ember-extension-support/data_adapter","ember-extension-support/container_debug_adapter"],
-  function(__dependency1__, __dependency2__, __dependency3__) {
-    "use strict";
-    /**
-    Ember Extension Support
-
-    @module ember
-    @submodule ember-extension-support
-    @requires ember-application
-    */
-
-    var Ember = __dependency1__["default"];
-    var DataAdapter = __dependency2__["default"];
-    var ContainerDebugAdapter = __dependency3__["default"];
-
-    Ember.DataAdapter = DataAdapter;
-    Ember.ContainerDebugAdapter = ContainerDebugAdapter;
-  });
-})();
-
-(function() {
-define("ember-testing/adapters/adapter", 
-  ["ember-metal/core","ember-metal/utils","ember-runtime/system/object","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // Ember.K
-    var inspect = __dependency2__.inspect;
-    var EmberObject = __dependency3__["default"];
-
-    /**
-     @module ember
-     @submodule ember-testing
-    */
-
-    /**
-      The primary purpose of this class is to create hooks that can be implemented
-      by an adapter for various test frameworks.
-
-      @class Adapter
-      @namespace Ember.Test
-    */
-    var Adapter = EmberObject.extend({
-      /**
-        This callback will be called whenever an async operation is about to start.
-
-        Override this to call your framework's methods that handle async
-        operations.
-
-        @public
-        @method asyncStart
-      */
-      asyncStart: Ember.K,
-
-      /**
-        This callback will be called whenever an async operation has completed.
-
-        @public
-        @method asyncEnd
-      */
-      asyncEnd: Ember.K,
-
-      /**
-        Override this method with your testing framework's false assertion.
-        This function is called whenever an exception occurs causing the testing
-        promise to fail.
-
-        QUnit example:
-
-        ```javascript
-          exception: function(error) {
-            ok(false, error);
-          };
-        ```
-
-        @public
-        @method exception
-        @param {String} error The exception to be raised.
-      */
-      exception: function(error) {
-        throw error;
-      }
-    });
-
-    __exports__["default"] = Adapter;
-  });
-define("ember-testing/adapters/qunit", 
-  ["ember-testing/adapters/adapter","ember-metal/utils","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Adapter = __dependency1__["default"];
-    var inspect = __dependency2__.inspect;
-
-    /**
-      This class implements the methods defined by Ember.Test.Adapter for the
-      QUnit testing framework.
-
-      @class QUnitAdapter
-      @namespace Ember.Test
-      @extends Ember.Test.Adapter
-    */
-    var QUnitAdapter = Adapter.extend({
-      asyncStart: function() {
-        stop();
-      },
-      asyncEnd: function() {
-        start();
-      },
-      exception: function(error) {
-        ok(false, inspect(error));
-      }
-    });
-
-    __exports__["default"] = QUnitAdapter;
-  });
-define("ember-testing/helpers", 
-  ["ember-metal/property_get","ember-metal/error","ember-metal/run_loop","ember-views/system/jquery","ember-testing/test"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
-    "use strict";
-    var get = __dependency1__.get;
-    var EmberError = __dependency2__["default"];
-    var run = __dependency3__["default"];
-    var jQuery = __dependency4__["default"];
-    var Test = __dependency5__["default"];
-
-    /**
-    * @module ember
-    * @submodule ember-testing
-    */
-
-    var helper = Test.registerHelper,
-        asyncHelper = Test.registerAsyncHelper,
-        countAsync = 0;
-
-    function currentRouteName(app){
-      var appController = app.__container__.lookup('controller:application');
-
-      return get(appController, 'currentRouteName');
-    }
-
-    function currentPath(app){
-      var appController = app.__container__.lookup('controller:application');
-
-      return get(appController, 'currentPath');
-    }
-
-    function currentURL(app){
-      var router = app.__container__.lookup('router:main');
-
-      return get(router, 'location').getURL();
-    }
-
-    function visit(app, url) {
-      var router = app.__container__.lookup('router:main');
-      router.location.setURL(url);
-
-      if (app._readinessDeferrals > 0) {
-        router['initialURL'] = url;
-        run(app, 'advanceReadiness');
-        delete router['initialURL'];
-      } else {
-        run(app, app.handleURL, url);
-      }
-
-      return wait(app);
-    }
-
-    function click(app, selector, context) {
-      var $el = findWithAssert(app, selector, context);
-      run($el, 'mousedown');
-
-      if ($el.is(':input')) {
-        var type = $el.prop('type');
-        if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
-          run($el, function(){
-            // Firefox does not trigger the `focusin` event if the window
-            // does not have focus. If the document doesn't have focus just
-            // use trigger('focusin') instead.
-            if (!document.hasFocus || document.hasFocus()) {
-              this.focus();
-            } else {
-              this.trigger('focusin');
-            }
-          });
-        }
-      }
-
-      run($el, 'mouseup');
-      run($el, 'click');
-
-      return wait(app);
-    }
-
-    function triggerEvent(app, selector, context, type, options){
-      if (arguments.length === 3) {
-        type = context;
-        context = null;
-      }
-
-      if (typeof options === 'undefined') {
-        options = {};
-      }
-
-      var $el = findWithAssert(app, selector, context);
-
-      var event = jQuery.Event(type, options);
-
-      run($el, 'trigger', event);
-
-      return wait(app);
-    }
-
-    function keyEvent(app, selector, context, type, keyCode) {
-      if (typeof keyCode === 'undefined') {
-        keyCode = type;
-        type = context;
-        context = null;
-      }
-
-      return triggerEvent(app, selector, context, type, { keyCode: keyCode, which: keyCode });
-    }
-
-    function fillIn(app, selector, context, text) {
-      var $el;
-      if (typeof text === 'undefined') {
-        text = context;
-        context = null;
-      }
-      $el = findWithAssert(app, selector, context);
-      run(function() {
-        $el.val(text).change();
-      });
-      return wait(app);
-    }
-
-    function findWithAssert(app, selector, context) {
-      var $el = find(app, selector, context);
-      if ($el.length === 0) {
-        throw new EmberError("Element " + selector + " not found.");
-      }
-      return $el;
-    }
-
-    function find(app, selector, context) {
-      var $el;
-      context = context || get(app, 'rootElement');
-      $el = app.$(selector, context);
-
-      return $el;
-    }
-
-    function andThen(app, callback) {
-      return wait(app, callback(app));
-    }
-
-    function wait(app, value) {
-      return Test.promise(function(resolve) {
-        // If this is the first async promise, kick off the async test
-        if (++countAsync === 1) {
-          Test.adapter.asyncStart();
-        }
-
-        // Every 10ms, poll for the async thing to have finished
-        var watcher = setInterval(function() {
-          // 1. If the router is loading, keep polling
-          var routerIsLoading = !!app.__container__.lookup('router:main').router.activeTransition;
-          if (routerIsLoading) { return; }
-
-          // 2. If there are pending Ajax requests, keep polling
-          if (Test.pendingAjaxRequests) { return; }
-
-          // 3. If there are scheduled timers or we are inside of a run loop, keep polling
-          if (run.hasScheduledTimers() || run.currentRunLoop) { return; }
-          if (Test.waiters && Test.waiters.any(function(waiter) {
-            var context = waiter[0];
-            var callback = waiter[1];
-            return !callback.call(context);
-          })) { return; }
-          // Stop polling
-          clearInterval(watcher);
-
-          // If this is the last async promise, end the async test
-          if (--countAsync === 0) {
-            Test.adapter.asyncEnd();
-          }
-
-          // Synchronously resolve the promise
-          run(null, resolve, value);
-        }, 10);
-      });
-
-    }
-
-
-    /**
-    * Loads a route, sets up any controllers, and renders any templates associated
-    * with the route as though a real user had triggered the route change while
-    * using your app.
-    *
-    * Example:
-    *
-    * ```javascript
-    * visit('posts/index').then(function() {
-    *   // assert something
-    * });
-    * ```
-    *
-    * @method visit
-    * @param {String} url the name of the route
-    * @return {RSVP.Promise}
-    */
-    asyncHelper('visit', visit);
-
-    /**
-    * Clicks an element and triggers any actions triggered by the element's `click`
-    * event.
-    *
-    * Example:
-    *
-    * ```javascript
-    * click('.some-jQuery-selector').then(function() {
-    *   // assert something
-    * });
-    * ```
-    *
-    * @method click
-    * @param {String} selector jQuery selector for finding element on the DOM
-    * @return {RSVP.Promise}
-    */
-    asyncHelper('click', click);
-
-    /**
-    * Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
-    *
-    * Example:
-    *
-    * ```javascript
-    * keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {
-    *  // assert something
-    * });
-    * ```
-    *
-    * @method keyEvent
-    * @param {String} selector jQuery selector for finding element on the DOM
-    * @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`
-    * @param {Number} keyCode the keyCode of the simulated key event
-    * @return {RSVP.Promise}
-    */
-    asyncHelper('keyEvent', keyEvent);
-
-    /**
-    * Fills in an input element with some text.
-    *
-    * Example:
-    *
-    * ```javascript
-    * fillIn('#email', 'you@example.com').then(function() {
-    *   // assert something
-    * });
-    * ```
-    *
-    * @method fillIn
-    * @param {String} selector jQuery selector finding an input element on the DOM
-    * to fill text with
-    * @param {String} text text to place inside the input element
-    * @return {RSVP.Promise}
-    */
-    asyncHelper('fillIn', fillIn);
-
-    /**
-    * Finds an element in the context of the app's container element. A simple alias
-    * for `app.$(selector)`.
-    *
-    * Example:
-    *
-    * ```javascript
-    * var $el = find('.my-selector');
-    * ```
-    *
-    * @method find
-    * @param {String} selector jQuery string selector for element lookup
-    * @return {Object} jQuery object representing the results of the query
-    */
-    helper('find', find);
-
-    /**
-    * Like `find`, but throws an error if the element selector returns no results.
-    *
-    * Example:
-    *
-    * ```javascript
-    * var $el = findWithAssert('.doesnt-exist'); // throws error
-    * ```
-    *
-    * @method findWithAssert
-    * @param {String} selector jQuery selector string for finding an element within
-    * the DOM
-    * @return {Object} jQuery object representing the results of the query
-    * @throws {Error} throws error if jQuery object returned has a length of 0
-    */
-    helper('findWithAssert', findWithAssert);
-
-    /**
-      Causes the run loop to process any pending events. This is used to ensure that
-      any async operations from other helpers (or your assertions) have been processed.
-
-      This is most often used as the return value for the helper functions (see 'click',
-      'fillIn','visit',etc).
-
-      Example:
-
-      ```javascript
-      Ember.Test.registerAsyncHelper('loginUser', function(app, username, password) {
-        visit('secured/path/here')
-        .fillIn('#username', username)
-        .fillIn('#password', username)
-        .click('.submit')
-
-        return wait();
-      });
-
-      @method wait
-      @param {Object} value The value to be returned.
-      @return {RSVP.Promise}
-    */
-    asyncHelper('wait', wait);
-    asyncHelper('andThen', andThen);
-
-
-    /**
-      Returns the currently active route name.
-
-    Example:
-
-    ```javascript
-    function validateRouteName(){
-    equal(currentRouteName(), 'some.path', "correct route was transitioned into.");
-    }
-
-    visit('/some/path').then(validateRouteName)
-    ```
-
-    @method currentRouteName
-    @return {Object} The name of the currently active route.
-    */
-    helper('currentRouteName', currentRouteName);
-
-    /**
-      Returns the current path.
-
-    Example:
-
-    ```javascript
-    function validateURL(){
-    equal(currentPath(), 'some.path.index', "correct path was transitioned into.");
-    }
-
-    click('#some-link-id').then(validateURL);
-    ```
-
-    @method currentPath
-    @return {Object} The currently active path.
-    */
-    helper('currentPath', currentPath);
-
-    /**
-      Returns the current URL.
-
-    Example:
-
-    ```javascript
-    function validateURL(){
-    equal(currentURL(), '/some/path', "correct URL was transitioned into.");
-    }
-
-    click('#some-link-id').then(validateURL);
-    ```
-
-    @method currentURL
-    @return {Object} The currently active URL.
-    */
-    helper('currentURL', currentURL);
-
-    /**
-      Triggers the given event on the element identified by the provided selector.
-
-      Example:
-
-      ```javascript
-      triggerEvent('#some-elem-id', 'blur');
-      ```
-
-      This is actually used internally by the `keyEvent` helper like so:
-
-      ```javascript
-      triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });
-      ```
-
-     @method triggerEvent
-     @param {String} selector jQuery selector for finding element on the DOM
-     @param {String} type The event type to be triggered.
-     @param {String} options The options to be passed to jQuery.Event.
-     @return {RSVP.Promise}
-    */
-    asyncHelper('triggerEvent', triggerEvent);
-  });
-define("ember-testing/initializers", 
-  ["ember-runtime/system/lazy_load"],
-  function(__dependency1__) {
-    "use strict";
-    var onLoad = __dependency1__.onLoad;
-
-    var name = 'deferReadiness in `testing` mode';
-
-    onLoad('Ember.Application', function(Application) {
-      if (!Application.initializers[name]) {
-        Application.initializer({
-          name: name,
-
-          initialize: function(container, application){
-            if (application.testing) {
-              application.deferReadiness();
-            }
-          }
-        });
-      }
-    });
-  });
-define("ember-testing", 
-  ["ember-metal/core","ember-testing/initializers","ember-testing/support","ember-testing/setup_for_testing","ember-testing/test","ember-testing/adapters/adapter","ember-testing/adapters/qunit","ember-testing/helpers"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-
-    // to setup initializer
-         // to handle various edge cases
-
-    var setupForTesting = __dependency4__["default"];
-    var Test = __dependency5__["default"];
-    var Adapter = __dependency6__["default"];
-    var QUnitAdapter = __dependency7__["default"];
-         // adds helpers to helpers object in Test
-
-    /**
-      Ember Testing
-
-      @module ember
-      @submodule ember-testing
-      @requires ember-application
-    */
-
-    Ember.Test = Test;
-    Ember.Test.Adapter = Adapter;
-    Ember.Test.QUnitAdapter = QUnitAdapter;
-    Ember.setupForTesting = setupForTesting;
-  });
-define("ember-testing/setup_for_testing", 
-  ["ember-metal/core","ember-testing/adapters/qunit","ember-views/system/jquery","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    // import Test from "ember-testing/test";  // ES6TODO: fix when cycles are supported
-    var QUnitAdapter = __dependency2__["default"];
-    var jQuery = __dependency3__["default"];
-
-    var Test;
-
-    function incrementAjaxPendingRequests(){
-      Test.pendingAjaxRequests++;
-    }
-
-    function decrementAjaxPendingRequests(){
-      Ember.assert("An ajaxComplete event which would cause the number of pending AJAX " +
-                   "requests to be negative has been triggered. This is most likely " +
-                   "caused by AJAX events that were started before calling " +
-                   "`injectTestHelpers()`.", Test.pendingAjaxRequests !== 0);
-      Test.pendingAjaxRequests--;
-    }
-
-    /**
-      Sets Ember up for testing. This is useful to perform
-      basic setup steps in order to unit test.
-
-      Use `App.setupForTesting` to perform integration tests (full
-      application testing).
-
-      @method setupForTesting
-      @namespace Ember
-    */
-    function setupForTesting() {
-      if (!Test) { Test = requireModule('ember-testing/test')['default']; }
-
-      Ember.testing = true;
-
-      // if adapter is not manually set default to QUnit
-      if (!Test.adapter) {
-        Test.adapter = QUnitAdapter.create();
-      }
-
-      if (!Test.pendingAjaxRequests) {
-        Test.pendingAjaxRequests = 0;
-      }
-
-      jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);
-      jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);
-      jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);
-      jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);
-    };
-
-    __exports__["default"] = setupForTesting;
-  });
-define("ember-testing/support", 
-  ["ember-metal/core","ember-views/system/jquery"],
-  function(__dependency1__, __dependency2__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var jQuery = __dependency2__["default"];
-
-    /**
-      @module ember
-      @submodule ember-testing
-     */
-
-    var $ = jQuery;
-
-    /**
-      This method creates a checkbox and triggers the click event to fire the
-      passed in handler. It is used to correct for a bug in older versions
-      of jQuery (e.g 1.8.3).
-
-      @private
-      @method testCheckboxClick
-    */
-    function testCheckboxClick(handler) {
-      $('<input type="checkbox">')
-        .css({ position: 'absolute', left: '-1000px', top: '-1000px' })
-        .appendTo('body')
-        .on('click', handler)
-        .trigger('click')
-        .remove();
-    }
-
-    $(function() {
-      /*
-        Determine whether a checkbox checked using jQuery's "click" method will have
-        the correct value for its checked property.
-
-        If we determine that the current jQuery version exhibits this behavior,
-        patch it to work correctly as in the commit for the actual fix:
-        https://github.com/jquery/jquery/commit/1fb2f92.
-      */
-      testCheckboxClick(function() {
-        if (!this.checked && !$.event.special.click) {
-          $.event.special.click = {
-            // For checkbox, fire native event so checked state will be right
-            trigger: function() {
-              if ($.nodeName( this, "input" ) && this.type === "checkbox" && this.click) {
-                this.click();
-                return false;
-              }
-            }
-          };
-        }
-      });
-
-      // Try again to verify that the patch took effect or blow up.
-      testCheckboxClick(function() {
-        Ember.warn("clicked checkboxes should be checked! the jQuery patch didn't work", this.checked);
-      });
-    });
-  });
-define("ember-testing/test", 
-  ["ember-metal/core","ember-metal/run_loop","ember-metal/platform","ember-runtime/compare","ember-runtime/ext/rsvp","ember-testing/setup_for_testing","ember-application/system/application","exports"],
-  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var emberRun = __dependency2__["default"];
-    var create = __dependency3__.create;
-    var compare = __dependency4__["default"];
-    var RSVP = __dependency5__["default"];
-    var setupForTesting = __dependency6__["default"];
-    var EmberApplication = __dependency7__["default"];
-
-    /**
-      @module ember
-      @submodule ember-testing
-     */
-    var slice = [].slice,
-        helpers = {},
-        injectHelpersCallbacks = [];
-
-    /**
-      This is a container for an assortment of testing related functionality:
-
-      * Choose your default test adapter (for your framework of choice).
-      * Register/Unregister additional test helpers.
-      * Setup callbacks to be fired when the test helpers are injected into
-        your application.
-
-      @class Test
-      @namespace Ember
-    */
-    var Test = {
-
-      /**
-        `registerHelper` is used to register a test helper that will be injected
-        when `App.injectTestHelpers` is called.
-
-        The helper method will always be called with the current Application as
-        the first parameter.
-
-        For example:
-
-        ```javascript
-        Ember.Test.registerHelper('boot', function(app) {
-          Ember.run(app, app.advanceReadiness);
-        });
-        ```
-
-        This helper can later be called without arguments because it will be
-        called with `app` as the first parameter.
-
-        ```javascript
-        App = Ember.Application.create();
-        App.injectTestHelpers();
-        boot();
-        ```
-
-        @public
-        @method registerHelper
-        @param {String} name The name of the helper method to add.
-        @param {Function} helperMethod
-        @param options {Object}
-      */
-      registerHelper: function(name, helperMethod) {
-        helpers[name] = {
-          method: helperMethod,
-          meta: { wait: false }
-        };
-      },
-
-      /**
-        `registerAsyncHelper` is used to register an async test helper that will be injected
-        when `App.injectTestHelpers` is called.
-
-        The helper method will always be called with the current Application as
-        the first parameter.
-
-        For example:
-
-        ```javascript
-        Ember.Test.registerAsyncHelper('boot', function(app) {
-          Ember.run(app, app.advanceReadiness);
-        });
-        ```
-
-        The advantage of an async helper is that it will not run
-        until the last async helper has completed.  All async helpers
-        after it will wait for it complete before running.
-
-
-        For example:
-
-        ```javascript
-        Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {
-          click('.delete-' + postId);
-        });
-
-        // ... in your test
-        visit('/post/2');
-        deletePost(2);
-        visit('/post/3');
-        deletePost(3);
-        ```
-
-        @public
-        @method registerAsyncHelper
-        @param {String} name The name of the helper method to add.
-        @param {Function} helperMethod
-      */
-      registerAsyncHelper: function(name, helperMethod) {
-        helpers[name] = {
-          method: helperMethod,
-          meta: { wait: true }
-        };
-      },
-
-      /**
-        Remove a previously added helper method.
-
-        Example:
-
-        ```javascript
-        Ember.Test.unregisterHelper('wait');
-        ```
-
-        @public
-        @method unregisterHelper
-        @param {String} name The helper to remove.
-      */
-      unregisterHelper: function(name) {
-        delete helpers[name];
-        delete Test.Promise.prototype[name];
-      },
-
-      /**
-        Used to register callbacks to be fired whenever `App.injectTestHelpers`
-        is called.
-
-        The callback will receive the current application as an argument.
-
-        Example:
-
-        ```javascript
-        Ember.Test.onInjectHelpers(function() {
-          Ember.$(document).ajaxSend(function() {
-            Test.pendingAjaxRequests++;
-          });
-
-          Ember.$(document).ajaxComplete(function() {
-            Test.pendingAjaxRequests--;
-          });
-        });
-        ```
-
-        @public
-        @method onInjectHelpers
-        @param {Function} callback The function to be called.
-      */
-      onInjectHelpers: function(callback) {
-        injectHelpersCallbacks.push(callback);
-      },
-
-      /**
-        This returns a thenable tailored for testing.  It catches failed
-        `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
-        callback in the last chained then.
-
-        This method should be returned by async helpers such as `wait`.
-
-        @public
-        @method promise
-        @param {Function} resolver The function used to resolve the promise.
-      */
-      promise: function(resolver) {
-        return new Test.Promise(resolver);
-      },
-
-      /**
-       Used to allow ember-testing to communicate with a specific testing
-       framework.
-
-       You can manually set it before calling `App.setupForTesting()`.
-
-       Example:
-
-       ```javascript
-       Ember.Test.adapter = MyCustomAdapter.create()
-       ```
-
-       If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
-
-       @public
-       @property adapter
-       @type {Class} The adapter to be used.
-       @default Ember.Test.QUnitAdapter
-      */
-      adapter: null,
-
-      /**
-        Replacement for `Ember.RSVP.resolve`
-        The only difference is this uses
-        and instance of `Ember.Test.Promise`
-
-        @public
-        @method resolve
-        @param {Mixed} The value to resolve
-      */
-      resolve: function(val) {
-        return Test.promise(function(resolve) {
-          return resolve(val);
-        });
-      },
-
-      /**
-         This allows ember-testing to play nicely with other asynchronous
-         events, such as an application that is waiting for a CSS3
-         transition or an IndexDB transaction.
-
-         For example:
-
-         ```javascript
-         Ember.Test.registerWaiter(function() {
-           return myPendingTransactions() == 0;
-         });
-         ```
-         The `context` argument allows you to optionally specify the `this`
-         with which your callback will be invoked.
-
-         For example:
-
-         ```javascript
-         Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);
-         ```
-
-         @public
-         @method registerWaiter
-         @param {Object} context (optional)
-         @param {Function} callback
-      */
-      registerWaiter: function(context, callback) {
-        if (arguments.length === 1) {
-          callback = context;
-          context = null;
-        }
-        if (!this.waiters) {
-          this.waiters = Ember.A();
-        }
-        this.waiters.push([context, callback]);
-      },
-      /**
-         `unregisterWaiter` is used to unregister a callback that was
-         registered with `registerWaiter`.
-
-         @public
-         @method unregisterWaiter
-         @param {Object} context (optional)
-         @param {Function} callback
-      */
-      unregisterWaiter: function(context, callback) {
-        var pair;
-        if (!this.waiters) { return; }
-        if (arguments.length === 1) {
-          callback = context;
-          context = null;
-        }
-        pair = [context, callback];
-        this.waiters = Ember.A(this.waiters.filter(function(elt) {
-          return compare(elt, pair)!==0;
-        }));
-      }
-    };
-
-    function helper(app, name) {
-      var fn = helpers[name].method,
-          meta = helpers[name].meta;
-
-      return function() {
-        var args = slice.call(arguments),
-            lastPromise = Test.lastPromise;
-
-        args.unshift(app);
-
-        // some helpers are not async and
-        // need to return a value immediately.
-        // example: `find`
-        if (!meta.wait) {
-          return fn.apply(app, args);
-        }
-
-        if (!lastPromise) {
-          // It's the first async helper in current context
-          lastPromise = fn.apply(app, args);
-        } else {
-          // wait for last helper's promise to resolve
-          // and then execute
-          run(function() {
-            lastPromise = Test.resolve(lastPromise).then(function() {
-              return fn.apply(app, args);
-            });
-          });
-        }
-
-        return lastPromise;
-      };
-    }
-
-    function run(fn) {
-      if (!emberRun.currentRunLoop) {
-        emberRun(fn);
-      } else {
-        fn();
-      }
-    }
-
-    EmberApplication.reopen({
-      /**
-       This property contains the testing helpers for the current application. These
-       are created once you call `injectTestHelpers` on your `Ember.Application`
-       instance. The included helpers are also available on the `window` object by
-       default, but can be used from this object on the individual application also.
-
-        @property testHelpers
-        @type {Object}
-        @default {}
-      */
-      testHelpers: {},
-
-      /**
-       This property will contain the original methods that were registered
-       on the `helperContainer` before `injectTestHelpers` is called.
-
-       When `removeTestHelpers` is called, these methods are restored to the
-       `helperContainer`.
-
-        @property originalMethods
-        @type {Object}
-        @default {}
-        @private
-      */
-      originalMethods: {},
-
-
-      /**
-      This property indicates whether or not this application is currently in
-      testing mode. This is set when `setupForTesting` is called on the current
-      application.
-
-      @property testing
-      @type {Boolean}
-      @default false
-      */
-      testing: false,
-
-      /**
-       This hook defers the readiness of the application, so that you can start
-       the app when your tests are ready to run. It also sets the router's
-       location to 'none', so that the window's location will not be modified
-       (preventing both accidental leaking of state between tests and interference
-       with your testing framework).
-
-       Example:
-
-      ```
-      App.setupForTesting();
-      ```
-
-        @method setupForTesting
-      */
-      setupForTesting: function() {
-        setupForTesting();
-
-        this.testing = true;
-
-        this.Router.reopen({
-          location: 'none'
-        });
-      },
-
-      /**
-        This will be used as the container to inject the test helpers into. By
-        default the helpers are injected into `window`.
-
-        @property helperContainer
-       @type {Object} The object to be used for test helpers.
-       @default window
-      */
-      helperContainer: window,
-
-      /**
-        This injects the test helpers into the `helperContainer` object. If an object is provided
-        it will be used as the helperContainer. If `helperContainer` is not set it will default
-        to `window`. If a function of the same name has already been defined it will be cached
-        (so that it can be reset if the helper is removed with `unregisterHelper` or
-        `removeTestHelpers`).
-
-       Any callbacks registered with `onInjectHelpers` will be called once the
-       helpers have been injected.
-
-      Example:
-      ```
-      App.injectTestHelpers();
-      ```
-
-        @method injectTestHelpers
-      */
-      injectTestHelpers: function(helperContainer) {
-        if (helperContainer) { this.helperContainer = helperContainer; }
-
-        this.testHelpers = {};
-        for (var name in helpers) {
-          this.originalMethods[name] = this.helperContainer[name];
-          this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
-          protoWrap(Test.Promise.prototype, name, helper(this, name), helpers[name].meta.wait);
-        }
-
-        for(var i = 0, l = injectHelpersCallbacks.length; i < l; i++) {
-          injectHelpersCallbacks[i](this);
-        }
-      },
-
-      /**
-        This removes all helpers that have been registered, and resets and functions
-        that were overridden by the helpers.
-
-        Example:
-
-        ```javascript
-        App.removeTestHelpers();
-        ```
-
-        @public
-        @method removeTestHelpers
-      */
-      removeTestHelpers: function() {
-        for (var name in helpers) {
-          this.helperContainer[name] = this.originalMethods[name];
-          delete this.testHelpers[name];
-          delete this.originalMethods[name];
-        }
-      }
-    });
-
-    // This method is no longer needed
-    // But still here for backwards compatibility
-    // of helper chaining
-    function protoWrap(proto, name, callback, isAsync) {
-      proto[name] = function() {
-        var args = arguments;
-        if (isAsync) {
-          return callback.apply(this, args);
-        } else {
-          return this.then(function() {
-            return callback.apply(this, args);
-          });
-        }
-      };
-    }
-
-    Test.Promise = function() {
-      RSVP.Promise.apply(this, arguments);
-      Test.lastPromise = this;
-    };
-
-    Test.Promise.prototype = create(RSVP.Promise.prototype);
-    Test.Promise.prototype.constructor = Test.Promise;
-
-    // Patch `then` to isolate async methods
-    // specifically `Ember.Test.lastPromise`
-    var originalThen = RSVP.Promise.prototype.then;
-    Test.Promise.prototype.then = function(onSuccess, onFailure) {
-      return originalThen.call(this, function(val) {
-        return isolate(onSuccess, val);
-      }, onFailure);
-    };
-
-    // This method isolates nested async methods
-    // so that they don't conflict with other last promises.
-    //
-    // 1. Set `Ember.Test.lastPromise` to null
-    // 2. Invoke method
-    // 3. Return the last promise created during method
-    // 4. Restore `Ember.Test.lastPromise` to original value
-    function isolate(fn, val) {
-      var value, lastPromise;
-
-      // Reset lastPromise for nested helpers
-      Test.lastPromise = null;
-
-      value = fn(val);
-
-      lastPromise = Test.lastPromise;
-
-      // If the method returned a promise
-      // return that promise. If not,
-      // return the last async helper's promise
-      if ((value && (value instanceof Test.Promise)) || !lastPromise) {
-        return value;
-      } else {
-        run(function() {
-          lastPromise = Test.resolve(lastPromise).then(function() {
-            return value;
-          });
-        });
-        return lastPromise;
-      }
-    }
-
-    __exports__["default"] = Test;
-  });
-})();
-
-define("container/container", 
-  ["container/inheriting_dict","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var InheritingDict = __dependency1__["default"];
-
-    // A lightweight container that helps to assemble and decouple components.
-    // Public api for the container is still in flux.
-    // The public api, specified on the application namespace should be considered the stable api.
-    function Container(parent) {
-      this.parent = parent;
-      this.children = [];
-
-      this.resolver = parent && parent.resolver || function() {};
-
-      this.registry = new InheritingDict(parent && parent.registry);
-      this.cache = new InheritingDict(parent && parent.cache);
-      this.factoryCache = new InheritingDict(parent && parent.factoryCache);
-      this.resolveCache = new InheritingDict(parent && parent.resolveCache);
-      this.typeInjections = new InheritingDict(parent && parent.typeInjections);
-      this.injections = {};
-
-      this.factoryTypeInjections = new InheritingDict(parent && parent.factoryTypeInjections);
-      this.factoryInjections = {};
-
-      this._options = new InheritingDict(parent && parent._options);
-      this._typeOptions = new InheritingDict(parent && parent._typeOptions);
-    }
-
-    Container.prototype = {
-
-      /**
-        @property parent
-        @type Container
-        @default null
-      */
-      parent: null,
-
-      /**
-        @property children
-        @type Array
-        @default []
-      */
-      children: null,
-
-      /**
-        @property resolver
-        @type function
-      */
-      resolver: null,
-
-      /**
-        @property registry
-        @type InheritingDict
-      */
-      registry: null,
-
-      /**
-        @property cache
-        @type InheritingDict
-      */
-      cache: null,
-
-      /**
-        @property typeInjections
-        @type InheritingDict
-      */
-      typeInjections: null,
-
-      /**
-        @property injections
-        @type Object
-        @default {}
-      */
-      injections: null,
-
-      /**
-        @private
-
-        @property _options
-        @type InheritingDict
-        @default null
-      */
-      _options: null,
-
-      /**
-        @private
-
-        @property _typeOptions
-        @type InheritingDict
-      */
-      _typeOptions: null,
-
-      /**
-        Returns a new child of the current container. These children are configured
-        to correctly inherit from the current container.
-
-        @method child
-        @return {Container}
-      */
-      child: function() {
-        var container = new Container(this);
-        this.children.push(container);
-        return container;
-      },
-
-      /**
-        Sets a key-value pair on the current container. If a parent container,
-        has the same key, once set on a child, the parent and child will diverge
-        as expected.
-
-        @method set
-        @param {Object} object
-        @param {String} key
-        @param {any} value
-      */
-      set: function(object, key, value) {
-        object[key] = value;
-      },
-
-      /**
-        Registers a factory for later injection.
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('model:user', Person, {singleton: false });
-        container.register('fruit:favorite', Orange);
-        container.register('communication:main', Email, {singleton: false});
-        ```
-
-        @method register
-        @param {String} fullName
-        @param {Function} factory
-        @param {Object} options
-      */
-      register: function(fullName, factory, options) {
-        validateFullName(fullName);
-
-        if (factory === undefined) {
-          throw new TypeError('Attempting to register an unknown factory: `' + fullName + '`');
-        }
-
-        var normalizedName = this.normalize(fullName);
-
-        if (this.cache.has(normalizedName)) {
-          throw new Error('Cannot re-register: `' + fullName +'`, as it has already been looked up.');
-        }
-
-        this.registry.set(normalizedName, factory);
-        this._options.set(normalizedName, options || {});
-      },
-
-      /**
-        Unregister a fullName
-
-        ```javascript
-        var container = new Container();
-        container.register('model:user', User);
-
-        container.lookup('model:user') instanceof User //=> true
-
-        container.unregister('model:user')
-        container.lookup('model:user') === undefined //=> true
-        ```
-
-        @method unregister
-        @param {String} fullName
-       */
-      unregister: function(fullName) {
-        validateFullName(fullName);
-
-        var normalizedName = this.normalize(fullName);
-
-        this.registry.remove(normalizedName);
-        this.cache.remove(normalizedName);
-        this.factoryCache.remove(normalizedName);
-        this.resolveCache.remove(normalizedName);
-        this._options.remove(normalizedName);
-      },
-
-      /**
-        Given a fullName return the corresponding factory.
-
-        By default `resolve` will retrieve the factory from
-        its container's registry.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        container.resolve('api:twitter') // => Twitter
-        ```
-
-        Optionally the container can be provided with a custom resolver.
-        If provided, `resolve` will first provide the custom resolver
-        the oppertunity to resolve the fullName, otherwise it will fallback
-        to the registry.
-
-        ```javascript
-        var container = new Container();
-        container.resolver = function(fullName) {
-          // lookup via the module system of choice
-        };
-
-        // the twitter factory is added to the module system
-        container.resolve('api:twitter') // => Twitter
-        ```
-
-        @method resolve
-        @param {String} fullName
-        @return {Function} fullName's factory
-      */
-      resolve: function(fullName) {
-        validateFullName(fullName);
-
-        var normalizedName = this.normalize(fullName);
-        var cached = this.resolveCache.get(normalizedName);
-
-        if (cached) { return cached; }
-
-        var resolved = this.resolver(normalizedName) || this.registry.get(normalizedName);
-
-        this.resolveCache.set(normalizedName, resolved);
-
-        return resolved;
-      },
-
-      /**
-        A hook that can be used to describe how the resolver will
-        attempt to find the factory.
-
-        For example, the default Ember `.describe` returns the full
-        class name (including namespace) where Ember's resolver expects
-        to find the `fullName`.
-
-        @method describe
-        @param {String} fullName
-        @return {string} described fullName
-      */
-      describe: function(fullName) {
-        return fullName;
-      },
-
-      /**
-        A hook to enable custom fullName normalization behaviour
-
-        @method normalize
-        @param {String} fullName
-        @return {string} normalized fullName
-      */
-      normalize: function(fullName) {
-        return fullName;
-      },
-
-      /**
-        @method makeToString
-
-        @param {any} factory
-        @param {string} fullName
-        @return {function} toString function
-      */
-      makeToString: function(factory, fullName) {
-        return factory.toString();
-      },
-
-      /**
-        Given a fullName return a corresponding instance.
-
-        The default behaviour is for lookup to return a singleton instance.
-        The singleton is scoped to the container, allowing multiple containers
-        to all have their own locally scoped singletons.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        var twitter = container.lookup('api:twitter');
-
-        twitter instanceof Twitter; // => true
-
-        // by default the container will return singletons
-        var twitter2 = container.lookup('api:twitter');
-        twitter instanceof Twitter; // => true
-
-        twitter === twitter2; //=> true
-        ```
-
-        If singletons are not wanted an optional flag can be provided at lookup.
-
-        ```javascript
-        var container = new Container();
-        container.register('api:twitter', Twitter);
-
-        var twitter = container.lookup('api:twitter', { singleton: false });
-        var twitter2 = container.lookup('api:twitter', { singleton: false });
-
-        twitter === twitter2; //=> false
-        ```
-
-        @method lookup
-        @param {String} fullName
-        @param {Object} options
-        @return {any}
-      */
-      lookup: function(fullName, options) {
-        validateFullName(fullName);
-        return lookup(this, this.normalize(fullName), options);
-      },
-
-      /**
-        Given a fullName return the corresponding factory.
-
-        @method lookupFactory
-        @param {String} fullName
-        @return {any}
-      */
-      lookupFactory: function(fullName) {
-        validateFullName(fullName);
-        return factoryFor(this, this.normalize(fullName));
-      },
-
-      /**
-        Given a fullName check if the container is aware of its factory
-        or singleton instance.
-
-        @method has
-        @param {String} fullName
-        @return {Boolean}
-      */
-      has: function(fullName) {
-        validateFullName(fullName);
-        return has(this, this.normalize(fullName));
-      },
-
-      /**
-        Allow registering options for all factories of a type.
-
-        ```javascript
-        var container = new Container();
-
-        // if all of type `connection` must not be singletons
-        container.optionsForType('connection', { singleton: false });
-
-        container.register('connection:twitter', TwitterConnection);
-        container.register('connection:facebook', FacebookConnection);
-
-        var twitter = container.lookup('connection:twitter');
-        var twitter2 = container.lookup('connection:twitter');
-
-        twitter === twitter2; // => false
-
-        var facebook = container.lookup('connection:facebook');
-        var facebook2 = container.lookup('connection:facebook');
-
-        facebook === facebook2; // => false
-        ```
-
-        @method optionsForType
-        @param {String} type
-        @param {Object} options
-      */
-      optionsForType: function(type, options) {
-        if (this.parent) { illegalChildOperation('optionsForType'); }
-
-        this._typeOptions.set(type, options);
-      },
-
-      /**
-        @method options
-        @param {String} type
-        @param {Object} options
-      */
-      options: function(type, options) {
-        this.optionsForType(type, options);
-      },
-
-      /**
-        Used only via `injection`.
-
-        Provides a specialized form of injection, specifically enabling
-        all objects of one type to be injected with a reference to another
-        object.
-
-        For example, provided each object of type `controller` needed a `router`.
-        one would do the following:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('router:main', Router);
-        container.register('controller:user', UserController);
-        container.register('controller:post', PostController);
-
-        container.typeInjection('controller', 'router', 'router:main');
-
-        var user = container.lookup('controller:user');
-        var post = container.lookup('controller:post');
-
-        user.router instanceof Router; //=> true
-        post.router instanceof Router; //=> true
-
-        // both controllers share the same router
-        user.router === post.router; //=> true
-        ```
-
-        @private
-        @method typeInjection
-        @param {String} type
-        @param {String} property
-        @param {String} fullName
-      */
-      typeInjection: function(type, property, fullName) {
-        validateFullName(fullName);
-        if (this.parent) { illegalChildOperation('typeInjection'); }
-
-        var fullNameType = fullName.split(':')[0];        
-        if(fullNameType === type) {
-          throw new Error('Cannot inject a `' + fullName + '` on other ' + type + '(s). Register the `' + fullName + '` as a different type and perform the typeInjection.');
-        }
-        addTypeInjection(this.typeInjections, type, property, fullName);
-      },
-
-      /**
-        Defines injection rules.
-
-        These rules are used to inject dependencies onto objects when they
-        are instantiated.
-
-        Two forms of injections are possible:
-
-        * Injecting one fullName on another fullName
-        * Injecting one fullName on a type
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('source:main', Source);
-        container.register('model:user', User);
-        container.register('model:post', Post);
-
-        // injecting one fullName on another fullName
-        // eg. each user model gets a post model
-        container.injection('model:user', 'post', 'model:post');
-
-        // injecting one fullName on another type
-        container.injection('model', 'source', 'source:main');
-
-        var user = container.lookup('model:user');
-        var post = container.lookup('model:post');
-
-        user.source instanceof Source; //=> true
-        post.source instanceof Source; //=> true
-
-        user.post instanceof Post; //=> true
-
-        // and both models share the same source
-        user.source === post.source; //=> true
-        ```
-
-        @method injection
-        @param {String} factoryName
-        @param {String} property
-        @param {String} injectionName
-      */
-      injection: function(fullName, property, injectionName) {
-        if (this.parent) { illegalChildOperation('injection'); }
-
-        validateFullName(injectionName);
-        var normalizedInjectionName = this.normalize(injectionName);
-
-        if (fullName.indexOf(':') === -1) {
-          return this.typeInjection(fullName, property, normalizedInjectionName);
-        }
-
-        validateFullName(fullName);
-        var normalizedName = this.normalize(fullName);
-
-        addInjection(this.injections, normalizedName, property, normalizedInjectionName);
-      },
-
-
-      /**
-        Used only via `factoryInjection`.
-
-        Provides a specialized form of injection, specifically enabling
-        all factory of one type to be injected with a reference to another
-        object.
-
-        For example, provided each factory of type `model` needed a `store`.
-        one would do the following:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('store:main', SomeStore);
-
-        container.factoryTypeInjection('model', 'store', 'store:main');
-
-        var store = container.lookup('store:main');
-        var UserFactory = container.lookupFactory('model:user');
-
-        UserFactory.store instanceof SomeStore; //=> true
-        ```
-
-        @private
-        @method factoryTypeInjection
-        @param {String} type
-        @param {String} property
-        @param {String} fullName
-      */
-      factoryTypeInjection: function(type, property, fullName) {
-        if (this.parent) { illegalChildOperation('factoryTypeInjection'); }
-
-        addTypeInjection(this.factoryTypeInjections, type, property, this.normalize(fullName));
-      },
-
-      /**
-        Defines factory injection rules.
-
-        Similar to regular injection rules, but are run against factories, via
-        `Container#lookupFactory`.
-
-        These rules are used to inject objects onto factories when they
-        are looked up.
-
-        Two forms of injections are possible:
-
-      * Injecting one fullName on another fullName
-      * Injecting one fullName on a type
-
-        Example:
-
-        ```javascript
-        var container = new Container();
-
-        container.register('store:main', Store);
-        container.register('store:secondary', OtherStore);
-        container.register('model:user', User);
-        container.register('model:post', Post);
-
-        // injecting one fullName on another type
-        container.factoryInjection('model', 'store', 'store:main');
-
-        // injecting one fullName on another fullName
-        container.factoryInjection('model:post', 'secondaryStore', 'store:secondary');
-
-        var UserFactory = container.lookupFactory('model:user');
-        var PostFactory = container.lookupFactory('model:post');
-        var store = container.lookup('store:main');
-
-        UserFactory.store instanceof Store; //=> true
-        UserFactory.secondaryStore instanceof OtherStore; //=> false
-
-        PostFactory.store instanceof Store; //=> true
-        PostFactory.secondaryStore instanceof OtherStore; //=> true
-
-        // and both models share the same source instance
-        UserFactory.store === PostFactory.store; //=> true
-        ```
-
-        @method factoryInjection
-        @param {String} factoryName
-        @param {String} property
-        @param {String} injectionName
-      */
-      factoryInjection: function(fullName, property, injectionName) {
-        if (this.parent) { illegalChildOperation('injection'); }
-
-        var normalizedName = this.normalize(fullName);
-        var normalizedInjectionName = this.normalize(injectionName);
-
-        validateFullName(injectionName);
-
-        if (fullName.indexOf(':') === -1) {
-          return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName);
-        }
-
-        validateFullName(fullName);
-
-        addInjection(this.factoryInjections, normalizedName, property, normalizedInjectionName);
-      },
-
-      /**
-        A depth first traversal, destroying the container, its descendant containers and all
-        their managed objects.
-
-        @method destroy
-      */
-      destroy: function() {
-        for (var i=0, l=this.children.length; i<l; i++) {
-          this.children[i].destroy();
-        }
-
-        this.children = [];
-
-        eachDestroyable(this, function(item) {
-          item.destroy();
-        });
-
-        this.parent = undefined;
-        this.isDestroyed = true;
-      },
-
-      /**
-        @method reset
-      */
-      reset: function() {
-        for (var i=0, l=this.children.length; i<l; i++) {
-          resetCache(this.children[i]);
-        }
-        resetCache(this);
-      }
-    };
-
-    function has(container, fullName){
-      if (container.cache.has(fullName)) {
-        return true;
-      }
-
-      return !!container.resolve(fullName);
-    }
-
-    function lookup(container, fullName, options) {
-      options = options || {};
-
-      if (container.cache.has(fullName) && options.singleton !== false) {
-        return container.cache.get(fullName);
-      }
-
-      var value = instantiate(container, fullName);
-
-      if (value === undefined) { return; }
-
-      if (isSingleton(container, fullName) && options.singleton !== false) {
-        container.cache.set(fullName, value);
-      }
-
-      return value;
-    }
-
-    function illegalChildOperation(operation) {
-      throw new Error(operation + " is not currently supported on child containers");
-    }
-
-    function isSingleton(container, fullName) {
-      var singleton = option(container, fullName, 'singleton');
-
-      return singleton !== false;
-    }
-
-    function buildInjections(container, injections) {
-      var hash = {};
-
-      if (!injections) { return hash; }
-
-      var injection, injectable;
-
-      for (var i=0, l=injections.length; i<l; i++) {
-        injection = injections[i];
-        injectable = lookup(container, injection.fullName);
-
-        if (injectable !== undefined) {
-          hash[injection.property] = injectable;
-        } else {
-          throw new Error('Attempting to inject an unknown injection: `' + injection.fullName + '`');
-        }
-      }
-
-      return hash;
-    }
-
-    function option(container, fullName, optionName) {
-      var options = container._options.get(fullName);
-
-      if (options && options[optionName] !== undefined) {
-        return options[optionName];
-      }
-
-      var type = fullName.split(":")[0];
-      options = container._typeOptions.get(type);
-
-      if (options) {
-        return options[optionName];
-      }
-    }
-
-    function factoryFor(container, fullName) {
-      var name = fullName;
-      var factory = container.resolve(name);
-      var injectedFactory;
-      var cache = container.factoryCache;
-      var type = fullName.split(":")[0];
-
-      if (factory === undefined) { return; }
-
-      if (cache.has(fullName)) {
-        return cache.get(fullName);
-      }
-
-      if (!factory || typeof factory.extend !== 'function' || (!Ember.MODEL_FACTORY_INJECTIONS && type === 'model')) {
-        // TODO: think about a 'safe' merge style extension
-        // for now just fallback to create time injection
-        return factory;
-      } else {
-
-        var injections        = injectionsFor(container, fullName);
-        var factoryInjections = factoryInjectionsFor(container, fullName);
-
-        factoryInjections._toString = container.makeToString(factory, fullName);
-
-        injectedFactory = factory.extend(injections);
-        injectedFactory.reopenClass(factoryInjections);
-
-        cache.set(fullName, injectedFactory);
-
-        return injectedFactory;
-      }
-    }
-
-    function injectionsFor(container, fullName) {
-      var splitName = fullName.split(":"),
-        type = splitName[0],
-        injections = [];
-
-      injections = injections.concat(container.typeInjections.get(type) || []);
-      injections = injections.concat(container.injections[fullName] || []);
-
-      injections = buildInjections(container, injections);
-      injections._debugContainerKey = fullName;
-      injections.container = container;
-
-      return injections;
-    }
-
-    function factoryInjectionsFor(container, fullName) {
-      var splitName = fullName.split(":"),
-        type = splitName[0],
-        factoryInjections = [];
-
-      factoryInjections = factoryInjections.concat(container.factoryTypeInjections.get(type) || []);
-      factoryInjections = factoryInjections.concat(container.factoryInjections[fullName] || []);
-
-      factoryInjections = buildInjections(container, factoryInjections);
-      factoryInjections._debugContainerKey = fullName;
-
-      return factoryInjections;
-    }
-
-    function instantiate(container, fullName) {
-      var factory = factoryFor(container, fullName);
-
-      if (option(container, fullName, 'instantiate') === false) {
-        return factory;
-      }
-
-      if (factory) {
-        if (typeof factory.extend === 'function') {
-          // assume the factory was extendable and is already injected
-          return factory.create();
-        } else {
-          // assume the factory was extendable
-          // to create time injections
-          // TODO: support new'ing for instantiation and merge injections for pure JS Functions
-          return factory.create(injectionsFor(container, fullName));
-        }
-      }
-    }
-
-    function eachDestroyable(container, callback) {
-      container.cache.eachLocal(function(key, value) {
-        if (option(container, key, 'instantiate') === false) { return; }
-        callback(value);
-      });
-    }
-
-    function resetCache(container) {
-      container.cache.eachLocal(function(key, value) {
-        if (option(container, key, 'instantiate') === false) { return; }
-        value.destroy();
-      });
-      container.cache.dict = {};
-    }
-
-    function addTypeInjection(rules, type, property, fullName) {
-      var injections = rules.get(type);
-
-      if (!injections) {
-        injections = [];
-        rules.set(type, injections);
-      }
-
-      injections.push({
-        property: property,
-        fullName: fullName
-      });
-    }
-
-    var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
-    function validateFullName(fullName) {
-      if (!VALID_FULL_NAME_REGEXP.test(fullName)) {
-        throw new TypeError('Invalid Fullname, expected: `type:name` got: ' + fullName);
-      }
-    }
-
-    function addInjection(rules, factoryName, property, injectionName) {
-      var injections = rules[factoryName] = rules[factoryName] || [];
-      injections.push({ property: property, fullName: injectionName });
-    }
-
-    __exports__["default"] = Container;
-  });define("ember-runtime/ext/rsvp", 
-  ["ember-metal/core","ember-metal/logger","exports"],
-  function(__dependency1__, __dependency2__, __exports__) {
-    "use strict";
-    var Ember = __dependency1__["default"];
-    var Logger = __dependency2__["default"];
-
-    var RSVP = requireModule("rsvp");
-    var Test, testModuleName = 'ember-testing/test';
-
-    RSVP.onerrorDefault = function(error) {
-      if (error instanceof Error) {
-        if (Ember.testing) {
-          // ES6TODO: remove when possible
-          if (!Test && Ember.__loader.registry[testModuleName]) {
-            Test = requireModule(testModuleName)['default'];
-          }
-
-          if (Test && Test.adapter) {
-            Test.adapter.exception(error);
-          } else {
-            throw error;
-          }
-        } else {
-          Logger.error(error.stack);
-          Ember.assert(error, false);
-        }
-      }
-    };
-
-    RSVP.on('error', RSVP.onerrorDefault);
-
-    __exports__["default"] = RSVP;
-  });define("ember-runtime/system/container", 
-  ["ember-metal/property_set","exports"],
-  function(__dependency1__, __exports__) {
-    "use strict";
-    var set = __dependency1__["default"];
-
-    var Container = requireModule('container')["default"];
-    Container.set = set;
-
-    __exports__["default"] = Container;
-  });(function() {
-// ensure that minispade loads the following modules first
-// ensure that the global exports have occurred for above
-// required packages
-requireModule('ember-metal');
-requireModule('ember-runtime');
-requireModule('ember-handlebars');
-requireModule('ember-views');
-requireModule('ember-routing');
-requireModule('ember-application');
-requireModule('ember-extension-support');
-
-// do this to ensure that Ember.Test is defined properly on the global
-// if it is present.
-if (Ember.__loader.registry['ember-testing']) {
-  requireModule('ember-testing');
-}
-
-/**
-Ember
-
-@module ember
-*/
-
-function throwWithMessage(msg) {
-  return function() {
-    throw new Ember.Error(msg);
-  };
-}
-
-function generateRemovedClass(className) {
-  var msg = " has been moved into a plugin: https://github.com/emberjs/ember-states";
-
-  return {
-    extend: throwWithMessage(className + msg),
-    create: throwWithMessage(className + msg)
-  };
-}
-
-Ember.StateManager = generateRemovedClass("Ember.StateManager");
-
-/**
-  This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states
-
-  @class StateManager
-  @namespace Ember
-*/
-
-Ember.State = generateRemovedClass("Ember.State");
-
-/**
-  This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states
-
-  @class State
-  @namespace Ember
-*/
-
-})();
-
-
-})();
diff --git a/dashboard/dependencies/js/handlebars.min.js b/dashboard/dependencies/js/handlebars.min.js
deleted file mode 100644
index 06e9c01..0000000
--- a/dashboard/dependencies/js/handlebars.min.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*!
-
- handlebars v1.3.0
-
-Copyright (C) 2011 by Yehuda Katz
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-@license
-*/
-var Handlebars=function(){var a=function(){"use strict";function a(a){this.string=a}var b;return a.prototype.toString=function(){return""+this.string},b=a}(),b=function(a){"use strict";function b(a){return h[a]||"&amp;"}function c(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c])}function d(a){return a instanceof g?a.toString():a||0===a?(a=""+a,j.test(a)?a.replace(i,b):a):""}function e(a){return a||0===a?m(a)&&0===a.length?!0:!1:!0}var f={},g=a,h={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},i=/[&<>"'`]/g,j=/[&<>"'`]/;f.extend=c;var k=Object.prototype.toString;f.toString=k;var l=function(a){return"function"==typeof a};l(/x/)&&(l=function(a){return"function"==typeof a&&"[object Function]"===k.call(a)});var l;f.isFunction=l;var m=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===k.call(a):!1};return f.isArray=m,f.escapeExpression=d,f.isEmpty=e,f}(a),c=function(){"use strict";function a(a,b){var d;b&&b.firstLine&&(d=b.firstLine,a+=" - "+d+":"+b.firstColumn);for(var e=Error.prototype.constructor.call(this,a),f=0;f<c.length;f++)this[c[f]]=e[c[f]];d&&(this.lineNumber=d,this.column=b.firstColumn)}var b,c=["description","fileName","lineNumber","message","name","number","stack"];return a.prototype=new Error,b=a}(),d=function(a,b){"use strict";function c(a,b){this.helpers=a||{},this.partials=b||{},d(this)}function d(a){a.registerHelper("helperMissing",function(a){if(2===arguments.length)return void 0;throw new h("Missing helper: '"+a+"'")}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse||function(){},e=c.fn;return m(b)&&(b=b.call(this)),b===!0?e(this):b===!1||null==b?d(this):l(b)?b.length>0?a.helpers.each(b,c):d(this):e(b)}),a.registerHelper("each",function(a,b){var c,d=b.fn,e=b.inverse,f=0,g="";if(m(a)&&(a=a.call(this)),b.data&&(c=q(b.data)),a&&"object"==typeof a)if(l(a))for(var h=a.length;h>f;f++)c&&(c.index=f,c.first=0===f,c.last=f===a.length-1),g+=d(a[f],{data:c});else for(var i in a)a.hasOwnProperty(i)&&(c&&(c.key=i,c.index=f,c.first=0===f),g+=d(a[i],{data:c}),f++);return 0===f&&(g=e(this)),g}),a.registerHelper("if",function(a,b){return m(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||g.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){return m(a)&&(a=a.call(this)),g.isEmpty(a)?void 0:b.fn(a)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)})}function e(a,b){p.log(a,b)}var f={},g=a,h=b,i="1.3.0";f.VERSION=i;var j=4;f.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:">= 1.0.0"};f.REVISION_CHANGES=k;var l=g.isArray,m=g.isFunction,n=g.toString,o="[object Object]";f.HandlebarsEnvironment=c,c.prototype={constructor:c,logger:p,log:e,registerHelper:function(a,b,c){if(n.call(a)===o){if(c||b)throw new h("Arg not supported with multiple helpers");g.extend(this.helpers,a)}else c&&(b.not=c),this.helpers[a]=b},registerPartial:function(a,b){n.call(a)===o?g.extend(this.partials,a):this.partials[a]=b}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){if(p.level<=a){var c=p.methodMap[a];"undefined"!=typeof console&&console[c]&&console[c].call(console,b)}}};f.logger=p,f.log=e;var q=function(a){var b={};return g.extend(b,a),b};return f.createFrame=q,f}(b,c),e=function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=m;if(b!==c){if(c>b){var d=n[c],e=n[b];throw new l("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new l("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){if(!b)throw new l("No environment passed to template");var c=function(a,c,d,e,f,g){var h=b.VM.invokePartial.apply(this,arguments);if(null!=h)return h;if(b.compile){var i={helpers:e,partials:f,data:g};return f[c]=b.compile(a,{data:void 0!==g},b),f[c](d,i)}throw new l("The partial "+c+" could not be compiled when running in runtime-only mode")},d={escapeExpression:k.escapeExpression,invokePartial:c,programs:[],program:function(a,b,c){var d=this.programs[a];return c?d=g(a,b,c):d||(d=this.programs[a]=g(a,b)),d},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c={},k.extend(c,b),k.extend(c,a)),c},programWithDepth:b.VM.programWithDepth,noop:b.VM.noop,compilerInfo:null};return function(c,e){e=e||{};var f,g,h=e.partial?e:b;e.partial||(f=e.helpers,g=e.partials);var i=a.call(d,h,c,f,g,e.data);return e.partial||b.VM.checkRevision(d.compilerInfo),i}}function f(a,b,c){var d=Array.prototype.slice.call(arguments,3),e=function(a,e){return e=e||{},b.apply(this,[a,e.data||c].concat(d))};return e.program=a,e.depth=d.length,e}function g(a,b,c){var d=function(a,d){return d=d||{},b(a,d.data||c)};return d.program=a,d.depth=0,d}function h(a,b,c,d,e,f){var g={partial:!0,helpers:d,partials:e,data:f};if(void 0===a)throw new l("The partial "+b+" could not be found");return a instanceof Function?a(c,g):void 0}function i(){return""}var j={},k=a,l=b,m=c.COMPILER_REVISION,n=c.REVISION_CHANGES;return j.checkRevision=d,j.template=e,j.programWithDepth=f,j.program=g,j.invokePartial=h,j.noop=i,j}(b,c,d),f=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c,j=d,k=e,l=function(){var a=new g.HandlebarsEnvironment;return j.extend(a,g),a.SafeString=h,a.Exception=i,a.Utils=j,a.VM=k,a.template=function(b){return k.template(b,a)},a},m=l();return m.create=l,f=m}(d,a,c,b,e),g=function(a){"use strict";function b(a){a=a||{},this.firstLine=a.first_line,this.firstColumn=a.first_column,this.lastColumn=a.last_column,this.lastLine=a.last_line}var c,d=a,e={ProgramNode:function(a,c,d,f){var g,h;3===arguments.length?(f=d,d=null):2===arguments.length&&(f=c,c=null),b.call(this,f),this.type="program",this.statements=a,this.strip={},d?(h=d[0],h?(g={first_line:h.firstLine,last_line:h.lastLine,last_column:h.lastColumn,first_column:h.firstColumn},this.inverse=new e.ProgramNode(d,c,g)):this.inverse=new e.ProgramNode(d,c),this.strip.right=c.left):c&&(this.strip.left=c.right)},MustacheNode:function(a,c,d,f,g){if(b.call(this,g),this.type="mustache",this.strip=f,null!=d&&d.charAt){var h=d.charAt(3)||d.charAt(2);this.escaped="{"!==h&&"&"!==h}else this.escaped=!!d;this.sexpr=a instanceof e.SexprNode?a:new e.SexprNode(a,c),this.sexpr.isRoot=!0,this.id=this.sexpr.id,this.params=this.sexpr.params,this.hash=this.sexpr.hash,this.eligibleHelper=this.sexpr.eligibleHelper,this.isHelper=this.sexpr.isHelper},SexprNode:function(a,c,d){b.call(this,d),this.type="sexpr",this.hash=c;var e=this.id=a[0],f=this.params=a.slice(1),g=this.eligibleHelper=e.isSimple;this.isHelper=g&&(f.length||c)},PartialNode:function(a,c,d,e){b.call(this,e),this.type="partial",this.partialName=a,this.context=c,this.strip=d},BlockNode:function(a,c,e,f,g){if(b.call(this,g),a.sexpr.id.original!==f.path.original)throw new d(a.sexpr.id.original+" doesn't match "+f.path.original,this);this.type="block",this.mustache=a,this.program=c,this.inverse=e,this.strip={left:a.strip.left,right:f.strip.right},(c||e).strip.left=a.strip.right,(e||c).strip.right=f.strip.left,e&&!c&&(this.isInverse=!0)},ContentNode:function(a,c){b.call(this,c),this.type="content",this.string=a},HashNode:function(a,c){b.call(this,c),this.type="hash",this.pairs=a},IdNode:function(a,c){b.call(this,c),this.type="ID";for(var e="",f=[],g=0,h=0,i=a.length;i>h;h++){var j=a[h].part;if(e+=(a[h].separator||"")+j,".."===j||"."===j||"this"===j){if(f.length>0)throw new d("Invalid path: "+e,this);".."===j?g++:this.isScoped=!0}else f.push(j)}this.original=e,this.parts=f,this.string=f.join("."),this.depth=g,this.isSimple=1===a.length&&!this.isScoped&&0===g,this.stringModeValue=this.string},PartialNameNode:function(a,c){b.call(this,c),this.type="PARTIAL_NAME",this.name=a.original},DataNode:function(a,c){b.call(this,c),this.type="DATA",this.id=a},StringNode:function(a,c){b.call(this,c),this.type="STRING",this.original=this.string=this.stringModeValue=a},IntegerNode:function(a,c){b.call(this,c),this.type="INTEGER",this.original=this.integer=a,this.stringModeValue=Number(a)},BooleanNode:function(a,c){b.call(this,c),this.type="BOOLEAN",this.bool=a,this.stringModeValue="true"===a},CommentNode:function(a,c){b.call(this,c),this.type="comment",this.comment=a}};return c=e}(c),h=function(){"use strict";var a,b=function(){function a(a,b){return{left:"~"===a.charAt(2),right:"~"===b.charAt(0)||"~"===b.charAt(1)}}function b(){this.yy={}}var c={trace:function(){},yy:{},symbols_:{error:2,root:3,statements:4,EOF:5,program:6,simpleInverse:7,statement:8,openInverse:9,closeBlock:10,openBlock:11,mustache:12,partial:13,CONTENT:14,COMMENT:15,OPEN_BLOCK:16,sexpr:17,CLOSE:18,OPEN_INVERSE:19,OPEN_ENDBLOCK:20,path:21,OPEN:22,OPEN_UNESCAPED:23,CLOSE_UNESCAPED:24,OPEN_PARTIAL:25,partialName:26,partial_option0:27,sexpr_repetition0:28,sexpr_option0:29,dataName:30,param:31,STRING:32,INTEGER:33,BOOLEAN:34,OPEN_SEXPR:35,CLOSE_SEXPR:36,hash:37,hash_repetition_plus0:38,hashSegment:39,ID:40,EQUALS:41,DATA:42,pathSegments:43,SEP:44,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",32:"STRING",33:"INTEGER",34:"BOOLEAN",35:"OPEN_SEXPR",36:"CLOSE_SEXPR",40:"ID",41:"EQUALS",42:"DATA",44:"SEP"},productions_:[0,[3,2],[3,1],[6,2],[6,3],[6,2],[6,1],[6,1],[6,0],[4,1],[4,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,4],[7,2],[17,3],[17,1],[31,1],[31,1],[31,1],[31,1],[31,1],[31,3],[37,1],[39,3],[26,1],[26,1],[26,1],[30,2],[21,1],[43,3],[43,1],[27,0],[27,1],[28,0],[28,2],[29,0],[29,1],[38,1],[38,2]],performAction:function(b,c,d,e,f,g){var h=g.length-1;switch(f){case 1:return new e.ProgramNode(g[h-1],this._$);case 2:return new e.ProgramNode([],this._$);case 3:this.$=new e.ProgramNode([],g[h-1],g[h],this._$);break;case 4:this.$=new e.ProgramNode(g[h-2],g[h-1],g[h],this._$);break;case 5:this.$=new e.ProgramNode(g[h-1],g[h],[],this._$);break;case 6:this.$=new e.ProgramNode(g[h],this._$);break;case 7:this.$=new e.ProgramNode([],this._$);break;case 8:this.$=new e.ProgramNode([],this._$);break;case 9:this.$=[g[h]];break;case 10:g[h-1].push(g[h]),this.$=g[h-1];break;case 11:this.$=new e.BlockNode(g[h-2],g[h-1].inverse,g[h-1],g[h],this._$);break;case 12:this.$=new e.BlockNode(g[h-2],g[h-1],g[h-1].inverse,g[h],this._$);break;case 13:this.$=g[h];break;case 14:this.$=g[h];break;case 15:this.$=new e.ContentNode(g[h],this._$);break;case 16:this.$=new e.CommentNode(g[h],this._$);break;case 17:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 18:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 19:this.$={path:g[h-1],strip:a(g[h-2],g[h])};break;case 20:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 21:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 22:this.$=new e.PartialNode(g[h-2],g[h-1],a(g[h-3],g[h]),this._$);break;case 23:this.$=a(g[h-1],g[h]);break;case 24:this.$=new e.SexprNode([g[h-2]].concat(g[h-1]),g[h],this._$);break;case 25:this.$=new e.SexprNode([g[h]],null,this._$);break;case 26:this.$=g[h];break;case 27:this.$=new e.StringNode(g[h],this._$);break;case 28:this.$=new e.IntegerNode(g[h],this._$);break;case 29:this.$=new e.BooleanNode(g[h],this._$);break;case 30:this.$=g[h];break;case 31:g[h-1].isHelper=!0,this.$=g[h-1];break;case 32:this.$=new e.HashNode(g[h],this._$);break;case 33:this.$=[g[h-2],g[h]];break;case 34:this.$=new e.PartialNameNode(g[h],this._$);break;case 35:this.$=new e.PartialNameNode(new e.StringNode(g[h],this._$),this._$);break;case 36:this.$=new e.PartialNameNode(new e.IntegerNode(g[h],this._$));break;case 37:this.$=new e.DataNode(g[h],this._$);break;case 38:this.$=new e.IdNode(g[h],this._$);break;case 39:g[h-2].push({part:g[h],separator:g[h-1]}),this.$=g[h-2];break;case 40:this.$=[{part:g[h]}];break;case 43:this.$=[];break;case 44:g[h-1].push(g[h]);break;case 47:this.$=[g[h]];break;case 48:g[h-1].push(g[h])}},table:[{3:1,4:2,5:[1,3],8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],25:[1,15]},{1:[3]},{5:[1,16],8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],25:[1,15]},{1:[2,2]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{4:20,6:18,7:19,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,8],22:[1,13],23:[1,14],25:[1,15]},{4:20,6:22,7:19,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,8],22:[1,13],23:[1,14],25:[1,15]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{17:23,21:24,30:25,40:[1,28],42:[1,27],43:26},{17:29,21:24,30:25,40:[1,28],42:[1,27],43:26},{17:30,21:24,30:25,40:[1,28],42:[1,27],43:26},{17:31,21:24,30:25,40:[1,28],42:[1,27],43:26},{21:33,26:32,32:[1,34],33:[1,35],40:[1,28],43:26},{1:[2,1]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{10:36,20:[1,37]},{4:38,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,7],22:[1,13],23:[1,14],25:[1,15]},{7:39,8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,6],22:[1,13],23:[1,14],25:[1,15]},{17:23,18:[1,40],21:24,30:25,40:[1,28],42:[1,27],43:26},{10:41,20:[1,37]},{18:[1,42]},{18:[2,43],24:[2,43],28:43,32:[2,43],33:[2,43],34:[2,43],35:[2,43],36:[2,43],40:[2,43],42:[2,43]},{18:[2,25],24:[2,25],36:[2,25]},{18:[2,38],24:[2,38],32:[2,38],33:[2,38],34:[2,38],35:[2,38],36:[2,38],40:[2,38],42:[2,38],44:[1,44]},{21:45,40:[1,28],43:26},{18:[2,40],24:[2,40],32:[2,40],33:[2,40],34:[2,40],35:[2,40],36:[2,40],40:[2,40],42:[2,40],44:[2,40]},{18:[1,46]},{18:[1,47]},{24:[1,48]},{18:[2,41],21:50,27:49,40:[1,28],43:26},{18:[2,34],40:[2,34]},{18:[2,35],40:[2,35]},{18:[2,36],40:[2,36]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{21:51,40:[1,28],43:26},{8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,3],22:[1,13],23:[1,14],25:[1,15]},{4:52,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,5],22:[1,13],23:[1,14],25:[1,15]},{14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]},{18:[2,45],21:56,24:[2,45],29:53,30:60,31:54,32:[1,57],33:[1,58],34:[1,59],35:[1,61],36:[2,45],37:55,38:62,39:63,40:[1,64],42:[1,27],43:26},{40:[1,65]},{18:[2,37],24:[2,37],32:[2,37],33:[2,37],34:[2,37],35:[2,37],36:[2,37],40:[2,37],42:[2,37]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,66]},{18:[2,42]},{18:[1,67]},{8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],25:[1,15]},{18:[2,24],24:[2,24],36:[2,24]},{18:[2,44],24:[2,44],32:[2,44],33:[2,44],34:[2,44],35:[2,44],36:[2,44],40:[2,44],42:[2,44]},{18:[2,46],24:[2,46],36:[2,46]},{18:[2,26],24:[2,26],32:[2,26],33:[2,26],34:[2,26],35:[2,26],36:[2,26],40:[2,26],42:[2,26]},{18:[2,27],24:[2,27],32:[2,27],33:[2,27],34:[2,27],35:[2,27],36:[2,27],40:[2,27],42:[2,27]},{18:[2,28],24:[2,28],32:[2,28],33:[2,28],34:[2,28],35:[2,28],36:[2,28],40:[2,28],42:[2,28]},{18:[2,29],24:[2,29],32:[2,29],33:[2,29],34:[2,29],35:[2,29],36:[2,29],40:[2,29],42:[2,29]},{18:[2,30],24:[2,30],32:[2,30],33:[2,30],34:[2,30],35:[2,30],36:[2,30],40:[2,30],42:[2,30]},{17:68,21:24,30:25,40:[1,28],42:[1,27],43:26},{18:[2,32],24:[2,32],36:[2,32],39:69,40:[1,70]},{18:[2,47],24:[2,47],36:[2,47],40:[2,47]},{18:[2,40],24:[2,40],32:[2,40],33:[2,40],34:[2,40],35:[2,40],36:[2,40],40:[2,40],41:[1,71],42:[2,40],44:[2,40]},{18:[2,39],24:[2,39],32:[2,39],33:[2,39],34:[2,39],35:[2,39],36:[2,39],40:[2,39],42:[2,39],44:[2,39]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{36:[1,72]},{18:[2,48],24:[2,48],36:[2,48],40:[2,48]},{41:[1,71]},{21:56,30:60,31:73,32:[1,57],33:[1,58],34:[1,59],35:[1,61],40:[1,28],42:[1,27],43:26},{18:[2,31],24:[2,31],32:[2,31],33:[2,31],34:[2,31],35:[2,31],36:[2,31],40:[2,31],42:[2,31]},{18:[2,33],24:[2,33],36:[2,33],40:[2,33]}],defaultActions:{3:[2,2],16:[2,1],50:[2,42]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},d=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 14;break;case 1:return 14;case 2:return this.popState(),14;case 3:return e(0,4),this.popState(),15;case 4:return 35;case 5:return 36;case 6:return 25;case 7:return 16;case 8:return 20;case 9:return 19;case 10:return 19;case 11:return 23;case 12:return 22;case 13:this.popState(),this.begin("com");break;case 14:return e(3,5),this.popState(),15;case 15:return 22;case 16:return 41;case 17:return 40;case 18:return 40;case 19:return 44;case 20:break;case 21:return this.popState(),24;case 22:return this.popState(),18;case 23:return b.yytext=e(1,2).replace(/\\"/g,'"'),32;case 24:return b.yytext=e(1,2).replace(/\\'/g,"'"),32;case 25:return 42;case 26:return 34;case 27:return 34;case 28:return 33;case 29:return 40;case 30:return b.yytext=e(1,2),40;case 31:return"INVALID";case 32:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:-?[0-9]+(?=([~}\s)])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[3],inclusive:!1},INITIAL:{rules:[0,1,32],inclusive:!0}},a}();return c.lexer=d,b.prototype=c,c.Parser=b,new b}();return a=b}(),i=function(a,b){"use strict";function c(a){return a.constructor===f.ProgramNode?a:(e.yy=f,e.parse(a))}var d={},e=a,f=b;return d.parser=e,d.parse=c,d}(h,g),j=function(a){"use strict";function b(){}function c(a,b,c){if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new f("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0);var d=c.parse(a),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function d(a,b,c){function d(){var d=c.parse(a),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new f("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=b||{},"data"in b||(b.data=!0);var e;return function(a,b){return e||(e=d()),e.call(this,a,b)}}var e={},f=a;return e.Compiler=b,b.prototype={compiler:b,disassemble:function(){for(var a,b,c,d=this.opcodes,e=[],f=0,g=d.length;g>f;f++)if(a=d[f],"DECLARE"===a.opcode)e.push("DECLARE "+a.name+"="+a.value);else{b=[];for(var h=0;h<a.args.length;h++)c=a.args[h],"string"==typeof c&&(c='"'+c.replace("\n","\\n")+'"'),b.push(c);e.push(a.opcode+" "+b.join(" "))}return e.join("\n")},equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;b>c;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||d.args.length!==e.args.length)return!1;for(var f=0;f<d.args.length;f++)if(d.args[f]!==e.args[f])return!1}if(b=this.children.length,a.children.length!==b)return!1;for(c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.opcodes=[],this.children=[],this.depths={list:[]},this.options=b;var c=this.options.knownHelpers;if(this.options.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0},c)for(var d in c)this.options.knownHelpers[d]=c[d];return this.accept(a)},accept:function(a){var b,c=a.strip||{};return c.left&&this.opcode("strip"),b=this[a.type](a),c.right&&this.opcode("strip"),b},program:function(a){for(var b=a.statements,c=0,d=b.length;d>c;c++)this.accept(b[c]);return this.isSimple=1===d,this.depths.list=this.depths.list.sort(function(a,b){return a-b}),this},compileProgram:function(a){var b,c=(new this.compiler).compile(a,this.options),d=this.guid++;this.usePartial=this.usePartial||c.usePartial,this.children[d]=c;for(var e=0,f=c.depths.list.length;f>e;e++)b=c.depths.list[e],2>b||this.addDepth(b-1);return d},block:function(a){var b=a.mustache,c=a.program,d=a.inverse;c&&(c=this.compileProgram(c)),d&&(d=this.compileProgram(d));var e=b.sexpr,f=this.classifySexpr(e);"helper"===f?this.helperSexpr(e,c,d):"simple"===f?(this.simpleSexpr(e),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("blockValue")):(this.ambiguousSexpr(e,c,d),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},hash:function(a){var b,c,d=a.pairs;this.opcode("pushHash");for(var e=0,f=d.length;f>e;e++)b=d[e],c=b[1],this.options.stringParams?(c.depth&&this.addDepth(c.depth),this.opcode("getContext",c.depth||0),this.opcode("pushStringParam",c.stringModeValue,c.type),"sexpr"===c.type&&this.sexpr(c)):this.accept(c),this.opcode("assignToHash",b[0]);this.opcode("popHash")},partial:function(a){var b=a.partialName;this.usePartial=!0,a.context?this.ID(a.context):this.opcode("push","depth0"),this.opcode("invokePartial",b.name),this.opcode("append")},content:function(a){this.opcode("appendContent",a.string)},mustache:function(a){this.sexpr(a.sexpr),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},ambiguousSexpr:function(a,b,c){var d=a.id,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.id;"DATA"===b.type?this.DATA(b):b.parts.length?this.ID(b):(this.addDepth(b.depth),this.opcode("getContext",b.depth),this.opcode("pushContext")),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.id.parts[0];if(this.options.knownHelpers[e])this.opcode("invokeKnownHelper",d.length,e);else{if(this.options.knownHelpersOnly)throw new f("You specified knownHelpersOnly, but used the unknown helper "+e,a);this.opcode("invokeHelper",d.length,e,a.isRoot)}},sexpr:function(a){var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ID:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0];b?this.opcode("lookupOnContext",a.parts[0]):this.opcode("pushContext");for(var c=1,d=a.parts.length;d>c;c++)this.opcode("lookup",a.parts[c])},DATA:function(a){if(this.options.data=!0,a.id.isScoped||a.id.depth)throw new f("Scoped data references are not supported: "+a.original,a);this.opcode("lookupData");for(var b=a.id.parts,c=0,d=b.length;d>c;c++)this.opcode("lookup",b[c])},STRING:function(a){this.opcode("pushString",a.string)},INTEGER:function(a){this.opcode("pushLiteral",a.integer)},BOOLEAN:function(a){this.opcode("pushLiteral",a.bool)},comment:function(){},opcode:function(a){this.opcodes.push({opcode:a,args:[].slice.call(arguments,1)})},declare:function(a,b){this.opcodes.push({opcode:"DECLARE",name:a,value:b})},addDepth:function(a){0!==a&&(this.depths[a]||(this.depths[a]=!0,this.depths.list.push(a)))},classifySexpr:function(a){var b=a.isHelper,c=a.eligibleHelper,d=this.options;if(c&&!b){var e=a.id.parts[0];d.knownHelpers[e]?b=!0:d.knownHelpersOnly&&(c=!1)}return b?"helper":c?"ambiguous":"simple"},pushParams:function(a){for(var b,c=a.length;c--;)b=a[c],this.options.stringParams?(b.depth&&this.addDepth(b.depth),this.opcode("getContext",b.depth||0),this.opcode("pushStringParam",b.stringModeValue,b.type),"sexpr"===b.type&&this.sexpr(b)):this[b.type](b)},setupFullMustacheParams:function(a,b,c){var d=a.params;return this.pushParams(d),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.hash(a.hash):this.opcode("emptyHash"),d}},e.precompile=c,e.compile=d,e}(c),k=function(a,b){"use strict";function c(a){this.value=a}function d(){}var e,f=a.COMPILER_REVISION,g=a.REVISION_CHANGES,h=a.log,i=b;d.prototype={nameLookup:function(a,b){var c,e;return 0===a.indexOf("depth")&&(c=!0),e=/^[0-9]+$/.test(b)?a+"["+b+"]":d.isValidJavaScriptVariableName(b)?a+"."+b:a+"['"+b+"']",c?"("+a+" && "+e+")":e},compilerInfo:function(){var a=f,b=g[a];return"this.compilerInfo = ["+a+",'"+b+"'];\n"},appendToBuffer:function(a){return this.environment.isSimple?"return "+a+";":{appendToBuffer:!0,content:a,toString:function(){return"buffer += "+a+";"}}},initializeBuffer:function(){return this.quotedString("")},namespace:"Handlebars",compile:function(a,b,c,d){this.environment=a,this.options=b||{},h("debug",this.environment.disassemble()+"\n\n"),this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[],aliases:{}},this.preamble(),this.stackSlot=0,this.stackVars=[],this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.compileChildren(a,b);
-var e,f=a.opcodes;this.i=0;for(var g=f.length;this.i<g;this.i++)e=f[this.i],"DECLARE"===e.opcode?this[e.name]=e.value:this[e.opcode].apply(this,e.args),e.opcode!==this.stripNext&&(this.stripNext=!1);if(this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new i("Compile completed with content left on stack");return this.createFunctionContext(d)},preamble:function(){var a=[];if(this.isChild)a.push("");else{var b=this.namespace,c="helpers = this.merge(helpers, "+b+".helpers);";this.environment.usePartial&&(c=c+" partials = this.merge(partials, "+b+".partials);"),this.options.data&&(c+=" data = data || {};"),a.push(c)}this.environment.isSimple?a.push(""):a.push(", buffer = "+this.initializeBuffer()),this.lastContext=0,this.source=a},createFunctionContext:function(a){var b=this.stackVars.concat(this.registers.list);if(b.length>0&&(this.source[1]=this.source[1]+", "+b.join(", ")),!this.isChild)for(var c in this.context.aliases)this.context.aliases.hasOwnProperty(c)&&(this.source[1]=this.source[1]+", "+c+"="+this.context.aliases[c]);this.source[1]&&(this.source[1]="var "+this.source[1].substring(2)+";"),this.isChild||(this.source[1]+="\n"+this.context.programs.join("\n")+"\n"),this.environment.isSimple||this.pushSource("return buffer;");for(var d=this.isChild?["depth0","data"]:["Handlebars","depth0","helpers","partials","data"],e=0,f=this.environment.depths.list.length;f>e;e++)d.push("depth"+this.environment.depths.list[e]);var g=this.mergeSource();if(this.isChild||(g=this.compilerInfo()+g),a)return d.push(g),Function.apply(this,d);var i="function "+(this.name||"")+"("+d.join(",")+") {\n  "+g+"}";return h("debug",i+"\n\n"),i},mergeSource:function(){for(var a,b="",c=0,d=this.source.length;d>c;c++){var e=this.source[c];e.appendToBuffer?a=a?a+"\n    + "+e.content:e.content:(a&&(b+="buffer += "+a+";\n  ",a=void 0),b+=e+"\n  ")}return b},blockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";var a=["depth0"];this.setupParams(0,a),this.replaceStack(function(b){return a.splice(1,0,b),"blockHelperMissing.call("+a.join(", ")+")"})},ambiguousBlockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";var a=["depth0"];this.setupParams(0,a);var b=this.topStack();a.splice(1,0,b),this.pushSource("if (!"+this.lastHelper+") { "+b+" = blockHelperMissing.call("+a.join(", ")+"); }")},appendContent:function(a){this.pendingContent&&(a=this.pendingContent+a),this.stripNext&&(a=a.replace(/^\s+/,"")),this.pendingContent=a},strip:function(){this.pendingContent&&(this.pendingContent=this.pendingContent.replace(/\s+$/,"")),this.stripNext="strip"},append:function(){this.flushInline();var a=this.popStack();this.pushSource("if("+a+" || "+a+" === 0) { "+this.appendToBuffer(a)+" }"),this.environment.isSimple&&this.pushSource("else { "+this.appendToBuffer("''")+" }")},appendEscaped:function(){this.context.aliases.escapeExpression="this.escapeExpression",this.pushSource(this.appendToBuffer("escapeExpression("+this.popStack()+")"))},getContext:function(a){this.lastContext!==a&&(this.lastContext=a)},lookupOnContext:function(a){this.push(this.nameLookup("depth"+this.lastContext,a,"context"))},pushContext:function(){this.pushStackLiteral("depth"+this.lastContext)},resolvePossibleLambda:function(){this.context.aliases.functionType='"function"',this.replaceStack(function(a){return"typeof "+a+" === functionType ? "+a+".apply(depth0) : "+a})},lookup:function(a){this.replaceStack(function(b){return b+" == null || "+b+" === false ? "+b+" : "+this.nameLookup(b,a,"context")})},lookupData:function(){this.pushStackLiteral("data")},pushStringParam:function(a,b){this.pushStackLiteral("depth"+this.lastContext),this.pushString(b),"sexpr"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(){this.pushStackLiteral("{}"),this.options.stringParams&&(this.push("{}"),this.push("{}"))},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.options.stringParams&&(this.push("{"+a.contexts.join(",")+"}"),this.push("{"+a.types.join(",")+"}")),this.push("{\n    "+a.values.join(",\n    ")+"\n  }")},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},push:function(a){return this.inlineStack.push(a),a},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},invokeHelper:function(a,b,c){this.context.aliases.helperMissing="helpers.helperMissing",this.useRegister("helper");var d=this.lastHelper=this.setupHelper(a,b,!0),e=this.nameLookup("depth"+this.lastContext,b,"context"),f="helper = "+d.name+" || "+e;d.paramsInit&&(f+=","+d.paramsInit),this.push("("+f+",helper ? helper.call("+d.callParams+") : helperMissing.call("+d.helperMissingParams+"))"),c||this.flushInline()},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(c.name+".call("+c.callParams+")")},invokeAmbiguous:function(a,b){this.context.aliases.functionType='"function"',this.useRegister("helper"),this.emptyHash();var c=this.setupHelper(0,a,b),d=this.lastHelper=this.nameLookup("helpers",a,"helper"),e=this.nameLookup("depth"+this.lastContext,a,"context"),f=this.nextStack();c.paramsInit&&this.pushSource(c.paramsInit),this.pushSource("if (helper = "+d+") { "+f+" = helper.call("+c.callParams+"); }"),this.pushSource("else { helper = "+e+"; "+f+" = typeof helper === functionType ? helper.call("+c.callParams+") : helper; }")},invokePartial:function(a){var b=[this.nameLookup("partials",a,"partial"),"'"+a+"'",this.popStack(),"helpers","partials"];this.options.data&&b.push("data"),this.context.aliases.self="this",this.push("self.invokePartial("+b.join(", ")+")")},assignToHash:function(a){var b,c,d=this.popStack();this.options.stringParams&&(c=this.popStack(),b=this.popStack());var e=this.hash;b&&e.contexts.push("'"+a+"': "+b),c&&e.types.push("'"+a+"': "+c),e.values.push("'"+a+"': ("+d+")")},compiler:d,compileChildren:function(a,b){for(var c,d,e=a.children,f=0,g=e.length;g>f;f++){c=e[f],d=new this.compiler;var h=this.matchExistingProgram(c);null==h?(this.context.programs.push(""),h=this.context.programs.length,c.index=h,c.name="program"+h,this.context.programs[h]=d.compile(c,b,this.context),this.context.environments[h]=c):(c.index=h,c.name="program"+h)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){if(this.context.aliases.self="this",null==a)return"self.noop";for(var b,c=this.environment.children[a],d=c.depths.list,e=[c.index,c.name,"data"],f=0,g=d.length;g>f;f++)b=d[f],1===b?e.push("depth0"):e.push("depth"+(b-1));return(0===d.length?"self.program(":"self.programWithDepth(")+e.join(", ")+")"},register:function(a,b){this.useRegister(a),this.pushSource(a+" = "+b+";")},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},pushStackLiteral:function(a){return this.push(new c(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent))),this.pendingContent=void 0),a&&this.source.push(a)},pushStack:function(a){this.flushInline();var b=this.incrStack();return a&&this.pushSource(b+" = "+a+";"),this.compileStack.push(b),b},replaceStack:function(a){var b,d,e,f="",g=this.isInline();if(g){var h=this.popStack(!0);if(h instanceof c)b=h.value,e=!0;else{d=!this.stackSlot;var i=d?this.incrStack():this.topStackName();f="("+this.push(i)+" = "+h+"),",b=this.topStack()}}else b=this.topStack();var j=a.call(this,b);return g?(e||this.popStack(),d&&this.stackSlot--,this.push("("+f+j+")")):(/^stack/.test(b)||(b=this.nextStack()),this.pushSource(b+" = ("+f+j+");")),b},nextStack:function(){return this.pushStack()},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;if(a.length){this.inlineStack=[];for(var b=0,d=a.length;d>b;b++){var e=a[b];e instanceof c?this.compileStack.push(e):this.pushStack(e)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),d=(b?this.inlineStack:this.compileStack).pop();if(!a&&d instanceof c)return d.value;if(!b){if(!this.stackSlot)throw new i("Invalid stack pop");this.stackSlot--}return d},topStack:function(a){var b=this.isInline()?this.inlineStack:this.compileStack,d=b[b.length-1];return!a&&d instanceof c?d.value:d},quotedString:function(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},setupHelper:function(a,b,c){var d=[],e=this.setupParams(a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:["depth0"].concat(d).join(", "),helperMissingParams:c&&["depth0",this.quotedString(b)].concat(d).join(", ")}},setupOptions:function(a,b){var c,d,e,f=[],g=[],h=[];f.push("hash:"+this.popStack()),this.options.stringParams&&(f.push("hashTypes:"+this.popStack()),f.push("hashContexts:"+this.popStack())),d=this.popStack(),e=this.popStack(),(e||d)&&(e||(this.context.aliases.self="this",e="self.noop"),d||(this.context.aliases.self="this",d="self.noop"),f.push("inverse:"+d),f.push("fn:"+e));for(var i=0;a>i;i++)c=this.popStack(),b.push(c),this.options.stringParams&&(h.push(this.popStack()),g.push(this.popStack()));return this.options.stringParams&&(f.push("contexts:["+g.join(",")+"]"),f.push("types:["+h.join(",")+"]")),this.options.data&&f.push("data:data"),f},setupParams:function(a,b,c){var d="{"+this.setupOptions(a,b).join(",")+"}";return c?(this.useRegister("options"),b.push("options"),"options="+d):(b.push(d),"")}};for(var j="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield".split(" "),k=d.RESERVED_WORDS={},l=0,m=j.length;m>l;l++)k[j[l]]=!0;return d.isValidJavaScriptVariableName=function(a){return!d.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)?!0:!1},e=d}(d,c),l=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c.parser,j=c.parse,k=d.Compiler,l=d.compile,m=d.precompile,n=e,o=g.create,p=function(){var a=o();return a.compile=function(b,c){return l(b,c,a)},a.precompile=function(b,c){return m(b,c,a)},a.AST=h,a.Compiler=k,a.JavaScriptCompiler=n,a.Parser=i,a.parse=j,a};return g=p(),g.create=p,f=g}(f,g,i,j,k);return l}();
\ No newline at end of file
diff --git a/dashboard/dependencies/js/jquery.min.js b/dashboard/dependencies/js/jquery.min.js
deleted file mode 100644
index 9a85bd3..0000000
--- a/dashboard/dependencies/js/jquery.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/
-(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)
-};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)
-},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);
diff --git a/dashboard/dependencies/js/moment.min.js b/dashboard/dependencies/js/moment.min.js
deleted file mode 100644
index 29e1cef..0000000
--- a/dashboard/dependencies/js/moment.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-//! moment.js
-//! version : 2.5.1
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
-//! license : MIT
-//! momentjs.com
-(function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){return function(c){return k(a.call(this,c),b)}}function d(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function e(){}function f(a){w(a),h(this,a)}function g(a){var b=q(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function h(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function i(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&qb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function j(a){return 0>a?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function l(a,b,c,d){var e,f,g=b._milliseconds,h=b._days,i=b._months;g&&a._d.setTime(+a._d+g*c),(h||i)&&(e=a.minute(),f=a.hour()),h&&a.date(a.date()+h*c),i&&a.month(a.month()+i*c),g&&!d&&db.updateOffset(a),(h||i)&&(a.minute(e),a.hour(f))}function m(a){return"[object Array]"===Object.prototype.toString.call(a)}function n(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function o(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f<a.length;){for(e=y(a[f]).split("-"),b=e.length,d=y(a[f+1]),d=d?d.split("-"):null;b>0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&j<i._week.dow&&k++,h=Z(f(g.gg),k,j,i._week.doy,i._week.dow)),a._a[ib]=h.year,a._dayOfYear=h.dayOfYear),a._dayOfYear&&(e=null==a._a[ib]?d[ib]:a._a[ib],a._dayOfYear>u(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b<d.length;b++)e=d[b],c=(h.match(H(e,a))||[])[0],c&&(f=h.substr(0,h.indexOf(c)),f.length>0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(f=0;f<a._f.length;f++)g=0,c=h({},a),c._pf=b(),c._f=a._f[f],N(c),x(c)&&(g+=c._pf.charsLeftOver,g+=10*c._pf.unusedTokens.length,c._pf.score=g,(null==e||e>g)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 0<a.year()&&a.year()<=9999?F(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):F(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return x(this)},isDSTShifted:function(){return this._a?this.isValid()&&o(this._a,(this._isUTC?db.utc(this._a):db(this._a)).toArray())>0:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=V(a,this.lang()),this.add({d:a-b})):b},month:function(a){var b,c=this._isUTC?"UTC":"";return null!=a?"string"==typeof a&&(a=this.lang().monthsParse(a),"number"!=typeof a)?this:(b=this.date(),this.date(1),this._d["set"+c+"Month"](a),this.date(Math.min(b,this.daysInMonth())),db.updateOffset(this),this):this._d["get"+c+"Month"]()},startOf:function(a){switch(a=p(a)){case"year":this.month(0);case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),this},endOf:function(a){return a=p(a),this.startOf(a).add("isoWeek"===a?"week":a,1).subtract("ms",1)},isAfter:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)>+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;eb<Rb.length;eb++)_(Rb[eb].toLowerCase().replace(/s$/,""),Rb[eb]);_("year","FullYear"),db.fn.days=db.fn.day,db.fn.months=db.fn.month,db.fn.weeks=db.fn.week,db.fn.isoWeeks=db.fn.isoWeek,db.fn.toJSON=db.fn.toISOString,h(db.duration.fn=g.prototype,{_bubble:function(){var a,b,c,d,e=this._milliseconds,f=this._days,g=this._months,h=this._data;h.milliseconds=e%1e3,a=j(e/1e3),h.seconds=a%60,b=j(a/60),h.minutes=b%60,c=j(b/60),h.hours=c%24,f+=j(c/24),h.days=f%30,g+=j(f/30),h.months=g%12,d=j(g/12),h.years=d},weeks:function(){return j(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*s(this._months/12)},humanize:function(a){var b=+this,c=X(b,!a,this.lang());return a&&(c=this.lang().pastFuture(b,c)),this.lang().postformat(c)},add:function(a,b){var c=db.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=db.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=p(a),this[a.toLowerCase()+"s"]()},as:function(a){return a=p(a),this["as"+a.charAt(0).toUpperCase()+a.slice(1)+"s"]()},lang:db.fn.lang,toIsoString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}});for(eb in Sb)Sb.hasOwnProperty(eb)&&(bb(eb,Sb[eb]),ab(eb.toLowerCase()));bb("Weeks",6048e5),db.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},db.lang("en",{ordinal:function(a){var b=a%10,c=1===s(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),rb?(module.exports=db,cb(!0)):"function"==typeof define&&define.amd?define("moment",function(b,c,d){return d.config&&d.config()&&d.config().noGlobal!==!0&&cb(d.config().noGlobal===a),db}):cb()}).call(this);
\ No newline at end of file
diff --git a/dashboard/files/XDATA Dashboard-1420837017579 b/dashboard/files/XDATA Dashboard-1420837017579
new file mode 100644
index 0000000..fc2832f
--- /dev/null
+++ b/dashboard/files/XDATA Dashboard-1420837017579
@@ -0,0 +1,383 @@
+{
+  "title": "XDATA Dashboard",
+  "services": {
+    "query": {
+      "list": {
+        "0": {
+          "query": "*",
+          "alias": "",
+          "color": "#7EB26D",
+          "id": 0,
+          "pin": false,
+          "type": "lucene",
+          "enable": true
+        }
+      },
+      "ids": [
+        0
+      ]
+    },
+    "filter": {
+      "list": {
+        "0": {
+          "type": "time",
+          "field": "@timestamp",
+          "from": "now-15m",
+          "to": "now",
+          "mandate": "must",
+          "active": true,
+          "alias": "",
+          "id": 0
+        }
+      },
+      "ids": [
+        0
+      ]
+    }
+  },
+  "rows": [
+    {
+      "title": "Options",
+      "height": "150px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "span": 12,
+          "editable": true,
+          "type": "histogram",
+          "loadingEditor": false,
+          "mode": "count",
+          "time_field": "timestamp",
+          "value_field": null,
+          "x-axis": true,
+          "y-axis": true,
+          "scale": 1,
+          "y_format": "none",
+          "grid": {
+            "max": null,
+            "min": 0
+          },
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "annotate": {
+            "enable": false,
+            "query": "*",
+            "size": 20,
+            "field": "_type",
+            "sort": [
+              "_score",
+              "desc"
+            ]
+          },
+          "auto_int": false,
+          "resolution": 100,
+          "interval": "1s",
+          "intervals": [
+            "auto",
+            "1s",
+            "1m",
+            "5m",
+            "10m",
+            "30m",
+            "1h",
+            "3h",
+            "12h",
+            "1d",
+            "1w",
+            "1y"
+          ],
+          "lines": true,
+          "fill": 2,
+          "linewidth": 2,
+          "points": false,
+          "pointradius": 5,
+          "bars": false,
+          "stack": true,
+          "spyable": true,
+          "zoomlinks": true,
+          "options": true,
+          "legend": true,
+          "show_query": true,
+          "interactive": true,
+          "legend_counts": true,
+          "timezone": "utc",
+          "percentage": false,
+          "zerofill": true,
+          "derivative": false,
+          "tooltip": {
+            "value_type": "cumulative",
+            "query_as_alias": true
+          },
+          "title": "Log Activity"
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Graph",
+      "height": "100px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field": "_type",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 100,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "below",
+          "title": "Document types",
+          "spyable": true,
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        },
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field": "parms.activity",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 10,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "none",
+          "spyable": true,
+          "title": "Document Types",
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Events",
+      "height": "650px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 2,
+          "editable": true,
+          "type": "column",
+          "loadingEditor": false,
+          "panels": [
+            {
+              "type": "terms",
+              "tmode": "terms",
+              "field": "sessionID",
+              "size": 10,
+              "order": "count",
+              "chart": "table",
+              "exclude": [],
+              "missing": false,
+              "other": false,
+              "style": {
+                "font-size": "10pt"
+              },
+              "donut": false,
+              "tilt": false,
+              "labels": true,
+              "arrangement": "horizontal",
+              "counter_pos": "above",
+              "spyable": true,
+              "queries": {
+                "mode": "all",
+                "ids": [
+                  0
+                ]
+              },
+              "tstat": "total",
+              "valuefield": ""
+            }
+          ]
+        },
+        {
+          "error": false,
+          "span": 10,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "table",
+          "size": 100,
+          "pages": 5,
+          "offset": 0,
+          "sort": [
+            "_score",
+            "desc"
+          ],
+          "style": {
+            "font-size": "9pt"
+          },
+          "overflow": "min-height",
+          "fields": [
+            "parms.wf_state",
+            "parms.desc",
+            "component.name",
+            "sessionID",
+            "timestamp",
+            "type",
+            "client",
+            "parms.activity"
+          ],
+          "highlight": [],
+          "sortable": true,
+          "header": true,
+          "paging": true,
+          "spyable": true,
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field_list": true,
+          "status": "Stable",
+          "trimFactor": 300,
+          "normTimes": true,
+          "title": "Documents",
+          "all_fields": false,
+          "localTime": false,
+          "timeField": "@timestamp"
+        }
+      ],
+      "notice": false
+    }
+  ],
+  "editable": true,
+  "index": {
+    "interval": "none",
+    "pattern": "[logstash-]YYYY.MM.DD",
+    "default": "xdata",
+    "warm_fields": false
+  },
+  "style": "dark",
+  "failover": false,
+  "panel_hints": true,
+  "loader": {
+    "save_gist": false,
+    "save_elasticsearch": true,
+    "save_local": true,
+    "save_default": true,
+    "save_temp": true,
+    "save_temp_ttl_enable": true,
+    "save_temp_ttl": "30d",
+    "load_gist": true,
+    "load_elasticsearch": true,
+    "load_elasticsearch_size": 20,
+    "load_local": true,
+    "hide": false
+  },
+  "pulldowns": [
+    {
+      "type": "query",
+      "collapse": false,
+      "notice": false,
+      "query": "*",
+      "pinned": true,
+      "history": [
+        "*",
+        "",
+        "hovered",
+        "user",
+        "*user"
+      ],
+      "remember": 10,
+      "enable": true
+    },
+    {
+      "type": "filtering",
+      "collapse": false,
+      "notice": true,
+      "enable": true
+    }
+  ],
+  "nav": [
+    {
+      "type": "timepicker",
+      "collapse": false,
+      "notice": false,
+      "status": "Stable",
+      "time_options": [
+        "5m",
+        "15m",
+        "1h",
+        "6h",
+        "12h",
+        "24h",
+        "2d",
+        "7d",
+        "30d"
+      ],
+      "refresh_intervals": [
+        "5s",
+        "10s",
+        "30s",
+        "1m",
+        "5m",
+        "15m",
+        "30m",
+        "1h",
+        "2h",
+        "1d"
+      ],
+      "timefield": "@timestamp",
+      "enable": true,
+      "now": true,
+      "filter_id": 0
+    }
+  ],
+  "refresh": "5s"
+}
\ No newline at end of file
diff --git a/dashboard/files/XDATA Dashboard-1421248955640 b/dashboard/files/XDATA Dashboard-1421248955640
new file mode 100644
index 0000000..4f1256c
--- /dev/null
+++ b/dashboard/files/XDATA Dashboard-1421248955640
@@ -0,0 +1,405 @@
+{
+  "title": "XDATA Dashboard",
+  "services": {
+    "query": {
+      "list": {
+        "0": {
+          "id": 0,
+          "color": "#7EB26D",
+          "alias": "",
+          "pin": false,
+          "type": "lucene",
+          "enable": true,
+          "query": "sessionID:\"my-1421247708256\""
+        },
+        "1": {
+          "id": 1,
+          "color": "#EAB839",
+          "alias": "",
+          "pin": false,
+          "type": "lucene",
+          "enable": true,
+          "query": "sessionID:\"my-1421244516740\""
+        }
+      },
+      "ids": [
+        0,
+        1
+      ]
+    },
+    "filter": {
+      "list": {
+        "0": {
+          "type": "time",
+          "field": "@timestamp",
+          "from": "now-15m",
+          "to": "now",
+          "mandate": "must",
+          "active": true,
+          "alias": "",
+          "id": 0
+        }
+      },
+      "ids": [
+        0
+      ]
+    }
+  },
+  "rows": [
+    {
+      "title": "Options",
+      "height": "150px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "span": 12,
+          "editable": true,
+          "type": "histogram",
+          "loadingEditor": false,
+          "mode": "count",
+          "time_field": "timestamp",
+          "value_field": null,
+          "x-axis": true,
+          "y-axis": true,
+          "scale": 1,
+          "y_format": "none",
+          "grid": {
+            "max": null,
+            "min": 0
+          },
+          "queries": {
+            "mode": "selected",
+            "ids": [
+              0,
+              1
+            ]
+          },
+          "annotate": {
+            "enable": false,
+            "query": "*",
+            "size": 20,
+            "field": "_type",
+            "sort": [
+              "_score",
+              "desc"
+            ]
+          },
+          "auto_int": true,
+          "resolution": 100,
+          "interval": "10s",
+          "intervals": [
+            "auto",
+            "1s",
+            "1m",
+            "5m",
+            "10m",
+            "30m",
+            "1h",
+            "3h",
+            "12h",
+            "1d",
+            "1w",
+            "1y"
+          ],
+          "lines": false,
+          "fill": 2,
+          "linewidth": 2,
+          "points": false,
+          "pointradius": 5,
+          "bars": true,
+          "stack": false,
+          "spyable": true,
+          "zoomlinks": true,
+          "options": true,
+          "legend": true,
+          "show_query": true,
+          "interactive": true,
+          "legend_counts": true,
+          "timezone": "utc",
+          "percentage": false,
+          "zerofill": true,
+          "derivative": false,
+          "tooltip": {
+            "value_type": "cumulative",
+            "query_as_alias": true
+          },
+          "title": "Log Activity"
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Graph",
+      "height": "100px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0,
+              1
+            ]
+          },
+          "field": "_type",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 100,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "below",
+          "title": "Document types",
+          "spyable": true,
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        },
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0,
+              1
+            ]
+          },
+          "field": "parms.activity",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 10,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "none",
+          "spyable": true,
+          "title": "Document Types",
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Events",
+      "height": "650px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 2,
+          "editable": true,
+          "type": "column",
+          "loadingEditor": false,
+          "panels": [
+            {
+              "type": "terms",
+              "tmode": "terms",
+              "field": "sessionID",
+              "size": 10,
+              "order": "count",
+              "chart": "table",
+              "exclude": [],
+              "missing": false,
+              "other": false,
+              "style": {
+                "font-size": "10pt"
+              },
+              "donut": false,
+              "tilt": false,
+              "labels": true,
+              "arrangement": "horizontal",
+              "counter_pos": "above",
+              "spyable": true,
+              "queries": {
+                "mode": "all",
+                "ids": [
+                  0,
+                  1
+                ]
+              },
+              "tstat": "total",
+              "valuefield": "",
+              "title": "Sessions",
+              "span": 2
+            }
+          ]
+        },
+        {
+          "error": false,
+          "span": 9,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "table",
+          "size": 100,
+          "pages": 5,
+          "offset": 0,
+          "sort": [
+            "timestamp",
+            "desc"
+          ],
+          "style": {
+            "font-size": "9pt"
+          },
+          "overflow": "min-height",
+          "fields": [
+            "parms.wf_state",
+            "parms.desc",
+            "component.name",
+            "sessionID",
+            "timestamp",
+            "type",
+            "client",
+            "parms.activity"
+          ],
+          "highlight": [],
+          "sortable": true,
+          "header": true,
+          "paging": true,
+          "spyable": true,
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0,
+              1
+            ]
+          },
+          "field_list": true,
+          "status": "Stable",
+          "trimFactor": 300,
+          "normTimes": true,
+          "title": "Documents",
+          "all_fields": false,
+          "localTime": false,
+          "timeField": "@timestamp"
+        }
+      ],
+      "notice": false
+    }
+  ],
+  "editable": true,
+  "index": {
+    "interval": "none",
+    "pattern": "[logstash-]YYYY.MM.DD",
+    "default": "xdata",
+    "warm_fields": false
+  },
+  "style": "dark",
+  "failover": false,
+  "panel_hints": true,
+  "loader": {
+    "save_gist": false,
+    "save_elasticsearch": true,
+    "save_local": true,
+    "save_default": true,
+    "save_temp": true,
+    "save_temp_ttl_enable": true,
+    "save_temp_ttl": "30d",
+    "load_gist": true,
+    "load_elasticsearch": true,
+    "load_elasticsearch_size": 20,
+    "load_local": true,
+    "hide": false
+  },
+  "pulldowns": [
+    {
+      "type": "query",
+      "collapse": false,
+      "notice": false,
+      "query": "*",
+      "pinned": true,
+      "history": [
+        "sessionID:\"my-1421244516740\"",
+        "sessionID:\"my-1421247708256\"",
+        "*",
+        "sessionID:{dave}",
+        "sessionID:dave",
+        "sessionIDs:\"dave\"",
+        "sessionID:\"dave\"",
+        "sessionID:\"my-14212445*\"",
+        "sessionID:my-1421247708256",
+        "sessionID:1421247708256"
+      ],
+      "remember": 10,
+      "enable": true
+    },
+    {
+      "type": "filtering",
+      "collapse": false,
+      "notice": true,
+      "enable": true
+    }
+  ],
+  "nav": [
+    {
+      "type": "timepicker",
+      "collapse": false,
+      "notice": false,
+      "status": "Stable",
+      "time_options": [
+        "5m",
+        "15m",
+        "1h",
+        "6h",
+        "12h",
+        "24h",
+        "2d",
+        "7d",
+        "30d"
+      ],
+      "refresh_intervals": [
+        "5s",
+        "10s",
+        "30s",
+        "1m",
+        "5m",
+        "15m",
+        "30m",
+        "1h",
+        "2h",
+        "1d"
+      ],
+      "timefield": "@timestamp",
+      "enable": true,
+      "now": true,
+      "filter_id": 0
+    }
+  ],
+  "refresh": "5s"
+}
\ No newline at end of file
diff --git a/dashboard/files/XDATA Dashboard-1421361378178 b/dashboard/files/XDATA Dashboard-1421361378178
new file mode 100644
index 0000000..ac067a6
--- /dev/null
+++ b/dashboard/files/XDATA Dashboard-1421361378178
@@ -0,0 +1,391 @@
+{
+  "title": "XDATA Dashboard",
+  "services": {
+    "query": {
+      "list": {
+        "0": {
+          "id": 0,
+          "color": "#7EB26D",
+          "alias": "",
+          "pin": false,
+          "type": "lucene",
+          "enable": true,
+          "query": "*"
+        }
+      },
+      "ids": [
+        0
+      ]
+    },
+    "filter": {
+      "list": {
+        "0": {
+          "type": "time",
+          "field": "@timestamp",
+          "from": "now-15m",
+          "to": "now",
+          "mandate": "must",
+          "active": true,
+          "alias": "",
+          "id": 0
+        }
+      },
+      "ids": [
+        0
+      ]
+    }
+  },
+  "rows": [
+    {
+      "title": "Options",
+      "height": "150px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "span": 12,
+          "editable": true,
+          "type": "histogram",
+          "loadingEditor": false,
+          "mode": "count",
+          "time_field": "timestamp",
+          "value_field": null,
+          "x-axis": true,
+          "y-axis": true,
+          "scale": 1,
+          "y_format": "none",
+          "grid": {
+            "max": null,
+            "min": 0
+          },
+          "queries": {
+            "mode": "selected",
+            "ids": [
+              0
+            ]
+          },
+          "annotate": {
+            "enable": false,
+            "query": "*",
+            "size": 20,
+            "field": "_type",
+            "sort": [
+              "_score",
+              "desc"
+            ]
+          },
+          "auto_int": true,
+          "resolution": 100,
+          "interval": "10s",
+          "intervals": [
+            "auto",
+            "1s",
+            "1m",
+            "5m",
+            "10m",
+            "30m",
+            "1h",
+            "3h",
+            "12h",
+            "1d",
+            "1w",
+            "1y"
+          ],
+          "lines": false,
+          "fill": 2,
+          "linewidth": 2,
+          "points": false,
+          "pointradius": 5,
+          "bars": true,
+          "stack": false,
+          "spyable": true,
+          "zoomlinks": true,
+          "options": true,
+          "legend": true,
+          "show_query": true,
+          "interactive": true,
+          "legend_counts": true,
+          "timezone": "utc",
+          "percentage": false,
+          "zerofill": true,
+          "derivative": false,
+          "tooltip": {
+            "value_type": "cumulative",
+            "query_as_alias": true
+          },
+          "title": "Log Activity"
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Graph",
+      "height": "100px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field": "_type",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 100,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "below",
+          "title": "Document types",
+          "spyable": true,
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        },
+        {
+          "error": false,
+          "span": 3,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "terms",
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field": "parms.activity",
+          "exclude": [],
+          "missing": false,
+          "other": false,
+          "size": 10,
+          "order": "count",
+          "style": {
+            "font-size": "10pt"
+          },
+          "donut": false,
+          "tilt": false,
+          "labels": true,
+          "arrangement": "horizontal",
+          "chart": "bar",
+          "counter_pos": "none",
+          "spyable": true,
+          "title": "Document Types",
+          "tmode": "terms",
+          "tstat": "total",
+          "valuefield": ""
+        }
+      ],
+      "notice": false
+    },
+    {
+      "title": "Events",
+      "height": "650px",
+      "editable": true,
+      "collapse": false,
+      "collapsable": true,
+      "panels": [
+        {
+          "error": false,
+          "span": 2,
+          "editable": true,
+          "type": "column",
+          "loadingEditor": false,
+          "panels": [
+            {
+              "type": "terms",
+              "tmode": "terms",
+              "field": "sessionID",
+              "size": 10,
+              "order": "count",
+              "chart": "table",
+              "exclude": [],
+              "missing": false,
+              "other": false,
+              "style": {
+                "font-size": "10pt"
+              },
+              "donut": false,
+              "tilt": false,
+              "labels": true,
+              "arrangement": "horizontal",
+              "counter_pos": "above",
+              "spyable": true,
+              "queries": {
+                "mode": "all",
+                "ids": [
+                  0
+                ]
+              },
+              "tstat": "total",
+              "valuefield": "",
+              "title": "Sessions",
+              "span": 2
+            }
+          ]
+        },
+        {
+          "error": false,
+          "span": 9,
+          "editable": true,
+          "group": [
+            "default"
+          ],
+          "type": "table",
+          "size": 100,
+          "pages": 5,
+          "offset": 0,
+          "sort": [
+            "timestamp",
+            "desc"
+          ],
+          "style": {
+            "font-size": "9pt"
+          },
+          "overflow": "min-height",
+          "fields": [
+            "parms.wf_state",
+            "parms.desc",
+            "component.name",
+            "sessionID",
+            "timestamp",
+            "type",
+            "client",
+            "parms.activity",
+            "wf_state_longname"
+          ],
+          "highlight": [],
+          "sortable": true,
+          "header": true,
+          "paging": true,
+          "spyable": true,
+          "queries": {
+            "mode": "all",
+            "ids": [
+              0
+            ]
+          },
+          "field_list": true,
+          "status": "Stable",
+          "trimFactor": 300,
+          "normTimes": true,
+          "title": "Documents",
+          "all_fields": false,
+          "localTime": false,
+          "timeField": "@timestamp"
+        }
+      ],
+      "notice": false
+    }
+  ],
+  "editable": true,
+  "index": {
+    "interval": "none",
+    "pattern": "[logstash-]YYYY.MM.DD",
+    "default": "xdata",
+    "warm_fields": false
+  },
+  "style": "dark",
+  "failover": false,
+  "panel_hints": true,
+  "loader": {
+    "save_gist": false,
+    "save_elasticsearch": true,
+    "save_local": true,
+    "save_default": true,
+    "save_temp": true,
+    "save_temp_ttl_enable": true,
+    "save_temp_ttl": "30d",
+    "load_gist": true,
+    "load_elasticsearch": true,
+    "load_elasticsearch_size": 20,
+    "load_local": true,
+    "hide": false
+  },
+  "pulldowns": [
+    {
+      "type": "query",
+      "collapse": false,
+      "notice": false,
+      "query": "*",
+      "pinned": true,
+      "history": [
+        "*",
+        "sessionID:\"my-1421247708256\"",
+        "sessionID:\"my-1421244516740\"",
+        "sessionID:{dave}",
+        "sessionID:dave",
+        "sessionIDs:\"dave\"",
+        "sessionID:\"dave\"",
+        "sessionID:\"my-14212445*\"",
+        "sessionID:my-1421247708256",
+        "sessionID:1421247708256"
+      ],
+      "remember": 10,
+      "enable": true
+    },
+    {
+      "type": "filtering",
+      "collapse": false,
+      "notice": true,
+      "enable": true
+    }
+  ],
+  "nav": [
+    {
+      "type": "timepicker",
+      "collapse": false,
+      "notice": false,
+      "status": "Stable",
+      "time_options": [
+        "5m",
+        "15m",
+        "1h",
+        "6h",
+        "12h",
+        "24h",
+        "2d",
+        "7d",
+        "30d"
+      ],
+      "refresh_intervals": [
+        "5s",
+        "10s",
+        "30s",
+        "1m",
+        "5m",
+        "15m",
+        "30m",
+        "1h",
+        "2h",
+        "1d"
+      ],
+      "timefield": "@timestamp",
+      "enable": true,
+      "now": true,
+      "filter_id": 0
+    }
+  ],
+  "refresh": "5s"
+}
\ No newline at end of file
diff --git a/dashboard/files/elasticsearch.yml b/dashboard/files/elasticsearch.yml
new file mode 100644
index 0000000..75f6a68
--- /dev/null
+++ b/dashboard/files/elasticsearch.yml
@@ -0,0 +1,387 @@
+##################### Elasticsearch Configuration Example #####################
+
+# This file contains an overview of various configuration settings,
+# targeted at operations staff. Application developers should
+# consult the guide at <http://elasticsearch.org/guide>.
+#
+# The installation procedure is covered at
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.
+#
+# Elasticsearch comes with reasonable defaults for most settings,
+# so you can try it out without bothering with configuration.
+#
+# Most of the time, these defaults are just fine for running a production
+# cluster. If you're fine-tuning your cluster, or wondering about the
+# effect of certain configuration option, please _do ask_ on the
+# mailing list or IRC channel [http://elasticsearch.org/community].
+
+# Any element in the configuration can be replaced with environment variables
+# by placing them in ${...} notation. For example:
+#
+#node.rack: ${RACK_ENV_VAR}
+
+# For information on supported formats and syntax for the config file, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>
+
+
+################################### Cluster ###################################
+
+# Cluster name identifies your cluster for auto-discovery. If you're running
+# multiple clusters on the same network, make sure you're using unique names.
+#
+#cluster.name: elasticsearch
+
+
+#################################### Node #####################################
+
+# Node names are generated dynamically on startup, so you're relieved
+# from configuring them manually. You can tie this node to a specific name:
+#
+#node.name: "Franz Kafka"
+
+# Every node can be configured to allow or deny being eligible as the master,
+# and to allow or deny to store the data.
+#
+# Allow this node to be eligible as a master node (enabled by default):
+#
+#node.master: true
+#
+# Allow this node to store data (enabled by default):
+#
+#node.data: true
+
+# You can exploit these settings to design advanced cluster topologies.
+#
+# 1. You want this node to never become a master node, only to hold data.
+#    This will be the "workhorse" of your cluster.
+#
+#node.master: false
+#node.data: true
+#
+# 2. You want this node to only serve as a master: to not store any data and
+#    to have free resources. This will be the "coordinator" of your cluster.
+#
+#node.master: true
+#node.data: false
+#
+# 3. You want this node to be neither master nor data node, but
+#    to act as a "search load balancer" (fetching data from nodes,
+#    aggregating results, etc.)
+#
+#node.master: false
+#node.data: false
+
+# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
+# Node Info API [http://localhost:9200/_nodes] or GUI tools
+# such as <http://www.elasticsearch.org/overview/marvel/>,
+# <http://github.com/karmi/elasticsearch-paramedic>,
+# <http://github.com/lukas-vlcek/bigdesk> and
+# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
+
+# A node can have generic attributes associated with it, which can later be used
+# for customized shard allocation filtering, or allocation awareness. An attribute
+# is a simple key value pair, similar to node.key: value, here is an example:
+#
+#node.rack: rack314
+
+# By default, multiple nodes are allowed to start from the same installation location
+# to disable it, set the following:
+#node.max_local_storage_nodes: 1
+
+
+#################################### Index ####################################
+
+# You can set a number of options (such as shard/replica options, mapping
+# or analyzer definitions, translog settings, ...) for indices globally,
+# in this file.
+#
+# Note, that it makes more sense to configure index settings specifically for
+# a certain index, either when creating it or by using the index templates API.
+#
+# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>
+# for more information.
+
+# Set the number of shards (splits) of an index (5 by default):
+#
+#index.number_of_shards: 5
+
+# Set the number of replicas (additional copies) of an index (1 by default):
+#
+#index.number_of_replicas: 1
+
+# Note, that for development on a local machine, with small indices, it usually
+# makes sense to "disable" the distributed features:
+#
+#index.number_of_shards: 1
+#index.number_of_replicas: 0
+
+# These settings directly affect the performance of index and search operations
+# in your cluster. Assuming you have enough machines to hold shards and
+# replicas, the rule of thumb is:
+#
+# 1. Having more *shards* enhances the _indexing_ performance and allows to
+#    _distribute_ a big index across machines.
+# 2. Having more *replicas* enhances the _search_ performance and improves the
+#    cluster _availability_.
+#
+# The "number_of_shards" is a one-time setting for an index.
+#
+# The "number_of_replicas" can be increased or decreased anytime,
+# by using the Index Update Settings API.
+#
+# Elasticsearch takes care about load balancing, relocating, gathering the
+# results from nodes, etc. Experiment with different settings to fine-tune
+# your setup.
+
+# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
+# the index status.
+
+
+#################################### Paths ####################################
+
+# Path to directory containing configuration (this file and logging.yml):
+#
+#path.conf: /path/to/conf
+
+# Path to directory where to store index data allocated for this node.
+#
+#path.data: /path/to/data
+#
+# Can optionally include more than one location, causing data to be striped across
+# the locations (a la RAID 0) on a file level, favouring locations with most free
+# space on creation. For example:
+#
+#path.data: /path/to/data1,/path/to/data2
+
+# Path to temporary files:
+#
+#path.work: /path/to/work
+
+# Path to log files:
+#
+#path.logs: /path/to/logs
+
+# Path to where plugins are installed:
+#
+#path.plugins: /path/to/plugins
+
+
+#################################### Plugin ###################################
+
+# If a plugin listed here is not installed for current node, the node will not start.
+#
+#plugin.mandatory: mapper-attachments,lang-groovy
+
+
+################################### Memory ####################################
+
+# Elasticsearch performs poorly when JVM starts swapping: you should ensure that
+# it _never_ swaps.
+#
+# Set this property to true to lock the memory:
+#
+#bootstrap.mlockall: true
+
+# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
+# to the same value, and that the machine has enough memory to allocate
+# for Elasticsearch, leaving enough memory for the operating system itself.
+#
+# You should also make sure that the Elasticsearch process is allowed to lock
+# the memory, eg. by using `ulimit -l unlimited`.
+
+
+############################## Network And HTTP ###############################
+
+# Elasticsearch, by default, binds itself to the 0.0.0.0 address, and listens
+# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
+# communication. (the range means that if the port is busy, it will automatically
+# try the next port).
+
+# Set the bind address specifically (IPv4 or IPv6):
+#
+#network.bind_host: 192.168.0.1
+
+# Set the address other nodes will use to communicate with this node. If not
+# set, it is automatically derived. It must point to an actual IP address.
+#
+#network.publish_host: 192.168.0.1
+
+# Set both 'bind_host' and 'publish_host':
+#
+#network.host: 192.168.0.1
+
+# Set a custom port for the node to node communication (9300 by default):
+#
+#transport.tcp.port: 9300
+
+# Enable compression for all communication between nodes (disabled by default):
+#
+#transport.tcp.compress: true
+
+# Set a custom port to listen for HTTP traffic:
+#
+#http.port: 9200
+
+# Set a custom allowed content length:
+#
+#http.max_content_length: 100mb
+
+# Disable HTTP completely:
+#
+#http.enabled: false
+
+
+################################### Gateway ###################################
+
+# The gateway allows for persisting the cluster state between full cluster
+# restarts. Every change to the state (such as adding an index) will be stored
+# in the gateway, and when the cluster starts up for the first time,
+# it will read its state from the gateway.
+
+# There are several types of gateway implementations. For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.
+
+# The default gateway type is the "local" gateway (recommended):
+#
+#gateway.type: local
+
+# Settings below control how and when to start the initial recovery process on
+# a full cluster restart (to reuse as much local data as possible when using shared
+# gateway).
+
+# Allow recovery process after N nodes in a cluster are up:
+#
+#gateway.recover_after_nodes: 1
+
+# Set the timeout to initiate the recovery process, once the N nodes
+# from previous setting are up (accepts time value):
+#
+#gateway.recover_after_time: 5m
+
+# Set how many nodes are expected in this cluster. Once these N nodes
+# are up (and recover_after_nodes is met), begin recovery process immediately
+# (without waiting for recover_after_time to expire):
+#
+#gateway.expected_nodes: 2
+
+
+############################# Recovery Throttling #############################
+
+# These settings allow to control the process of shards allocation between
+# nodes during initial recovery, replica allocation, rebalancing,
+# or when adding and removing nodes.
+
+# Set the number of concurrent recoveries happening on a node:
+#
+# 1. During the initial recovery
+#
+#cluster.routing.allocation.node_initial_primaries_recoveries: 4
+#
+# 2. During adding/removing nodes, rebalancing, etc
+#
+#cluster.routing.allocation.node_concurrent_recoveries: 2
+
+# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
+#
+#indices.recovery.max_bytes_per_sec: 20mb
+
+# Set to limit the number of open concurrent streams when
+# recovering a shard from a peer:
+#
+#indices.recovery.concurrent_streams: 5
+
+
+################################## Discovery ##################################
+
+# Discovery infrastructure ensures nodes can be found within a cluster
+# and master node is elected. Multicast discovery is the default.
+
+# Set to ensure a node sees N other master eligible nodes to be considered
+# operational within the cluster. This should be set to a quorum/majority of 
+# the master-eligible nodes in the cluster.
+#
+#discovery.zen.minimum_master_nodes: 1
+
+# Set the time to wait for ping responses from other nodes when discovering.
+# Set this option to a higher value on a slow or congested network
+# to minimize discovery failures:
+#
+#discovery.zen.ping.timeout: 3s
+
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
+
+# Unicast discovery allows to explicitly control which nodes will be used
+# to discover the cluster. It can be used when multicast is not present,
+# or to restrict the cluster communication-wise.
+#
+# 1. Disable multicast discovery (enabled by default):
+#
+#discovery.zen.ping.multicast.enabled: false
+#
+# 2. Configure an initial list of master nodes in the cluster
+#    to perform discovery when new nodes (master or data) are started:
+#
+#discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
+
+# EC2 discovery allows to use AWS EC2 API in order to perform discovery.
+#
+# You have to install the cloud-aws plugin for enabling the EC2 discovery.
+#
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html>
+#
+# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/>
+# for a step-by-step tutorial.
+
+# GCE discovery allows to use Google Compute Engine API in order to perform discovery.
+#
+# You have to install the cloud-gce plugin for enabling the GCE discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-gce>.
+
+# Azure discovery allows to use Azure API in order to perform discovery.
+#
+# You have to install the cloud-azure plugin for enabling the Azure discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-azure>.
+
+################################## Slow Log ##################################
+
+# Shard level query and fetch threshold logging.
+
+#index.search.slowlog.threshold.query.warn: 10s
+#index.search.slowlog.threshold.query.info: 5s
+#index.search.slowlog.threshold.query.debug: 2s
+#index.search.slowlog.threshold.query.trace: 500ms
+
+#index.search.slowlog.threshold.fetch.warn: 1s
+#index.search.slowlog.threshold.fetch.info: 800ms
+#index.search.slowlog.threshold.fetch.debug: 500ms
+#index.search.slowlog.threshold.fetch.trace: 200ms
+
+#index.indexing.slowlog.threshold.index.warn: 10s
+#index.indexing.slowlog.threshold.index.info: 5s
+#index.indexing.slowlog.threshold.index.debug: 2s
+#index.indexing.slowlog.threshold.index.trace: 500ms
+
+################################## GC Logging ################################
+
+#monitor.jvm.gc.young.warn: 1000ms
+#monitor.jvm.gc.young.info: 700ms
+#monitor.jvm.gc.young.debug: 400ms
+
+#monitor.jvm.gc.old.warn: 10s
+#monitor.jvm.gc.old.info: 5s
+#monitor.jvm.gc.old.debug: 2s
+
+################################## Security ################################
+
+# Uncomment if you want to enable JSONP as a valid return transport on the
+# http server. With this enabled, it may pose a security risk, so disabling
+# it unless you need it is recommended (it is disabled by default).
+#
+#http.jsonp.enable: true
+http.cors.allow-origin: "*"
+http.cors.enabled: true
diff --git a/dashboard/files/test.conf b/dashboard/files/test.conf
new file mode 100644
index 0000000..5e51b17
--- /dev/null
+++ b/dashboard/files/test.conf
@@ -0,0 +1,32 @@
+input {
+  file {
+    path => "/home/vagrant/xdata_log"
+    start_position => beginning
+  }
+}
+
+filter {
+  json{
+        source => "message"
+#        target => "tweet"
+    }
+}
+#filter {
+#  if [path] =~ "access" {
+#    mutate { replace => { "type" => "apache_access" } }
+#    grok {
+#      match => { "message" => "%{COMBINEDAPACHELOG}" }
+#    }
+#  }
+#  date {
+#    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
+#  }
+#}
+
+output {
+  elasticsearch {
+	  index => xdata
+    host => localhost
+  }
+  stdout { codec => rubydebug }
+}
diff --git a/dashboard/files/xdata.conf b/dashboard/files/xdata.conf
new file mode 100644
index 0000000..5b89488
--- /dev/null
+++ b/dashboard/files/xdata.conf
@@ -0,0 +1,21 @@
+input {
+  file {
+    path => "/var/log/xdata/xdata.log"
+    start_position => beginning
+  }
+}
+
+filter {
+  json{
+        source => "message"
+    }
+}
+
+output {
+  elasticsearch {
+          index => xdata
+    host => localhost
+  }
+  stdout { codec => rubydebug }
+}
+
diff --git a/dashboard/lib/.jshintrc b/dashboard/lib/.jshintrc
deleted file mode 100644
index 9ed4773..0000000
--- a/dashboard/lib/.jshintrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "curly": true,
-  "eqeqeq": true,
-  "immed": true,
-  "latedef": true,
-  "newcap": true,
-  "noarg": true,
-  "sub": true,
-  "undef": true,
-  "boss": true,
-  "eqnull": true,
-  "predef": ["exports"]
-}
diff --git a/dashboard/lib/app/app.js b/dashboard/lib/app/app.js
deleted file mode 100644
index 547d504..0000000
--- a/dashboard/lib/app/app.js
+++ /dev/null
@@ -1,242 +0,0 @@
-var app = angular.module('xdata-db', [
-  'ngRoute',
-  'ngResource',
-  'ui.bootstrap',
-  'ngAnimate'
-  ]);
-
-$.ajaxSetup({
-  beforeSend:function(){
-      $('.draper').toggleClass('active')
-  },
-  complete:function(){
-      $('.draper').toggleClass('active')
-  }
-})
-
-app.config(['$routeProvider', function($routeProvider) {
-	$routeProvider
-		.when('/', {
-      templateUrl: 'templates/index.html',
-      controller: 'IndexController'
-    })
-    .when('/session/:id', {
-      templateUrl: 'templates/session.html',
-      controller: 'SessionController'
-    })
-    .when('/stats/compActivity', {
-      templateUrl: 'templates/stats-comp-activity.html',
-      controller: 'StatsController'
-    })
-		.otherwise({ redirectTo: '/' });
-}]);
-
-// app.run(function($rootScope) { // instance-injector
-//   scope.$watch(function() {
-//     return $http.pendingRequests.length > 0;
-//   }, function (v) {
-//     if(v){
-//         elm.show();
-//     }else{
-//         elm.hide();
-//     }
-//   });
-// });
-
-app.factory('Session', function($resource) {
-  // return $resource('http://10.1.90.46:1337/sessions/:id', {}, {
-  return $resource('/sessions/:id', {}, {
-    // Use this method for getting a list of observations
-    query: {
-      method: 'GET',
-      params: {},
-      isArray: true,
-    }
-  })
-});
-
-app.factory('Document', function($resource) {
-  return $resource('/rf_docs', {}, {
-    // Use this method for getting a list of polls
-    query: {
-      method: 'GET',
-      params: {},
-      isArray: true,
-    },
-  })
-})
-
-app.controller('AppController', ['$scope', '$location', function($scope, $location) {
-  $scope.title = 'XDATA Logging Dashboard';
-  $scope.routes = [
-    {url: '/#/', name: 'Home'}
-  ]
-}]);
-
-app.controller('IndexController', [
-  '$scope',
-  'Session',
-  '$filter',
-  '$location',
-  '$window',
-  function($scope, Session, $filter, $location, $window) {
-
-  $scope.numberOfPages = 0;
-  $scope.pageSize = 20;
-
-  $scope.sesFilter = {
-    curComponent: null,
-    curUser: null,
-    dt: null,
-    orderBy: {
-      label: 'start',
-      state: true
-    }
-  };
-
-  angular.element($window).on('resize', $scope.$apply.bind($scope));
-
-  $scope.sessions = Session.query();
-  $scope.filtSessions = [];
-
-  $scope.sessions
-  .$promise.then(function(d) {
-    console.log(d);
-    $scope.components = groupBy(d, 'component').map(function(d) { return d.key; });
-    $scope.users = groupBy(d, 'user').map(function(d) { return d.key; });
-
-    $scope.components2 = groupBy(d, 'component')
-    $scope.users2 = groupBy(d, 'user')
-
-    var tmp = $filter('sessionFilters')($scope.sessions, $scope.sesFilter);
-    $scope.filtSessions = $filter('orderBy')(tmp, 'start', true);
-    $scope.numberOfPages = Math.ceil(d.length/$scope.pageSize);
-    $scope.currentPage = 0;
-    $scope.pagedData = $filter('pageFilter')(d, $scope.currentPage, $scope.pageSize);
-  });
-
-  $scope.nSysLogs = function(d) {
-    // console.log(d);
-    return d.nLogs - d.nUserLogs;
-  }
-
-  // $scope.orderBy = function(field) {
-  //   if ($scope.sesFilter.orderBy[0] === field) {
-  //     $scope.sesFilter.orderBy[1] = !$scope.sesFilter.orderBy[1];
-  //   } else {
-  //     $scope.sesFilter.orderBy = [field, true]
-  //   }
-  // }
-
-  $scope.duration = function(d) {
-    // console.log(d);
-    var start = new Date(d.start);
-    var stop = new Date(d.stop);
-    return stop.getTime() - start.getTime();
-  }
-
-  $scope.$watch('sesFilter', function(sesFilter) {
-    console.log('filter Changed')
-    var tmp = $filter('sessionFilters')($scope.sessions, $scope.sesFilter);
-    $scope.filtSessions = $filter('orderBy')(tmp, sesFilter.orderBy.label, sesFilter.orderBy.state)
-    // $scope.pagedData = $filter('pageFilter')($scope.filtSessions, 0, $scope.pageSize);
-  }, true);
-
-  $scope.$watch('filtSessions', function(d) {
-    $scope.numberOfPages = Math.ceil(d.length/$scope.pageSize);
-    $scope.pagedData = $filter('pageFilter')(d, $scope.currentPage = 0, $scope.pageSize);
-  })
-
-  function groupBy(data, field) {
-    var t = d3.nest()
-    .key(function(d) { return d[field]; })
-    .entries(data);
-
-    return t;
-  }
-
-  $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
-  $scope.format = $scope.formats[0];
-
-  $scope.today = function() {
-    $scope.dt = new Date();
-  };
-  $scope.today();
-
-  $scope.clear = function () {
-    $scope.dt = null;
-  };
-
-  // Disable weekend selection
-  $scope.disabled = function(date, mode) {
-    return ( mode === 'day' && ( date.getDay() === 0 || date.getDay() === 6 ) );
-  };
-
-  $scope.toggleMin = function() {
-    $scope.minDate = $scope.minDate ? null : new Date();
-  };
-  $scope.toggleMin();
-
-  $scope.open = function($event) {
-    $event.preventDefault();
-    $event.stopPropagation();
-
-    $scope.opened = true;
-  };
-
-  $scope.dateOptions = {
-    formatYear: 'yy',
-    startingDay: 1
-  };
-
-  $scope.initDate = new Date('2016-15-20');
-
-  $scope.redirect = function(d) {
-    $location.path("/session/" + d._id)
-  }
-
-  $scope.$watch('currentPage', function(d) {
-    $scope.pagedData = $filter('pageFilter')($scope.filtSessions, $scope.currentPage, $scope.pageSize);
-    if ($scope.currentPage > $scope.numberOfPages) {
-      $scope.currentPage = $scope.numberOfPages-1;
-    }
-  });
-}]);
-
-app.filter('sessionFilters', function() {
-  return function( items, sesFilter) {
-    var filtered = [];
-    angular.forEach(items, function(item, i) {
-      var component = !sesFilter.curComponent || (item.component ===  sesFilter.curComponent);
-      var user = !sesFilter.curUser || (item.user ===  sesFilter.curUser);
-      var dt = !sesFilter.dt || (d3.time.day(new Date(item.start)).getTime() ==  new Date(sesFilter.dt).getTime());
-
-      if(component && user && dt) {
-        filtered.push(item);
-      }
-    });
-    return filtered;
-  };
-});
-
-app.directive('draperLogo', ['$http', 
-  function ($http) {
-  return {
-    restrict: 'E',
-    templateUrl: 'templates/directives/draper-logo.html',
-    link: function (scope, elm, attrs) {
-      scope.isLoading = function () {
-        return $http.pendingRequests.length > 0;
-      };
-      scope.$watch(scope.isLoading, function (v)
-      { 
-        if (v) {
-          $('.draper').toggleClass('active')
-        } else {
-          $('.draper').toggleClass('active')
-        }
-        
-      });
-    }
-  };
-}]);
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/bootstrap-nav.js b/dashboard/lib/app/directives/bootstrap-nav.js
deleted file mode 100644
index cbee03c..0000000
--- a/dashboard/lib/app/directives/bootstrap-nav.js
+++ /dev/null
@@ -1,31 +0,0 @@
-app.directive('bootstrapNav', function() {
-  return {
-    restrict: 'AEC',
-    templateUrl: 'templates/directives/bootstrap-nav.html',
-    scope: { url: '=', name: '='},
-    controller: function($scope, $location) { 
-      // console.log('here')
-      // $scope.loc = $location.path();
-      // $scope.$watch('loc', function(data){
-      //   console.log('l1', data)
-      // });
-      $scope.isActive = function () { 
-    // console.log('here2', viewLocation, ('/#' + $location.path()))
-        return $scope.url === ('/#' + $location.path());
-    };
-    },
-    link: function(scope, el, attr){
-      // scope.$watch('loc', function(data){
-      //   console.log('l', data)
-      // });
-      // if (scope.url === ('/#' + scope.loc)) {
-      //   el.addClass('active');
-      // } else {
-      //   el.removeClass('active')
-      // }
-      // console.log(scope.isActive())
-    }      
-  }
-})
-
-// console.log('here')
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/comp-by-activity.js b/dashboard/lib/app/directives/comp-by-activity.js
deleted file mode 100644
index 0544697..0000000
--- a/dashboard/lib/app/directives/comp-by-activity.js
+++ /dev/null
@@ -1,230 +0,0 @@
-app.directive('compByActivity', function () {
-  return {
-    restrict:'E',
-    // templateUrl: 'templates/directives/sort-th.html',
-        // transclude: true,
-        // scope: {
-        //   order: '=',
-        //   label: '='
-        // },
-        controller: function($scope) {
-          console.log('hello')
-          function translate(dx, dy) {
-            return "translate(" + dx + "," + dy + ")"
-          }
-  d3.json('/stats/activities', function(data) {
-    console.log(data);
-    var maxComponents = d3.max(data, function(d) { return d.components.length; });
-
-    window.data = data;
-
-    var width = 800,
-    // height = 800;
-    barHeight = 40,
-    padding = 3,
-    margin = {top: 50, bottom: 30, left: 30, right: 30},
-    svgHeight = (barHeight + padding)*data.length + margin.top + margin.bottom,
-    svgWidth = width + margin.left + margin.right;
-
-    var svg = d3.select('.fixed-info .axis')
-    .append('svg')
-    .attr({
-      width: svgWidth,
-      height: 60
-    })
-    .append('g')
-    .attr("transform", translate(margin.left, margin.top));
-
-    var xScale = d3.scale.linear()
-      .range([0, width])
-      .domain([0, maxComponents+3]);
-
-    var xAxis = d3.svg.axis()
-    .scale(xScale)
-    .orient("top");
-
-    svg.append("g")
-      .attr("class", "x axis")
-      // .attr("transform", "translate(0," + 50 + ")")
-      .call(xAxis)
-      .append("text")
-      // .attr("transform", "rotate(-90)")
-      .attr("y", -40)
-      .attr("dy", ".71em")
-      .style("text-anchor", "start")
-      .text("Number of Components per Activity");
-
-    // })
-
-    
-
-    var wfCoding = {
-      0: {id: 0, wfState:'WF_OTHER', name: 'Other'},
-      1: {id: 1, wfState:'WF_DEFINE',name: 'Define Problem'},
-      2: {id: 2, wfState:'WF_GETDATA',name: 'Get Data'},
-      3: {id: 3, wfState:'WF_EXPLORE',name: 'Explore Data'},
-      4: {id: 4, wfState:'WF_CREATE',name: 'Create View'},
-      5: {id: 5, wfState:'WF_ENRICH',name: 'Enrich Data'},
-      6: {id: 6, wfState:'WF_TRANSFORM',name: 'Transform Data'},
-      99: {id: 99, wfState:'WF_UNK',name: 'UNK'}
-    }
-
-    var byWf = d3.nest()
-    .key(function(d) { 
-      var a = d.wfStates[0];
-      var a = (!a) ? 99 : +a;
-      return a; 
-    })
-    .entries(data);
-
-    byWf.sort(function(a, b) {
-      return +a.key - +b.key;
-    })
-
-    byWf.forEach(function(wfData) {
-
-      var wfCode = wfCoding[+wfData.key].wfState
-      var wfName = wfCoding[+wfData.key].name
-    
-      var data = wfData.values;
-
-      var width = 800,
-      // height = 800;
-      barHeight = 40,
-      padding = 3,
-      margin = {top: 50, bottom: 30, left: 30, right: 30},
-      svgHeight = (barHeight + padding)*data.length + margin.top + margin.bottom,
-      svgWidth = width + margin.left + margin.right;
-
-      var svg = d3.select('.canvas')
-      .append('svg')
-      .attr({
-        width: svgWidth,
-        height: svgHeight
-      })
-      .append('g')
-      .attr("transform", translate(margin.left, margin.top));
-
-      data.sort(function(a, b) {
-        return b.components.length - a.components.length;
-      })
-
-      svg.append('text')
-      .attr({
-        class: wfCode.toLowerCase() + ' wfTitle fill-light',
-        x: 0,
-        y: -5
-      })
-      .text(wfName)
-
-      // svg.selectAll('rect')
-      // .data(data)
-      // .enter()
-      // .append('rect')
-      // .attr({
-      //   x: 0,
-      //   y: function(d, i) { return i*(barHeight+3); },
-      //   width: function(d) { return xScale(d.components.length)},
-      //   height: barHeight,
-      //   class: function(d) { return wfCode.toLowerCase() + " fill-light bar"}
-      // })
-
-      var barGr = svg.selectAll('g.bar-group')
-      .data(data)
-      .enter()
-      .append('g')
-      .attr({
-        class: 'bar-group',
-        transform: function(d,i) {
-          return translate(0, i*(barHeight + padding));
-        },
-        cursor: 'pointer'
-      })
-      .on("mouseenter", function(d) {
-        d3.select(this).select('rect').classed('stroke-dark', true)
-        .classed('sw2', true)
-        
-        d3.select(this).select('.compGr')
-        .attr('visibility', 'visible');
-
-        var lis = d3.select('.components ol')
-        .selectAll('li')
-        .data(d.components, function(d) { return d; })
-
-        lis
-        .enter()
-        .append('li')
-        .html(function(d) { return d; })
-
-        lis.exit().remove();
-
-        console.log(d.components)
-      })
-      .on("mouseleave", function(d) {
-        d3.select(this).select('rect')
-        .classed('stroke-dark', false)
-        .classed('sw2', false)
-
-        d3.select(this).select('.compGr')
-        .attr('visibility', 'hidden');
-      });
-
-      barGr
-      .append('rect')
-      .attr({
-        x: 0,
-        y: 0,
-        width: function(d) { return xScale(d.components.length)},
-        height: barHeight,
-        class: function(d) { return wfCode.toLowerCase() + " fill-light bar"}
-      })
-
-      barGr
-      .append('text')
-      .attr({
-        x: 0,
-        y: barHeight/2,
-        dy: '0.3em',
-        dx: 10,
-        class: function(d) { return wfCode.toLowerCase() + " fill-dark over-text"}
-      })
-      .text(function(d) {
-        return d._id;
-      })
-
-      barGr
-      .append('g')
-      .attr({
-        transform: function(d) {
-          var dx1 = xScale(d.components.length);
-
-          if (d._id) {
-            var dx2 = d._id.length * 12;
-          } else {
-            var dx2 = 0;
-          }
-
-          var dx = d3.max([dx1, dx2]);
-
-          // console.log(translate(dx+20, 20))
-          return translate(dx+20, 20);
-          // return translate(250, 20)
-        },
-        class: 'compGr',
-        visibility: 'hidden'
-      })
-      .selectAll('text')
-      .data(function(d) { return ['Components:'].concat(d.components); })
-      .enter()
-      .append('text')
-      .attr('y', function(d,i) { return i*20; })
-      .attr('class', wfCode.toLowerCase() + " fill-light")
-      .text(function(d) {
-        return d;
-      })
-
-    })
-  })
-        }
-      };
-    });
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/download.js b/dashboard/lib/app/directives/download.js
deleted file mode 100644
index afa8a0d..0000000
--- a/dashboard/lib/app/directives/download.js
+++ /dev/null
@@ -1,19 +0,0 @@
-app.directive('myDownload', function ($compile) {
-    return {
-        restrict:'E',
-        scope:{ getUrlData:'&getData'},
-        // template: '<a class="btn" download="backup.json"' +
-        //             'href="{{url}}">' +
-        //             'Download' +
-        //             '</a>',
-        link:function (scope, elm, attrs) {
-            var url = URL.createObjectURL(scope.getUrlData());
-            elm.append($compile(
-                '<a class="btn" download="logs.json"' +
-                    'href="' + url + '">' +
-                    '<span class="glyphicon glyphicon-download"></span>' +
-                    '</a>'
-            )(scope));
-        }
-    };
-});
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/paginate.js b/dashboard/lib/app/directives/paginate.js
deleted file mode 100644
index 7c35870..0000000
--- a/dashboard/lib/app/directives/paginate.js
+++ /dev/null
@@ -1,46 +0,0 @@
-app.directive('paginate', function() {
-  return {
-    restrict: 'E',
-    templateUrl: 'templates/directives/paginate.html',
-    scope: { currentPage: '=', numberOfPages: '='},
-    controller: function($scope) {
-
-      function setPage(currentPage, numberOfPages) {
-        $scope.pages = [];
-        if (numberOfPages < 8) {
-          for (var i = 0;i< numberOfPages;i++){
-            $scope.pages.push({text:i, cls:i == currentPage ? 'active' : null})
-          }
-        } else if (currentPage > 3 && currentPage < (numberOfPages - 4)) {
-          // console.log('A')
-          $scope.pages = $scope.pages.concat([{text:'0', cls:null},{text:'...', cls:'disabled'}]);
-          for (var i = currentPage -2;i<= currentPage+2;i++){
-            $scope.pages.push({text:i, cls:i == currentPage ? 'active' : null})
-          }
-          $scope.pages = $scope.pages.concat([{text:'...', cls:'disabled'},{text:numberOfPages ? numberOfPages-1 : '...', cls:null}]);
-        } else
-        if (currentPage < 4) {
-          // console.log('B')
-          for (var i = 0;i< 6;i++){
-            $scope.pages.push({text: i, cls: i == currentPage ? 'active' : null})
-          }
-          $scope.pages = $scope.pages.concat([{text:'...', cls:'disabled'},{text:numberOfPages ? numberOfPages-1 : '...', cls:null}]);
-        } else
-        if (currentPage >= numberOfPages - 4) {
-          // console.log('C')
-          $scope.pages = $scope.pages.concat([{text:'0', cls:null},{text:'...', cls:'disabled'}]);
-          for (var i = numberOfPages - 6;i < numberOfPages;i++){
-            $scope.pages.push({text: i, cls: i == currentPage ? 'active' : null})
-          }
-        }
-      }
-      $scope.$watch('numberOfPages', function(currentPage){
-        setPage($scope.currentPage, $scope.numberOfPages);
-      })
-      $scope.$watch('currentPage', function(currentPage){
-        setPage($scope.currentPage, $scope.numberOfPages);
-      });
-
-    }
-  }
-})
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/sort-th.js b/dashboard/lib/app/directives/sort-th.js
deleted file mode 100644
index 9d43f91..0000000
--- a/dashboard/lib/app/directives/sort-th.js
+++ /dev/null
@@ -1,36 +0,0 @@
-app.directive('sortHeader', function () {
-  return {
-    restrict:'A',
-    templateUrl: 'templates/directives/sort-th.html',
-        transclude: true,
-        scope: {
-          order: '=',
-          label: '='
-        },
-        controller: function($scope) {
-          console.log('ORDER', $scope.order, $scope.label);          
-
-          // up or down?
-          $scope.asc = true;
-
-          // show or hide?
-          $scope.on = true;
-
-          $scope.toggleOrder = function() {
-            $scope.order.label = $scope.label;
-            $scope.order.state = !$scope.order.state
-          }
-
-          $scope.$watch(function() {
-            return $scope.order;
-          }, function(d) {
-            if (d.label == $scope.label) {
-              $scope.asc = $scope.order.state;
-              $scope.on = true;
-            } else {
-              $scope.on = false
-            }
-          }, true)
-        }
-      };
-    });
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/wf-legend.js b/dashboard/lib/app/directives/wf-legend.js
deleted file mode 100644
index 8a4ff13..0000000
--- a/dashboard/lib/app/directives/wf-legend.js
+++ /dev/null
@@ -1,80 +0,0 @@
-app.directive('wfLegend', function() {
-  return {
-    restrict: 'E',
-    scope: {
-      height: '='
-    },
-    controller: function($scope, wfStates) {
-      $scope.wfStates = wfStates.wfStates;
-    },
-    link: function(scope, element, attr){
-
-      var el = element[0],
-      margin = {top:2, bottom: 2, left: 30, right: 30},
-      height = scope.height - margin.top - margin.bottom,
-      width = el.clientWidth - margin.left - margin.right;
-
-      function translate(x,y) {
-        return 'translate(' + x + ',' + y + ')';
-      }
-
-      var svg = d3.select(el).append('svg')
-      .attr({width: el.clientWidth, height: scope.height});
-
-      var drawLayer = svg.append('g')
-      .attr('transform', translate(margin.left, margin.top));
-
-      var textLayer = svg.append('g')
-      .attr('transform', translate(margin.left, margin.top));
-
-      var xScale = d3.scale.ordinal()
-      .rangeBands([0, width], .1, 0)
-      .domain(d3.range(scope.wfStates.length));
-
-      // var xScale = d3.time.scale()
-      // .range([0, width])
-      // .domain([0, scope.wfStates.length]);
-
-      console.log('A', height, scope.height, scope.wfStates)
-
-      drawLayer.selectAll('rect')
-      .data(scope.wfStates)
-      .enter()
-      .append('rect')
-      .attr({
-        x: function(d, i) { return xScale(i); },
-        width: xScale.rangeBand(),
-        y: 0,
-        height: height,
-        fill: function(d) { return d.color; },
-        class: 'wfState'
-      })
-      .on("click", function(d) { 
-        window.open('/static/wf_states/#' + d.wfState); 
-      });
-      // .attr("xlink:href", function (d) {
-      //     return "http://www.google.com";
-      // });
-
-      textLayer.selectAll('text')
-      .data(scope.wfStates)
-      .enter()
-      .append('text')
-      .style("text-anchor", "middle")
-      .attr({
-        x: function(d, i) { return xScale(i) + xScale.rangeBand()/2; },
-        y: height/2,
-        dy: 4,
-        fill: function(d, i) { return d.stroke; },
-        class: 'wfState'
-      })
-      .text(function(d, i) { return d.name; })
-      .on("click", function(d) { 
-        window.open('/static/wf_states/#' + d.wfState); 
-      });;
-
-
-
-    }
-  }
-})
\ No newline at end of file
diff --git a/dashboard/lib/app/directives/wf-state-chart.js b/dashboard/lib/app/directives/wf-state-chart.js
deleted file mode 100644
index cb5d298..0000000
--- a/dashboard/lib/app/directives/wf-state-chart.js
+++ /dev/null
@@ -1,197 +0,0 @@
-app.directive('wfStateChart', function() {
-  return {
-    restrict: 'E',
-    scope: {
-      logs: '=',
-      height: '=',
-      timebounds: '='
-    },
-    controller: function($scope, wfStates) {
-      $scope.wfData = [];
-      $scope.logs2 = [];
-      $scope.$watch('logs', function(logs) {
-        if (!logs.length) return;
-
-        // logs.
-
-        // logs.sort(function(a,b){return a.timestamp.getTime() - b.getTime()});
-
-        logs = logs.filter(function(d) {
-          return d.type == 'USERACTION';
-        });
-
-        $scope.logs2 = logs;
-        var wfData = [],
-        curState = {};
-
-        logs.forEach(function(d) {
-          if (d.type === 'SYSACTION') return;
-          if (d.parms.wf_state != curState.state) {
-
-            curState.stop = d.timestamp;
-            if (curState.start) wfData.push(curState);
-
-            try {
-              var tmp =  _.findWhere(wfStates.wfStates, {id: +d.parms.wf_state});
-              // console.log(d, _.findWhere(wfStates.wfStates, {id: +d.parms.wf_state}))
-              curState = _.clone(tmp);
-              curState.state = d.parms.wf_state;
-              curState.start = d.timestamp;
-            }
-            catch(err) {
-              var tmp =  _.findWhere(wfStates.wfStates, {id: 99});
-              curState = _.clone(tmp);
-              curState.state = 99;
-              curState.start = d.timestamp;
-            }
-            
-          }
-        });
-        curState.stop = d3.time.second.offset(logs[logs.length-1].timestamp, 5);
-        wfData.push(curState);
-
-        $scope.wfData = wfData;
-      }, true)
-    },
-    link: function($scope, element, attr){
-
-      var el = element[0],
-      margin = {top:10, bottom: 20, left: 30, right: 30},
-      height = $scope.height - margin.top - margin.bottom,
-      width = el.clientWidth - margin.left - margin.right;
-
-      function translate(x,y) {
-        return 'translate(' + x + ',' + y + ')';
-      }
-
-      var svg = d3.select(el).append('svg')
-      .attr({width: el.clientWidth, height: $scope.height});
-
-      console.log(height, $scope.height)
-
-      var wfLayer = svg.append('g')
-      .attr('transform', translate(margin.left, margin.top));
-
-      var activityLayer = svg.append('g')
-      .attr('transform', translate(margin.left, margin.top));
-
-      var brushLayer = svg.append('g')
-      .attr('transform', translate(margin.left, margin.top));
-
-      var xScale = d3.time.scale()
-      .range([0, width]);
-
-      var xAxis = d3.svg.axis()
-      .scale(xScale)
-      .ticks(5)
-      .orient("bottom");
-
-      wfLayer.append("g")
-      .attr("class", "x axis")
-      .attr("transform", "translate(0," + height + ")")
-      .call(xAxis);
-
-      function render() {
-        wfLayer.selectAll('rect')
-        .attr({
-          x: function(d) {
-            return xScale(d.start);
-          },
-          dave: function(d) {
-            return d.start;
-          },
-          width: function(d) {
-            var out = xScale(d.stop) - xScale(d.start);
-            return out > 0 ? out : 0;
-          }
-        })
-
-        activityLayer.selectAll('line')
-        .attr({
-          x1: function(d){ return xScale(d.timestamp); },
-          x2: function(d){ return xScale(d.timestamp); }
-        })
-
-        wfLayer.select(".x.axis").call(xAxis);
-      }
-
-      var brush = d3.svg.brush()
-      .x(xScale)
-      .on("brushend", brushed);
-
-      function brushed() {
-        console.log('brushing', brush.empty())
-        // console.log(typeof brush.empty() === 'null')
-        // if (brush.empty() == null) return;
-        // console.log('brushing', brush.empty())
-        $scope.$apply(function() {
-          $scope.timebounds = brush.empty() ? null : brush.extent();
-        })
-      }
-
-      $scope.$watch('logs2', function(logs) {
-        // console.log('LOGS', logs)
-        if (!logs.length) return;
-
-        console.log('LOGS', logs)
-        activityLayer.selectAll('line')
-        .data(logs)
-        .enter()
-        .append('line')
-        .attr({
-          // x0: function(d){ return xScale(d.timestamp); },
-          // x1: function(d){ return xScale(d.timestamp); },
-          y1: 0,
-          y2: height,
-          stroke: function(d){ return d.color; },
-        })
-      })
-
-      $scope.$watch('wfData', function(wfData) {
-        if (!wfData.length) return;
-        console.log(wfData)
-
-        var min = d3.min(wfData, function(d) {
-          return d.start;
-        });
-
-        var max = d3.max(wfData, function(d) {
-          return d.stop;
-        });
-
-        xScale.domain([min, max]);
-
-        wfLayer.selectAll('rect')
-        .data(wfData)
-        .enter()
-        .append('rect')
-        .attr({
-          y: 0,
-          height: height,
-          fill: function(d){ return d.color; },
-          'fill-opacity': 0.6
-        })
-
-        render();
-
-        brushLayer
-        .attr("class", "x brush")
-        .call(brush)
-        .selectAll("rect")
-        .attr("y", -4)
-        .attr("height", height + 8);
-      })
-
-      $scope.$watch(function(){
-        return el.clientWidth
-      }, function(){
-        var width = el.clientWidth;
-        // height = el.clientHeight;
-        svg.attr({width: width, height: $scope.height});
-        width = el.clientWidth - margin.left - margin.right;
-        xScale.range([0, width])
-        render();
-      })
-    }
-  }
-})
\ No newline at end of file
diff --git a/dashboard/lib/app/filters/pageFilter.js b/dashboard/lib/app/filters/pageFilter.js
deleted file mode 100644
index 1c20ee6..0000000
--- a/dashboard/lib/app/filters/pageFilter.js
+++ /dev/null
@@ -1,41 +0,0 @@
-app.filter('pageFilter', function(){
-  return function(input, currentPage, pageSize){
-    return input.filter(function(d,i) {
-      return (i >= currentPage*pageSize) && (i < (currentPage+1)*pageSize)
-    });
-  };
-});
-
-var a = [{name: 'a', num:2}, {name: 'b', num:3}]
-app.filter('pageFilter2', function() {
-  return function( items, userAccessLevel) {
-  	console.log(items);
-    var filtered = [];
-    angular.forEach(items, function(item, i) {
-      if(item.name ===  'Yogyakarta') {
-        filtered.push(item);
-      }
-    });
-    return filtered;
-  };
-});
-
-app.filter('moment', function() {
-  return function( items, userAccessLevel) {
-    console.log(items);
-    var filtered = [];
-    angular.forEach(items, function(item, i) {
-      if(item.name ===  'Yogyakarta') {
-        filtered.push(item);
-      }
-    });
-    return filtered;
-  };
-});
-
-app.filter('duration', function() {
-  return function( duration, userAccessLevel) {
-    
-    return moment.duration(duration, 'milliseconds').humanize();
-  };
-});
\ No newline at end of file
diff --git a/dashboard/lib/app/services/helpers.js b/dashboard/lib/app/services/helpers.js
deleted file mode 100644
index 8127740..0000000
--- a/dashboard/lib/app/services/helpers.js
+++ /dev/null
@@ -1,41 +0,0 @@
-app
-.service('wfStates', function() {
-    var exports = {};
-
-    exports.wfStates = [
-      {id: 0, wfState:'WF_OTHER', name: 'Other', color: '#aaa', stroke: '#EEEEEE'},
-      {id: 1, wfState:'WF_DEFINE',name: 'Define Problem', color: '#984ea3', stroke: '#F8D0FD'},
-      {id: 2, wfState:'WF_GETDATA',name: 'Get Data', color: '#d7191c', stroke: 'rgb(255, 192, 192)'},
-      {id: 3, wfState:'WF_EXPLORE',name: 'Explore Data', color: '#fdae61', stroke: '#AF6013'},
-      {id: 4, wfState:'WF_CREATE',name: 'Create View', color: '#f1b6da', stroke: '#cc4037'},
-      {id: 5, wfState:'WF_ENRICH',name: 'Enrich Data', color: '#abdda4', stroke: '#4F8348'},
-      {id: 6, wfState:'WF_TRANSFORM',name: 'Transform Data', color: '#2b83ba', stroke: '#0B3D5C'},
-      {id: 99, wfState:'WF_UNK',name: 'UNK', color: '#000', stroke: '#C9C9C9'},
-    ]
-
-    return exports;
-})
-
-// #7fc97f
-// #beaed4
-// #fdc086
-// #ffff99
-// #386cb0
-
-// #66c2a5
-// #fc8d62
-// #8da0cb
-// #e78ac3
-// #a6d854
-
-// #e41a1c
-// #377eb8
-// #4daf4a
-// #984ea3
-// #ff7f00
-
-// #d7191c
-// #fdae61
-// #ffffbf
-// #abdda4
-// #2b83ba
diff --git a/dashboard/lib/app/session-cont.js b/dashboard/lib/app/session-cont.js
deleted file mode 100644
index 6e452a2..0000000
--- a/dashboard/lib/app/session-cont.js
+++ /dev/null
@@ -1,177 +0,0 @@
-app.controller('SessionController', [
-  '$scope',
-  'Session',
-  '$filter',
-  '$routeParams',
-  '$window',
-  '$modal',
-  'wfStates',
-  function($scope, Session, $filter, $routeParams, $window, $modal, wfStates) {
-  $scope.filtData = [];
-  $scope.numberOfPages = 0;
-  $scope.pageSize = 20;
-
-  $scope.orderBy = {
-    label: 'timestamp',
-    state: false
-  };
-
-  angular.element($window).on('resize', $scope.$apply.bind($scope));
-  $scope.logs = Session.query({id:$routeParams.id});
-
-  $scope.filtData = $scope.logs;
-
-  $scope.activities = [];
-
-
-  $scope.logs
-  .$promise.then(function(d) {
-
-    d.forEach(function(d) { d.timestamp = new Date(d.timestamp); })
-      
-    d.sort(function(a,b){return a.timestamp.getTime() - b.timestamp.getTime()});
-
-    $scope.activities = d3.nest()
-    .key(function(d) { 
-      return d.parms.activity; 
-    })
-    .entries(d.filter(function(d) {
-      return d.type == 'USERACTION';
-    }))
-
-    console.log('AAAA', $scope.activities);
-
-    $scope.component = d[0].component;
-    d.forEach(function(d, i) {
-      d.index = i;
-      // d.timestamp = new Date(d.timestamp);
-
-      if (d.type === 'SYSACTION') {
-        d.color = "#eee";
-      } else {
-        try {
-          var tmp =  _.findWhere(wfStates.wfStates, {id: +d.parms.wf_state});
-          d.color = tmp.color;
-          d.parms.name = tmp.name;
-        }
-        catch(err) {
-          var tmp =  _.findWhere(wfStates.wfStates, {id: 99});
-          d.color = tmp.color;
-          d.parms.name = tmp.name;
-        }        
-      }
-    })    
-
-    $scope.numberOfPages = Math.ceil(d.length/$scope.pageSize);
-    $scope.currentPage = 0;
-    var tmp = $filter('orderBy')(d, 'timestamp', false)
-
-    $scope.filtData = tmp;
-    // $scope.pagedData = $filter('pageFilter')(tmp, $scope.currentPage, $scope.pageSize);
-  });
-
-  $scope.duration = function(d) {
-    if (!$scope.logs.length) { return; }
-    // console.log(d);
-    var extent = d3.extent($scope.logs, function(d) {
-      return new Date(d.timestamp);
-    })
-    return extent[1].getTime() - extent[0].getTime();
-  }
-
-  $scope.activityModal = function() {
-    console.log('activityModal')
-
-    var modalInstance = $modal.open({
-      templateUrl: 'templates/modals/activity.html',
-      controller: ActivityModalCtrl,
-      size: 'lg',
-      resolve: {
-        activities: function () {
-          return $scope.activities;
-        }
-      }
-    });
-
-    modalInstance.result.then(function (selectedItem) {
-      $scope.selected = selectedItem;
-    }, function () {
-      // $log.info('Modal dismissed at: ' + new Date());
-    });
-  }
-
-
-  $scope.timebounds = null;
-
-  $scope.$watch('timebounds', function(d) {
-    $scope.filtData = $filter('timeFilters')($scope.logs, d);
-    $scope.filtData = $filter('orderBy')($scope.filtData, $scope.orderBy.label, $scope.orderBy.state);
-  })
-
-  // watch for any changes in filtData
-  $scope.$watch('filtData', function(d) {
-    console.log('A', d.length)
-    $scope.numberOfPages = Math.ceil(d.length/$scope.pageSize);
-    $scope.pagedData = $filter('pageFilter')(d, $scope.currentPage = 0, $scope.pageSize);
-  })
-
-  $scope.$watch('orderBy', function(orderBy) {
-    console.log('ORDER2', orderBy, $scope.filtData)
-    $scope.filtData = $filter('orderBy')($scope.filtData, orderBy.label, orderBy.state);
-  }, true);
-
-
-  $scope.$watch('currentPage', function(d) {
-    var tmp = $filter('orderBy')($scope.filtData, 'timestamp', false)
-    $scope.pagedData = $filter('pageFilter')(tmp, $scope.currentPage, $scope.pageSize);
-    if ($scope.currentPage > $scope.numberOfPages) {
-      $scope.currentPage = $scope.numberOfPages-1;
-    }
-  });
-
-  $scope.getBlob = function(){
-    console.log($scope.logs);
-    var json = JSON.stringify($scope.logs);
-    return new Blob([json], {type: "application/json"});
-  }
-
-//   var content = 'file content';
-// var blob = new Blob([ content ], { type : 'text/plain' });
-// $scope.url = (window.URL || window.webkitURL).createObjectURL( blob );
-
-  $scope.downloadData = function(d){
-    var tmp = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify($scope.logs));
-    return "data:" + tmp;
-  };
-}]);
-
-app.filter('timeFilters', function() {
-  return function( items, timebounds) {
-    console.log('timeFilters', timebounds)
-    if (!timebounds) return items;
-
-    var filtered = [];
-    angular.forEach(items, function(item, i) {
-      var a = item.timestamp.getTime() >= (timebounds[0].getTime()-100);
-      var b = item.timestamp.getTime() <= (timebounds[1].getTime()+100);
-
-      if(a && b) {
-        filtered.push(item);
-      }
-    });
-    return filtered;
-  };
-});
-
-var ActivityModalCtrl = function ($scope, $modalInstance, activities) {
-
-  $scope.activities = activities;
-
-  $scope.ok = function () {
-    $modalInstance.close($scope.selected.item);
-  };
-
-  $scope.cancel = function () {
-    $modalInstance.dismiss('cancel');
-  };
-};
\ No newline at end of file
diff --git a/dashboard/lib/app/stats-ctrl.js b/dashboard/lib/app/stats-ctrl.js
deleted file mode 100644
index bc5d648..0000000
--- a/dashboard/lib/app/stats-ctrl.js
+++ /dev/null
@@ -1,6 +0,0 @@
-app.controller('StatsController', [
-  '$scope',
-  function($scope) {
-  
-}]);
-
diff --git a/dashboard/lib/app_old/activity-chart.js b/dashboard/lib/app_old/activity-chart.js
deleted file mode 100644
index 5e40e44..0000000
--- a/dashboard/lib/app_old/activity-chart.js
+++ /dev/null
@@ -1,88 +0,0 @@
-App.ActivityChartComponent = App.ChartCompComponent.extend(App.WfColors, {
-  hasNoData: Ember.computed(function() {
-    return false;
-  }).property('logData'),  
-  transformViewport: Ember.computed(function() {
-    return "translate(120, 0)";
-  }).property('marginLeft', 'marginTop'),
-  drawChart: function() {
-
-    var colors = this.get('colors');
-
-    var nest2 = d3.nest()
-    .key(function(d) { return d.wfState; })
-    .key(function(d) { return d.activity; })
-    .entries(this.get('logs'));
-
-    var nest = d3.nest()
-    .key(function(d) { return d.activity; })
-    .sortKeys(d3.descending)
-    .entries(this.get('logs'));
-
-    console.log('ACTIVITIES', nest, nest2);   
-
-    var x = d3.scale.linear()
-    .range([0, this.get('graphicWidth')]);
-
-    var y = d3.scale.ordinal()
-    .rangeRoundBands([this.get('graphicHeight'), 0], .1);     
-
-    var yAxis = d3.svg.axis()
-    .scale(y)
-    .orient("left");      
-
-    var svg = this.get('viewport');
-
-    x.domain([0, d3.max(nest, function(d) { return d.values.length; })]);
-    y.domain(nest.map(function(d) { return d.key; }));        
-
-    var yAx = svg.selectAll('g.y.axis')
-    .data([1])
-
-    yAx
-    .enter()
-    .append("g")
-    .attr("class", "y axis");
-
-    yAx
-    .call(yAxis);
-
-    var aBars = svg.selectAll(".activity-bar")
-    .data(nest);
-
-    aBars
-    .enter().append("rect");
-
-    aBars
-    .attr("fill", function(d) { return colors[d.values[0].wfState]; })
-    .attr("class", "activity-bar")
-    .attr("x", 0) //function(d) { return x(d.values.length); })
-    .attr("width", function(d) { return x(d.values.length); })
-    .attr("y", function(d) { return y(d.key); })
-    .attr("height", y.rangeBand() );
-
-    aBars
-    .exit().remove();
-
-    var tCount = svg.selectAll(".activity-text")
-    .data(nest);
-
-    tCount
-    .enter()
-    .append("text")
-    .attr("class", "activity-text");
-
-    tCount
-    .attr("fill", function(d) { return x(d.values.length) < 20 ? 'black' : 'white'})
-    .attr("x", function(d) { return x(d.values.length); })
-    .attr("dx", function(d) { return x(d.values.length) < 20 ? 10 : -10})
-    .attr("y", function(d) { return y(d.key) + y.rangeBand()/2 + 4; })
-    .text(function(d) { return d.values.length; })
-    .attr('text-anchor', function(d) { return x(d.values.length) < 20 ? 'start' : 'end'});
-
-    tCount
-    .exit().remove();
-  }.observes('logs'),  
-});
-
-Ember.Handlebars.helper('activity-chart', App.ActivityChartComponent)
diff --git a/dashboard/lib/app_old/app.js b/dashboard/lib/app_old/app.js
deleted file mode 100644
index 683d8ad..0000000
--- a/dashboard/lib/app_old/app.js
+++ /dev/null
@@ -1,296 +0,0 @@
-App = Ember.Application.create();
-
-App.ApplicationView = Ember.View.extend({
-    didInsertElement: function(event) {
-      console.log('Enabling Draper Logger');
-      window.ac = new activityLogger().echo(true).testing(true);
-    }
-});
-
-App.ApplicationController = Ember.ArrayController.extend({
-  registered: false,
-  testing: true,  
-  logUrl: '',
-  actions: {
-    record: function() {
-      this.set('testing', !this.get('testing'));
-      ac.testing(this.get('testing'))
-
-      if (!this.get('registered')) {
-        this.set('registered', true);
-        ac.registerActivityLogger(this.get('logUrl'), "Dashboard", "0.1");
-      }
-
-      
-
-      // var url = 'http://dcrlinuxvm.draper.com:1337';
-      // window.ac = new activityLogger().echo(true).testing(true);
-      // ac.registerActivityLogger(url, "Dashboard", "0.1");
-    }
-  }
-});
-
-App.Router.map(function() {
-  this.resource('index', { path: '/' });
-  // this.resource('sessions', { path: '/sessions' });
-  // this.resource('session', { path: '/session/:session_id' });
-  // this.resource('query', { path: '/query' });
-  // this.resource('post', { path: '/post' });
-  // this.resource('todos', { path: '/todos' });
-  // this.resource('dessions', { path: '/dession' });
-  // this.resource('dession', { path: '/dession/:dession_id' });
-});
-
-App.IndexRoute = Ember.Route.extend({
-  afterModel: function(posts, transition) {
-    this.transitionTo('sessions');    
-  }
-});
-
-// App.SessionsController = Ember.ArrayController.extend({
-//   queryParams: ['query'],
-//   query: null,
-  
-//   queryField: Ember.computed.oneWay('query'),
-//   actions: {
-//     search: function() {
-//       this.set('query', this.get('queryField'));
-//     },
-//     link: function(obj) {
-//      this.transitionToRoute('session', obj.get('_id'))
-//     },  
-//     sort: function(sortBy) {
-//       var previousSortBy = this.get('sortProperties.0');
-
-//       if (sortBy === previousSortBy) {
-//         return this.set('sortAscending', !this.get('sortAscending'));
-//       }
-//       else {
-//         this.set('sortAscending', true);
-//         return this.set('sortProperties', [sortBy]);
-//       }
-//     }
-//   },
-//   count: function() {
-//     return this.get('length');
-//   }.property('@each'),  
-//   sortProperties: ['maxTime'],
-//   sortAscending: false
-// });
-
-// App.SessionController = Ember.ArrayController.extend({
-//   session: null,
-//   stuff: function(d){
-//     return "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(this.get('content')));
-//   }.property('content'),
-//   minTime: function(d){
-//     return d3.min(this.get('content'), function(d) { return d.timestamp; });
-//   }.property('content'),
-//   maxTime: function(d){
-//     return d3.max(this.get('content'), function(d) { return d.timestamp; });
-//   }.property('content'),
-//   duration: function(d){
-//     var min = d3.min(this.get('content'), function(d) { return d.timestamp; }),
-//     max = d3.max(this.get('content'), function(d) { return d.timestamp; });
-//     return +moment(max).diff(moment(min));
-//   }.property('content'),
-//   numLogs: function(d){
-//     return +this.get('content').length;
-//   }.property('content')
-// })
-
-// App.Session = Ember.Object.extend({
-//   _id: null,
-//   numLogs: null,
-//   minTime: null,
-//   maxTime: null,
-//   client: null,
-//   numUserActions: null,
-//   component: null,
-//   duration: function() {    
-//     return +moment(this.get('maxTime')).diff(moment(this.get('minTime')));
-//   }.property('maxTime','minTime'),
-//   numSysActions: function() {    
-//     return this.get('numLogs') - this.get('numUserActions');
-//   }.property('numUserActions','numLogs')
-// });
-
-// App.Log = Ember.Object.extend({
-//   _id: null,
-//   type: null,
-//   component: null,
-//   description: null,
-//   timestamp: null,
-//   isSys: function() {    
-//     return this.get('type') == 'SYSACTION';
-//   }.property('type'),
-// });
-
-// App.SysLog = App.Log.extend();
-// App.UserLog = App.Log.extend({
-//   wfState: null,
-//   action: null
-// });
-
-// App.SessionsRoute = Ember.Route.extend({
-//   model: function(params) {
-//     //var url = 'http://xd-draper.xdata.data-tactics-corp.com:8001/sessions' + $.param(params);
-//     var url = '/sessions' + $.param(params);
-//     return Ember.$.getJSON(url).then(function(data) {
-//       return data.sessions.map(function(d) { return App.Session.create(d); });
-//     });
-//   }
-// });
-
-// App.QueryController = Ember.ArrayController.extend({
-//   queryParams: ['query'],
-//   query: null,
-  
-//   queryField: Ember.computed.oneWay('query'),
-//   actions: {
-//     search: function() {
-//       this.set('query', this.get('queryField'));
-//     }
-//   }
-// });
-
-// App.QueryRoute = Ember.Route.extend({
-//   model: function(params) {
-//     if (!params.query) {
-//       return []; // no results;
-//     }
-    
-//     var regex = new RegExp(params.query);
-//     return words.filter(function(word) {
-//       return regex.exec(word);
-//     });
-//   },
-//   actions: {
-//     queryParamsDidChange: function() {
-//       // opt into full refresh
-//       this.refresh();
-//     }
-//   }
-// })
-
-// App.QueryView = Ember.View.extend({
-//     didInsertElement: function(event) {
-//       $('#datetimepicker1').datetimepicker();
-//       $('#datetimepicker2').datetimepicker();
-//     }
-// });
-
-// App.SessionRoute = Ember.Route.extend({
-//   model: function(params) {
-
-//     this.controllerFor('session').set('session', params.session_id)
-
-//     json = {sessionID: params.session_id};
-//     //var url = 'http://xd-draper.xdata.data-tactics-corp.com:8001/test?' + $.param(json);
-//     var url = '/test?' + $.param(json);
-    
-    
-//     return Ember.$.getJSON(url).then(function(data) {
-//       // console.log(data);
-//       var out = data.session.map(function(d){
-//         out = {_id:d._id, type:d.type, component:d.component.name, description:d.parms.desc, timestamp:d.timestamp}
-//         return d.type=='USERACTION' ? App.UserLog.create($.extend(out, {wfState:d.parms.wf_state, activity:d.parms.activity})) : App.SysLog.create(out);
-//       })
-
-//       // console.log(out)
-//       return out;
-//     });    
-//   },
-//   actions: {
-//     queryParamsDidChange: function() {      
-//       this.refresh();
-//     }
-//   }
-// });
-
-
-
-
-// App.Pollster = Ember.Object.extend({
-//   start: function(){
-//     this.timer = setInterval(this.onPoll.bind(this), 500);
-//   },
-//   stop: function(){
-//     clearInterval(this.timer);
-//   },
-//   onPoll: function(){
-//     // Issue JSON request and add data to the store
-//   }
-// });
-
-// App.PostRoute = Ember.Route.extend({
-//   setupController: function(controller, model) {
-//     console.log('setupController');
-//     if (Ember.isNone(this.get('pollster'))) {
-//       console.log('polling');
-//       var route = this;
-//       this.set('pollster', App.Pollster.create({
-//         last_time: new Date(),
-//         onPoll: function() {
-//           // console.log('polling');
-//           Ember.$.getJSON('/updates', {time: this.get('last_time')}).then(function(json_obj) {
-
-//             // The JSON structure is as follows:
-//             // {
-//             //   comments: [
-//             //     { ... },
-//             //     { ... },
-//             //   ]
-//             // }
-
-//             // Iterate through the comments
-//             json_obj.logs.forEach(function(comment) {
-//               var result = Ember.Object.create({
-//                 isLoaded: false
-//               });
-
-//               result.setProperties(comment);
-//               result.set('isLoaded', true);
-//               // Make sure that the comment is not already in the store
-//               if (! route.get('store').recordIsLoaded(result, result._id)) {
-//                 console.log(route.get('store'))
-//                 route.get('store').push('comment', result);
-//               }
-//             });
-
-//             if (json_obj.logs.length) console.log(json_obj);
-//           });
-
-//           this.set('last_time', new Date())
-//         }
-//       }));
-//     }
-//     this.get('pollster').start();
-//   },
-//   // This is called upon exiting the Route
-//   deactivate: function() {
-//     this.get('pollster').stop();
-//   }
-// });
-
-App.WfColors = Ember.Mixin.create({
-  colors: ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2'],
-  wfStates: [
-      'Other',
-      'Define Problem',
-      'Get Data',
-      'Explore Data',
-      'Create View',
-      'Enrich Data',
-      'Transform Data'
-      ],
-  wfStates2: [
-    {id: 0, name: 'Other'},
-    {id: 1, name: 'Define Problem'},
-    {id: 2, name: 'Get Data'},
-    {id: 3, name: 'Explore Data'},
-    {id: 4, name: 'Create View'},
-    {id: 5, name: 'Enrich Data'},
-    {id: 6, name: 'Transform Data'}
-  ]
-});
\ No newline at end of file
diff --git a/dashboard/lib/app_old/band-test.js b/dashboard/lib/app_old/band-test.js
deleted file mode 100644
index 18408d8..0000000
--- a/dashboard/lib/app_old/band-test.js
+++ /dev/null
@@ -1,231 +0,0 @@
-App.Router.map(function() {
-  this.resource("sessions", { path: "/session" });
-  this.resource("session", { path: "/session/:session_id" });
-});
-
-App.SessionAdapter = DS.RESTAdapter.extend();
-App.LogAdapter = DS.RESTAdapter.extend();
-App.SessionSerializer = DS.RESTSerializer.extend({
-  primaryKey: '_id'
-});
-App.LogSerializer = DS.RESTSerializer.extend({
-  primaryKey: '_id'
-});
-
-App.Session = DS.Model.extend({
-	// name: DS.attr('string'),
- //  nMembers: DS.attr('number'),
- //  firstShow: DS.attr('date'),
- 	user: DS.attr('string'),
- 	component: DS.attr('string'),
- 	start: DS.attr('date'),
-  logs: DS.hasMany('log', {async: true})
-});
-
-App.Log = DS.Model.extend({
-	timestamp: DS.attr('date'),
-  activity: DS.attr(),
-  activityType: DS.attr('string'),
-  activityDesc: DS.attr('string'),
-  wfState: DS.attr('number'),
-  feedback: DS.attr('boolean', {defaultValue: false}),
-  sessionID: DS.belongsTo('session', { inverse: 'logs' })
-
-  // releaseDate: DS.attr('date'),
-  // title: DS.attr('string'),
-  // nTracks: DS.attr('number'),
-  // session: DS.belongsTo('Session', { inverse: 'logs' })
-});
-
-App.SessionsController = Ember.ArrayController.extend({
-	itemController: 'session',
-	sortProperties: ['start'],
-	sortAscending: false, // false for descending
-	actions: {    
-    link: function(obj) {
-     this.transitionToRoute('session', obj)
-    }
-  },
-});
-
-App.SessionController = Ember.ObjectController.extend({
-	minTime: function(){		
-		return d3.min(this.get('logs').toArray(), function(d) { return d.get('timestamp'); });
-	}.property('logs.@each'),
-	maxTime: function(){		
-		return d3.max(this.get('logs').toArray(), function(d) { return d.get('timestamp'); });
-	}.property('logs.@each'),	
-	duration: function(){		
-		var max = d3.max(this.get('logs').toArray(), function(d) { return d.get('timestamp'); });
-		var min = d3.min(this.get('logs').toArray(), function(d) { return d.get('timestamp'); });
-		if (min && max) return max.getTime() - min.getTime();
-	}.property('logs.@each'),
-	nUserLogs: function() {
-		return this.get('logs').toArray().filter(function(d) { return d.get('activityType') == 'USERACTION'}).length;
-	}.property('logs.@each'),
-	nSysLogs: function() {
-		return this.get('logs').toArray().filter(function(d) { return d.get('activityType') == 'SYSACTION'}).length;
-	}.property('logs.@each'),
-	downloadData: function(d){
-		console.log(this.get('logs').toArray())
-		var tmp = "text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(this.get('logs').toArray()));		
-		return "data:" + tmp;
-    
-  }.property('logs.@each'),
-});
-
-App.LogsController = Ember.ArrayController.extend(App.WfColors, {
-	itemController: 'log',
-	sortProperties: ['timestamp'],
-	needs: 'session',
-  session: Ember.computed.alias("controllers.session"),
-  counts: function(){
-    var states = this.get('wfStates'),
-    logs = this.get('content');   
-    console.log(this.get('content.length'))
-    states = states.map(function(d, i) {      
-      return {
-        numLogs: logs.filter(function(d) {          
-          return +d.get('wfState') == i;
-        }).length,
-        text: d,
-        code: i,
-      };
-    });
-
-    // console.log('COUNTS', states, logs.length, this.get('content.length'));
-    return states;
-  }.property('@each.wfState'),
-  // addIndex: function() {
-  //   this.get('content').forEach(function(d, i) {
-  //     d.set('myIndex', i);
-  //   })
-  // }.observes('@each'),
-  userLogs: function() {    
-    logs = this.get('content').map(function(d) {
-      // console.log(d);
-      return {
-        timestamp: d.get('timestamp'),
-        wfState: d.get('wfState'),
-        activity: d.get('activity'),
-        type: d.get('activityType')
-      }
-    });
-
-    logs = logs.sort(function(a,b) {
-      return a.timestamp - b.timestamp;
-    });    
-
-    logs = logs.filter(function(d) { return d.type != 'SYSACTION'; });    
-    
-    return logs;
-  }.property('@each.wfState'),
-  wfData: function() {
-    var wfData = [],
-    curState = {};
-    
-    var logs = this.get('userLogs');
-
-    if (!logs.length) return wfData;
-
-    logs.forEach(function(d) {
-      // console.log('loopa', d.timestamp, d.wfState)
-      if (d.wfState != curState.state) {
-        
-        curState.stop = d.timestamp;
-        if (curState.start) wfData.push(curState);
-        curState = {};
-        curState.state = d.wfState;
-        curState.start = d.timestamp;
-        // console.log('CURSTATE', curState);
-      }
-    });      
-
-    // console.log('DAVE_WFDATA', wfData, logs);
-    curState.stop = d3.time.second.offset(logs[logs.length-1].timestamp, 5);
-    wfData.push(curState);
-    
-    return wfData;
-  }.property('@each.wfState'),
-	actions: {
-    createLog: function(log) {
-      console.log('createLog', log);
-
-      var timestamp = new Date(log.get('timestamp').getTime() + 1); 
-      var newLog = this.get('session').store.createRecord('log', {
-        timestamp: timestamp,
-        activityType: 'FEEDBACK',
-        wfState: log.get('wfState'),
-        feedback: true
-      });
-
-      newLog.save();
-
-      this.get('session.logs').pushObject(newLog);      
-    }
-  }
-});
-
-App.LogController = Ember.ObjectController.extend(App.WfColors, {
-	editing: false,
-	newTimestamp: function() {    
-    return moment(this.get('timestamp')).format('h:mm:ss.SSS a');
-  }.property('timestamp'),
-	wfColor: function() {
-    var id = this.get('wfState');
-    return "background-color:" + this.get('colors')[id];
-  }.property('wfState'),
-  wfStateFormat: function() {
-    var id = this.get('wfState');
-    return this.get('wfStates')[id];
-  }.property('wfState'),
-  isEditing: function() {
-    if (this.get('editing') && this.get('feedback')) {
-      return true;
-    } else {
-      return false;
-    }
-  }.property('editing'),
-  actions: {
-    removeLog: function() {
-      var log = this.get('model');
-      log.eachRelationship(function(name, relationship){
-        if (relationship.kind === "belongsTo") {
-          var inverse = relationship.parentType.inverseFor(name);
-          var parent  = log.get(name);
-          if (inverse && parent) parent.get(inverse.name).removeObject(log);
-        }
-      });
-      log.deleteRecord();
-      log.save();
-    },
-    updateLog: function() {
-      var b = moment(this.get('newTimestamp'), 'h:mm:ss.SSS a');
-      var c = moment(this.get('timestamp'));
-
-      b.year(c.year());
-      b.month(c.month());
-      b.date(c.date());
-      console.log('updateLog', b.toDate());
-      var model = this.get('model');
-      model.set('timestamp', b.toDate());
-      model.set('activity', this.get('activity'));
-      model.set('wfState', this.get('wfState'));
-      model.save();
-      this.set('editing', false);
-    },
-    editLog: function() {
-      console.log('editing', this.get('editing'))
-      this.set('editing', !this.get('editing'));
-      if (!this.get('editing')) {
-        this.send('updateLog');
-      }      
-    } 
-  }
-})
-
-App.SessionsRoute = Ember.Route.extend({  
-  model: function() {    
-    return this.store.find('session');
-  }
-});
\ No newline at end of file
diff --git a/dashboard/lib/app_old/chart-component.js b/dashboard/lib/app_old/chart-component.js
deleted file mode 100644
index 38a6674..0000000
--- a/dashboard/lib/app_old/chart-component.js
+++ /dev/null
@@ -1,98 +0,0 @@
-App.ChartCompComponent = Ember.Component.extend({
-  // templateName: 'chart-comp',
-  // templateName:'components/chart-comp',
-  layoutName:'components/chart-comp',
-  classNames: ['chart-frame', 'scroll-y'],
-  horizontalMargin: 30,
-  verticalMargin: 30,
-  marginRight: Ember.computed.alias('horizontalMargin'),
-  marginLeft: Ember.computed.alias('horizontalMargin'),
-  marginTop: Ember.computed.alias('verticalMargin'),
-  marginBottom: Ember.computed.alias('verticalMargin'),
-  defaultOuterHeight: 200,
-  defaultOuterWidth: 700,
-  outerHeight: Ember.computed.alias('defaultOuterHeight'),
-  outerWidth: Ember.computed.alias('defaultOuterWidth'),
-  width: Ember.computed(function() {
-    return this.get('outerWidth') - this.get('marginLeft') - this.get('marginRight');
-  }).property('outerWidth', 'marginLeft', 'marginRight'),
-  height: Ember.computed(function() {
-    return this.get('outerHeight') - this.get('marginBottom') - this.get('marginTop');
-  }).property('outerHeight', 'marginBottom', 'marginTop'),
-  $viewport: Ember.computed(function() {
-    return this.$('.chart-viewport')[0];
-  }),
-  viewport: Ember.computed(function() {
-    return d3.select(this.get('$viewport'))
-    .attr('transform', this.get('transformViewport'));
-  }),
-  transformViewport: Ember.computed(function() {
-    return "translate(" + (this.get('marginLeft')) + "," + (this.get('marginTop')) + ")";
-  }).property('marginLeft', 'marginTop'),
-  labelPadding: 10,
-  labelWidth: 30,
-  labelHeight: 15,
-  labelWidthOffset: Ember.computed(function() {
-    return this.get('labelWidth') + this.get('labelPadding');
-  }).property('labelWidth', 'labelPadding'),
-  labelHeightOffset: Ember.computed(function() {
-    return this.get('labelHeight') + this.get('labelPadding');
-  }).property('labelHeight', 'labelPadding'),
-  graphicTop: 0,
-  graphicLeft: 0,
-  graphicWidth: Ember.computed.alias('width'),
-  graphicHeight: Ember.computed.alias('height'),
-  graphicBottom: Ember.computed(function() {
-    return this.get('graphicTop') + this.get('graphicHeight');
-  }).property('graphicTop', 'graphicHeight'),
-  graphicRight: Ember.computed(function() {
-    return this.get('graphicLeft') + this.get('graphicWidth');
-  }).property('graphicLeft', 'graphicWidth'),
-  hasNoData: Ember.computed(function() {
-    return Ember.isEmpty(this.get('finishedData'));
-  }).property('finishedData'),
-  concatenatedProperties: ['renderVars'],
-  renderVars: ['finishedData', 'width', 'height', 'margin'],
-  init: function() {
-    var renderVar, _i, _len, _ref, _results;
-    this._super();
-    _ref = this.get('renderVars').uniq();
-    _results = [];
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      renderVar = _ref[_i];
-      _results.push(this.addObserver(renderVar, (function(_this) {
-        return function() {
-          return Ember.run.once(_this, _this.get('draw'));
-        };
-      })(this)));
-    }
-    return _results;
-  },
-  didInsertElement: function() {
-    this._super();
-    this._updateDimensions();
-    return Ember.run.once(this, this.get('draw'));
-  },
-  onResizeEnd: function() {
-    return this._updateDimensions();
-  },
-  _updateDimensions: function() {
-    console.log('UpdateDims', this.$().parent().height(), this.$().height());
-    this.$().height(this.$().parent().height());
-    this.set('defaultOuterHeight', this.$().height());
-    return this.set('defaultOuterWidth', this.$().width());
-  },
-  clearChart: function() {
-    return this.$('.chart-viewport').children().remove();
-  },
-  draw: function() {
-    if (this.get('state') !== 'inDOM') {
-      return;
-    }
-    if (this.get('hasNoData')) {
-      return this.clearChart();
-    } else {
-      return this.drawChart();
-    }
-  }
-});
\ No newline at end of file
diff --git a/dashboard/lib/app_old/context-chart.js b/dashboard/lib/app_old/context-chart.js
deleted file mode 100644
index efc4475..0000000
--- a/dashboard/lib/app_old/context-chart.js
+++ /dev/null
@@ -1,300 +0,0 @@
-App.ContextChartComponent = App.ChartCompComponent.extend(App.WfColors, {
-  hasNoData: Ember.computed(function() {
-    return false;
-  }).property('logData'),
-  contextHeight: 20,
-  marginHeight: 5,
-  xDomain: Ember.computed(function() {
-    var min = d3.min(this.get('wfData'), function(d) { return d.start; });
-    var max = d3.max(this.get('wfData'), function(d) { return d.stop; });
-
-    // console.log('WFDATA', [min, max])
-    return [min, max];
-  }).property('wfData'),
-  yDomain: Ember.computed(function() {
-    return [0, 1]
-  }).property('wfData'),
-  focusHeight: Ember.computed(function() {
-    return this.get('graphicHeight') - (this.get('contextHeight') + this.get('marginHeight'));
-  }).property('graphicHeight', 'contextHeight'),
-  yContextRange: Ember.computed(function() {
-    return [this.get('graphicTop') + this.get('contextHeight'), this.get('graphicTop')];
-  }).property('graphicTop', 'contextHeight'),
-  yContextScale: Ember.computed(function() {
-    return d3.scale.linear().domain(this.get('yDomain')).range(this.get('yContextRange'));
-  }).property('yDomain', 'yContextRange'),
-  yFocusRange: Ember.computed(function() {
-    console.log('AAA', [this.get('graphicTop') + this.get('focusHeight'), this.get('graphicTop')])
-    return [this.get('graphicTop') + this.get('focusHeight'), this.get('graphicTop')];
-    // return [200, 0];
-  }).property('graphicTop', 'focusHeight'),
-  yFocusScale: Ember.computed(function() {
-    return d3.scale.linear().domain(this.get('yDomain')).range(this.get('yFocusRange'));
-  }).property('yDomain', 'yFocusRange'),
-  xRange: Ember.computed(function() {
-    return [this.get('graphicLeft'), this.get('graphicLeft') + this.get('graphicWidth')];
-  }).property('graphicLeft', 'graphicWidth'),
-  xContextTimeScale: Ember.computed(function() {
-    var xDomain;
-    xDomain = this.get('xDomain');
-    return d3.time.scale().domain(this.get('xDomain')).range(this.get('xRange'));
-  }).property('xDomain', 'xRange'),
-  xFocusTimeScale: Ember.computed(function() {    
-    // return d3.time.scale();
-    return d3.time.scale().domain(this.get('xDomain')).range(this.get('xRange'));
-  }).property('xDomain', 'xRange'),
-  xContextAxis: Ember.computed(function() {
-    var xAxis;
-    xAxis = this.get('contextFrame').select('.x.axis');
-    if (xAxis.empty()) {
-      return this.get('contextFrame').insert('g', ':first-child').attr('class', 'x axis');
-    } else {
-      return xAxis;
-    }
-  }).volatile(),
-  xFocusAxis: Ember.computed(function() {
-    var xAxis;
-    xAxis = this.get('focusFrame').select('.x.axis');
-    if (xAxis.empty()) {
-      return this.get('focusFrame').insert('g', ':first-child').attr('class', 'x axis');
-    } else {
-      return xAxis;
-    }
-  }).volatile(),
-  // wfData: Ember.computed(function() {
-  //   var wfData = [],
-  //   curState = {};
-
-  //   var logs = this.get('logData');
-
-  //   console.log('LOGS', logs)
-
-  //   // logs = logs.filter(function(d) { return d.type == 'USERACTION'; });
-
-  //   // logs.forEach(function(d) {
-  //   //   d.timestamp = new Date(d.timestamp);
-  //   //   if (d.wfState != curState.state) {
-  //   //     curState.stop = d.timestamp;
-  //   //     if (curState.start) wfData.push(curState);
-  //   //     curState = {};
-  //   //     curState.state = d.wfState;
-  //   //     curState.start = d.timestamp;
-  //   //   }
-  //   // });      
-
-  //   // curState.stop = d3.time.second.offset(logs[logs.length-1].timestamp, 5);
-  //   // wfData.push(curState);
-
-  //   return wfData;
-  // }).property('logData'),
-  // testObs: function() {
-  //   console.log(this.get('logData').length)
-  // }.property('logData'),
-  testObs: Ember.computed(function() {
-    console.log(this.get('logs').length)
-  }).property('logs'),
-  contextFrame: Ember.computed(function() {
-    return this.get('viewport').select('.context').datum(this.get('wfData'));
-  }).volatile(),
-  focusFrame: Ember.computed(function() {
-    return this.get('viewport').select('.focus').datum(this.get('wfData'));
-  }).volatile(),
-  buildGroups: function() {
-    this.get('viewport')
-    .append('g')
-    .attr('class', 'context');
-
-    this.get('viewport')
-    .append('g')
-    .attr('transform', "translate(0," + (this.get('contextHeight') + this.get('marginHeight')) + ")")
-    .attr('class', 'focus');
-  },  
-  drawChart: function() {
-    this.buildGroups();    
-
-    this.get('viewport')
-    .append("defs")
-    .append("clipPath")
-    .attr("id", "clip")
-    .append("rect")
-    .attr("width", this.get('graphicWidth'))
-    .attr("height", this.get('focusHeight'));
-
-    this.updateChart();
-
-    // console.log('DRAWCHART', this.get('testDave'), this.get('testDave.length'));
-  },
-  updateChart: function() {
-    var this_ = this;
-
-    var xContextTimeScale = this.get('xContextTimeScale'),
-    xFocusTimeScale = this.get('xFocusTimeScale')
-    yContextScale = this.get('yContextScale'),
-    yFocusScale = this.get('yFocusScale'),
-    colors = this.get('colors'),
-    xDomain = this.get('xDomain'),
-    focus = this.get('focusFrame');
-
-    var brush = d3.svg.brush()
-    .x(xContextTimeScale)
-    .on("brush", brushed);
-
-    var contextFrame = this.get('contextFrame')
-    .selectAll('g.draw-pane')
-    .data([1]);
-
-    contextFrame
-    .enter()
-    .append("g")
-    .attr('class', 'draw-pane');
-
-    var cf = contextFrame
-    .selectAll('rect.wf-context')
-    .data(this.get('wfData'))
-
-    cf
-    .enter()
-    .append('rect')
-    .attr('class', 'wf-context');
-
-    cf
-    .attr({
-      x: function(d) { return xContextTimeScale(d.start); },
-      width: function(d) { return xContextTimeScale(d.stop) - xContextTimeScale(d.start); },
-      y: function(d) { return yContextScale(1); },
-      height: function(d) { return yContextScale(0) - yContextScale(1); },
-      fill: function(d) { return colors[+d.state]},
-      'fill-opacity': 0.5
-    });
-
-    cf.exit()
-    .remove();
-
-    this.get('contextFrame').selectAll('g.x.brush')
-    .data([1])
-    .enter()
-    .append("g")
-    .attr("class", "x brush")
-    .call(brush)
-    .selectAll("rect")
-    .attr("y", -6)
-    .attr("height", this.get('contextHeight') + 7);
-
-    var wf = this.get('focusFrame')
-    .selectAll('rect.wf-focus')
-    .data(this.get('wfData'))
-
-    wf
-    .enter()
-    .append('rect')
-    .attr('class', 'wf-focus');
-
-    wf
-    .attr({
-      x: function(d) { return xFocusTimeScale(d.start); },
-      width: function(d) { return xFocusTimeScale(d.stop) - xFocusTimeScale(d.start); },
-      y: function(d) { return yFocusScale(1); },
-      height: function(d) { return yFocusScale(0) - yFocusScale(1); },
-      fill: function(d) { return colors[+d.state]},
-      'fill-opacity': 0.5,
-      'clip-path': 'url(#clip)'
-    });
-
-    wf.exit()
-    .remove();
-        
-    var logLines = this.get('focusFrame')
-    .selectAll('line.log-line')
-    .data(this.get('logs'));
-
-    console.log('NLINES', this.get('logs').length)
-
-    logLines  
-    .enter()
-    .append('line')
-    .attr('class', 'log-line');
-
-    logLines
-    .attr({
-      x1: function(d) { return xFocusTimeScale(d.timestamp); },
-      x2: function(d) { return xFocusTimeScale(d.timestamp); },
-      y1: function(d) { return yFocusScale(1); },
-      y2: function(d) { return yFocusScale(0); },
-      stroke: function(d) { return colors[+d.wfState]},
-      'clip-path': 'url(#clip)'
-    });
-
-    logLines.exit()
-    .remove();
-
-    // var logCircs = this.get('focusFrame')
-    // .selectAll('line.log-circ')
-    // .data(this.get('logs'));
-
-    // logCircs
-    // .enter()
-    // .append('circle')
-    // .attr('class', 'log-circ')
-    // .on("mouseover", function(d) {
-    //   $("#test").html(d.activity + ": " + d.description);
-    // });
-
-    // logCircs    
-    // .attr({
-    //   cx: function(d) { return xFocusTimeScale(d.timestamp); },
-    //   cy: function(d) { return yFocusScale(0) - 5; },
-    //   r: 5,
-    //   fill: function(d) { return colors[+d.wfState]},
-    //   'clip-path': 'url(#clip)'
-    // });
-
-    // logCircs.exit()
-    // .remove();
-
-    xAxis = d3.svg.axis().scale(xFocusTimeScale).orient('bottom');
-    
-    gXAxis = this.get('xFocusAxis').attr({
-      transform: "translate(0," + (this.get('focusHeight')) + ")"
-    }).call(xAxis);
-
-    xAxis1 = d3.svg.axis().scale(xContextTimeScale).orient('top');
-    
-    gXAxis = this.get('xContextAxis').call(xAxis1);
-
-    function brushed() {
-      xFocusTimeScale.domain(brush.empty() ? xDomain : brush.extent());
-      
-      focus
-      .selectAll('rect')
-      .attr({
-        x: function(d) { return xFocusTimeScale(d.start); },
-        width: function(d) { return xFocusTimeScale(d.stop) - xFocusTimeScale(d.start); }
-      });
-
-      focus
-      .selectAll('line.log-line')
-      .attr({
-        x1: function(d) { return xFocusTimeScale(d.timestamp); },
-        x2: function(d) { return xFocusTimeScale(d.timestamp); }
-      });
-
-      // logCircs
-      // .attr({
-      //   cx: function(d) { return xFocusTimeScale(d.timestamp); }
-      // });
-
-      xAxis = d3.svg.axis().scale(xFocusTimeScale).orient('bottom');    
-      this_.get('xFocusAxis').call(xAxis);
-    }
-  }.observes('logs'),
-  daveReed: function() {
-    // this.buildGroups();
-    // this.drawContext();
-    // this.drawFocus();
-    // console.log('DAVE DRAWCHART', this.get('testDave'), this.get('testDave.length'));
-  }.observes('logs')
-});
-
-Ember.Handlebars.helper('context-chart', App.ContextChartComponent)
-
-// $("body").append("<div class='chart-float-tooltip' id='#{@get 'tooltipId'}'></div>")
\ No newline at end of file
diff --git a/dashboard/lib/app_old/d3-test.js b/dashboard/lib/app_old/d3-test.js
deleted file mode 100644
index 0c3a780..0000000
--- a/dashboard/lib/app_old/d3-test.js
+++ /dev/null
@@ -1,159 +0,0 @@
-App.BarChartComponent = Ember.Component.extend({
-    tagName: 'div',
-    // attributeBindings: 'width height'.w(),
-    // margin: {top: 20, right: 20, bottom: 30, left: 40},
-    
-    // w: function(){
-    //   return this.get('width') - this.get('margin.left') - this.get('margin.right');
-    // }.property('width'),
-  
-    // h: function(){
-    //   return this.get('height') - this.get('margin.top') - this.get('margin.bottom');
-    // }.property('height'),  
-  
-    // transformG: function(){
-    //   return "translate(" + this.get('margin.left') + "," + this.get('margin.top') + ")";
-    // }.property(),
-      
-    // transformX: function(){
-    //   return "translate(0,"+ this.get('h') +")";
-    // }.property('h'),   
-  
-    draw: function(){
-      console.log('In Draw', this);
-      var wf_states = [],
-      curState = {};
-
-      window.T = this;
-
-      var logs = this.logs;
-
-      
-
-      var f3 = d3.time.format("%H:%M:%S.%L")
-      var f4 = d3.time.format("%a, %e %b %Y")
-
-      logs = logs.filter(function(d) { return d.type == 'USERACTION'; });
-
-      if (!logs.length) return
-      console.log(logs)
-
-      logs.forEach(function(d) {
-        d.timestamp = new Date(d.timestamp);
-
-        // console.log(d)
-        if (d.wfState != curState.state) {
-          // console.log('in loop')
-          curState.stop = d.timestamp;
-          if (curState.start) wf_states.push(curState);
-          curState = {};
-          curState.state = d.wfState;
-          curState.start = d.timestamp;
-        }
-      });
-
-      // console.log(wf_states)
-
-      curState.stop = d3.time.second.offset(logs[logs.length-1].timestamp, 5);
-      wf_states.push(curState);
-    // x.domain([d3.min(data, function(d) { return d.start; }), d3.max(data, function(d) { return d.stop; })])
-      var chartArtist = eventChart()
-      .data(wf_states)
-      .x(d3.time.scale()
-        .range([0, 500])
-        .domain([d3.min(wf_states, function(d) { return d.start; }), d3.max(wf_states, function(d) { return d.stop; })])
-      );      
-
-      var chart = d3.select('.chart')
-      .datum(chart);
-
-      chart.call(chartArtist);
-
-      var chartArtist2 = eventChart()
-      .brushing(true)
-      .data(wf_states)
-      .y(d3.scale.linear()
-        .range([20, 0]))
-      .x(d3.time.scale()
-        .range([0, 500])
-        .domain([d3.min(wf_states, function(d) { return d.start; }), d3.max(wf_states, function(d) { return d.stop; })])
-      );
-
-      var chart2 = d3.select('#context')
-      .datum(chart);
-
-      chart2.call(chartArtist2);
-
-      function renderAll() {
-        // console.log(chartArtist2.brush.extent())
-
-        var a = chartArtist2.brush.extent()
-        chartArtist.x().domain(a)
-        chart.call(chartArtist);
-
-        logMarkers
-        .selectAll('line')
-        .attr("x1", function(d) { return x(d.timestamp); })
-        .attr("x2", function(d) { return x(d.timestamp); })
-
-        logMarkers
-        .selectAll('circle')
-        .attr("cx", function(d) { return x(d.timestamp); })
-        // .attr("x2", function(d) { return x(d.timestamp); })
-      }
-
-      chartArtist2
-      .on("brush", renderAll)
-      .on("brushend", renderAll);
-
-
-
-      var logMarkers = d3.select(".chart svg > g").selectAll("g.log_markers").data(logs)
-      .enter()
-      .append("g")
-      .attr("class", "log-markers")
-      .on("mouseover", function(d) { 
-        d3.select('#event-info .timestamp')
-        .html(f3(d.timestamp));
-        d3.select('#event-info .desc')
-        .html(d.parms.desc);
-        d3.select('#event-info .activity')
-        .html(d.parms.activity);
-
-        d3.select(this).select('circle')
-        .attr('fill', 'white')
-      })
-      .on("mouseout", function(d) { 
-        d3.select('#event-info .timestamp')
-        .html("");
-        d3.select('#event-info .desc')
-        .html("");
-        d3.select('#event-info .activity')
-        .html("");
-
-        d3.select(this).select('circle')
-        .attr('fill', 'black')
-      });
-
-      var x = chartArtist.x();
-
-      logMarkers.append("line")
-      .attr("x1", function(d) { return x(d.timestamp); })
-      .attr("x2", function(d) { return x(d.timestamp); })
-      .attr("y1", 0)
-      .attr("y2", 100)
-      .attr("stroke-width", 1)
-      .attr("stroke", "black")
-      .attr("clip-path", "url(#clip-0)");
-
-      logMarkers.append("circle")
-      .attr("cx", function(d) { return x(d.timestamp); })
-      .attr("cy", 4)
-      .attr("r", 4)
-      .attr("clip-path", "url(#clip-0)");
-    },
-  
-    didInsertElement: function(){
-      this.draw();
-    }
-  });
\ No newline at end of file
diff --git a/dashboard/lib/app_old/helpers.js b/dashboard/lib/app_old/helpers.js
deleted file mode 100644
index 4e5b13b..0000000
--- a/dashboard/lib/app_old/helpers.js
+++ /dev/null
@@ -1,44 +0,0 @@
-Ember.Handlebars.helper('format-date', function(date) {
-  return moment(date).format('DDMMMYY');
-});
-
-Ember.Handlebars.helper('format-date-time', function(date) {
-  return moment(date).format('DDMMMYY h:mm:ss a');
-});
-
-Ember.Handlebars.helper('format-time', function(date) {
-  return moment(date).format('h:mm:ss.SSS a');
-});
-
-Ember.Handlebars.helper('format-time-simple', function(date) {
-  return moment(date).format('h:mm:ss a');
-});
-
-Ember.Handlebars.helper('format-date-full', function(date) {
-  return moment(date).format('MMMM Do YYYY, h:mm:ss a');
-});
-
-Ember.Handlebars.helper('format-duration-human', function(duration) {
-  return moment.duration(duration).humanize();
-});
-
-Ember.Handlebars.helper('format-id', function(id) {
-  if (id) {
-    return id.slice(0, 4) + id.slice(id.length-3, id.length);
-  }  
-});
-
-Ember.Handlebars.helper('format-action', function(action) {
-  if (action == 'USERACTION') {
-    return 'UA';
-  } else if (action == 'FEEDBACK') {
-    return 'FB';
-  }  else if (action == 'SYSACTION') {
-    return 'SA';
-  }  
-});
-
-
-Ember.Handlebars.helper('format-duration', function(duration) {
-  return moment.utc(duration).format("HH:mm:ss");
-});
\ No newline at end of file
diff --git a/dashboard/lib/app_old/legend-chart.js b/dashboard/lib/app_old/legend-chart.js
deleted file mode 100644
index 94bee8f..0000000
--- a/dashboard/lib/app_old/legend-chart.js
+++ /dev/null
@@ -1,72 +0,0 @@
-App.LegendChartComponent = App.ChartCompComponent.extend(App.WfColors, {
-    hasNoData: Ember.computed(function() {
-      return false;
-    }).property('wfStates'),
-    defaultOuterHeight: 200,
-    verticalMargin: 0,
-    xScale: function() {
-      var xScale = d3.scale.ordinal()
-      .domain(d3.range(this.get('wfStates').length))
-      .rangeBands([0, this.get('graphicWidth')], .1, 0);
-
-      return xScale;
-    }.property('graphicWidth'),
-    drawChart: function(){ 
-      
-      var colors = this.get('colors');
-
-      var svg = this.get('viewport');
-
-      var xScale = this.get('xScale');
-
-      svg.selectAll('rect.legend')
-      .data(this.get('wfStates'))
-      .enter()
-      .append('rect')
-      .attr({
-        fill: function(d, i) { return colors[i]; },
-        class: 'legend',
-        x: function(d,i) { return xScale(i); },
-        width: xScale.rangeBand(),
-        y: 0,
-        height: 30
-      })
-
-      var text = svg.selectAll('text.legend')
-      .data(this.get('counts'))
-      .enter()
-      .append('text')
-      .attr({
-        x: function(d,i) { return xScale(i) + 0.5*xScale.rangeBand(); },
-        y: 20,
-        'text-anchor': 'middle',
-        fill: 'white'
-      })
-      .text(function(d) { 
-        var text = d.text;
-
-        return d.numLogs ? d.text + " (" + d.numLogs + ")" : d.text; 
-      })
-
-      this.set('textD', text);
-    },
-    updateChart: function() {
-      console.log('updateChart')
-      var xScale = this.get('xScale');
-
-      var text = this.get('textD')
-      .data(this.get('counts'))
-      .attr({
-        x: function(d,i) { return xScale(i) + 0.5*xScale.rangeBand(); },
-        y: 20,
-        'text-anchor': 'middle',
-        fill: 'white'
-      })
-      .text(function(d) { 
-        var text = d.text;
-
-        return d.numLogs ? d.text + " (" + d.numLogs + ")" : d.text; 
-      })
-
-    }.observes('counts')
-  });
\ No newline at end of file
diff --git a/dashboard/lib/app_old/logs.js b/dashboard/lib/app_old/logs.js
deleted file mode 100644
index 932f3d7..0000000
--- a/dashboard/lib/app_old/logs.js
+++ /dev/null
@@ -1,259 +0,0 @@
-// App.Dession = DS.Model.extend({
-//   logs: DS.hasMany('log', {async: true}),
-//   extra: DS.attr()
-// });
-
-// App.Log = DS.Model.extend({  
-//   timestamp: DS.attr('date'),
-//   // parms: DS.attr(),
-//   activity: DS.attr(),
-//   activityType: DS.attr('string'),
-//   wfState: DS.attr('number'),
-//   feedback: DS.attr('boolean', {defaultValue: false}),
-//   dession: DS.belongsTo('dession', { inverse: 'logs' })
-// });
-
-// App.DessionRoute = Ember.Route.extend({  
-//   model: function() {    
-//     return this.store.find('dession', 1);
-//   }
-// });
-
-// App.DessionsRoute = Ember.Route.extend({  
-//   model: function() {    
-//     return this.store.find('dession');
-//   }
-// });
-
-
-// App.DessionsController = Ember.ArrayController.extend({
-//   queryParams: ['query'],
-//   query: null,
-  
-//   queryField: Ember.computed.oneWay('query'),
-//   actions: {
-//     search: function() {
-//       this.set('query', this.get('queryField'));
-//     },
-//     link: function(obj) {
-//       console.log(obj.get('id'))
-//      this.transitionToRoute('dession', obj.get('id'))
-//     },  
-//     sort: function(sortBy) {
-//       var previousSortBy = this.get('sortProperties.0');
-
-//       if (sortBy === previousSortBy) {
-//         return this.set('sortAscending', !this.get('sortAscending'));
-//       }
-//       else {
-//         this.set('sortAscending', true);
-//         return this.set('sortProperties', [sortBy]);
-//       }
-//     }
-//   },
-//   count: function() {
-//     return this.get('length');
-//   }.property('@each'),  
-//   sortProperties: ['maxTime'],
-//   sortAscending: false
-// });
-
-// App.LogsController = Ember.ArrayController.extend(App.WfColors, {
-//   needs: 'dession',
-//   dession: Ember.computed.alias("controllers.dession"),
-//   itemController: 'log',
-//   sortProperties: ['timestamp'],
-//   counts: function(){
-//     var states = this.get('wfStates'),
-//     logs = this.get('content');   
-//     console.log(this.get('content.length'))
-//     states = states.map(function(d, i) {      
-//       return {
-//         numLogs: logs.filter(function(d) {          
-//           return +d.get('wfState') == i;
-//         }).length,
-//         text: d,
-//         code: i,
-//       };
-//     });
-
-//     // console.log('COUNTS', states, logs.length, this.get('content.length'));
-//     return states;
-//   }.property('@each.wfState'),
-//   addIndex: function() {
-//     this.get('content').forEach(function(d, i) {
-//       d.set('myIndex', i);
-//     })
-//   }.observes('@each'),
-//   userLogs: function() {    
-//     logs = this.get('content').map(function(d) {
-//       // console.log(d);
-//       return {
-//         timestamp: d.get('timestamp'),
-//         wfState: d.get('wfState'),
-//         activity: d.get('activity'),
-//         type: d.get('activityType')
-//       }
-//     });
-
-//     logs = logs.sort(function(a,b) {
-//       return a.timestamp - b.timestamp;
-//     });    
-
-//     logs = logs.filter(function(d) { return d.type != 'SYSACTION'; });    
-    
-//     return logs;
-//   }.property('@each.wfState'),
-//   wfData: function() {
-//     var wfData = [],
-//     curState = {};
-    
-//     var logs = this.get('userLogs');
-
-//     if (!logs.length) return wfData;
-
-//     logs.forEach(function(d) {
-//       // console.log('loopa', d.timestamp, d.wfState)
-//       if (d.wfState != curState.state) {
-        
-//         curState.stop = d.timestamp;
-//         if (curState.start) wfData.push(curState);
-//         curState = {};
-//         curState.state = d.wfState;
-//         curState.start = d.timestamp;
-//         // console.log('CURSTATE', curState);
-//       }
-//     });      
-
-//     // console.log('DAVE_WFDATA', wfData, logs);
-//     curState.stop = d3.time.second.offset(logs[logs.length-1].timestamp, 5);
-//     wfData.push(curState);
-    
-//     return wfData;
-//   }.property('@each.wfState'),
-//   actions: {
-//     createLog: function(log) {
-//       console.log('createLog', log);
-
-//       var timestamp = new Date(log.get('timestamp').getTime() + 1); 
-//       var newLog = this.get('dession').store.createRecord('log', {
-//         activityType: 'FEEDBACK',
-//         timestamp: timestamp,
-//         feedback: true
-//       });
-
-//       newLog.save();
-
-//       this.get('dession.logs').pushObject(newLog);      
-//     }
-//   }
-// })
-
-// App.LogController = Ember.ObjectController.extend(App.WfColors, {
-//   // wfStates: [0,1,2,3,4,5,6],
-//   editing: false,
-//   // newTimestampBinding: Ember.Binding.oneWay('timestamp'),  
-//   newTimestamp: function() {    
-//     return moment(this.get('timestamp')).format('h:mm:ss.SSS a');
-//   }.property('timestamp'),
-//   isEditing: function() {
-//     if (this.get('editing') && this.get('feedback')) {
-//       return true;
-//     } else {
-//       return false;
-//     }
-//   }.property('editing'),
-//   wfColor: function() {
-//     var id = this.get('wfState');
-//     return "background-color:" + this.get('colors')[id];
-//   }.property('wfState'),
-//   wfStateFormat: function() {
-//     var id = this.get('wfState');
-//     return this.get('wfStates')[id];
-//   }.property('wfState'),
-//   actions: {
-//     removeLog: function() {
-//       var log = this.get('model');
-//       log.eachRelationship(function(name, relationship){
-//         if (relationship.kind === "belongsTo") {
-//           var inverse = relationship.parentType.inverseFor(name);
-//           var parent  = log.get(name);
-//           if (inverse && parent) parent.get(inverse.name).removeObject(log);
-//         }
-//       });
-//       log.deleteRecord();
-//       log.save();
-//     },
-//     updateLog: function() {
-//       var b = moment(this.get('newTimestamp'), 'h:mm:ss.SSS a');
-//       var c = moment(this.get('timestamp'));
-
-//       b.year(c.year());
-//       b.month(c.month());
-//       b.date(c.date());
-//       console.log('updateLog', b.toDate());
-//       var model = this.get('model');
-//       model.set('timestamp', b.toDate());
-//       model.set('activity', this.get('activity'));
-//       model.set('wfState', this.get('wfState'));
-//       model.save();
-//       // this.set('editing', false);
-//     },
-//     editLog: function() {
-//       console.log('editing', this.get('editing'))
-//       this.set('editing', !this.get('editing'));
-//       if (!this.get('editing')) {
-//         this.send('updateLog');
-//       }      
-//     } 
-//   }
-// });
-
-// App.DessionAdapter = DS.RESTAdapter.extend({
-// });
-
-// App.LogAdapter = DS.RESTAdapter.extend({
-//   // primaryKey: '_id'
-// });
-
-// App.LogSerializer = DS.RESTSerializer.extend({
-//   primaryKey: '_id'
-// });
-
-// App.DessionSerializer = DS.RESTSerializer.extend({
-//   primaryKey: '_id'
-// });
-
-// App.DessionAdapter = DS.FixtureAdapter.extend();
-// App.LogAdapter = DS.FixtureAdapter.extend();
-
-// App.Dession.FIXTURES = [
-// {
-//   id: 1,
-//   extra: 'dave',
-//   logs: [1, 2, 3]
-// }
-// ]
-
-// var dateObj = new Date();
-
-// App.Log.FIXTURES = [
-//   {
-//     id: 1,    
-//     timestamp: new Date(dateObj.getTime() + 1000),
-//     parms: 'parms1',
-//     dession: 1
-//   },
-//   {
-//     id: 2,
-//     timestamp: new Date(dateObj.getTime() + 7000),
-//     parms: 'parms2',
-//     dession: 1
-//   },
-//   {
-//     id: 3,
-//     timestamp:  new Date(dateObj.getTime() + 3000),
-//     parms: 'parms3',
-//     dession: 1
-//   }
-// ];
\ No newline at end of file
diff --git a/dashboard/lib/app_old/mixins.js b/dashboard/lib/app_old/mixins.js
deleted file mode 100644
index 784b42a..0000000
--- a/dashboard/lib/app_old/mixins.js
+++ /dev/null
@@ -1,21 +0,0 @@
-App.WfColors = Ember.Mixin.create({
-  colors: ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2'],
-  wfStates: [
-      'Other',
-      'Define Problem',
-      'Get Data',
-      'Explore Data',
-      'Create View',
-      'Enrich Data',
-      'Transform Data'
-      ],
-  wfStates2: [
-    {id: 0, name: 'Other'},
-    {id: 1, name: 'Define Problem'},
-    {id: 2, name: 'Get Data'},
-    {id: 3, name: 'Explore Data'},
-    {id: 4, name: 'Create View'},
-    {id: 5, name: 'Enrich Data'},
-    {id: 6, name: 'Transform Data'}
-  ]
-});
\ No newline at end of file
diff --git a/dashboard/lib/app_old/todos.js b/dashboard/lib/app_old/todos.js
deleted file mode 100644
index 8729445..0000000
--- a/dashboard/lib/app_old/todos.js
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
-// // App.Dession = DS.Model.extend({
-// //   logs: DS.hasMany('log', {embedded: true}),
-// //   extra: DS.attr()
-// // })
-
-// // App.Log = DS.Model.extend({
-// //   // sessionID: DS.attr('string'),
-// //   timestamp: DS.attr('date'),
-// //   parms: DS.attr(),
-// //   // dave: DS.attr('string'),
-// //   // isCompleted: DS.attr('boolean'),
-// //   editable: false,
-// //   dession: DS.belongsTo('dession')
-// // })
-
-// // console.log('hey')
-// // App.LogAdapter = DS.RESTAdapter.extend({
-// //   primaryKey: '_id'
-// // });
-
-// // App.LogSerializer = DS.RESTSerializer.extend({
-// //   primaryKey: '_id',
-// //   // normalizeHash: {
-// //   //   type: function(hash) {
-// //   //     console.log(hash);
-// //   //     hash.dave = hash.type;
-// //   //     delete hash.type;
-// //   //     return hash;
-// //   //   }
-// //   // }
-// // });
-// App.Dession = Ember.Object.extend({
-//   // start?l,
-// });
-
-// App.Log = Ember.Object.extend({
-//   // start?l,
-// });
-
-// App.Dession.reopenClass({
-//   find: function(postId) {
-//     // Set some default properties here.
-//     var result = Ember.Object.create({
-//       isLoaded: false
-//     });
-
-//     $.getJSON('/dessions/1', function(data) {
-//       console.log(data)
-//       data.logs.forEach(function(d){ d.timestamp = new Date(d.timestamp); })
-//       result.setProperties(data);
-//       result.set('isLoaded', true);
-
-//       // App.LogsController.set('content', data.logs);
-//     });
-
-//     return result;
-//   }
-// });
-
-
-// // App.TodosRoute = Ember.Route.extend({
-// //   // model: function() {
-// //   //   console.log(this.store.find('todo'))
-// //   //   return this.store.find('todo');
-// //   // }
-// //   model: function() {
-// //     console.log(this.store.find('todoList'))
-// //     return this.store.find('todoList');
-// //   }
-// // });
-
-
-
-// App.DessionRoute = Ember.Route.extend({
-//   // model: function() {
-//   //   console.log(this.store.find('todo'))
-//   //   return this.store.find('todo');
-//   // }
-//   // setupController: function(controller, model) {
-//   //   console.log(model, this.controllerFor('logs'));
-//   //   controller.set('model', model);
-//   //   this.controllerFor('logs').set('model', model.logs);
-//   // },
-//   model: function() {
-//     // console.log(this.store.find('dession', 1))
-//     // return this.store.find('dession', 1);
-//     return App.Dession.find();
-//   }
-// });
-
-// // App.TodosRoute = Ember.Route.extend({
-// //   // model: function() {
-// //   //   console.log(this.store.find('todo'))
-// //   //   return this.store.find('todo');
-// //   // }
-// //   model: function() {
-// //     // console.log(this.store.find('todo'))
-// //     return this.store.find('todoList');
-// //   }
-// // });
-
-// App.LogsController = Ember.ArrayController.extend({
-//  sortProperties: ['timestamp'],
-//  itemController: 'log',
-//   actions: {
-//     // createTodo: function() {
-//     //   console.log('createTodo');
-
-//     //   var dateObj = this.get('timestamp');
-//     //   console.log(dateObj);
-//     //   dateObj += 1;
-
-//     //   var timestamp = new Date(dateObj);      
-
-//     //   // Create the new Todo model
-//     //   var todo = this.store.createRecord('todo', {
-//     //     timestamp: timestamp
-//     //   });
-
-//     //   // // Clear the "New Todo" text field
-//     //   // this.set('newTitle', '');
-
-//     //   // Save the new model
-//     //   // todo.save();
-//     // }
-//   }
-// });
-
-// App.LogController = Ember.ObjectController.extend({
-//  // sortProperties: ['timestamp'],
-//  needs: ['dession'],
-//  wfStates: [0,1,2,3,4,5,6],
-//   actions: {
-//     createTodo: function() {
-//       console.log('createTodo');
-
-//       var dateObj = this.get('timestamp');
-//       // console.log(dateObj);
-//       // dateObj += 1;
-
-//       var timestamp = new Date(dateObj.getTime() + 1); 
-
-//       console.log('New Log', dateObj, timestamp, this)     
-
-//       var log = Ember.Object.create({
-//         timestamp: timestamp,
-//         editable: true,
-//         isLoaded: true
-//       });
-
-//       this.get('controllers.dession.logs').addObject(log);
-
-//       console.log(this.get('controllers.dession.logs').length)
-
-//     // $.getJSON('/dessions/1', function(data) {
-//     //   console.log(data)
-//     //   data.logs.forEach(function(d){ d.timestamp = new Date(d.timestamp); })
-//     //   result.setProperties(data);
-//     //   result.set('isLoaded', true);
-//     // });
-
-//       // Create the new Todo model
-//       // var todo = this.store.createRecord('log', {
-//       //   timestamp: timestamp,
-//       //   editable: true,
-//       //   dession: this.get('controllers.dession')
-//       // });
-
-//       // // Clear the "New Todo" text field
-//       // this.set('newTitle', '');
-
-//       // Save the new model
-//       // todo.save();
-//     },
-//     removeLog: function() {
-//     var log = this.get('model');
-//     log.deleteRecord();
-//     // todo.save();
-//   },
-//   }
-// });
-
-
-
-
-
-
-
-
-
-
-// // App.TodoAdapter = DS.FixtureAdapter.extend();
-
-// // App.Todo.FIXTURES = [
-// //  {
-// //    id: 1,
-// //    title: 'Learn Ember.js',
-// //    isCompleted: true
-// //  },
-// //  {
-// //    id: 2,
-// //    title: '...',
-// //    isCompleted: false
-// //  },
-// //  {
-// //    id: 3,
-// //    title: 'Profit!',
-// //    isCompleted: false
-// //  }
-// // ];
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/angular-animate.min.js b/dashboard/lib/assets/angular/angular-animate.min.js
deleted file mode 100644
index 83ddae6..0000000
--- a/dashboard/lib/assets/angular/angular-animate.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- AngularJS v1.2.0-rc.3
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(m,f,n){'use strict';f.module("ngAnimate",["ng"]).config(["$provide","$animateProvider",function(A,s){var v=f.noop,w=f.forEach,B=s.$$selectors,k="$$ngAnimateState",x="ng-animate",u={running:!0};A.decorator("$animate",["$delegate","$injector","$sniffer","$rootElement","$timeout","$rootScope",function(q,m,y,n,p,g){function G(a){if(a){var c=[],b={};a=a.substr(1).split(".");(y.transitions||y.animations)&&a.push("");for(var e=0;e<a.length;e++){var d=a[e],l=B[d];l&&!b[d]&&(c.push(m.get(l)),b[d]=
-!0)}return c}}function d(a,c,b,e,d,f){function g(){if(!g.hasBeenRun){g.hasBeenRun=!0;var a=b.data(k);a&&(r?l(b):(a.flagTimer=p(function(){l(b)},0,!1),b.data(k,a)));(f||v)()}}var q=(" "+((b.attr("class")||"")+" "+c)).replace(/\s+/g,"."),h=[];w(G(q),function(c,b){h.push({start:c[a]})});e||(e=d?d.parent():b.parent());d={running:!0};if((e.inheritedData(k)||d).running||0==h.length)g();else{e=b.data(k)||{};var r="addClass"==a||"removeClass"==a;if(e.running){if(r&&e.structural){f&&f();return}p.cancel(e.flagTimer);
-t(e.animations);(e.done||v)()}b.data(k,{running:!0,structural:!r,animations:h,done:g});b.addClass(x);w(h,function(a,e){var d=function(){a:{h[e].done=!0;(h[e].endFn||v)();for(var a=0;a<h.length;a++)if(!h[a].done)break a;g()}};a.start?a.endFn=r?a.start(b,c,d):a.start(b,d):d()})}}function z(a){f.forEach(a[0].querySelectorAll("."+x),function(a){a=f.element(a);var b=a.data(k);b&&(t(b.animations),l(a))})}function t(a){w(a,function(a){(a.endFn||v)(!0)})}function l(a){a.removeClass(x);a.removeData(k)}n.data(k,
-u);return{enter:function(a,c,b,e){this.enabled(!1,a);q.enter(a,c,b);g.$$postDigest(function(){d("enter","ng-enter",a,c,b,function(){e&&p(e,0,!1)})})},leave:function(a,c){z(a);this.enabled(!1,a);g.$$postDigest(function(){d("leave","ng-leave",a,null,null,function(){q.leave(a,c)})})},move:function(a,c,b,e){z(a);this.enabled(!1,a);q.move(a,c,b);g.$$postDigest(function(){d("move","ng-move",a,null,null,function(){e&&p(e,0,!1)})})},addClass:function(a,c,b){d("addClass",c,a,null,null,function(){q.addClass(a,
-c,b)})},removeClass:function(a,c,b){d("removeClass",c,a,null,null,function(){q.removeClass(a,c,b)})},enabled:function(a,c){switch(arguments.length){case 2:if(a)l(c);else{var b=c.data(k)||{};b.structural=!0;b.running=!0;c.data(k,b)}break;case 1:u.running=!a;break;default:a=!u.running}return!!a}}}]);s.register("",["$window","$sniffer","$timeout",function(k,v,y){function w(a){C.push(a);y.cancel(D);D=y(function(){f.forEach(C,function(a){a()});C=[];D=null;r={}},10,!1)}function p(a,b,d){var f=r[b];if(!f){var h=
-0,E=0,p=0,m=0;t(a,function(a){if(a.nodeType==B&&(a=k.getComputedStyle(a)||{},h=Math.max(g(a[l+e]),h),!d)){E=Math.max(g(a[l+s]),E);m=Math.max(g(a[c+s]),m);var b=g(a[c+e]);0<b&&(b*=parseInt(a[c+A])||1);p=Math.max(b,p)}});f={transitionDelay:E,animationDelay:m,transitionDuration:h,animationDuration:p};r[b]=f}return f}function g(a){var b=0;a=f.isString(a)?a.split(/\s*,\s*/):[];t(a,function(a){b=Math.max(parseFloat(a)||0,b)});return b}function x(a){var b=a.parent(),c=b.data(h);c||(b.data(h,++F),c=F);return c+
-"-"+a[0].className}function d(c,d,e){function f(a){a.stopPropagation();a=a.originalEvent||a;var b=a.$manualTimeStamp||a.timeStamp||Date.now();Math.max(b-r,0)>=m&&a.elapsedTime>=k&&e()}var h=x(c);if(!(0<p(c,h,!0).transitionDuration)){c.addClass(d);var g=p(c,h+" "+d),k=Math.max(g.transitionDuration,g.animationDuration);if(0<k){var m=1E3*Math.max(g.transitionDelay,g.animationDelay),r=Date.now(),q=c[0];0<g.transitionDuration&&(q.style[l+u]="none");var n="";t(d.split(" "),function(a,b){n+=(0<b?" ":"")+
-a+"-active"});var s=b+" "+a;w(function(){0<g.transitionDuration&&(q.style[l+u]="");c.addClass(n)});c.on(s,f);return function(a){c.off(s,f);c.removeClass(d);c.removeClass(n);a&&e()}}c.removeClass(d)}e()}function z(a,b){var c="";a=f.isArray(a)?a:a.split(/\s+/);t(a,function(a,d){a&&0<a.length&&(c+=(0<d?" ":"")+a+b)});return c}var t=f.forEach,l,a,c,b;m.ontransitionend===n&&m.onwebkittransitionend!==n?(l="WebkitTransition",a="webkitTransitionEnd transitionend"):(l="transition",a="transitionend");m.onanimationend===
-n&&m.onwebkitanimationend!==n?(c="WebkitAnimation",b="webkitAnimationEnd animationend"):(c="animation",b="animationend");var e="Duration",u="Property",s="Delay",A="IterationCount",B=1,h="$ngAnimateKey",r={},F=0,C=[],D;return{enter:function(a,b){return d(a,"ng-enter",b)},leave:function(a,b){return d(a,"ng-leave",b)},move:function(a,b){return d(a,"ng-move",b)},addClass:function(a,b,c){return d(a,z(b,"-add"),c)},removeClass:function(a,b,c){return d(a,z(b,"-remove"),c)}}}])}])})(window,window.angular);
-//# sourceMappingURL=angular-animate.min.js.map
diff --git a/dashboard/lib/assets/angular/angular-resource.min.js b/dashboard/lib/assets/angular/angular-resource.min.js
deleted file mode 100644
index b3e0221..0000000
--- a/dashboard/lib/assets/angular/angular-resource.min.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- AngularJS v1.2.0-rc.3
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(H,h,C){'use strict';var x=h.$$minErr("$resource");h.module("ngResource",["ng"]).factory("$resource",["$http","$parse","$q",function(D,y,E){function n(h,k){this.template=h;this.defaults=k||{};this.urlParams={}}function t(e,k,f){function q(b,c){var d={};c=u({},k,c);r(c,function(a,c){s(a)&&(a=a());var m;a&&a.charAt&&"@"==a.charAt(0)?(m=a.substr(1),m=y(m)(b)):m=a;d[c]=m});return d}function d(b){return b.resource}function g(b){z(b||{},this)}var F=new n(e);f=u({},G,f);r(f,function(b,c){var A=
-/^(POST|PUT|PATCH)$/i.test(b.method);g[c]=function(a,c,m,k){var p={},e,f,v;switch(arguments.length){case 4:v=k,f=m;case 3:case 2:if(s(c)){if(s(a)){f=a;v=c;break}f=c;v=m}else{p=a;e=c;f=m;break}case 1:s(a)?f=a:A?e=a:p=a;break;case 0:break;default:throw x("badargs",arguments.length);}var n=e instanceof g,l=n?e:b.isArray?[]:new g(e),w={},t=b.interceptor&&b.interceptor.response||d,y=b.interceptor&&b.interceptor.responseError||C;r(b,function(a,c){"params"!=c&&("isArray"!=c&&"interceptor"!=c)&&(w[c]=z(a))});
-A&&(w.data=e);F.setUrlParams(w,u({},q(e,b.params||{}),p),b.url);p=D(w).then(function(c){var a=c.data,d=l.$promise;if(a){if(h.isArray(a)!=!!b.isArray)throw x("badcfg",b.isArray?"array":"object",h.isArray(a)?"array":"object");b.isArray?(l.length=0,r(a,function(a){l.push(new g(a))})):(z(a,l),l.$promise=d)}l.$resolved=!0;c.resource=l;return c},function(a){l.$resolved=!0;(v||B)(a);return E.reject(a)});p=p.then(function(a){var c=t(a);(f||B)(c,a.headers);return c},y);return n?p:(l.$promise=p,l.$resolved=
-!1,l)};g.prototype["$"+c]=function(a,b,d){s(a)&&(d=b,b=a,a={});a=g[c](a,this,b,d);return a.$promise||a}});g.bind=function(b){return t(e,u({},k,b),f)};return g}var G={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},B=h.noop,r=h.forEach,u=h.extend,z=h.copy,s=h.isFunction;n.prototype={setUrlParams:function(e,k,f){var q=this,d=f||q.template,g,n,b=q.urlParams={};r(d.split(/\W/),function(c){if("hasOwnProperty"===c)throw x("badname");
-!/^\d+$/.test(c)&&(c&&RegExp("(^|[^\\\\]):"+c+"(\\W|$)").test(d))&&(b[c]=!0)});d=d.replace(/\\:/g,":");k=k||{};r(q.urlParams,function(c,b){g=k.hasOwnProperty(b)?k[b]:q.defaults[b];h.isDefined(g)&&null!==g?(n=encodeURIComponent(g).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),d=d.replace(RegExp(":"+b+"(\\W|$)","g"),n+"$1")):d=d.replace(RegExp("(/?):"+b+"(\\W|$)","g"),function(a,
-c,b){return"/"==b.charAt(0)?b:c+b})});d=d.replace(/\/+$/,"");d=d.replace(/\/\.(?=\w+($|\?))/,".");e.url=d.replace(/\/\\\./,"/.");r(k,function(c,b){q.urlParams[b]||(e.params=e.params||{},e.params[b]=c)})}};return t}])})(window,window.angular);
-//# sourceMappingURL=angular-resource.min.js.map
diff --git a/dashboard/lib/assets/angular/angular-route.min.js b/dashboard/lib/assets/angular/angular-route.min.js
deleted file mode 100644
index deb4c41..0000000
--- a/dashboard/lib/assets/angular/angular-route.min.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- AngularJS v1.2.0-rc.3
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(u,c,A){'use strict';function w(c,s,g,b,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(l,m,y){return function(p,l,m){function k(){h&&(h.$destroy(),h=null);q&&(d.leave(q),q=null)}function x(){var a=c.current&&c.current.locals,e=a&&a.$template;if(e){var r=p.$new();y(r,function(v){k();v.html(e);d.enter(v,null,l);var f=g(v.contents()),n=c.current;h=n.scope=r;q=v;if(n.controller){a.$scope=h;var p=b(n.controller,a);n.controllerAs&&(h[n.controllerAs]=p);
-v.data("$ngControllerController",p);v.children().data("$ngControllerController",p)}f(h);h.$emit("$viewContentLoaded");h.$eval(t);s()})}else k()}var h,q,t=m.onload||"";p.$on("$routeChangeSuccess",x);x()}}}}u=c.module("ngRoute",["ng"]).provider("$route",function(){function u(b,d){return c.extend(new (c.extend(function(){},{prototype:b})),d)}function s(b,c){var l=c.caseInsensitiveMatch,m={originalPath:b,regexp:b},g=m.keys=[];b=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?|\*])?/g,function(b,
-c,d,k){b="?"===k?k:null;k="*"===k?k:null;g.push({name:d,optional:!!b});c=c||"";return""+(b?"":c)+"(?:"+(b?c:"")+(k&&"(.+?)"||"([^/]+)")+(b||"")+")"+(b||"")}).replace(/([\/$\*])/g,"\\$1");m.regexp=RegExp("^"+b+"$",l?"i":"");return m}var g={};this.when=function(b,d){g[b]=c.extend({reloadOnSearch:!0},d,b&&s(b,d));if(b){var l="/"==b[b.length-1]?b.substr(0,b.length-1):b+"/";g[l]=c.extend({redirectTo:b},s(l,d))}return this};this.otherwise=function(b){this.when(null,b);return this};this.$get=["$rootScope",
-"$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(b,d,l,m,s,p,w,z){function k(){var a=x(),e=t.current;if(a&&e&&a.$$route===e.$$route&&c.equals(a.pathParams,e.pathParams)&&!a.reloadOnSearch&&!q)e.params=a.params,c.copy(e.params,l),b.$broadcast("$routeUpdate",e);else if(a||e)q=!1,b.$broadcast("$routeChangeStart",a,e),(t.current=a)&&a.redirectTo&&(c.isString(a.redirectTo)?d.path(h(a.redirectTo,a.params)).search(a.params).replace():d.url(a.redirectTo(a.pathParams,d.path(),
-d.search())).replace()),m.when(a).then(function(){if(a){var b=c.extend({},a.resolve),e,f;c.forEach(b,function(a,e){b[e]=c.isString(a)?s.get(a):s.invoke(a)});c.isDefined(e=a.template)?c.isFunction(e)&&(e=e(a.params)):c.isDefined(f=a.templateUrl)&&(c.isFunction(f)&&(f=f(a.params)),f=z.getTrustedResourceUrl(f),c.isDefined(f)&&(a.loadedTemplateUrl=f,e=p.get(f,{cache:w}).then(function(a){return a.data})));c.isDefined(e)&&(b.$template=e);return m.all(b)}}).then(function(d){a==t.current&&(a&&(a.locals=d,
-c.copy(a.params,l)),b.$broadcast("$routeChangeSuccess",a,e))},function(c){a==t.current&&b.$broadcast("$routeChangeError",a,e,c)})}function x(){var a,b;c.forEach(g,function(r,k){var f;if(f=!b){var n=d.path();f=r.keys;var h={};if(r.regexp)if(n=r.regexp.exec(n)){for(var g=1,l=n.length;g<l;++g){var m=f[g-1],p="string"==typeof n[g]?decodeURIComponent(n[g]):n[g];m&&p&&(h[m.name]=p)}f=h}else f=null;else f=null;f=a=f}f&&(b=u(r,{params:c.extend({},d.search(),a),pathParams:a}),b.$$route=r)});return b||g[null]&&
-u(g[null],{params:{},pathParams:{}})}function h(a,b){var d=[];c.forEach((a||"").split(":"),function(a,c){if(0===c)d.push(a);else{var g=a.match(/(\w+)(.*)/),h=g[1];d.push(b[h]);d.push(g[2]||"");delete b[h]}});return d.join("")}var q=!1,t={routes:g,reload:function(){q=!0;b.$evalAsync(k)}};b.$on("$locationChangeSuccess",k);return t}]});u.provider("$routeParams",function(){this.$get=function(){return{}}});u.directive("ngView",w);w.$inject=["$route","$anchorScroll","$compile","$controller","$animate"]})(window,
-window.angular);
-//# sourceMappingURL=angular-route.min.js.map
diff --git a/dashboard/lib/assets/angular/angular-sanitize.min.js b/dashboard/lib/assets/angular/angular-sanitize.min.js
deleted file mode 100644
index 94d275e..0000000
--- a/dashboard/lib/assets/angular/angular-sanitize.min.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- AngularJS v1.2.0-rc.3
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(m,g,n){'use strict';function h(a){var d={};a=a.split(",");var c;for(c=0;c<a.length;c++)d[a[c]]=!0;return d}function D(a,d){function c(a,b,c,f){b=g.lowercase(b);if(r[b])for(;e.last()&&s[e.last()];)k("",e.last());t[b]&&e.last()==b&&k("",b);(f=u[b]||!!f)||e.push(b);var l={};c.replace(E,function(a,b,d,c,e){l[b]=p(d||c||e||"")});d.start&&d.start(b,l,f)}function k(a,b){var c=0,k;if(b=g.lowercase(b))for(c=e.length-1;0<=c&&e[c]!=b;c--);if(0<=c){for(k=e.length-1;k>=c;k--)d.end&&d.end(e[k]);e.length=
-c}}var b,f,e=[],l=a;for(e.last=function(){return e[e.length-1]};a;){f=!0;if(e.last()&&v[e.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(F,"$1").replace(G,"$1");d.chars&&d.chars(p(b));return""}),k("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(d.comment&&d.comment(a.substring(4,b)),a=a.substring(b+3),f=!1);else if(w.test(a)){if(b=a.match(w))a=a.replace(b[0],""),f=!1}else if(H.test(a)){if(b=a.match(x))a=
-a.substring(b[0].length),b[0].replace(x,k),f=!1}else I.test(a)&&(b=a.match(y))&&(a=a.substring(b[0].length),b[0].replace(y,c),f=!1);f&&(b=a.indexOf("<"),f=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(p(f)))}if(a==l)throw J("badparse",a);l=a}k()}function p(a){q.innerHTML=a.replace(/</g,"&lt;");return q.innerText||q.textContent||""}function z(a){return a.replace(/&/g,"&amp;").replace(K,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function A(a){var d=
-!1,c=g.bind(a,a.push);return{start:function(a,b,f){a=g.lowercase(a);!d&&v[a]&&(d=a);d||!0!=B[a]||(c("<"),c(a),g.forEach(b,function(a,b){var d=g.lowercase(b);!0!=L[d]||!0===C[d]&&!a.match(M)||(c(" "),c(b),c('="'),c(z(a)),c('"'))}),c(f?"/>":">"))},end:function(a){a=g.lowercase(a);d||!0!=B[a]||(c("</"),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||c(z(a))}}}var J=g.$$minErr("$sanitize"),y=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,x=/^<\s*\/\s*([\w:-]+)[^>]*>/,
-E=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,I=/^</,H=/^<\s*\//,F=/\x3c!--(.*?)--\x3e/g,w=/<!DOCTYPE([^>]*?)>/i,G=/<!\[CDATA\[(.*?)]]\x3e/g,M=/^((ftp|https?):\/\/|mailto:|tel:|#)/i,K=/([^\#-~| |!])/g,u=h("area,br,col,hr,img,wbr");m=h("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");n=h("rp,rt");var t=g.extend({},n,m),r=g.extend({},m,h("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),
-s=g.extend({},n,h("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),v=h("script,style"),B=g.extend({},u,r,s,t),C=h("background,cite,href,longdesc,src,usemap"),L=g.extend({},C,h("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,span,start,summary,target,title,type,valign,value,vspace,width")),
-q=document.createElement("pre");g.module("ngSanitize",[]).value("$sanitize",function(a){var d=[];D(a,A(d));return d.join("")});g.module("ngSanitize").filter("linky",function(){var a=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,d=/^mailto:/;return function(c,k){if(!c)return c;var b,f=c,e=[],l=A(e),h,m,n={};g.isDefined(k)&&(n.target=k);for(;b=f.match(a);)h=b[0],b[2]==b[3]&&(h="mailto:"+h),m=b.index,l.chars(f.substr(0,m)),n.href=h,l.start("a",n),l.chars(b[0].replace(d,
-"")),l.end("a"),f=f.substring(m+b[0].length);l.chars(f);return e.join("")}})})(window,window.angular);
-//# sourceMappingURL=angular-sanitize.min.js.map
diff --git a/dashboard/lib/assets/angular/angular.min.js b/dashboard/lib/assets/angular/angular.min.js
deleted file mode 100644
index e1fd419..0000000
--- a/dashboard/lib/assets/angular/angular.min.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- AngularJS v1.2.0-rc.3
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(Y,R,s){'use strict';function D(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/undefined/"+(b?b+"/":"")+a;for(c=1;c<arguments.length;c++)a=a+(1==c?"?":"&")+"p"+(c-1)+"="+encodeURIComponent("function"==typeof arguments[c]?arguments[c].toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof arguments[c]?"undefined":"string"!=typeof arguments[c]?JSON.stringify(arguments[c]):arguments[c]);return Error(a)}}function nb(b){if(null==b||ya(b))return!1;
-var a=b.length;return 1===b.nodeType&&a?!0:F(b)||H(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function p(b,a,c){var d;if(b)if(E(b))for(d in b)"prototype"!=d&&("length"!=d&&"name"!=d&&b.hasOwnProperty(d))&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==p)b.forEach(a,c);else if(nb(b))for(d=0;d<b.length;d++)a.call(c,b[d],d);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d);return b}function Lb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}function Gc(b,a,c){for(var d=
-Lb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function Mb(b){return function(a,c){b(c,a)}}function Va(){for(var b=ia.length,a;b;){b--;a=ia[b].charCodeAt(0);if(57==a)return ia[b]="A",ia.join("");if(90==a)ia[b]="0";else return ia[b]=String.fromCharCode(a+1),ia.join("")}ia.unshift("0");return ia.join("")}function Nb(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function G(b){var a=b.$$hashKey;p(arguments,function(a){a!==b&&p(a,function(a,c){b[c]=a})});Nb(b,a);return b}function W(b){return parseInt(b,
-10)}function Hc(b,a){return G(new (G(function(){},{prototype:b})),a)}function v(){}function za(b){return b}function aa(b){return function(){return b}}function z(b){return"undefined"==typeof b}function w(b){return"undefined"!=typeof b}function S(b){return null!=b&&"object"==typeof b}function F(b){return"string"==typeof b}function ob(b){return"number"==typeof b}function Ha(b){return"[object Date]"==Wa.apply(b)}function H(b){return"[object Array]"==Wa.apply(b)}function E(b){return"function"==typeof b}
-function Xa(b){return"[object RegExp]"==Wa.apply(b)}function ya(b){return b&&b.document&&b.location&&b.alert&&b.setInterval}function Ic(b){return b&&(b.nodeName||b.on&&b.find)}function Jc(b,a,c){var d=[];p(b,function(b,f,g){d.push(a.call(c,b,f,g))});return d}function Ya(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Ia(b,a){var c=Ya(b,a);0<=c&&b.splice(c,1);return a}function fa(b,a){if(ya(b)||b&&b.$evalAsync&&b.$watch)throw Ja("cpws");if(a){if(b===
-a)throw Ja("cpi");if(H(b))for(var c=a.length=0;c<b.length;c++)a.push(fa(b[c]));else{c=a.$$hashKey;p(a,function(b,c){delete a[c]});for(var d in b)a[d]=fa(b[d]);Nb(a,c)}}else(a=b)&&(H(b)?a=fa(b,[]):Ha(b)?a=new Date(b.getTime()):Xa(b)?a=RegExp(b.source):S(b)&&(a=fa(b,{})));return a}function Kc(b,a){a=a||{};for(var c in b)b.hasOwnProperty(c)&&"$$"!==c.substr(0,2)&&(a[c]=b[c]);return a}function Aa(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&
-"object"==c)if(H(b)){if(!H(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!Aa(b[d],a[d]))return!1;return!0}}else{if(Ha(b))return Ha(a)&&b.getTime()==a.getTime();if(Xa(b)&&Xa(a))return b.toString()==a.toString();if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||ya(b)||ya(a)||H(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!E(b[d])){if(!Aa(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==s&&!E(a[d]))return!1;return!0}return!1}function pb(b,
-a){var c=2<arguments.length?ua.call(arguments,2):[];return!E(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(ua.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}}function Lc(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)?c=s:ya(a)?c="$WINDOW":a&&R===a?c="$DOCUMENT":a&&(a.$evalAsync&&a.$watch)&&(c="$SCOPE");return c}function oa(b,a){return"undefined"===typeof b?s:JSON.stringify(b,Lc,a?"  ":null)}function Ob(b){return F(b)?
-JSON.parse(b):b}function Ka(b){b&&0!==b.length?(b=B(""+b),b=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)):b=!1;return b}function ga(b){b=x(b).clone();try{b.html("")}catch(a){}var c=x("<div>").append(b).html();try{return 3===b[0].nodeType?B(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+B(b)})}catch(d){return B(c)}}function Pb(b){try{return decodeURIComponent(b)}catch(a){}}function Qb(b){var a={},c,d;p((b||"").split("&"),function(b){b&&(c=b.split("="),d=Pb(c[0]),
-w(d)&&(b=w(c[1])?Pb(c[1]):!0,a[d]?H(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Rb(b){var a=[];p(b,function(b,d){H(b)?p(b,function(b){a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))}):a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))});return a.length?a.join("&"):""}function qb(b){return va(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function va(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,
-a?"%20":"+")}function Mc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;p(g,function(a){g[a]=!0;c(R.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(p(b.querySelectorAll("."+a),c),p(b.querySelectorAll("."+a+"\\:"),c),p(b.querySelectorAll("["+a+"]"),c))});p(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):p(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}});
-e&&a(e,f?[f]:[])}function Sb(b,a){var c=function(){b=x(b);if(b.injector()){var c=b[0]===R?"document":ga(b);throw Ja("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=Tb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)});e.enabled(!0)}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(Y&&!d.test(Y.name))return c();Y.name=Y.name.replace(d,"");Za.resumeBootstrap=
-function(b){p(b,function(b){a.push(b)});c()}}function $a(b,a){a=a||"_";return b.replace(Nc,function(b,d){return(d?a:"")+b.toLowerCase()})}function rb(b,a,c){if(!b)throw Ja("areq",a||"?",c||"required");return b}function La(b,a,c){c&&H(b)&&(b=b[b.length-1]);rb(E(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b));return b}function pa(b,a){if("hasOwnProperty"===b)throw Ja("badname",a);}function sb(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=
-0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&E(b)?pb(e,b):b}function Oc(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=D("$injector");return a(a(b,"angular",Object),"module",function(){var b={};return function(e,f,g){pa(e,"module");f&&b.hasOwnProperty(e)&&(b[e]=null);return a(b,e,function(){function a(c,d,e){return function(){b[e||"push"]([c,d,arguments]);return r}}if(!f)throw c("nomod",e);var b=[],d=[],l=a("$injector","invoke"),r={_invokeQueue:b,_runBlocks:d,requires:f,name:e,provider:a("$provide",
-"provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:l,run:function(a){d.push(a);return this}};g&&l(g);return r})}})}function Ma(b){return b.replace(Pc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(Qc,"Moz$1")}function tb(b,
-a,c,d){function e(b){var e=c&&b?[this.filter(b)]:[this],m=a,k,l,r,q,n,y;if(!d||null!=b)for(;e.length;)for(k=e.shift(),l=0,r=k.length;l<r;l++)for(q=x(k[l]),m?q.triggerHandler("$destroy"):m=!m,n=0,q=(y=q.children()).length;n<q;n++)e.push(Ba(y[n]));return f.apply(this,arguments)}var f=Ba.fn[b],f=f.$original||f;e.$original=f;Ba.fn[b]=e}function J(b){if(b instanceof J)return b;if(!(this instanceof J)){if(F(b)&&"<"!=b.charAt(0))throw ub("nosel");return new J(b)}if(F(b)){var a=R.createElement("div");a.innerHTML=
-"<div>&#160;</div>"+b;a.removeChild(a.firstChild);vb(this,a.childNodes);x(R.createDocumentFragment()).append(this)}else vb(this,b)}function wb(b){return b.cloneNode(!0)}function Na(b){Ub(b);var a=0;for(b=b.childNodes||[];a<b.length;a++)Na(b[a])}function Vb(b,a,c,d){if(w(d))throw ub("offargs");var e=ja(b,"events");ja(b,"handle")&&(z(a)?p(e,function(a,c){xb(b,c,a);delete e[c]}):p(a.split(" "),function(a){z(c)?(xb(b,a,e[a]),delete e[a]):Ia(e[a]||[],c)}))}function Ub(b,a){var c=b[ab],d=Oa[c];d&&(a?delete Oa[c].data[a]:
-(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Vb(b)),delete Oa[c],b[ab]=s))}function ja(b,a,c){var d=b[ab],d=Oa[d||-1];if(w(c))d||(b[ab]=d=++Rc,d=Oa[d]={}),d[a]=c;else return d&&d[a]}function Wb(b,a,c){var d=ja(b,"data"),e=w(c),f=!e&&w(a),g=f&&!S(a);d||g||ja(b,"data",d={});if(e)d[a]=c;else if(f){if(g)return d&&d[a];G(d,a)}else return d}function yb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function zb(b,a){a&&b.setAttribute&&
-p(a.split(" "),function(a){b.setAttribute("class",ba((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+ba(a)+" "," ")))})}function Ab(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");p(a.split(" "),function(a){a=ba(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",ba(c))}}function vb(b,a){if(a){a=a.nodeName||!w(a.length)||ya(a)?[a]:a;for(var c=0;c<a.length;c++)b.push(a[c])}}function Xb(b,a){return bb(b,"$"+(a||
-"ngController")+"Controller")}function bb(b,a,c){b=x(b);for(9==b[0].nodeType&&(b=b.find("html"));b.length;){if((c=b.data(a))!==s)return c;b=b.parent()}}function Yb(b,a){var c=cb[a.toLowerCase()];return c&&Zb[b.nodeName]&&c}function Sc(b,a){var c=function(c,e){c.preventDefault||(c.preventDefault=function(){c.returnValue=!1});c.stopPropagation||(c.stopPropagation=function(){c.cancelBubble=!0});c.target||(c.target=c.srcElement||R);if(z(c.defaultPrevented)){var f=c.preventDefault;c.preventDefault=function(){c.defaultPrevented=
-!0;f.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented||!1==c.returnValue};p(a[e||c.type],function(a){a.call(b,c)});8>=Q?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ca(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c===s&&(c=b.$$hashKey=Va()):c=b;return a+":"+c}function Pa(b){p(b,
-this.put,this)}function $b(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(Tc,""),c=c.match(Uc),p(c[1].split(Vc),function(b){b.replace(Wc,function(b,c,d){a.push(d)})})),b.$inject=a):H(b)?(c=b.length-1,La(b[c],"fn"),a=b.slice(0,c)):La(b,"fn",!0);return a}function Tb(b){function a(a){return function(b,c){if(S(b))p(b,Mb(a));else return a(b,c)}}function c(a,b){pa(a,"service");if(E(b)||H(b))b=r.instantiate(b);if(!b.$get)throw Qa("pget",a);return l[a+h]=b}function d(a,
-b){return c(a,{$get:b})}function e(a){var b=[];p(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(F(a)){var c=Ra(a);b=b.concat(e(c.requires)).concat(c._runBlocks);for(var d=c._invokeQueue,c=0,f=d.length;c<f;c++){var h=d[c],g=r.get(h[0]);g[h[1]].apply(g,h[2])}}else E(a)?b.push(r.invoke(a)):H(a)?b.push(r.invoke(a)):La(a,"module")}catch(m){throw H(a)&&(a=a[a.length-1]),m.message&&(m.stack&&-1==m.stack.indexOf(m.message))&&(m=m.message+"\n"+m.stack),Qa("modulerr",a,m.stack||m.message||m);}}});return b}
-function f(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===g)throw Qa("cdep",m.join(" <- "));return a[d]}try{return m.unshift(d),a[d]=g,a[d]=b(d)}finally{m.shift()}}function d(a,b,e){var f=[],k=$b(a),h,g,m;g=0;for(h=k.length;g<h;g++){m=k[g];if("string"!==typeof m)throw Qa("itkn",m);f.push(e&&e.hasOwnProperty(m)?e[m]:c(m))}a.$inject||(a=a[h]);switch(b?-1:f.length){case 0:return a();case 1:return a(f[0]);case 2:return a(f[0],f[1]);case 3:return a(f[0],f[1],f[2]);case 4:return a(f[0],f[1],f[2],
-f[3]);case 5:return a(f[0],f[1],f[2],f[3],f[4]);case 6:return a(f[0],f[1],f[2],f[3],f[4],f[5]);case 7:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6]);case 8:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7]);case 9:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]);case 10:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9]);default:return a.apply(b,f)}}return{invoke:d,instantiate:function(a,b){var c=function(){},e;c.prototype=(H(a)?a[a.length-1]:a).prototype;c=new c;e=d(a,c,b);return S(e)?
-e:c},get:c,annotate:$b,has:function(b){return l.hasOwnProperty(b+h)||a.hasOwnProperty(b)}}}var g={},h="Provider",m=[],k=new Pa,l={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,aa(b))}),constant:a(function(a,b){pa(a,"constant");l[a]=b;q[a]=b}),decorator:function(a,b){var c=r.get(a+h),d=c.$get;c.$get=function(){var a=n.invoke(d,c);return n.invoke(b,null,{$delegate:a})}}}},r=l.$injector=f(l,
-function(){throw Qa("unpr",m.join(" <- "));}),q={},n=q.$injector=f(q,function(a){a=r.get(a+h);return n.invoke(a.$get,a)});p(e(b),function(a){n.invoke(a||v)});return n}function Xc(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;p(a,function(a){b||"a"!==B(a.nodeName)||(b=a)});return b}function f(){var b=c.hash(),d;b?(d=g.getElementById(b))?d.scrollIntoView():(d=e(g.getElementsByName(b)))?d.scrollIntoView():
-"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var g=a.document;b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(f)});return f}]}function Yc(b,a,c,d){function e(a){try{a.apply(null,ua.call(arguments,1))}finally{if(y--,0===y)for(;A.length;)try{A.pop()()}catch(b){c.error(b)}}}function f(a,b){(function Bb(){p(C,function(a){a()});u=b(Bb,a)})()}function g(){t=null;U!=h.url()&&(U=h.url(),p(T,function(a){a(h.url())}))}var h=this,m=a[0],k=b.location,l=b.history,r=b.setTimeout,q=b.clearTimeout,
-n={};h.isMock=!1;var y=0,A=[];h.$$completeOutstandingRequest=e;h.$$incOutstandingRequestCount=function(){y++};h.notifyWhenNoOutstandingRequests=function(a){p(C,function(a){a()});0===y?a():A.push(a)};var C=[],u;h.addPollFn=function(a){z(u)&&f(100,r);C.push(a);return a};var U=k.href,M=a.find("base"),t=null;h.url=function(a,c){k!==b.location&&(k=b.location);if(a){if(U!=a)return U=a,d.history?c?l.replaceState(null,"",a):(l.pushState(null,"",a),M.attr("href",M.attr("href"))):(t=a,c?k.replace(a):k.href=
-a),h}else return t||k.href.replace(/%27/g,"'")};var T=[],ca=!1;h.onUrlChange=function(a){if(!ca){if(d.history)x(b).on("popstate",g);if(d.hashchange)x(b).on("hashchange",g);else h.addPollFn(g);ca=!0}T.push(a);return a};h.baseHref=function(){var a=M.attr("href");return a?a.replace(/^https?\:\/\/[^\/]*/,""):""};var N={},da="",ka=h.baseHref();h.cookies=function(a,b){var d,e,f,k;if(a)b===s?m.cookie=escape(a)+"=;path="+ka+";expires=Thu, 01 Jan 1970 00:00:00 GMT":F(b)&&(d=(m.cookie=escape(a)+"="+escape(b)+
-";path="+ka).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(m.cookie!==da)for(da=m.cookie,d=da.split("; "),N={},f=0;f<d.length;f++)e=d[f],k=e.indexOf("="),0<k&&(a=unescape(e.substring(0,k)),N[a]===s&&(N[a]=unescape(e.substring(k+1))));return N}};h.defer=function(a,b){var c;y++;c=r(function(){delete n[c];e(a)},b||0);n[c]=!0;return c};h.defer.cancel=function(a){return n[a]?(delete n[a],q(a),e(v),!0):!1}}function Zc(){this.$get=
-["$window","$log","$sniffer","$document",function(b,a,c,d){return new Yc(b,d,a,c)}]}function $c(){this.$get=function(){function b(b,d){function e(a){a!=r&&(q?q==a&&(q=a.n):q=a,f(a.n,a.p),f(a,r),r=a,r.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw D("$cacheFactory")("iid",b);var g=0,h=G({},d,{id:b}),m={},k=d&&d.capacity||Number.MAX_VALUE,l={},r=null,q=null;return a[b]={put:function(a,b){var c=l[a]||(l[a]={key:a});e(c);if(!z(b))return a in m||g++,m[a]=b,g>k&&this.remove(q.key),
-b},get:function(a){var b=l[a];if(b)return e(b),m[a]},remove:function(a){var b=l[a];b&&(b==r&&(r=b.p),b==q&&(q=b.n),f(b.n,b.p),delete l[a],delete m[a],g--)},removeAll:function(){m={};g=0;l={};r=q=null},destroy:function(){l=h=m=null;delete a[b]},info:function(){return G({},h,{size:g})}}}var a={};b.info=function(){var b={};p(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function ad(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function bc(b){var a=
-{},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,f=/^\s*(https?|ftp|mailto|tel|file):/,g=/^\s*(https?|ftp|file):|data:image\//,h=/^(on[a-z]+|formaction)$/;this.directive=function k(d,e){pa(d,"directive");F(d)?(rb(e,"directiveFactory"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];p(a[d],function(a,f){try{var k=b.invoke(a);E(k)?k={compile:aa(k)}:!k.compile&&k.link&&(k.compile=aa(k.link));k.priority=
-k.priority||0;k.index=f;k.name=k.name||d;k.require=k.require||k.controller&&k.name;k.restrict=k.restrict||"A";e.push(k)}catch(g){c(g)}});return e}])),a[d].push(e)):p(d,Mb(k));return this};this.aHrefSanitizationWhitelist=function(a){return w(a)?(f=a,this):f};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(g=a,this):g};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate",function(b,l,r,q,n,y,A,
-C,u,U,M){function t(a,b,c,d,e){a instanceof x||(a=x(a));p(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=x(b).wrap("<span></span>").parent()[0])});var f=ca(a,b,a,c,d,e);return function(b,c){rb(b,"scope");for(var d=c?Sa.clone.call(a):a,e=0,k=d.length;e<k;e++){var g=d[e];1!=g.nodeType&&9!=g.nodeType||d.eq(e).data("$scope",b)}T(d,"ng-scope");c&&c(d,b);f&&f(b,d,d);return d}}function T(a,b){try{a.addClass(b)}catch(c){}}function ca(a,b,c,d,e,f){function k(a,c,d,e){var f,h,l,r,n,q,y,$=[];
-n=0;for(q=c.length;n<q;n++)$.push(c[n]);y=n=0;for(q=g.length;n<q;y++)h=$[y],c=g[n++],f=g[n++],c?(c.scope?(l=a.$new(S(c.scope)),x(h).data("$scope",l)):l=a,(r=c.transclude)||!e&&b?c(f,l,h,d,function(b){return function(c){var d=a.$new();d.$$transcluded=!0;return b(d,c).on("$destroy",pb(d,d.$destroy))}}(r||b)):c(f,l,h,s,e)):f&&f(a,h.childNodes,s,e)}for(var g=[],h,l,r,n=0;n<a.length;n++)l=new z,h=N(a[n],[],l,0==n?d:s,e),h=(f=h.length?L(h,a[n],l,b,c,null,[],[],f):null)&&f.terminal||!a[n].childNodes||!a[n].childNodes.length?
-null:ca(a[n].childNodes,f?f.transclude:b),g.push(f),g.push(h),r=r||f||h,f=null;return r?k:null}function N(a,b,c,f,k){var g=c.$attr,h;switch(a.nodeType){case 1:Z(b,la(Da(a).toLowerCase()),"E",f,k);var l,r,n;h=a.attributes;for(var q=0,y=h&&h.length;q<y;q++){var A=!1,p=!1;l=h[q];if(!Q||8<=Q||l.specified){r=l.name;n=la(r);ma.test(n)&&(r=$a(n.substr(6),"-"));var t=n.replace(/(Start|End)$/,"");n===t+"Start"&&(A=r,p=r.substr(0,r.length-5)+"end",r=r.substr(0,r.length-6));n=la(r.toLowerCase());g[n]=r;c[n]=
-l=ba(Q&&"href"==r?decodeURIComponent(a.getAttribute(r,2)):l.value);Yb(a,n)&&(c[n]=!0);B(a,b,l,n);Z(b,n,"A",f,k,A,p)}}a=a.className;if(F(a)&&""!==a)for(;h=e.exec(a);)n=la(h[2]),Z(b,n,"C",f,k)&&(c[n]=ba(h[3])),a=a.substr(h.index+h[0].length);break;case 3:w(b,a.nodeValue);break;case 8:try{if(h=d.exec(a.nodeValue))n=la(h[1]),Z(b,n,"M",f,k)&&(c[n]=ba(h[2]))}catch(U){}}b.sort(O);return b}function da(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ha("uterdir",b,c);1==a.nodeType&&
-(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return x(d)}function ka(a,b,c){return function(d,e,f,k){e=da(e[0],b,c);return a(d,e,f,k)}}function L(a,b,c,d,e,f,k,h,g){function n(a,b,c,d){a&&(c&&(a=ka(a,c,d)),a.require=I.require,k.push(a));b&&(c&&(b=ka(b,c,d)),b.require=I.require,h.push(b))}function q(a,b){var c,d="data",e=!1;if(F(a)){for(;"^"==(c=a.charAt(0))||"?"==c;)a=a.substr(1),"^"==c&&(d="inheritedData"),e=e||"?"==c;c=b[d]("$"+a+"Controller");
-8==b[0].nodeType&&b[0].$$controller&&(c=c||b[0].$$controller,b[0].$$controller=null);if(!c&&!e)throw ha("ctreq",a,Z);}else H(a)&&(c=[],p(a,function(a){c.push(q(a,b))}));return c}function U(a,d,e,f,g){var n,$,t,C,T;n=b===e?c:Kc(c,new z(x(e),c.$attr));$=n.$$element;if(u){var ca=/^\s*([@=&])(\??)\s*(\w*)\s*$/,N=d.$parent||d;p(u.scope,function(a,b){var c=a.match(ca)||[],e=c[3]||b,f="?"==c[2],c=c[1],k,g,h;d.$$isolateBindings[b]=c+e;switch(c){case "@":n.$observe(e,function(a){d[b]=a});n.$$observers[e].$$scope=
-N;n[e]&&(d[b]=l(n[e])(N));break;case "=":if(f&&!n[e])break;g=y(n[e]);h=g.assign||function(){k=d[b]=g(N);throw ha("nonassign",n[e],u.name);};k=d[b]=g(N);d.$watch(function(){var a=g(N);a!==d[b]&&(a!==k?k=d[b]=a:h(N,a=k=d[b]));return a});break;case "&":g=y(n[e]);d[b]=function(a){return g(N,a)};break;default:throw ha("iscp",u.name,b,a);}})}v&&p(v,function(a){var b={$scope:d,$element:$,$attrs:n,$transclude:g},c;T=a.controller;"@"==T&&(T=n[a.name]);c=A(T,b);8==$[0].nodeType?$[0].$$controller=c:$.data("$"+
-a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});f=0;for(t=k.length;f<t;f++)try{C=k[f],C(d,$,n,C.require&&q(C.require,$))}catch(L){r(L,ga($))}a&&a(d,e.childNodes,s,g);for(f=h.length-1;0<=f;f--)try{C=h[f],C(d,$,n,C.require&&q(C.require,$))}catch(ka){r(ka,ga($))}}g=g||{};var C=-Number.MAX_VALUE,ca,u=g.newIsolateScopeDirective,M=g.templateDirective,L=c.$$element=x(b),I,Z,w;g=g.transcludeDirective;for(var O=d,v,B,ma=0,K=a.length;ma<K;ma++){I=a[ma];var G=I.$$start,D=I.$$end;G&&(L=
-da(b,G,D));w=s;if(C>I.priority)break;if(w=I.scope)ca=ca||I,I.templateUrl||(P("new/isolated scope",u,I,L),S(w)&&(T(L,"ng-isolate-scope"),u=I),T(L,"ng-scope"));Z=I.name;!I.templateUrl&&I.controller&&(w=I.controller,v=v||{},P("'"+Z+"' controller",v[Z],I,L),v[Z]=I);if(w=I.transclude)"ngRepeat"!==Z&&(P("transclusion",g,I,L),g=I),"element"==w?(C=I.priority,w=da(b,G,D),L=c.$$element=x(R.createComment(" "+Z+": "+c[Z]+" ")),b=L[0],db(e,x(ua.call(w,0)),b),O=t(w,d,C,f&&f.name,{newIsolateScopeDirective:u,transcludeDirective:g,
-templateDirective:M})):(w=x(wb(b)).contents(),L.html(""),O=t(w,d));if(I.template)if(P("template",M,I,L),M=I,w=E(I.template)?I.template(L,c):I.template,w=cc(w),I.replace){f=I;w=x("<div>"+ba(w)+"</div>").contents();b=w[0];if(1!=w.length||1!==b.nodeType)throw ha("tplrt",Z,"");db(e,L,b);K={$attr:{}};a=a.concat(N(b,a.splice(ma+1,a.length-(ma+1)),K));ac(c,K);K=a.length}else L.html(w);if(I.templateUrl)P("template",M,I,L),M=I,I.replace&&(f=I),U=Bb(a.splice(ma,a.length-ma),L,c,e,O,k,h,{newIsolateScopeDirective:u,
-transcludeDirective:g,templateDirective:M}),K=a.length;else if(I.compile)try{B=I.compile(L,c,O),E(B)?n(null,B,G,D):B&&n(B.pre,B.post,G,D)}catch(J){r(J,ga(L))}I.terminal&&(U.terminal=!0,C=Math.max(C,I.priority))}U.scope=ca&&ca.scope;U.transclude=g&&O;return U}function Z(d,e,f,g,h,l,n){if(e===h)return null;h=null;if(a.hasOwnProperty(e)){var q;e=b.get(e+c);for(var y=0,A=e.length;y<A;y++)try{q=e[y],(g===s||g>q.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Hc(q,{$$start:l,$$end:n})),d.push(q),h=q)}catch(C){r(C)}}return h}
-function ac(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;p(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});p(b,function(b,f){"class"==f?(T(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?e.attr("style",e.attr("style")+";"+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function Bb(a,b,c,d,e,f,k,g){var h=[],l,r,y=b[0],A=a.shift(),C=G({},A,{templateUrl:null,transclude:null,replace:null}),t=E(A.templateUrl)?A.templateUrl(b,c):
-A.templateUrl;b.html("");q.get(U.getTrustedResourceUrl(t),{cache:n}).success(function(n){var q;n=cc(n);if(A.replace){n=x("<div>"+ba(n)+"</div>").contents();q=n[0];if(1!=n.length||1!==q.nodeType)throw ha("tplrt",A.name,t);n={$attr:{}};db(d,b,q);N(q,a,n);ac(c,n)}else q=y,b.html(n);a.unshift(C);l=L(a,q,c,e,b,A,f,k,g);p(d,function(a,c){a==q&&(d[c]=b[0])});for(r=ca(b[0].childNodes,e);h.length;){n=h.shift();var U=h.shift(),T=h.shift(),s=h.shift(),u=b[0];U!==y&&(u=wb(q),db(T,x(U),u));l(r,n,u,d,s)}h=null}).error(function(a,
-b,c,d){throw ha("tpload",d.url);});return function(a,b,c,d,e){h?(h.push(b),h.push(c),h.push(d),h.push(e)):l(r,b,c,d,e)}}function O(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function P(a,b,c,d){if(b)throw ha("multidir",b.name,c.name,a,ga(d));}function w(a,b){var c=l(b,!0);c&&a.push({priority:0,compile:aa(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);T(d.data("$binding",e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=
-a})})})}function v(a,b){if("xlinkHref"==b||"IMG"!=Da(a)&&("src"==b||"ngSrc"==b))return U.RESOURCE_URL}function B(a,b,c,d){var e=l(c,!0);if(e){if("multiple"===d&&"SELECT"===Da(a))throw ha("selmulti",ga(a));b.push({priority:-100,compile:aa(function(b,c,f){c=f.$$observers||(f.$$observers={});if(h.test(d))throw ha("nodomevents");if(e=l(f[d],!0,v(a,d)))f[d]=e(b),(c[d]||(c[d]=[])).$$inter=!0,(f.$$observers&&f.$$observers[d].$$scope||b).$watch(e,function(a){f.$set(d,a)})})})}}function db(a,b,c){var d=b[0],
-e=b.length,f=d.parentNode,h,k;if(a)for(h=0,k=a.length;h<k;h++)if(a[h]==d){a[h++]=c;k=h+e-1;for(var g=a.length;h<g;h++,k++)k<g?a[h]=a[k]:delete a[h];a.length-=e-1;break}f&&f.replaceChild(c,d);a=R.createDocumentFragment();a.appendChild(d);c[x.expando]=d[x.expando];d=1;for(e=b.length;d<e;d++)f=b[d],x(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}var z=function(a,b){this.$$element=a;this.$attr=b||{}};z.prototype={$normalize:la,$addClass:function(a){a&&0<a.length&&M.addClass(this.$$element,
-a)},$removeClass:function(a){a&&0<a.length&&M.removeClass(this.$$element,a)},$set:function(a,b,c,d){function e(a,b){var c=[],d=a.split(/\s+/),f=b.split(/\s+/),h=0;a:for(;h<d.length;h++){for(var k=d[h],g=0;g<f.length;g++)if(k==f[g])continue a;c.push(k)}return c}if("class"==a)b=b||"",c=this.$$element.attr("class")||"",this.$removeClass(e(c,b).join(" ")),this.$addClass(e(b,c).join(" "));else{var h=Yb(this.$$element[0],a);h&&(this.$$element.prop(a,b),d=h);this[a]=b;d?this.$attr[a]=d:(d=this.$attr[a])||
-(this.$attr[a]=d=$a(a,"-"));h=Da(this.$$element);if("A"===h&&"href"===a||"IMG"===h&&"src"===a)if(!Q||8<=Q)h=wa(b).href,""!==h&&("href"===a&&!h.match(f)||"src"===a&&!h.match(g))&&(this[a]=b="unsafe:"+h);!1!==c&&(null===b||b===s?this.$$element.removeAttr(d):this.$$element.attr(d,b))}(c=this.$$observers)&&p(c[a],function(a){try{a(b)}catch(c){r(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);e.push(b);C.$evalAsync(function(){e.$$inter||b(c[a])});return b}};
-var D=l.startSymbol(),J=l.endSymbol(),cc="{{"==D||"}}"==J?za:function(a){return a.replace(/\{\{/g,D).replace(/}}/g,J)},ma=/^ngAttr[A-Z]/;return t}]}function la(b){return Ma(b.replace(bd,""))}function cd(){var b={},a=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,d){pa(a,"controller");S(a)?G(b,a):b[a]=d};this.$get=["$injector","$window",function(c,d){return function(e,f){var g,h,m;F(e)&&(g=e.match(a),h=g[1],m=g[3],e=b.hasOwnProperty(h)?b[h]:sb(f.$scope,h,!0)||sb(d,h,!0),La(e,h,!0));g=c.instantiate(e,
-f);if(m){if(!f||"object"!=typeof f.$scope)throw D("$controller")("noscp",h||e.name,m);f.$scope[m]=g}return g}}]}function dd(){this.$get=["$window",function(b){return x(b.document)}]}function ed(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function dc(b){var a={},c,d,e;if(!b)return a;p(b.split("\n"),function(b){e=b.indexOf(":");c=B(ba(b.substr(0,e)));d=ba(b.substr(e+1));c&&(a[c]=a[c]?a[c]+(", "+d):d)});return a}function ec(b){var a=S(b)?b:s;return function(c){a||
-(a=dc(b));return c?a[B(c)]||null:a}}function fc(b,a,c){if(E(c))return c(b,a);p(c,function(c){b=c(b,a)});return b}function fd(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults={transformResponse:[function(d){F(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=Ob(d)));return d}],transformRequest:[function(a){return S(a)&&"[object File]"!==Wa.apply(a)?oa(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:d,
-put:d,patch:d},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=this.interceptors=[],g=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,r,q){function n(a){function c(a){var b=G({},a,{data:fc(a.data,a.headers,d.transformResponse)});return 200<=a.status&&300>a.status?b:r.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f=function(a){function b(a){var c;p(a,function(b,
-d){E(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=G({},a.headers),f,h,c=G({},c.common,c[B(a.method)]);b(c);b(d);a:for(f in c){a=B(f);for(h in d)if(B(h)===a)continue a;d[f]=c[f]}return d}(a);G(d,a);d.headers=f;d.method=Ea(d.method);(a=Cb(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var h=[function(a){f=a.headers;var b=fc(a.data,ec(f),a.transformRequest);z(a.data)&&p(f,function(a,b){"content-type"===B(b)&&delete f[b]});z(a.withCredentials)&&
-!z(e.withCredentials)&&(a.withCredentials=e.withCredentials);return y(a,b,f).then(c,c)},s],k=r.when(d);for(p(u,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&h.push(a.response,a.responseError)});h.length;){a=h.shift();var g=h.shift(),k=k.then(a,g)}k.success=function(a){k.then(function(b){a(b.data,b.status,b.headers,d)});return k};k.error=function(a){k.then(null,function(b){a(b.data,b.status,b.headers,d)});return k};return k}function y(b,
-c,f){function k(a,b,c){p&&(200<=a&&300>a?p.put(s,[a,b,dc(c)]):p.remove(s));g(b,a,c);d.$$phase||d.$apply()}function g(a,c,d){c=Math.max(c,0);(200<=c&&300>c?q.resolve:q.reject)({data:a,status:c,headers:ec(d),config:b})}function m(){var a=Ya(n.pendingRequests,b);-1!==a&&n.pendingRequests.splice(a,1)}var q=r.defer(),y=q.promise,p,u,s=A(b.url,b.params);n.pendingRequests.push(b);y.then(m,m);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(p=S(b.cache)?b.cache:S(e.cache)?e.cache:C);if(p)if(u=p.get(s),
-w(u)){if(u.then)return u.then(m,m),u;H(u)?g(u[1],u[0],fa(u[2])):g(u,200,{})}else p.put(s,y);z(u)&&a(b.method,s,c,k,f,b.timeout,b.withCredentials,b.responseType);return y}function A(a,b){if(!b)return a;var c=[];Gc(b,function(a,b){null!=a&&a!=s&&(H(a)||(a=[a]),p(a,function(a){S(a)&&(a=oa(a));c.push(va(b)+"="+va(a))}))});return a+(-1==a.indexOf("?")?"?":"&")+c.join("&")}var C=c("$http"),u=[];p(f,function(a){u.unshift(F(a)?q.get(a):q.invoke(a))});p(g,function(a,b){var c=F(a)?q.get(a):q.invoke(a);u.splice(b,
-0,{response:function(a){return c(r.when(a))},responseError:function(a){return c(r.reject(a))}})});n.pendingRequests=[];(function(a){p(arguments,function(a){n[a]=function(b,c){return n(G(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){p(arguments,function(a){n[a]=function(b,c,d){return n(G(d||{},{method:a,url:b,data:c}))}})})("post","put");n.defaults=e;return n}]}function gd(){this.$get=["$browser","$window","$document",function(b,a,c){return hd(b,id,b.defer,a.angular.callbacks,
-c[0],a.location.protocol.replace(":",""))}]}function hd(b,a,c,d,e,f){function g(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;Q?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c);return d}return function(e,m,k,l,r,q,n,y){function A(){u=-1;M&&M();t&&t.abort()}function C(a,d,e,h){var g=f||wa(m).protocol;T&&c.cancel(T);M=t=null;d="file"==g?e?200:404:d;a(1223==d?204:d,
-e,h);b.$$completeOutstandingRequest(v)}var u;b.$$incOutstandingRequestCount();m=m||b.url();if("jsonp"==B(e)){var s="_"+(d.counter++).toString(36);d[s]=function(a){d[s].data=a};var M=g(m.replace("JSON_CALLBACK","angular.callbacks."+s),function(){d[s].data?C(l,200,d[s].data):C(l,u||-2);delete d[s]})}else{var t=new a;t.open(e,m,!0);p(r,function(a,b){w(a)&&t.setRequestHeader(b,a)});t.onreadystatechange=function(){if(4==t.readyState){var a=t.getAllResponseHeaders();C(l,u||t.status,t.responseType?t.response:
-t.responseText,a)}};n&&(t.withCredentials=!0);y&&(t.responseType=y);t.send(k||null)}if(0<q)var T=c(A,q);else q&&q.then&&q.then(A)}}function jd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,k,l){for(var r,q,n=0,y=[],A=f.length,p=!1,u=[];n<A;)-1!=(r=f.indexOf(b,n))&&-1!=(q=f.indexOf(a,r+g))?(n!=r&&y.push(f.substring(n,r)),y.push(n=c(p=f.substring(r+
-g,q))),n.exp=p,n=q+h,p=!0):(n!=A&&y.push(f.substring(n)),n=A);(A=y.length)||(y.push(""),A=1);if(l&&1<y.length)throw gc("noconcat",f);if(!k||p)return u.length=A,n=function(a){try{for(var b=0,c=A,h;b<c;b++)"function"==typeof(h=y[b])&&(h=h(a),h=l?e.getTrusted(l,h):e.valueOf(h),null==h||h==s?h="":"string"!=typeof h&&(h=oa(h))),u[b]=h;return u.join("")}catch(g){a=gc("interr",f,g.toString()),d(a)}},n.exp=f,n.parts=y,n}var g=b.length,h=a.length;f.startSymbol=function(){return b};f.endSymbol=function(){return a};
-return f}]}function kd(){this.$get=["$rootScope","$window","$q",function(b,a,c){function d(d,g,h,m){var k=a.setInterval,l=a.clearInterval,r=c.defer(),q=r.promise;h=w(h)?h:0;var n=0,y=w(m)&&!m;q.then(null,null,d);q.$$intervalId=k(function(){r.notify(n++);0<h&&n>=h&&(r.resolve(n),l(q.$$intervalId),delete e[q.$$intervalId]);y||b.$apply()},g);e[q.$$intervalId]=r;return q}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],
-!0):!1};return d}]}function ld(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
-DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function hc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=qb(b[a]);return b.join("/")}function ic(b,a){var c=wa(b);a.$$protocol=
-c.protocol;a.$$host=c.hostname;a.$$port=W(c.port)||md[c.protocol]||null}function jc(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=wa(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=Qb(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function na(b,a){if(0==a.indexOf(b))return a.substr(b.length)}function Ta(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Db(b){return b.substr(0,
-Ta(b).lastIndexOf("/")+1)}function kc(b,a){this.$$html5=!0;a=a||"";var c=Db(b);ic(b,this);this.$$parse=function(a){var b=na(c,a);if(!F(b))throw Eb("ipthprfx",a,c);jc(b,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Rb(this.$$search),b=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=hc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=na(b,d))!==s)return d=e,(e=na(a,e))!==s?c+(na("/",e)||e):b+d;if((e=na(c,
-d))!==s)return c+e;if(c==d+"/")return c}}function Fb(b,a){var c=Db(b);ic(b,this);this.$$parse=function(d){var e=na(b,d)||na(c,d),e="#"==e.charAt(0)?na(a,e):this.$$html5?e:"";if(!F(e))throw Eb("ihshprfx",d,a);jc(e,this);this.$$compose()};this.$$compose=function(){var c=Rb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=hc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Ta(b)==Ta(a))return a}}function lc(b,a){this.$$html5=!0;Fb.apply(this,
-arguments);var c=Db(b);this.$$rewrite=function(d){var e;if(b==Ta(d))return d;if(e=na(c,d))return b+a+e;if(c===d+"/")return c}}function eb(b){return function(){return this[b]}}function mc(b,a){return function(c){if(z(c))return this[b];this[b]=a(c);this.$$compose();return this}}function nd(){var b="",a=!1;this.hashPrefix=function(a){return w(a)?(b=a,this):b};this.html5Mode=function(b){return w(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",
-h.absUrl(),a)}var h,m=d.baseHref(),k=d.url();a?(m=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(m||"/"),e=e.history?kc:lc):(m=Ta(k),e=Fb);h=new e(m,"#"+b);h.$$parse(h.$$rewrite(k));f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=x(a.target);"a"!==B(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=h.$$rewrite(e);e&&(!b.attr("target")&&g&&!a.isDefaultPrevented())&&(a.preventDefault(),g!=d.url()&&(h.$$parse(g),c.$apply(),Y.angular["ff-684208-preventDefault"]=
-!0))}});h.absUrl()!=k&&d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$broadcast("$locationChangeStart",a,h.absUrl()).defaultPrevented?d.url(h.absUrl()):(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);g(b)}),c.$$phase||c.$digest()))});var l=0;c.$watch(function(){var a=d.url(),b=h.$$replace;l&&a==h.absUrl()||(l++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),g(a))}));h.$$replace=!1;return l});return h}]}
-function od(){var b=!0,a=this;this.debugEnabled=function(a){return w(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||v;return e.apply?function(){var a=[];p(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),
-info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function qa(b,a){if("constructor"===b)throw xa("isecfld",a);return b}function fb(b,a){if(b&&b.constructor===b)throw xa("isecfn",a);if(b&&b.document&&b.location&&b.alert&&b.setInterval)throw xa("isecwindow",a);if(b&&(b.nodeName||b.on&&b.find))throw xa("isecdom",a);return b}function gb(b,a,c,d,e){e=e||{};a=a.split(".");for(var f,g=0;1<a.length;g++){f=qa(a.shift(),d);var h=
-b[f];h||(h={},b[f]=h);b=h;b.then&&e.unwrapPromises&&(ra(d),"$$v"in b||function(a){a.then(function(b){a.$$v=b})}(b),b.$$v===s&&(b.$$v={}),b=b.$$v)}f=qa(a.shift(),d);return b[f]=c}function nc(b,a,c,d,e,f,g){qa(b,f);qa(a,f);qa(c,f);qa(d,f);qa(e,f);return g.unwrapPromises?function(h,g){var k=g&&g.hasOwnProperty(b)?g:h,l;if(null===k||k===s)return k;(k=k[b])&&k.then&&(ra(f),"$$v"in k||(l=k,l.$$v=s,l.then(function(a){l.$$v=a})),k=k.$$v);if(!a||null===k||k===s)return k;(k=k[a])&&k.then&&(ra(f),"$$v"in k||
-(l=k,l.$$v=s,l.then(function(a){l.$$v=a})),k=k.$$v);if(!c||null===k||k===s)return k;(k=k[c])&&k.then&&(ra(f),"$$v"in k||(l=k,l.$$v=s,l.then(function(a){l.$$v=a})),k=k.$$v);if(!d||null===k||k===s)return k;(k=k[d])&&k.then&&(ra(f),"$$v"in k||(l=k,l.$$v=s,l.then(function(a){l.$$v=a})),k=k.$$v);if(!e||null===k||k===s)return k;(k=k[e])&&k.then&&(ra(f),"$$v"in k||(l=k,l.$$v=s,l.then(function(a){l.$$v=a})),k=k.$$v);return k}:function(f,g){var k=g&&g.hasOwnProperty(b)?g:f;if(null===k||k===s)return k;k=k[b];
-if(!a||null===k||k===s)return k;k=k[a];if(!c||null===k||k===s)return k;k=k[c];if(!d||null===k||k===s)return k;k=k[d];return e&&null!==k&&k!==s?k=k[e]:k}}function oc(b,a,c){if(Gb.hasOwnProperty(b))return Gb[b];var d=b.split("."),e=d.length,f;if(a.csp)f=6>e?nc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,f){var h=0,g;do g=nc(d[h++],d[h++],d[h++],d[h++],d[h++],c,a)(b,f),f=s,b=g;while(h<e);return g};else{var g="var l, fn, p;\n";p(d,function(b,d){qa(b,c);g+="if(s === null || s === undefined) return s;\nl=s;\ns="+
-(d?"s":'((k&&k.hasOwnProperty("'+b+'"))?k:s)')+'["'+b+'"];\n'+(a.unwrapPromises?'if (s && s.then) {\n pw("'+c.replace(/\"/g,'\\"')+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")});var g=g+"return s;",h=Function("s","k","pw",g);h.toString=function(){return g};f=function(a,b){return h(a,b,ra)}}"hasOwnProperty"!==b&&(Gb[b]=f);return f}function pd(){var b={},a={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(b){return w(b)?
-(a.unwrapPromises=!!b,this):a.unwrapPromises};this.logPromiseWarnings=function(b){return w(b)?(a.logPromiseWarnings=b,this):a.logPromiseWarnings};this.$get=["$filter","$sniffer","$log",function(c,d,e){a.csp=d.csp;ra=function(b){a.logPromiseWarnings&&!pc.hasOwnProperty(b)&&(pc[b]=!0,e.warn("[$parse] Promise found in the expression `"+b+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))};return function(d){var e;switch(typeof d){case "string":if(b.hasOwnProperty(d))return b[d];
-e=new Hb(a);e=(new Ua(e,c,a)).parse(d,!1);"hasOwnProperty"!==d&&(b[d]=e);return e;case "function":return d;default:return v}}}]}function qd(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return rd(function(a){b.$evalAsync(a)},a)}]}function rd(b,a){function c(a){return a}function d(a){return g(a)}var e=function(){var h=[],m,k;return k={resolve:function(a){if(h){var c=h;h=s;m=f(a);c.length&&b(function(){for(var a,b=0,d=c.length;b<d;b++)a=c[b],m.then(a[0],a[1],a[2])})}},reject:function(a){k.resolve(g(a))},
-notify:function(a){if(h){var c=h;h.length&&b(function(){for(var b,d=0,e=c.length;d<e;d++)b=c[d],b[2](a)})}},promise:{then:function(b,f,g){var k=e(),y=function(d){try{k.resolve((E(b)?b:c)(d))}catch(e){k.reject(e),a(e)}},A=function(b){try{k.resolve((E(f)?f:d)(b))}catch(c){k.reject(c),a(c)}},p=function(b){try{k.notify((E(g)?g:c)(b))}catch(d){a(d)}};h?h.push([y,A,p]):m.then(y,A,p);return k.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();c?d.resolve(a):
-d.reject(a);return d.promise}function d(e,f){var h=null;try{h=(a||c)()}catch(g){return b(g,!1)}return h&&E(h.then)?h.then(function(){return b(e,f)},function(a){return b(a,!1)}):b(e,f)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},f=function(a){return a&&E(a.then)?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},g=function(c){return{then:function(f,g){var l=e();b(function(){try{l.resolve((E(g)?g:d)(c))}catch(b){l.reject(b),a(b)}});return l.promise}}};
-return{defer:e,reject:g,when:function(h,m,k,l){var r=e(),q,n=function(b){try{return(E(m)?m:c)(b)}catch(d){return a(d),g(d)}},y=function(b){try{return(E(k)?k:d)(b)}catch(c){return a(c),g(c)}},p=function(b){try{return(E(l)?l:c)(b)}catch(d){a(d)}};b(function(){f(h).then(function(a){q||(q=!0,r.resolve(f(a).then(n,y,p)))},function(a){q||(q=!0,r.resolve(y(a)))},function(a){q||r.notify(p(a))})});return r.promise},all:function(a){var b=e(),c=0,d=H(a)?[]:{};p(a,function(a,e){c++;f(a).then(function(a){d.hasOwnProperty(e)||
-(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise}}}function sd(){var b=10,a=D("$rootScope");this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(c,d,e,f){function g(){this.$id=Va();this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this["this"]=this.$root=this;this.$$destroyed=!1;this.$$asyncQueue=
-[];this.$$postDigestQueue=[];this.$$listeners={};this.$$isolateBindings={}}function h(b){if(l.$$phase)throw a("inprog",l.$$phase);l.$$phase=b}function m(a,b){var c=e(a);La(c,b);return c}function k(){}g.prototype={constructor:g,$new:function(a){a?(a=new g,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(a=function(){},a.prototype=this,a=new a,a.$id=Va());a["this"]=a;a.$$listeners={};a.$parent=this;a.$$watchers=a.$$nextSibling=a.$$childHead=a.$$childTail=
-null;a.$$prevSibling=this.$$childTail;this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,c){var d=m(a,"watch"),e=this.$$watchers,f={fn:b,last:k,get:d,exp:a,eq:!!c};if(!E(b)){var g=m(b||v,"listener");f.fn=function(a,b,c){g(c)}}if("string"==typeof a&&d.constant){var h=f.fn;f.fn=function(a,b,c){h.call(this,a,b,c);Ia(e,f)}}e||(e=this.$$watchers=[]);e.unshift(f);return function(){Ia(e,f)}},$watchCollection:function(a,b){var c=
-this,d,f,g=0,h=e(a),k=[],l={},m=0;return this.$watch(function(){f=h(c);var a,b;if(S(f))if(nb(f))for(d!==k&&(d=k,m=d.length=0,g++),a=f.length,m!==a&&(g++,d.length=m=a),b=0;b<a;b++)d[b]!==f[b]&&(g++,d[b]=f[b]);else{d!==l&&(d=l={},m=0,g++);a=0;for(b in f)f.hasOwnProperty(b)&&(a++,d.hasOwnProperty(b)?d[b]!==f[b]&&(g++,d[b]=f[b]):(m++,d[b]=f[b],g++));if(m>a)for(b in g++,d)d.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(m--,delete d[b])}else d!==f&&(d=f,g++);return g},function(){b(f,d,c)})},$digest:function(){var c,
-e,f,g,m=this.$$asyncQueue,p=this.$$postDigestQueue,s,w,M=b,t,x=[],v,N,da;h("$digest");do{w=!1;for(t=this;m.length;)try{da=m.shift(),da.scope.$eval(da.expression)}catch(ka){d(ka)}do{if(g=t.$$watchers)for(s=g.length;s--;)try{(c=g[s])&&((e=c.get(t))!==(f=c.last)&&!(c.eq?Aa(e,f):"number"==typeof e&&"number"==typeof f&&isNaN(e)&&isNaN(f)))&&(w=!0,c.last=c.eq?fa(e):e,c.fn(e,f===k?e:f,t),5>M&&(v=4-M,x[v]||(x[v]=[]),N=E(c.exp)?"fn: "+(c.exp.name||c.exp.toString()):c.exp,N+="; newVal: "+oa(e)+"; oldVal: "+
-oa(f),x[v].push(N)))}catch(L){d(L)}if(!(g=t.$$childHead||t!==this&&t.$$nextSibling))for(;t!==this&&!(g=t.$$nextSibling);)t=t.$parent}while(t=g);if(w&&!M--)throw l.$$phase=null,a("infdig",b,oa(x));}while(w||m.length);for(l.$$phase=null;p.length;)try{p.shift()()}catch(B){d(B)}},$destroy:function(){if(l!=this&&!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);
-this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return e(a)(this,b)},$evalAsync:function(a){l.$$phase||l.$$asyncQueue.length||f.defer(function(){l.$$asyncQueue.length&&l.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},
-$apply:function(a){try{return h("$apply"),this.$eval(a)}catch(b){d(b)}finally{l.$$phase=null;try{l.$digest()}catch(c){throw d(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[Ya(c,b)]=null}},$emit:function(a,b){var c=[],e,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(ua.call(arguments,1)),l,m;do{e=f.$$listeners[a]||c;h.currentScope=
-f;l=0;for(m=e.length;l<m;l++)if(e[l])try{e[l].apply(null,k)}catch(p){d(p)}else e.splice(l,1),l--,m--;if(g)break;f=f.$parent}while(f);return h},$broadcast:function(a,b){var c=this,e=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(ua.call(arguments,1)),h,k;do{c=e;f.currentScope=c;e=c.$$listeners[a]||[];h=0;for(k=e.length;h<k;h++)if(e[h])try{e[h].apply(null,g)}catch(l){d(l)}else e.splice(h,1),h--,k--;if(!(e=c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==
-this&&!(e=c.$$nextSibling);)c=c.$parent}while(c=e);return f}};var l=new g;return l}]}function td(b){if("self"===b)return b;if(F(b)){if(-1<b.indexOf("***"))throw sa("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return RegExp("^"+b+"$")}if(Xa(b))return RegExp("^"+b.source+"$");throw sa("imatcher");}function qc(b){var a=[];w(b)&&p(b,function(b){a.push(td(b))});return a}function ud(){this.SCE_CONTEXTS=ea;var b=
-["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=qc(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=qc(b));return a};this.$get=["$log","$document","$injector",function(c,d,e){function f(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var g=function(a){throw sa("unsafe");
-};e.has("$sanitize")&&(g=e.get("$sanitize"));var h=f(),m={};m[ea.HTML]=f(h);m[ea.CSS]=f(h);m[ea.URL]=f(h);m[ea.JS]=f(h);m[ea.RESOURCE_URL]=f(m[ea.URL]);return{trustAs:function(a,b){var c=m.hasOwnProperty(a)?m[a]:null;if(!c)throw sa("icontext",a,b);if(null===b||b===s||""===b)return b;if("string"!==typeof b)throw sa("itype",a);return new c(b)},getTrusted:function(c,d){if(null===d||d===s||""===d)return d;var e=m.hasOwnProperty(c)?m[c]:null;if(e&&d instanceof e)return d.$$unwrapTrustedValue();if(c===
-ea.RESOURCE_URL){var e=wa(d.toString()),f,h,p=!1;f=0;for(h=b.length;f<h;f++)if("self"===b[f]?Cb(e):b[f].exec(e.href)){p=!0;break}if(p)for(f=0,h=a.length;f<h;f++)if("self"===a[f]?Cb(e):a[f].exec(e.href)){p=!1;break}if(p)return d;throw sa("insecurl",d.toString());}if(c===ea.HTML)return g(d);throw sa("unsafe");},valueOf:function(a){return a instanceof h?a.$$unwrapTrustedValue():a}}}]}function vd(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$parse","$document","$sceDelegate",
-function(a,c,d){if(b&&Q&&(c=c[0].documentMode,c!==s&&8>c))throw sa("iequirks");var e=fa(ea);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=za);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var f=e.parseAs,g=e.getTrusted,h=e.trustAs;p(ea,function(a,b){var c=B(b);e[Ma("parse_as_"+c)]=function(b){return f(a,b)};e[Ma("get_trusted_"+
-c)]=function(b){return g(a,b)};e[Ma("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function wd(){this.$get=["$window","$document",function(b,a){var c={},d=W((/android (\d+)/.exec(B((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|O|ms)(?=[A-Z])/,m=f.body&&f.body.style,k=!1,l=!1;if(m){for(var r in m)if(k=h.exec(r)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in m&&"webkit");k=!!("transition"in m||
-g+"Transition"in m);l=!!("animation"in m||g+"Animation"in m);!d||k&&l||(k=F(f.body.style.webkitTransition),l=F(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!f.documentMode||7<f.documentMode),hasEvent:function(a){if("input"==a&&9==Q)return!1;if(z(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:f.securityPolicy?f.securityPolicy.isActive:!1,vendorPrefix:g,transitions:k,animations:l}}]}function xd(){this.$get=
-["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,h,m){var k=c.defer(),l=k.promise,r=w(m)&&!m;h=a.defer(function(){try{k.resolve(e())}catch(a){k.reject(a),d(a)}finally{delete f[l.$$timeoutId]}r||b.$apply()},h);l.$$timeoutId=h;f[h]=k;return l}var f={};e.cancel=function(b){return b&&b.$$timeoutId in f?(f[b.$$timeoutId].reject("canceled"),delete f[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return e}]}function wa(b){Q&&(V.setAttribute("href",b),b=V.href);V.setAttribute("href",
-b);return{href:V.href,protocol:V.protocol?V.protocol.replace(/:$/,""):"",host:V.host,search:V.search?V.search.replace(/^\?/,""):"",hash:V.hash?V.hash.replace(/^#/,""):"",hostname:V.hostname,port:V.port,pathname:V.pathname&&"/"===V.pathname.charAt(0)?V.pathname:"/"+V.pathname}}function Cb(b){b=F(b)?wa(b):b;return b.protocol===rc.protocol&&b.host===rc.host}function yd(){this.$get=aa(Y)}function sc(b){function a(d,e){if(S(d)){var f={};p(d,function(b,c){f[c]=a(c,b)});return f}return b.factory(d+c,e)}
-var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",tc);a("date",uc);a("filter",zd);a("json",Ad);a("limitTo",Bd);a("lowercase",Cd);a("number",vc);a("orderBy",wc);a("uppercase",Dd)}function zd(){return function(b,a,c){if(!H(b))return b;var d=[];d.check=function(a){for(var b=0;b<d.length;b++)if(!d[b](a))return!1;return!0};switch(typeof c){case "function":break;case "boolean":if(!0==c){c=function(a,b){return Za.equals(a,b)};break}default:c=
-function(a,b){b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)}}var e=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!e(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&e(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(e(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a=
-{$:a};case "object":for(var f in a)"$"==f?function(){if(a[f]){var b=f;d.push(function(c){return e(c,a[b])})}}():function(){if("undefined"!=typeof a[f]){var b=f;d.push(function(c){return e(sb(c,b),a[b])})}}();break;case "function":d.push(a);break;default:return b}for(var g=[],h=0;h<b.length;h++){var m=b[h];d.check(m)&&g.push(m)}return g}}function tc(b){var a=b.NUMBER_FORMATS;return function(b,d){z(d)&&(d=a.CURRENCY_SYM);return xc(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\u00A4/g,d)}}function vc(b){var a=
-b.NUMBER_FORMATS;return function(b,d){return xc(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function xc(b,a,c,d,e){if(isNaN(b)||!isFinite(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",h="",m=[],k=!1;if(-1!==g.indexOf("e")){var l=g.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?g="0":(h=g,k=!0)}if(k)0<e&&(-1<b&&1>b)&&(h=b.toFixed(e));else{g=(g.split(yc)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));g=Math.pow(10,e);b=Math.round(b*g)/g;b=(""+b).split(yc);g=b[0];b=b[1]||
-"";var k=0,l=a.lgSize,r=a.gSize;if(g.length>=l+r)for(var k=g.length-l,q=0;q<k;q++)0===(k-q)%r&&0!==q&&(h+=c),h+=g.charAt(q);for(q=k;q<g.length;q++)0===(g.length-q)%l&&0!==q&&(h+=c),h+=g.charAt(q);for(;b.length<e;)b+="0";e&&"0"!==e&&(h+=d+b.substr(0,e))}m.push(f?a.negPre:a.posPre);m.push(h);m.push(f?a.negSuf:a.posSuf);return m.join("")}function Ib(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function X(b,a,c,d){c=c||0;return function(e){e=
-e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Ib(e,a,d)}}function hb(b,a){return function(c,d){var e=c["get"+b](),f=Ea(a?"SHORT"+b:b);return d[f][e]}}function uc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,m=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=W(b[9]+b[10]),g=W(b[9]+b[11]));h.call(a,W(b[1]),W(b[2])-1,W(b[3]));f=W(b[4]||0)-f;g=W(b[5]||0)-g;h=W(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));m.call(a,f,g,h,b)}return a}
-var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var f="",g=[],h,m;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;F(c)&&(c=Ed.test(c)?W(c):a(c));ob(c)&&(c=new Date(c));if(!Ha(c))return c;for(;e;)(m=Fd.exec(e))?(g=g.concat(ua.call(m,1)),e=g.pop()):(g.push(e),e=null);p(g,function(a){h=Gd[a];f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function Ad(){return function(b){return oa(b,!0)}}
-function Bd(){return function(b,a){if(!H(b)&&!F(b))return b;a=W(a);if(F(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function wc(b){return function(a,c,d){function e(a,b){return Ka(b)?function(b,c){return a(c,b)}:a}if(!H(a)||!c)return a;c=H(c)?c:[c];c=Jc(c,function(a){var c=!1,d=a||za;if(F(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);
-d=b(a)}return e(function(a,b){var c;c=d(a);var e=d(b),f=typeof c,g=typeof e;f==g?("string"==f&&(c=c.toLowerCase(),e=e.toLowerCase()),c=c===e?0:c<e?-1:1):c=f<g?-1:1;return c},c)});for(var f=[],g=0;g<a.length;g++)f.push(a[g]);return f.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function ta(b){E(b)&&(b={link:b});b.restrict=b.restrict||"AC";return aa(b)}function zc(b,a){function c(a,c){c=c?"-"+$a(c,"-"):"";b.removeClass((a?ib:jb)+c).addClass((a?jb:
-ib)+c)}var d=this,e=b.parent().controller("form")||kb,f=0,g=d.$error={},h=[];d.$name=a.name||a.ngForm;d.$dirty=!1;d.$pristine=!0;d.$valid=!0;d.$invalid=!1;e.$addControl(d);b.addClass(Fa);c(!0);d.$addControl=function(a){pa(a.$name,"input");h.push(a);a.$name&&(d[a.$name]=a)};d.$removeControl=function(a){a.$name&&d[a.$name]===a&&delete d[a.$name];p(g,function(b,c){d.$setValidity(c,!0,a)});Ia(h,a)};d.$setValidity=function(a,b,h){var r=g[a];if(b)r&&(Ia(r,h),r.length||(f--,f||(c(b),d.$valid=!0,d.$invalid=
-!1),g[a]=!1,c(!0,a),e.$setValidity(a,!0,d)));else{f||c(b);if(r){if(-1!=Ya(r,h))return}else g[a]=r=[],f++,c(!1,a),e.$setValidity(a,!1,d);r.push(h);d.$valid=!1;d.$invalid=!0}};d.$setDirty=function(){b.removeClass(Fa).addClass(lb);d.$dirty=!0;d.$pristine=!1;e.$setDirty()};d.$setPristine=function(){b.removeClass(lb).addClass(Fa);d.$dirty=!1;d.$pristine=!0;p(h,function(a){a.$setPristine()})}}function mb(b,a,c,d,e,f){var g=function(){var e=a.val();Ka(c.ngTrim||"T")&&(e=ba(e));d.$viewValue!==e&&b.$apply(function(){d.$setViewValue(e)})};
-if(e.hasEvent("input"))a.on("input",g);else{var h,m=function(){h||(h=f.defer(function(){g();h=null}))};a.on("keydown",function(a){a=a.keyCode;91===a||(15<a&&19>a||37<=a&&40>=a)||m()});a.on("change",g);if(e.hasEvent("paste"))a.on("paste cut",m)}d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var k=c.ngPattern,l=function(a,b){if(d.$isEmpty(b)||a.test(b))return d.$setValidity("pattern",!0),b;d.$setValidity("pattern",!1);return s};k&&((e=k.match(/^\/(.*)\/([gim]*)$/))?(k=RegExp(e[1],
-e[2]),e=function(a){return l(k,a)}):e=function(c){var d=b.$eval(k);if(!d||!d.test)throw D("ngPattern")("noregexp",k,d,ga(a));return l(d,c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var r=W(c.ngMinlength);e=function(a){if(!d.$isEmpty(a)&&a.length<r)return d.$setValidity("minlength",!1),s;d.$setValidity("minlength",!0);return a};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var q=W(c.ngMaxlength);e=function(a){if(!d.$isEmpty(a)&&a.length>q)return d.$setValidity("maxlength",
-!1),s;d.$setValidity("maxlength",!0);return a};d.$parsers.push(e);d.$formatters.push(e)}}function Jb(b,a){b="ngClass"+b;return function(){return{restrict:"AC",link:function(c,d,e){function f(b){if(!0===a||c.$index%2===a)h&&!Aa(b,h)&&e.$removeClass(g(h)),e.$addClass(g(b));h=fa(b)}function g(a){if(H(a))return a.join(" ");if(S(a)){var b=[];p(a,function(a,c){a&&b.push(c)});return b.join(" ")}return a}var h=s;c.$watch(e[b],f,!0);e.$observe("class",function(a){f(c.$eval(e[b]))});"ngClass"!==b&&c.$watch("$index",
-function(d,f){var h=d&1;h!==f&1&&(h===a?(h=c.$eval(e[b]),e.$addClass(g(h))):(h=c.$eval(e[b]),e.$removeClass(g(h))))})}}}}var B=function(b){return F(b)?b.toLowerCase():b},Ea=function(b){return F(b)?b.toUpperCase():b},Q,x,Ba,ua=[].slice,Hd=[].push,Wa=Object.prototype.toString,Ja=D("ng"),Za=Y.angular||(Y.angular={}),Ra,Da,ia=["0","0","0"];Q=W((/msie (\d+)/.exec(B(navigator.userAgent))||[])[1]);isNaN(Q)&&(Q=W((/trident\/.*; rv:(\d+)/.exec(B(navigator.userAgent))||[])[1]));v.$inject=[];za.$inject=[];var ba=
-function(){return String.prototype.trim?function(b){return F(b)?b.trim():b}:function(b){return F(b)?b.replace(/^\s*/,"").replace(/\s*$/,""):b}}();Da=9>Q?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ea(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Nc=/[A-Z]/g,Id={full:"1.2.0-rc.3",major:1,minor:2,dot:0,codeName:"ferocious-twitch"},Oa=J.cache={},ab=J.expando="ng-"+(new Date).getTime(),Rc=1,Ac=Y.document.addEventListener?
-function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},xb=Y.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},Pc=/([\:\-\_]+(.))/g,Qc=/^moz([A-Z])/,ub=D("jqLite"),Sa=J.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===R.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),J(Y).on("load",a))},toString:function(){var b=[];p(this,function(a){b.push(""+a)});return"["+b.join(", ")+
-"]"},eq:function(b){return 0<=b?x(this[b]):x(this[this.length+b])},length:0,push:Hd,sort:[].sort,splice:[].splice},cb={};p("multiple selected checked disabled readOnly required open".split(" "),function(b){cb[B(b)]=b});var Zb={};p("input select option textarea button form details".split(" "),function(b){Zb[Ea(b)]=!0});p({data:Wb,inheritedData:bb,scope:function(b){return bb(b,"$scope")},controller:Xb,injector:function(b){return bb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:yb,
-css:function(b,a,c){a=Ma(a);if(w(c))b.style[a]=c;else{var d;8>=Q&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=Q&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=B(a);if(cb[d])if(w(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||v).specified?d:s;else if(w(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(w(c))b[a]=c;else return b[a]},
-text:function(){function b(b,d){var e=a[b.nodeType];if(z(d))return e?b[e]:"";b[e]=d}var a=[];9>Q?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(z(a)){if("SELECT"===Da(b)&&b.multiple){var c=[];p(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)Na(d[c]);b.innerHTML=a}},function(b,a){J.prototype[a]=
-function(a,d){var e,f;if((2==b.length&&b!==yb&&b!==Xb?a:d)===s){if(S(a)){for(e=0;e<this.length;e++)if(b===Wb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;f=e==s?Math.min(this.length,1):this.length;for(var g=0;g<f;g++){var h=b(this[g],a,d);e=e?e+h:h}return e}for(e=0;e<this.length;e++)b(this[e],a,d);return this}});p({removeData:Ub,dealoc:Na,on:function a(c,d,e,f){if(w(f))throw ub("onargs");var g=ja(c,"events"),h=ja(c,"handle");g||ja(c,"events",g={});h||ja(c,"handle",h=Sc(c,g));
-p(d.split(" "),function(d){var f=g[d];if(!f){if("mouseenter"==d||"mouseleave"==d){var l=R.body.contains||R.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!!(e&&1===e.nodeType&&(d.contains?d.contains(e):a.compareDocumentPosition&&a.compareDocumentPosition(e)&16))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[];a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===
-this||l(this,c))||h(a,d)})}else Ac(c,d,h),g[d]=[];f=g[d]}f.push(e)})},off:Vb,replaceWith:function(a,c){var d,e=a.parentNode;Na(a);p(new J(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];p(a.childNodes,function(a){1===a.nodeType&&c.push(a)});return c},contents:function(a){return a.childNodes||[]},append:function(a,c){p(new J(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;
-p(new J(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=x(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){Na(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;p(new J(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},addClass:Ab,removeClass:zb,toggleClass:function(a,c,d){z(d)&&(d=!yb(a,c));(d?Ab:zb)(a,c)},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;
-for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName(c)},clone:wb,triggerHandler:function(a,c,d){c=(ja(a,"events")||{})[c];d=d||[];var e=[{preventDefault:v,stopPropagation:v}];p(c,function(c){c.apply(a,e.concat(d))})}},function(a,c){J.prototype[c]=function(c,e,f){for(var g,h=0;h<this.length;h++)g==s?(g=a(this[h],c,e,f),g!==s&&(g=x(g))):vb(g,a(this[h],c,e,f));return g==s?this:g};J.prototype.bind=J.prototype.on;J.prototype.unbind=J.prototype.off});
-Pa.prototype={put:function(a,c){this[Ca(a)]=c},get:function(a){return this[Ca(a)]},remove:function(a){var c=this[a=Ca(a)];delete this[a];return c}};var Uc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Vc=/,/,Wc=/^\s*(_?)(\S+?)\1\s*$/,Tc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Qa=D("$injector"),Jd=D("$animate"),Kd=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Jd("notcsel",c);this.$$selectors[c.substr(1)]=e;a.factory(e,d)};this.$get=["$timeout",
-function(a){return{enter:function(d,e,f,g){f=f&&f[f.length-1];var h=e&&e[0]||f&&f.parentNode,m=f&&f.nextSibling||null;p(d,function(a){h.insertBefore(a,m)});g&&a(g,0,!1)},leave:function(d,e){d.remove();e&&a(e,0,!1)},move:function(a,c,f,g){this.enter(a,c,f,g)},addClass:function(d,e,f){e=F(e)?e:H(e)?e.join(" "):"";p(d,function(a){Ab(a,e)});f&&a(f,0,!1)},removeClass:function(d,e,f){e=F(e)?e:H(e)?e.join(" "):"";p(d,function(a){zb(a,e)});f&&a(f,0,!1)},enabled:v}}]}],ha=D("$compile");bc.$inject=["$provide"];
-var bd=/^(x[\:\-_]|data[\:\-_])/i,id=Y.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw D("$httpBackend")("noxhr");},gc=D("$interpolate"),Ld=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,md={http:80,https:443,ftp:21},Eb=D("$location");lc.prototype=Fb.prototype=kc.prototype={$$html5:!1,$$replace:!1,absUrl:eb("$$absUrl"),url:function(a,c){if(z(a))return this.$$url;
-var d=Ld.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));(d[2]||d[1])&&this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:eb("$$protocol"),host:eb("$$host"),port:eb("$$port"),path:mc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(F(a))this.$$search=Qb(a);else if(S(a))this.$$search=a;else throw Eb("isrcharg");break;default:c==s||null==c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();
-return this},hash:mc("$$hash",za),replace:function(){this.$$replace=!0;return this}};var xa=D("$parse"),pc={},ra,Ga={"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:v,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return w(d)?w(e)?d+e:d:w(e)?e:s},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(w(d)?d:0)-(w(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,
-c,d,e){return d(a,c)^e(a,c)},"=":v,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,
-c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Md={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Hb=function(a){this.options=a};Hb.prototype={constructor:Hb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index<this.text.length;){this.ch=this.text.charAt(this.index);if(this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();
-else if(this.isIdent(this.ch))this.readIdent(),this.was("{,")&&("{"===a[0]&&(c=this.tokens[this.tokens.length-1]))&&(c.json=-1===c.text.indexOf("."));else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch,json:this.was(":[,")&&this.is("{[")||this.is("}]:,")}),this.is("{[")&&a.unshift(this.ch),this.is("}]")&&a.shift(),this.index++;else if(this.isWhitespace(this.ch)){this.index++;continue}else{var d=this.ch+this.peek(),e=d+this.peek(2),f=Ga[this.ch],g=Ga[d],h=Ga[e];h?(this.tokens.push({index:this.index,
-text:e,fn:h}),this.index+=3):g?(this.tokens.push({index:this.index,text:d,fn:g}),this.index+=2):f?(this.tokens.push({index:this.index,text:this.ch,fn:f,json:this.was("[,:")&&this.is("+-")}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}this.lastCh=this.ch}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},was:function(a){return-1!==a.indexOf(this.lastCh)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+
-a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=w(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw xa("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=
-B(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,json:!0,fn:function(){return a}})},readIdent:function(){for(var a=this,c="",d=this.index,e,f,g,h;this.index<this.text.length;){h=
-this.text.charAt(this.index);if("."===h||this.isIdent(h)||this.isNumber(h))"."===h&&(e=this.index),c+=h;else break;this.index++}if(e)for(f=this.index;f<this.text.length;){h=this.text.charAt(f);if("("===h){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(h))f++;else break}d={index:d,text:c};if(Ga.hasOwnProperty(c))d.fn=Ga[c],d.json=Ga[c];else{var m=oc(c,this.options,this.text);d.fn=G(function(a,c){return m(a,c)},{assign:function(d,e){return gb(d,c,e,a.text,a.options)}})}this.tokens.push(d);
-g&&(this.tokens.push({index:e,text:".",json:!1}),this.tokens.push({index:e+1,text:g,json:!1}))},readString:function(a){var c=this.index;this.index++;for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(g=this.text.substring(this.index+1,this.index+5),g.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+g+"]"),this.index+=4,d+=String.fromCharCode(parseInt(g,16))):d=(f=Md[g])?d+f:d+g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;
-this.tokens.push({index:c,text:e,string:d,json:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};var Ua=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};Ua.ZERO=function(){return 0};Ua.prototype={constructor:Ua,parse:function(a,c){this.text=a;this.json=c;this.tokens=this.lexer.lex(a);c&&(this.assignment=this.logicalOR,this.functionCall=this.fieldAccess=this.objectIndex=this.filterChain=function(){this.throwError("is not valid json",{text:a,
-index:0})});var d=c?this.primary():this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);d.literal=!!d.literal;d.constant=!!d.constant;return d},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.json&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(",
-"[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw xa("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw xa("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},
-expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.json&&!a.json&&this.throwError("is not valid json",a),this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return G(function(d,e){return a(d,e,c)},{constant:c.constant})},ternaryFn:function(a,c,d){return G(function(e,f){return a(e,f)?c(e,f):d(e,f)},{constant:a.constant&&c.constant&&d.constant})},binaryFn:function(a,c,d){return G(function(e,f){return c(e,
-f,a,d)},{constant:a.constant&&d.constant})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0;f<a.length;f++){var g=a[f];g&&(e=g(c,d))}return e}},filterChain:function(){for(var a=this.expression(),c;;)if(c=this.expect("|"))a=this.binaryFn(a,c.fn,this.filter());else return a},filter:function(){for(var a=this.expect(),c=this.$filter(a.text),d=[];;)if(a=this.expect(":"))d.push(this.expression());
-else{var e=function(a,e,h){h=[h];for(var m=0;m<d.length;m++)h.push(d[m](a,e));return c.apply(a,h)};return function(){return e}}},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),function(d,f){return a.assign(d,c(d,f),f)}):a},ternary:function(){var a=this.logicalOR(),c,d;if(this.expect("?")){c=this.ternary();
-if(d=this.expect(":"))return this.ternaryFn(a,c,this.ternary());this.throwError("expected :",d)}else return a},logicalOR:function(){for(var a=this.logicalAND(),c;;)if(c=this.expect("||"))a=this.binaryFn(a,c.fn,this.logicalAND());else return a},logicalAND:function(){var a=this.equality(),c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND());return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},
-relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(Ua.ZERO,a.fn,
-this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=oc(d,this.options,this.text);return G(function(c,d,h){return e(h||a(c,d),d)},{assign:function(e,g,h){return gb(a(e,h),d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return G(function(e,f){var g=a(e,f),h=d(e,f),m;if(!g)return s;(g=fb(g[h],c.text))&&(g.then&&c.options.unwrapPromises)&&(m=g,"$$v"in g||(m.$$v=s,
-m.then(function(a){m.$$v=a})),g=g.$$v);return g},{assign:function(e,f,g){var h=d(e,g);return fb(a(e,g),c.text)[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(f,g){for(var h=[],m=c?c(f,g):f,k=0;k<d.length;k++)h.push(d[k](f,g));k=a(f,g,m)||v;fb(k,e.text);h=k.apply?k.apply(m,h):k(h[0],h[1],h[2],h[3],h[4]);return fb(h,e.text)}},arrayDeclaration:function(){var a=[],c=!0;if("]"!==
-this.peekToken().text){do{var d=this.expression();a.push(d);d.constant||(c=!1)}while(this.expect(","))}this.consume("]");return G(function(c,d){for(var g=[],h=0;h<a.length;h++)g.push(a[h](c,d));return g},{literal:!0,constant:c})},object:function(){var a=[],c=!0;if("}"!==this.peekToken().text){do{var d=this.expect(),d=d.string||d.text;this.consume(":");var e=this.expression();a.push({key:d,value:e});e.constant||(c=!1)}while(this.expect(","))}this.consume("}");return G(function(c,d){for(var e={},m=
-0;m<a.length;m++){var k=a[m];e[k.key]=k.value(c,d)}return e},{literal:!0,constant:c})}};var Gb={},sa=D("$sce"),ea={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},V=R.createElement("a"),rc=wa(Y.location.href,!0);sc.$inject=["$provide"];tc.$inject=["$locale"];vc.$inject=["$locale"];var yc=".",Gd={yyyy:X("FullYear",4),yy:X("FullYear",2,0,!0),y:X("FullYear",1),MMMM:hb("Month"),MMM:hb("Month",!0),MM:X("Month",2,1),M:X("Month",1,1),dd:X("Date",2),d:X("Date",1),HH:X("Hours",2),H:X("Hours",
-1),hh:X("Hours",2,-12),h:X("Hours",1,-12),mm:X("Minutes",2),m:X("Minutes",1),ss:X("Seconds",2),s:X("Seconds",1),sss:X("Milliseconds",3),EEEE:hb("Day"),EEE:hb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ib(Math[0<a?"floor":"ceil"](a/60),2)+Ib(Math.abs(a%60),2))}},Fd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Ed=/^\-?\d+$/;uc.$inject=["$locale"];var Cd=aa(B),Dd=aa(Ea);wc.$inject=
-["$parse"];var Nd=aa({restrict:"E",compile:function(a,c){8>=Q&&(c.href||c.name||c.$set("href",""),a.append(R.createComment("IE fix")));return function(a,c){c.on("click",function(a){c.attr("href")||a.preventDefault()})}}}),Kb={};p(cb,function(a,c){if("multiple"!=a){var d=la("ng-"+c);Kb[d]=function(){return{priority:100,compile:function(){return function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}}});p(["src","srcset","href"],function(a){var c=la("ng-"+a);Kb[c]=function(){return{priority:99,
-link:function(d,e,f){f.$observe(c,function(c){c&&(f.$set(a,c),Q&&e.prop(a,f[a]))})}}}});var kb={$addControl:v,$removeControl:v,$setValidity:v,$setDirty:v,$setPristine:v};zc.$inject=["$element","$attrs","$scope"];var Bc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:zc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Ac(e[0],"submit",h);e.on("$destroy",function(){c(function(){xb(e[0],
-"submit",h)},0,!1)})}var m=e.parent().controller("form"),k=f.name||f.ngForm;k&&gb(a,k,g,k);if(m)e.on("$destroy",function(){m.$removeControl(g);k&&gb(a,k,s,k);G(g,kb)})}}}}}]},Od=Bc(),Pd=Bc(!0),Qd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Rd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/,Sd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Cc={text:mb,number:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Sd.test(a))return e.$setValidity("number",
-!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});if(d.min){var h=parseFloat(d.min);a=function(a){if(!e.$isEmpty(a)&&a<h)return e.$setValidity("min",!1),s;e.$setValidity("min",!0);return a};e.$parsers.push(a);e.$formatters.push(a)}if(d.max){var m=parseFloat(d.max);d=function(a){if(!e.$isEmpty(a)&&a>m)return e.$setValidity("max",!1),s;e.$setValidity("max",!0);return a};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){if(e.$isEmpty(a)||
-ob(a))return e.$setValidity("number",!0),a;e.$setValidity("number",!1);return s})},url:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);a=function(a){if(e.$isEmpty(a)||Qd.test(a))return e.$setValidity("url",!0),a;e.$setValidity("url",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,f,g){mb(a,c,d,e,f,g);a=function(a){if(e.$isEmpty(a)||Rd.test(a))return e.$setValidity("email",!0),a;e.$setValidity("email",!1);return s};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,
-e){z(d.name)&&c.attr("name",Va());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;F(f)||(f=!0);F(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a===
-f});e.$parsers.push(function(a){return a?f:g})},hidden:v,button:v,submit:v,reset:v},Dc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,g){g&&(Cc[B(f.type)]||Cc.text)(d,e,f,g,c,a)}}}],jb="ng-valid",ib="ng-invalid",Fa="ng-pristine",lb="ng-dirty",Td=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,f){function g(a,c){c=c?"-"+$a(c,"-"):"";e.removeClass((a?ib:jb)+c).addClass((a?jb:ib)+c)}this.$modelValue=this.$viewValue=Number.NaN;
-this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var h=f(d.ngModel),m=h.assign;if(!m)throw D("ngModel")("nonassign",d.ngModel,ga(e));this.$render=v;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var k=e.inheritedData("$formController")||kb,l=0,r=this.$error={};e.addClass(Fa);g(!0);this.$setValidity=function(a,c){r[a]!==!c&&(c?(r[a]&&l--,l||(g(!0),this.$valid=!0,this.$invalid=!1)):(g(!1),
-this.$invalid=!0,this.$valid=!1,l++),r[a]=!c,g(c,a),k.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(lb).addClass(Fa)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,e.removeClass(Fa).addClass(lb),k.$setDirty());p(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,m(a,d),p(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var q=this;a.$watch(function(){var c=
-h(a);if(q.$modelValue!==c){var d=q.$formatters,e=d.length;for(q.$modelValue=c;e--;)c=d[e](c);q.$viewValue!==c&&(q.$viewValue=c,q.$render())}})}],Ud=function(){return{require:["ngModel","^?form"],controller:Td,link:function(a,c,d,e){var f=e[0],g=e[1]||kb;g.$addControl(f);c.on("$destroy",function(){g.$removeControl(f)})}}},Vd=aa({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ec=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=
-!0;var f=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required",function(){f(e.$viewValue)})}}}},Wd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!z(a)){var c=[];a&&p(a.split(f),function(a){a&&c.push(ba(a))});return c}});e.$formatters.push(function(a){return H(a)?a.join(", "):
-s});e.$isEmpty=function(a){return!a||!a.length}}}},Xd=/^(true|false|\d+)$/,Yd=function(){return{priority:100,compile:function(a,c){return Xd.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},Zd=ta(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),$d=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",
-c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],ae=["$sce","$parse",function(a,c){return function(d,e,f){e.addClass("ng-binding").data("$binding",f.ngBindHtml);var g=c(f.ngBindHtml);d.$watch(function(){return(g(d)||"").toString()},function(c){e.html(a.getTrustedHtml(g(d))||"")})}}],be=Jb("",!0),ce=Jb("Odd",0),de=Jb("Even",1),ee=ta({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),fe=[function(){return{scope:!0,controller:"@"}}],ge=["$sniffer",function(a){return{priority:1E3,
-compile:function(){a.csp=!0}}}],Fc={};p("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=la("ng-"+a);Fc[c]=["$parse",function(d){return function(e,f,g){var h=d(g[c]);f.on(B(a),function(a){e.$apply(function(){h(e,{$event:a})})})}}]});var he=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",compile:function(c,d,e){return function(c,d,h){var m,
-k;c.$watch(h.ngIf,function(h){m&&(a.leave(m),m=s);k&&(k.$destroy(),k=s);Ka(h)&&(k=c.$new(),e(k,function(c){m=c;a.enter(c,d.parent(),d)}))})}}}}],ie=["$http","$templateCache","$anchorScroll","$compile","$animate","$sce",function(a,c,d,e,f,g){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",compile:function(h,m,k){var l=m.ngInclude||m.src,p=m.onload||"",q=m.autoscroll;return function(h,m){var s=0,C,u,x=function(){C&&(C.$destroy(),C=null);u&&(f.leave(u),u=null)};h.$watch(g.parseAsResourceUrl(l),
-function(g){var l=++s;g?(a.get(g,{cache:c}).success(function(a){if(l===s){var c=h.$new();k(c,function(g){x();C=c;u=g;u.html(a);f.enter(u,null,m);e(u.contents())(C);!w(q)||q&&!h.$eval(q)||d();C.$emit("$includeContentLoaded");h.$eval(p)})}}).error(function(){l===s&&x()}),h.$emit("$includeContentRequested")):x()})}}}}],je=ta({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ke=ta({terminal:!0,priority:1E3}),le=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",
-link:function(e,f,g){var h=g.count,m=g.$attr.when&&f.attr(g.$attr.when),k=g.offset||0,l=e.$eval(m)||{},r={},q=c.startSymbol(),n=c.endSymbol(),s=/^when(Minus)?(.+)$/;p(g,function(a,c){s.test(c)&&(l[B(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});p(l,function(a,e){r[e]=c(a.replace(d,q+h+"-"+k+n))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in l||(c=a.pluralCat(c-k));return r[c](e,f,!0)},function(a){f.text(a)})}}}],me=["$parse","$animate",function(a,
-c){function d(a){if(a.startNode===a.endNode)return x(a.startNode);var c=a.startNode,d=[c];do{c=c.nextSibling;if(!c)break;d.push(c)}while(c!==a.endNode);return x(d)}var e=D("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,compile:function(f,g,h){return function(f,g,l){var r=l.ngRepeat,q=r.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),n,s,w,C,u,v,B,t={$id:Ca};if(!q)throw e("iexp",r);l=q[1];u=q[2];(q=q[4])?(n=a(q),s=function(a,c,d){B&&(t[B]=a);t[v]=c;t.$index=d;return n(f,
-t)}):(w=function(a,c){return Ca(c)},C=function(a){return a});q=l.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!q)throw e("iidexp",l);v=q[3]||q[1];B=q[2];var F={};f.$watchCollection(u,function(a){var l,q,n=g[0],u,t={},G,D,O,P,H,K,z=[];if(nb(a))H=a,u=s||w;else{u=s||C;H=[];for(O in a)a.hasOwnProperty(O)&&"$"!=O.charAt(0)&&H.push(O);H.sort()}G=H.length;q=z.length=H.length;for(l=0;l<q;l++)if(O=a===H?l:H[l],P=a[O],P=u(O,P,l),pa(P,"`track by` id"),F.hasOwnProperty(P))K=F[P],delete F[P],t[P]=
-K,z[l]=K;else{if(t.hasOwnProperty(P))throw p(z,function(a){a&&a.startNode&&(F[a.id]=a)}),e("dupes",r,P);z[l]={id:P};t[P]=!1}for(O in F)F.hasOwnProperty(O)&&(K=F[O],l=d(K),c.leave(l),p(l,function(a){a.$$NG_REMOVED=!0}),K.scope.$destroy());l=0;for(q=H.length;l<q;l++){O=a===H?l:H[l];P=a[O];K=z[l];z[l-1]&&(n=z[l-1].endNode);if(K.startNode){D=K.scope;u=n;do u=u.nextSibling;while(u&&u.$$NG_REMOVED);K.startNode!=u&&c.move(d(K),null,x(n));n=K.endNode}else D=f.$new();D[v]=P;B&&(D[B]=O);D.$index=l;D.$first=
-0===l;D.$last=l===G-1;D.$middle=!(D.$first||D.$last);D.$odd=!(D.$even=0==l%2);K.startNode||h(D,function(a){a[a.length++]=R.createComment(" end ngRepeat: "+r+" ");c.enter(a,null,x(n));n=a;K.scope=D;K.startNode=n&&n.endNode?n.endNode:a[0];K.endNode=a[a.length-1];t[K.id]=K})}F=t})}}}}],ne=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Ka(c)?"removeClass":"addClass"](d,"ng-hide")})}}],oe=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Ka(c)?
-"addClass":"removeClass"](d,"ng-hide")})}}],pe=ta(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&p(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),qe=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g,h,m=[];c.$watch(e.ngSwitch||e.on,function(d){for(var l=0,r=m.length;l<r;l++)m[l].$destroy(),a.leave(h[l]);h=[];m=[];if(g=f.cases["!"+d]||f.cases["?"])c.$eval(e.change),p(g,function(d){var e=c.$new();
-m.push(e);d.transclude(e,function(c){var e=d.element;h.push(c);a.enter(c,e.parent(),e)})})})}}}],re=ta({transclude:"element",priority:800,require:"^ngSwitch",compile:function(a,c,d){return function(a,f,g,h){h.cases["!"+c.ngSwitchWhen]=h.cases["!"+c.ngSwitchWhen]||[];h.cases["!"+c.ngSwitchWhen].push({transclude:d,element:f})}}}),se=ta({transclude:"element",priority:800,require:"^ngSwitch",compile:function(a,c,d){return function(a,c,g,h){h.cases["?"]=h.cases["?"]||[];h.cases["?"].push({transclude:d,
-element:c})}}}),te=ta({controller:["$element","$transclude",function(a,c){if(!c)throw D("ngTransclude")("orphan",ga(a));this.$transclude=c}],link:function(a,c,d,e){e.$transclude(function(a){c.html("");c.append(a)})}}),ue=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],ve=D("ngOptions"),we=aa({terminal:!0}),xe=["$compile","$parse",function(a,c){var d=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/,
-e={$setViewValue:v};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var m=this,k={},l=e,p;m.databound=d.ngModel;m.init=function(a,c,d){l=a;p=d};m.addOption=function(c){pa(c,'"option value"');k[c]=!0;l.$viewValue==c&&(a.val(c),p.parent()&&p.remove())};m.removeOption=function(a){this.hasOption(a)&&(delete k[a],l.$viewValue==a&&this.renderUnknownOption(a))};m.renderUnknownOption=function(c){c="? "+Ca(c)+" ?";p.val(c);a.prepend(p);a.val(c);p.prop("selected",
-!0)};m.hasOption=function(a){return k.hasOwnProperty(a)};c.$on("$destroy",function(){m.renderUnknownOption=v})}],link:function(e,g,h,m){function k(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(t.parent()&&t.remove(),c.val(a),""===a&&u.prop("selected",!0)):z(a)&&u?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){t.parent()&&t.remove();d.$setViewValue(c.val())})})}function l(a,c,d){var e;d.$render=function(){var a=new Pa(d.$viewValue);p(c.find("option"),
-function(c){c.selected=w(a.get(c.value))})};a.$watch(function(){Aa(e,d.$viewValue)||(e=fa(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=[];p(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function r(e,f,h){function g(){var a={"":[]},c=[""],d,k,t,v,x;v=h.$modelValue;x=r(e)||[];var B=n?Lb(x):x,G,z,A;z={};t=!1;var E,J;if(y)if(u&&H(v))for(t=new Pa([]),A=0;A<v.length;A++)z[m]=v[A],t.put(u(e,z),v[A]);else t=new Pa(v);for(A=0;G=B.length,
-A<G;A++){k=A;if(n){k=B[A];if("$"===k.charAt(0))continue;z[n]=k}z[m]=x[k];d=q(e,z)||"";(k=a[d])||(k=a[d]=[],c.push(d));y?d=t.remove(u?u(e,z):p(e,z))!==s:(u?(d={},d[m]=v,d=u(e,d)===u(e,z)):d=v===p(e,z),t=t||d);E=l(e,z);E=E===s?"":E;k.push({id:u?u(e,z):n?B[A]:A,label:E,selected:d})}y||(C||null===v?a[""].unshift({id:"",label:"",selected:!t}):t||a[""].unshift({id:"?",label:"",selected:!0}));z=0;for(B=c.length;z<B;z++){d=c[z];k=a[d];w.length<=z?(v={element:F.clone().attr("label",d),label:k.label},x=[v],
-w.push(x),f.append(v.element)):(x=w[z],v=x[0],v.label!=d&&v.element.attr("label",v.label=d));E=null;A=0;for(G=k.length;A<G;A++)t=k[A],(d=x[A+1])?(E=d.element,d.label!==t.label&&E.text(d.label=t.label),d.id!==t.id&&E.val(d.id=t.id),E[0].selected!==t.selected&&E.prop("selected",d.selected=t.selected)):(""===t.id&&C?J=C:(J=D.clone()).val(t.id).attr("selected",t.selected).text(t.label),x.push({element:J,label:t.label,id:t.id,selected:t.selected}),E?E.after(J):v.element.append(J),E=J);for(A++;x.length>
-A;)x.pop().element.remove()}for(;w.length>z;)w.pop()[0].element.remove()}var k;if(!(k=v.match(d)))throw ve("iexp",v,ga(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],q=c(k[3]||""),p=c(k[2]?k[1]:m),r=c(k[7]),u=k[8]?c(k[8]):null,w=[[{element:f,label:""}]];C&&(a(C)(e),C.removeClass("ng-scope"),C.remove());f.html("");f.on("change",function(){e.$apply(function(){var a,c=r(e)||[],d={},g,k,l,q,t,v,x;if(y)for(k=[],q=0,v=w.length;q<v;q++)for(a=w[q],l=1,t=a.length;l<t;l++){if((g=a[l].element)[0].selected){g=g.val();
-n&&(d[n]=g);if(u)for(x=0;x<c.length&&(d[m]=c[x],u(e,d)!=g);x++);else d[m]=c[g];k.push(p(e,d))}}else if(g=f.val(),"?"==g)k=s;else if(""==g)k=null;else if(u)for(x=0;x<c.length;x++){if(d[m]=c[x],u(e,d)==g){k=p(e,d);break}}else d[m]=c[g],n&&(d[n]=g),k=p(e,d);h.$setViewValue(k)})});h.$render=g;e.$watch(g)}if(m[1]){var q=m[0],n=m[1],y=h.multiple,v=h.ngOptions,C=!1,u,D=x(R.createElement("option")),F=x(R.createElement("optgroup")),t=D.clone();m=0;for(var B=g.children(),G=B.length;m<G;m++)if(""==B[m].value){u=
-C=B.eq(m);break}q.init(n,C,t);if(y&&(h.required||h.ngRequired)){var E=function(a){n.$setValidity("required",!h.required||a&&a.length);return a};n.$parsers.push(E);n.$formatters.unshift(E);h.$observe("required",function(){E(n.$viewValue)})}v?r(e,g,n):y?l(e,g,n):k(e,g,n,q)}}}}],ye=["$interpolate",function(a){var c={addOption:v,removeOption:v};return{restrict:"E",priority:100,compile:function(d,e){if(z(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var k=d.parent(),
-l=k.data("$selectController")||k.parent().data("$selectController");l&&l.databound?d.prop("selected",!1):l=c;f?a.$watch(f,function(a,c){e.$set("value",a);a!==c&&l.removeOption(c);l.addOption(a)}):l.addOption(e.value);d.on("$destroy",function(){l.removeOption(e.value)})}}}}],ze=aa({restrict:"E",terminal:!0});(Ba=Y.jQuery)?(x=Ba,G(Ba.fn,{scope:Sa.scope,controller:Sa.controller,injector:Sa.injector,inheritedData:Sa.inheritedData}),tb("remove",!0,!0,!1),tb("empty",!1,!1,!1),tb("html",!1,!1,!0)):x=J;Za.element=
-x;(function(a){G(a,{bootstrap:Sb,copy:fa,extend:G,equals:Aa,element:x,forEach:p,injector:Tb,noop:v,bind:pb,toJson:oa,fromJson:Ob,identity:za,isUndefined:z,isDefined:w,isString:F,isFunction:E,isObject:S,isNumber:ob,isElement:Ic,isArray:H,$$minErr:D,version:Id,isDate:Ha,lowercase:B,uppercase:Ea,callbacks:{counter:0}});Ra=Oc(Y);try{Ra("ngLocale")}catch(c){Ra("ngLocale",[]).provider("$locale",ld)}Ra("ng",["ngLocale"],["$provide",function(a){a.provider("$compile",bc).directive({a:Nd,input:Dc,textarea:Dc,
-form:Od,script:ue,select:xe,style:ze,option:ye,ngBind:Zd,ngBindHtml:ae,ngBindTemplate:$d,ngClass:be,ngClassEven:de,ngClassOdd:ce,ngCsp:ge,ngCloak:ee,ngController:fe,ngForm:Pd,ngHide:oe,ngIf:he,ngInclude:ie,ngInit:je,ngNonBindable:ke,ngPluralize:le,ngRepeat:me,ngShow:ne,ngStyle:pe,ngSwitch:qe,ngSwitchWhen:re,ngSwitchDefault:se,ngOptions:we,ngTransclude:te,ngModel:Ud,ngList:Wd,ngChange:Vd,required:Ec,ngRequired:Ec,ngValue:Yd}).directive(Kb).directive(Fc);a.provider({$anchorScroll:Xc,$animate:Kd,$browser:Zc,
-$cacheFactory:$c,$controller:cd,$document:dd,$exceptionHandler:ed,$filter:sc,$interpolate:jd,$interval:kd,$http:fd,$httpBackend:gd,$location:nd,$log:od,$parse:pd,$rootScope:sd,$q:qd,$sce:vd,$sceDelegate:ud,$sniffer:wd,$templateCache:ad,$timeout:xd,$window:yd})}])})(Za);x(R).ready(function(){Mc(R,Sb)})})(window,document);angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}</style>');
-//# sourceMappingURL=angular.min.js.map
diff --git a/dashboard/lib/assets/angular/extensions/angular-leaflet-directive.min.js b/dashboard/lib/assets/angular/extensions/angular-leaflet-directive.min.js
deleted file mode 100644
index 27e606e..0000000
--- a/dashboard/lib/assets/angular/extensions/angular-leaflet-directive.min.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**!
- * The MIT License
- *
- * Copyright (c) 2013 the angular-leaflet-directive Team, http://tombatossals.github.io/angular-leaflet-directive
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * angular-leaflet-directive
- * https://github.com/tombatossals/angular-leaflet-directive
- *
- * @authors https://github.com/tombatossals/angular-leaflet-directive/graphs/contributors
- */
-
-/*! angular-leaflet-directive 15-04-2014 */
-!function(){"use strict";angular.module("leaflet-directive",[]).directive("leaflet",["$q","leafletData","leafletMapDefaults","leafletHelpers","leafletEvents",function(a,b,c,d,e){var f;return{restrict:"EA",replace:!0,scope:{center:"=center",defaults:"=defaults",maxbounds:"=maxbounds",bounds:"=bounds",markers:"=markers",legend:"=legend",geojson:"=geojson",paths:"=paths",tiles:"=tiles",layers:"=layers",controls:"=controls",eventBroadcast:"=eventBroadcast"},template:'<div class="angular-leaflet-map"></div>',controller:["$scope",function(b){f=a.defer(),this.getMap=function(){return f.promise},this.getLeafletScope=function(){return b}}],link:function(a,g,h){var i=d.isDefined,j=c.setDefaults(a.defaults,h.id),k=e.genDispatchMapEvent,l=e.getAvailableMapEvents();i(h.width)&&(isNaN(h.width)?g.css("width",h.width):g.css("width",h.width+"px")),i(h.height)&&(isNaN(h.height)?g.css("height",h.height):g.css("height",h.height+"px"));var m=new L.Map(g[0],c.getMapCreationDefaults(h.id));if(f.resolve(m),i(h.center)||m.setView([j.center.lat,j.center.lng],j.center.zoom),!i(h.tiles)&&!i(h.layers)){var n=L.tileLayer(j.tileLayer,j.tileLayerOptions);n.addTo(m),b.setTiles(n,h.id)}if(i(m.zoomControl)&&i(j.zoomControlPosition)&&m.zoomControl.setPosition(j.zoomControlPosition),i(m.zoomControl)&&j.zoomControl===!1&&m.zoomControl.removeFrom(m),i(m.zoomsliderControl)&&i(j.zoomsliderControl)&&j.zoomsliderControl===!1&&m.zoomsliderControl.removeFrom(m),!i(h.eventBroadcast))for(var o="broadcast",p=0;p<l.length;p++){var q=l[p];m.on(q,k(a,q,o),{eventName:q})}m.whenReady(function(){b.setMap(m,h.id)}),a.$on("$destroy",function(){b.unresolveMap(h.id)})}}}]),angular.module("leaflet-directive").directive("center",["$log","$q","$location","leafletMapDefaults","leafletHelpers","leafletBoundsHelpers",function(a,b,c,d,e,f){var g,h=e.isDefined,i=e.isNumber,j=e.isSameCenterOnMap,k=e.safeApply,l=e.isValidCenter,m=e.isEmpty,n=e.isUndefinedOrEmpty,o=function(a,b){return h(a)&&!m(a)&&n(b)},p=function(a){a.$broadcast("boundsChanged")},q=function(a,b,d){if(h(d.urlHashCenter)){var e=b.getCenter(),f=e.lat.toFixed(4)+":"+e.lng.toFixed(4)+":"+b.getZoom(),g=c.search();h(g.c)&&g.c===f||a.$emit("centerUrlHash",f)}};return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){g=b.defer(),this.getCenter=function(){return g.promise}},link:function(b,e,m,n){var r=n.getLeafletScope(),s=r.center;n.getMap().then(function(b){var e=d.getDefaults(m.id);if(-1!==m.center.search("-"))return a.error('The "center" variable can\'t use a "-" on his key name: "'+m.center+'".'),void b.setView([e.center.lat,e.center.lng],e.center.zoom);if(o(r.bounds,s))b.fitBounds(f.createLeafletBounds(r.bounds)),s=b.getCenter(),k(r,function(a){a.center={lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1}}),k(r,function(a){var c=b.getBounds(),d={northEast:{lat:c._northEast.lat,lng:c._northEast.lng},southWest:{lat:c._southWest.lat,lng:c._southWest.lng}};a.bounds=d});else{if(!h(s))return a.error('The "center" property is not defined in the main scope'),void b.setView([e.center.lat,e.center.lng],e.center.zoom);h(s.lat)&&h(s.lng)||h(s.autoDiscover)||angular.copy(e.center,s)}var n,t;if("yes"===m.urlHashCenter){var u=function(){var a,b=c.search();if(h(b.c)){var d=b.c.split(":");3===d.length&&(a={lat:parseFloat(d[0]),lng:parseFloat(d[1]),zoom:parseInt(d[2],10)})}return a};n=u(),r.$on("$locationChangeSuccess",function(a){var c=a.currentScope,d=u();h(d)&&!j(d,b)&&(c.center={lat:d.lat,lng:d.lng,zoom:d.zoom})})}r.$watch("center",function(c){return h(n)&&(angular.copy(n,c),n=void 0),l(c)||c.autoDiscover===!0?c.autoDiscover===!0?(i(c.zoom)||b.setView([e.center.lat,e.center.lng],e.center.zoom),void b.locate(i(c.zoom)&&c.zoom>e.center.zoom?{setView:!0,maxZoom:c.zoom}:h(e.maxZoom)?{setView:!0,maxZoom:e.maxZoom}:{setView:!0})):void(t&&j(c,b)||(b.setView([c.lat,c.lng],c.zoom),p(r,b))):void a.warn("[AngularJS - Leaflet] invalid 'center'")},!0),b.whenReady(function(){t=!0}),b.on("moveend",function(){g.resolve(),q(r,b,m),j(s,b)||k(r,function(a){a.center={lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1},p(r,b)})}),s.autoDiscover===!0&&b.on("locationerror",function(){a.warn("[AngularJS - Leaflet] The Geolocation API is unauthorized on this page."),l(s)?(b.setView([s.lat,s.lng],s.zoom),p(r,b)):(b.setView([e.center.lat,e.center.lng],e.center.zoom),p(r,b))})})}}}]),angular.module("leaflet-directive").directive("tiles",["$log","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)||i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c){var f=e.tileLayerOptions,h=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?i(c.url)&&i(c.options)&&!angular.equals(c.options,f)?(a.removeLayer(d),f=e.tileLayerOptions,angular.copy(c.options,f),h=c.url,d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id)):void(i(c.url)&&d.setUrl(c.url)):(i(c.options)&&angular.copy(c.options,f),i(c.url)&&(h=c.url),d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.")}}}]),angular.module("leaflet-directive").directive("legend",["$log","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j=c.isArray,k=c.isDefined,l=c.isFunction,m=h.getLeafletScope(),n=m.legend,o=n.legendClass?n.legendClass:"legend",p=n.position||"bottomright";h.getMap().then(function(c){k(n.url)||j(n.colors)&&j(n.labels)&&n.colors.length===n.labels.length?k(n.url)?a.info("[AngularJS - Leaflet] loading arcgis legend service."):(i=L.control({position:p}),i.onAdd=d.getOnAddArrayLegend(n,o),i.addTo(c)):a.warn("[AngularJS - Leaflet] legend.colors and legend.labels must be set."),m.$watch("legend.url",function(e){k(e)&&b.get(e).success(function(a){k(i)?d.updateArcGISLegend(i.getContainer(),a):(i=L.control({position:p}),i.onAdd=d.getOnAddArcGISLegend(a,o),i.addTo(c)),k(n.loadedData)&&l(n.loadedData)&&n.loadedData()}).error(function(){a.warn("[AngularJS - Leaflet] legend.url not loaded.")})})})}}}]),angular.module("leaflet-directive").directive("geojson",["$log","$rootScope","leafletData","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,e,f,g){var h=d.safeApply,i=d.isDefined,j=g.getLeafletScope(),k={};g.getMap().then(function(a){j.$watch("geojson",function(e){if(i(k)&&a.hasLayer(k)&&a.removeLayer(k),i(e)&&i(e.data)){var f=e.resetStyleOnMouseout,g=e.onEachFeature;g||(g=function(a,c){d.LabelPlugin.isLoaded()&&i(e.label)&&c.bindLabel(a.properties.description),c.on({mouseover:function(c){h(j,function(){e.selected=a,b.$broadcast("leafletDirectiveMap.geojsonMouseover",c)})},mouseout:function(a){f&&k.resetStyle(a.target),h(j,function(){e.selected=void 0,b.$broadcast("leafletDirectiveMap.geojsonMouseout",a)})},click:function(c){h(j,function(){e.selected=a,b.$broadcast("leafletDirectiveMap.geojsonClick",e.selected,c)})}})}),e.options={style:e.style,filter:e.filter,onEachFeature:g,pointToLayer:e.pointToLayer},k=L.geoJson(e.data,e.options),c.setGeoJSON(k),k.addTo(a)}})})}}}]),angular.module("leaflet-directive").directive("layers",["$log","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){var g;return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){g=b.defer(),this.getLayers=function(){return g.promise}},link:function(b,h,i,j){var k=d.isDefined,l={},m=j.getLeafletScope(),n=m.layers,o=e.createLayer,p=f.updateLayersControl,q=!1;j.getMap().then(function(b){if(!k(n)||!k(n.baselayers)||0===Object.keys(n.baselayers).length)return void a.error("[AngularJS - Leaflet] At least one baselayer has to be defined");g.resolve(l),c.setLayers(l,i.id),l.baselayers={},l.overlays={};var d=i.id,e=!1;for(var f in n.baselayers){var h=o(n.baselayers[f]);k(h)?(l.baselayers[f]=h,n.baselayers[f].top===!0&&(b.addLayer(l.baselayers[f]),e=!0)):delete n.baselayers[f]}!e&&Object.keys(l.baselayers).length>0&&b.addLayer(l.baselayers[Object.keys(n.baselayers)[0]]);for(f in n.overlays){var j=o(n.overlays[f]);k(j)?(l.overlays[f]=j,n.overlays[f].visible===!0&&b.addLayer(l.overlays[f])):delete n.overlays[f]}m.$watch("layers.baselayers",function(c){for(var e in l.baselayers)k(c[e])||(b.hasLayer(l.baselayers[e])&&b.removeLayer(l.baselayers[e]),delete l.baselayers[e]);for(var f in c)if(!k(l.baselayers[f])){var g=o(c[f]);k(g)&&(l.baselayers[f]=g,c[f].top===!0&&b.addLayer(l.baselayers[f]))}if(0===Object.keys(l.baselayers).length)return void a.error("[AngularJS - Leaflet] At least one baselayer has to be defined");var h=!1;for(var i in l.baselayers)if(b.hasLayer(l.baselayers[i])){h=!0;break}h||b.addLayer(l.baselayers[Object.keys(n.baselayers)[0]]),q=p(b,d,q,c,n.overlays,l)},!0),m.$watch("layers.overlays",function(a){for(var c in l.overlays)k(a[c])||(b.hasLayer(l.overlays[c])&&b.removeLayer(l.overlays[c]),delete l.overlays[c]);for(var e in a){if(!k(l.overlays[e])){var f=o(a[e]);k(f)&&(l.overlays[e]=f,a[e].visible===!0&&b.addLayer(l.overlays[e]))}a[e].visible&&!b.hasLayer(l.overlays[e])?b.addLayer(l.overlays[e]):a[e].visible===!1&&b.hasLayer(l.overlays[e])&&b.removeLayer(l.overlays[e])}q=p(b,d,q,n.baselayers,a,l)},!0)})}}}]),angular.module("leaflet-directive").directive("bounds",["$log","$timeout","leafletHelpers","leafletBoundsHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","center"],link:function(b,e,f,g){var h=c.isDefined,i=d.createLeafletBounds,j=g[0].getLeafletScope(),k=g[0],l=function(a){return 0===a._southWest.lat&&0===a._southWest.lng&&0===a._northEast.lat&&0===a._northEast.lng?!0:!1};k.getMap().then(function(b){j.$on("boundsChanged",function(c){var d=c.currentScope,e=b.getBounds();if(a.debug("updated map bounds...",e),!l(e)){var f={northEast:{lat:e._northEast.lat,lng:e._northEast.lng},southWest:{lat:e._southWest.lat,lng:e._southWest.lng}};angular.equals(d.bounds,f)||(a.debug("Need to update scope bounds."),d.bounds=f)}}),j.$watch("bounds",function(c){if(a.debug("updated bounds...",c),!h(c))return void a.error("[AngularJS - Leaflet] Invalid bounds");var d=i(c);d&&!b.getBounds().equals(d)&&(a.debug("Need to update map bounds."),b.fitBounds(d))},!0)})}}}]),angular.module("leaflet-directive").directive("markers",["$log","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletEvents",function(a,b,c,d,e,f,g,h){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(b,f,i,j){var k=j[0],l=e,m=e.isDefined,n=e.isString,o=k.getLeafletScope(),p=o.markers,q=g.deleteMarker,r=g.addMarkerWatcher,s=g.listenMarkerEvents,t=g.addMarkerToGroup,u=h.bindMarkerEvents,v=g.createMarker;k.getMap().then(function(b){var e,f={};e=m(j[1])?j[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise},m(p)&&e().then(function(c){d.setMarkers(f,i.id),o.$watch("markers",function(d){for(var e in f)m(d)&&m(d[e])||(q(f[e],b,c),delete f[e]);for(var g in d)if(-1===g.search("-")){if(!m(f[g])){var h=d[g],j=v(h);if(!m(j)){a.error("[AngularJS - Leaflet] Received invalid data on the marker "+g+".");continue}if(f[g]=j,m(h.message)&&j.bindPopup(h.message,h.popupOptions),m(h.group)&&t(j,h.group,b),l.LabelPlugin.isLoaded()&&m(h.label)&&m(h.label.message)&&j.bindLabel(h.label.message,h.label.options),m(h)&&m(h.layer)){if(!n(h.layer)){a.error("[AngularJS - Leaflet] A layername must be a string");continue}if(!m(c)){a.error("[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.");continue}if(!m(c.overlays)||!m(c.overlays[h.layer])){a.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"');continue}var k=c.overlays[h.layer];if(!(k instanceof L.LayerGroup)){a.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group"');continue}k.addLayer(j),b.hasLayer(j)&&h.focus===!0&&j.openPopup()}else m(h.group)||(b.addLayer(j),h.focus===!0&&j.openPopup(),l.LabelPlugin.isLoaded()&&m(h.label)&&m(h.label.options)&&h.label.options.noHide===!0&&j.showLabel());var p=!m(i.watchMarkers)||"true"===i.watchMarkers;p&&(r(j,g,o,c,b),s(j,h,o)),u(j,g,h,o)}}else a.error('The marker can\'t use a "-" on his key name: "'+g+'".')},!0)})})}}}]),angular.module("leaflet-directive").directive("paths",["$log","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletEvents",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(g,h,i,j){var k=d.isDefined,l=j.getLeafletScope(),m=l.paths,n=e.createPath,o=f.bindPathEvents,p=e.setPathOptions;j.getMap().then(function(e){var f=c.getDefaults(i.id);if(k(m)){var g={};b.setPaths(g,i.id);var h=function(a,b){var c=l.$watch("paths."+b,function(b){return k(b)?void p(a,b.type,b):(e.removeLayer(a),void c())},!0)};l.$watch("paths",function(b){for(var c in b)if(-1===c.search("-")){if(!k(g[c])){var i=b[c],j=n(c,b[c],f);k(j)&&k(i.message)&&j.bindPopup(i.message),d.LabelPlugin.isLoaded()&&k(i.label)&&k(i.label.message)&&j.bindLabel(i.label.message,i.label.options),k(j)&&(g[c]=j,e.addLayer(j),h(j,c)),o(j,c,i,l)}}else a.error('[AngularJS - Leaflet] The path name "'+c+'" is not valid. It must not include "-" and a number.');for(var m in g)k(b[m])||delete g[m]},!0)}})}}}]),angular.module("leaflet-directive").directive("controls",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(a,c,d,e){if(e){var f=b.isDefined,g=e.getLeafletScope(),h=g.controls;e.getMap().then(function(a){if(f(L.Control.Draw)&&f(h.draw)){var b=new L.FeatureGroup;a.addLayer(b);var c={edit:{featureGroup:b}};angular.extend(c,h.draw.options);var d=new L.Control.Draw(c);a.addControl(d)}if(f(h.custom))for(var e in h.custom)a.addControl(h.custom[e])})}}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["$log","$rootScope","leafletHelpers","leafletEvents",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,e,f,g){var h=c.isObject,i=g.getLeafletScope(),j=i.eventBroadcast,k=d.getAvailableMapEvents(),l=d.genDispatchMapEvent;g.getMap().then(function(b){var c,d,e=[],f="broadcast";if(h(j)){if(void 0===j.map||null===j.map)e=k;else if("object"!=typeof j.map)a.warn("[AngularJS - Leaflet] event-broadcast.map must be an object check your model.");else{void 0!==j.map.logic&&null!==j.map.logic&&("emit"!==j.map.logic&&"broadcast"!==j.map.logic?a.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===j.map.logic&&(f="emit"));var g=!1,m=!1;if(void 0!==j.map.enable&&null!==j.map.enable&&"object"==typeof j.map.enable&&(g=!0),void 0!==j.map.disable&&null!==j.map.disable&&"object"==typeof j.map.disable&&(m=!0),g&&m)a.warn("[AngularJS - Leaflet] can not enable and disable events at the time");else if(g||m)if(g)for(c=0;c<j.map.enable.length;c++)d=j.map.enable[c],-1!==e.indexOf(d)?a.warn("[AngularJS - Leaflet] This event "+d+" is already enabled"):-1===k.indexOf(d)?a.warn("[AngularJS - Leaflet] This event "+d+" does not exist"):e.push(d);else for(e=k,c=0;c<j.map.disable.length;c++){d=j.map.disable[c];var n=e.indexOf(d);-1===n?a.warn("[AngularJS - Leaflet] This event "+d+" does not exist or has been already disabled"):e.splice(n,1)}else a.warn("[AngularJS - Leaflet] must enable or disable events")}for(c=0;c<e.length;c++)d=e[c],b.on(d,l(i,d,f),{eventName:d})}else a.warn("[AngularJS - Leaflet] event-broadcast must be an object, check your model.")})}}}]),angular.module("leaflet-directive").directive("maxbounds",["$log","leafletMapDefaults","leafletBoundsHelpers",function(a,b,c){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,d,e){var f=e.getLeafletScope(),g=c.isValidBounds;e.getMap().then(function(a){f.$watch("maxbounds",function(b){if(!g(b))return void a.setMaxBounds();var c=[[b.southWest.lat,b.southWest.lng],[b.northEast.lat,b.northEast.lng]];a.setMaxBounds(c),a.fitBounds(c)})})}}}]),angular.module("leaflet-directive").service("leafletData",["$log","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h={},i={},j={},k={},l={};this.setMap=function(a,b){var c=e(g,b);c.resolve(a),f(g,b)},this.getMap=function(a){var b=d(g,a);return b.promise},this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g,a);g[b]=void 0},this.getPaths=function(a){var b=d(j,a);return b.promise},this.setPaths=function(a,b){var c=e(j,b);c.resolve(a),f(j,b)},this.getMarkers=function(a){var b=d(k,a);return b.promise},this.setMarkers=function(a,b){var c=e(k,b);c.resolve(a),f(k,b)},this.getLayers=function(a){var b=d(i,a);return b.promise},this.setLayers=function(a,b){var c=e(i,b);c.resolve(a),f(i,b)},this.setTiles=function(a,b){var c=e(h,b);c.resolve(a),f(h,b)},this.getTiles=function(a){var b=d(h,a);return b.promise},this.setGeoJSON=function(a,b){var c=e(l,b);c.resolve(a),f(l,b)},this.getGeoJSON=function(a){var b=d(l,a);return b.promise}}]),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},crs:L.CRS.EPSG3857,tileLayer:"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.obtainEffectiveMapId,f={};return{getDefaults:function(a){var b=e(f,a);return f[b]},getMapCreationDefaults:function(a){var b=e(f,a),c=f[b],g={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};return d(c.minZoom)&&(g.minZoom=c.minZoom),d(c.zoomAnimation)&&(g.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(g.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(g.markerZoomAnimation=c.markerZoomAnimation),g},setDefaults:function(a,b){var g=c();d(a)&&(g.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:g.doubleClickZoom,g.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:g.doubleClickZoom,g.zoomControl=d(a.zoomControl)?a.zoomControl:g.zoomControl,g.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:g.zoomsliderControl,g.attributionControl=d(a.attributionControl)?a.attributionControl:g.attributionControl,g.tileLayer=d(a.tileLayer)?a.tileLayer:g.tileLayer,g.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:g.zoomControlPosition,g.keyboard=d(a.keyboard)?a.keyboard:g.keyboard,g.dragging=d(a.dragging)?a.dragging:g.dragging,d(a.controls)&&angular.extend(g.controls,a.controls),d(a.crs)&&d(L.CRS[a.crs])&&(g.crs=L.CRS[a.crs]),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,g.tileLayerOptions),d(a.maxZoom)&&(g.maxZoom=a.maxZoom),d(a.minZoom)&&(g.minZoom=a.minZoom),d(a.zoomAnimation)&&(g.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(g.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(g.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(g.worldCopyJump=a.worldCopyJump));var h=e(f,b);return f[h]=g,g}}}]),angular.module("leaflet-directive").factory("leafletEvents",["$rootScope","$q","$log","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d,i=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},j=function(a,b,c,d){for(var e=i(),f="markers."+d,g=0;g<e.length;g++){var h=e[g];c.label.on(h,m(a,h,b,c.label,f))}},k=function(b,c,d,f,g,h){return function(i){var j="leafletDirectiveMarker."+b;"click"===b?e(d,function(){a.$broadcast("leafletDirectiveMarkersClick",g)}):"dragend"===b&&(e(d,function(){h.lat=f.getLatLng().lat,h.lng=f.getLatLng().lng}),h.message&&h.focus===!0&&f.openPopup()),e(d,function(b){"emit"===c?b.$emit(j,{markerName:g,leafletEvent:i}):a.$broadcast(j,{markerName:g,leafletEvent:i})})}},l=function(b,c,d,f,g){return function(f){var h="leafletDirectivePath."+b;e(d,function(b){"emit"===c?b.$emit(h,{pathName:g,leafletEvent:f}):a.$broadcast(h,{pathName:g,leafletEvent:f})})}},m=function(b,c,d,f,g){return function(h){var i="leafletDirectiveLabel."+c,j=g.replace("markers.","");e(b,function(b){"emit"===d?b.$emit(i,{leafletEvent:h,label:f,markerName:j}):"broadcast"===d&&a.$broadcast(i,{leafletEvent:h,label:f,markerName:j})})}},n=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","dragstart","drag","dragend","move","remove","popupopen","popupclose"]},o=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","add","remove","popupopen","popupclose"]};return{getAvailableMapEvents:function(){return["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","contextmenu","focus","blur","preclick","load","unload","viewreset","movestart","move","moveend","dragstart","drag","dragend","zoomstart","zoomend","zoomlevelschange","resize","autopanstart","layeradd","layerremove","baselayerchange","overlayadd","overlayremove","locationfound","locationerror","popupopen","popupclose","draw:created","draw:edited","draw:deleted","draw:drawstart","draw:drawstop","draw:editstart","draw:editstop","draw:deletestart","draw:deletestop"]},genDispatchMapEvent:function(b,c,d){return function(f){var g="leafletDirectiveMap."+c;e(b,function(b){"emit"===d?b.$emit(g,{leafletEvent:f}):"broadcast"===d&&a.$broadcast(g,{leafletEvent:f})})}},getAvailableMarkerEvents:n,getAvailablePathEvents:o,bindMarkerEvents:function(a,b,d,e){var i,l,m=[],o="broadcast";if(f(e.eventBroadcast))if(g(e.eventBroadcast))if(f(e.eventBroadcast.marker))if(g(e.eventBroadcast.marker)){void 0!==e.eventBroadcast.marker.logic&&null!==e.eventBroadcast.marker.logic&&("emit"!==e.eventBroadcast.marker.logic&&"broadcast"!==e.eventBroadcast.marker.logic?c.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===e.eventBroadcast.marker.logic&&(o="emit"));var p=!1,q=!1;if(void 0!==e.eventBroadcast.marker.enable&&null!==e.eventBroadcast.marker.enable&&"object"==typeof e.eventBroadcast.marker.enable&&(p=!0),void 0!==e.eventBroadcast.marker.disable&&null!==e.eventBroadcast.marker.disable&&"object"==typeof e.eventBroadcast.marker.disable&&(q=!0),p&&q)c.warn("[AngularJS - Leaflet] can not enable and disable events at the same time");else if(p||q)if(p)for(i=0;i<e.eventBroadcast.marker.enable.length;i++)l=e.eventBroadcast.marker.enable[i],-1!==m.indexOf(l)?c.warn("[AngularJS - Leaflet] This event "+l+" is already enabled"):-1===n().indexOf(l)?c.warn("[AngularJS - Leaflet] This event "+l+" does not exist"):m.push(l);else for(m=n(),i=0;i<e.eventBroadcast.marker.disable.length;i++){l=e.eventBroadcast.marker.disable[i];var r=m.indexOf(l);-1===r?c.warn("[AngularJS - Leaflet] This event "+l+" does not exist or has been already disabled"):m.splice(r,1)}else c.warn("[AngularJS - Leaflet] must enable or disable events")}else c.warn("[AngularJS - Leaflet] event-broadcast.marker must be an object check your model.");else m=n();else c.error("[AngularJS - Leaflet] event-broadcast must be an object check your model.");else m=n();for(i=0;i<m.length;i++)l=m[i],a.on(l,k(l,o,e,a,b,d));h.LabelPlugin.isLoaded()&&f(a.label)&&j(e,o,a,b)},bindPathEvents:function(a,b,d,e){var i,k,m=[],n="broadcast";if(window.lls=e,f(e.eventBroadcast))if(g(e.eventBroadcast))if(f(e.eventBroadcast.path))if(g(e.eventBroadcast.paths))c.warn("[AngularJS - Leaflet] event-broadcast.path must be an object check your model.");else{void 0!==e.eventBroadcast.path.logic&&null!==e.eventBroadcast.path.logic&&("emit"!==e.eventBroadcast.path.logic&&"broadcast"!==e.eventBroadcast.path.logic?c.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===e.eventBroadcast.path.logic&&(n="emit"));var p=!1,q=!1;if(void 0!==e.eventBroadcast.path.enable&&null!==e.eventBroadcast.path.enable&&"object"==typeof e.eventBroadcast.path.enable&&(p=!0),void 0!==e.eventBroadcast.path.disable&&null!==e.eventBroadcast.path.disable&&"object"==typeof e.eventBroadcast.path.disable&&(q=!0),p&&q)c.warn("[AngularJS - Leaflet] can not enable and disable events at the same time");else if(p||q)if(p)for(i=0;i<e.eventBroadcast.path.enable.length;i++)k=e.eventBroadcast.path.enable[i],-1!==m.indexOf(k)?c.warn("[AngularJS - Leaflet] This event "+k+" is already enabled"):-1===o().indexOf(k)?c.warn("[AngularJS - Leaflet] This event "+k+" does not exist"):m.push(k);else for(m=o(),i=0;i<e.eventBroadcast.path.disable.length;i++){k=e.eventBroadcast.path.disable[i];var r=m.indexOf(k);-1===r?c.warn("[AngularJS - Leaflet] This event "+k+" does not exist or has been already disabled"):m.splice(r,1)}else c.warn("[AngularJS - Leaflet] must enable or disable events")}else m=o();else c.error("[AngularJS - Leaflet] event-broadcast must be an object check your model.");else m=o();for(i=0;i<m.length;i++)k=m[i],a.on(k,l(k,n,e,m,b));h.LabelPlugin.isLoaded()&&f(a.label)&&j(e,n,a,b)}}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","$log","leafletHelpers",function($rootScope,$log,leafletHelpers){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?($log.error("[AngularJS - Leaflet] A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?($log.error("[AngularJS - Leaflet] A base layer must have an url"),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have bounds defined"),!1):!0:!1}var Helpers=leafletHelpers,isString=leafletHelpers.isString,isObject=leafletHelpers.isObject,isDefined=leafletHelpers.isDefined,layerTypes={xyz:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer(a.url,a.options)}},geoJSON:{mustHaveUrl:!0,createLayer:function(a){return Helpers.GeoJSONPlugin.isLoaded()?new L.TileLayer.GeoJSON(a.url,a.pluginOptions,a.options):void 0}},wms:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wms(a.url,a.options)}},wmts:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wmts(a.url,a.options)}},wfs:{mustHaveUrl:!0,mustHaveLayer:!0,createLayer:function(params){if(Helpers.WFSLayerPlugin.isLoaded()){var options=angular.copy(params.options);return options.crs&&"string"==typeof options.crs&&(options.crs=eval(options.crs)),new L.GeoJSON.WFS(params.url,params.layer,options)}}},group:{mustHaveUrl:!1,createLayer:function(){return L.layerGroup()}},google:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"SATELLITE";if(Helpers.GoogleLayerPlugin.isLoaded())return new L.Google(b,a.options)}},china:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"";if(Helpers.ChinaLayerPlugin.isLoaded())return L.tileLayer.chinaProvider(b,a.options)}},ags:{mustHaveUrl:!0,createLayer:function(a){if(Helpers.AGSLayerPlugin.isLoaded()){var b=angular.copy(a.options);angular.extend(b,{url:a.url});var c=new lvector.AGS(b);return c.onAdd=function(a){this.setMap(a)},c.onRemove=function(){this.setMap(null)},c}}},dynamic:{mustHaveUrl:!0,createLayer:function(a){return Helpers.DynamicMapLayerPlugin.isLoaded()?L.esri.dynamicMapLayer(a.url,a.options):void 0}},markercluster:{mustHaveUrl:!1,createLayer:function(a){return Helpers.MarkerClusterPlugin.isLoaded()?new L.MarkerClusterGroup(a.options):void $log.error("[AngularJS - Leaflet] The markercluster plugin is not loaded.")}},bing:{mustHaveUrl:!1,createLayer:function(a){return Helpers.BingLayerPlugin.isLoaded()?new L.BingLayer(a.key,a.options):void 0}},yandex:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"map";if(Helpers.YandexLayerPlugin.isLoaded())return new L.Yandex(b,a.options)}},imageOverlay:{mustHaveUrl:!0,mustHaveBounds:!0,createLayer:function(a){return L.imageOverlay(a.url,a.bounds,a.options)}}};return{createLayer:function(a){if(isValidLayerType(a)){if(!isString(a.name))return void $log.error("[AngularJS - Leaflet] A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,options:a.layerOptions,layer:a.layer,type:a.layerType,bounds:a.bounds,key:a.key,pluginOptions:a.pluginOptions};return layerTypes[a.type].createLayer(c)}}}}]),angular.module("leaflet-directive").factory("leafletControlHelpers",["$rootScope","$log","leafletHelpers","leafletMapDefaults",function(a,b,c,d){var e,f=c.isObject,g=c.isDefined,h=function(a,b){var c=0;return f(a)&&(c+=Object.keys(a).length),f(b)&&(c+=Object.keys(b).length),c>1},i=function(a){var b,c=d.getDefaults(a),e={collapsed:c.controls.layers.collapsed,position:c.controls.layers.position};return b=c.controls.layers&&g(c.controls.layers.control)?c.controls.layers.control.apply(this,[[],[],e]):new L.control.layers([],[],e)};return{layersControlMustBeVisible:h,updateLayersControl:function(a,b,c,d,f,j){var k,l=h(d,f);if(g(e)&&c){for(k in j.baselayers)e.removeLayer(j.baselayers[k]);for(k in j.overlays)e.removeLayer(j.overlays[k]);e.removeFrom(a)}if(l){e=i(b);for(k in d)g(j.baselayers[k])&&e.addBaseLayer(j.baselayers[k],d[k].name);for(k in f)g(j.overlays[k])&&e.addOverlay(j.overlays[k],f[k].name);e.addTo(a)}return l}}}]),angular.module("leaflet-directive").factory("leafletLegendHelpers",function(){var a=function(a,b){if(a.innerHTML="",b.error)a.innerHTML+='<div class="info-title alert alert-danger">'+b.error.message+"</div>";else for(var c=0;c<b.layers.length;c++){var d=b.layers[c];a.innerHTML+='<div class="info-title">'+d.layerName+"</div>";for(var e=0;e<d.legend.length;e++){var f=d.legend[e];a.innerHTML+='<div class="inline"><img src="data:'+f.contentType+";base64,"+f.imageData+'" /></div><div class="info-label">'+f.label+"</div>"}}},b=function(b,c){return function(){var d=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(d,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(d),L.DomEvent.on(d,"mousewheel",L.DomEvent.stopPropagation)),a(d,b),d}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d<a.colors.length;d++)c.innerHTML+='<div class="outline"><i style="background:'+a.colors[d]+'"></i></div><div class="info-label">'+a.labels[d]+"</div>";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddArcGISLegend:b,getOnAddArrayLegend:c,updateArcGISLegend:a}}),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","$log","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return new L.LatLng(a.lat,a.lng)})}function e(a){return new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c=["stroke","weight","color","opacity","fill","fillColor","fillOpacity","dashArray","lineCap","lineJoin","clickable","pointerEvents","className","smoothFactor","noClip"],d={},e=0;e<c.length;e++){var f=c[e];h(a[f])?d[f]=a[f]:h(b.path[f])&&(d[f]=b.path[f])}return d}var h=c.isDefined,i=c.isArray,j=c.isNumber,k=c.isValidPoint,l=function(a,b){h(b.weight)&&a.setStyle({weight:b.weight}),h(b.color)&&a.setStyle({color:b.color}),h(b.opacity)&&a.setStyle({opacity:b.opacity})},m=function(a){if(!i(a))return!1;for(var b in a){var c=a[b];if(!k(c))return!1
-}return!0},n={polyline:{isValid:function(a){var b=a.latlngs;return m(b)},createPath:function(a){return new L.Polyline([],a)},setPath:function(a,b){a.setLatLngs(d(b.latlngs)),l(a,b)}},multiPolyline:{isValid:function(a){var b=a.latlngs;if(!i(b))return!1;for(var c in b){var d=b[c];if(!m(d))return!1}return!0},createPath:function(a){return new L.multiPolyline([[[0,0],[1,1]]],a)},setPath:function(a,b){a.setLatLngs(f(b.latlngs)),l(a,b)}},polygon:{isValid:function(a){var b=a.latlngs;return m(b)},createPath:function(a){return new L.Polygon([],a)},setPath:function(a,b){a.setLatLngs(d(b.latlngs)),l(a,b)}},multiPolygon:{isValid:function(a){var b=a.latlngs;if(!i(b))return!1;for(var c in b){var d=b[c];if(!m(d))return!1}return!0},createPath:function(a){return new L.MultiPolygon([[[0,0],[1,1],[0,1]]],a)},setPath:function(a,b){a.setLatLngs(f(b.latlngs)),l(a,b)}},rectangle:{isValid:function(a){var b=a.latlngs;if(!i(b)||2!==b.length)return!1;for(var c in b){var d=b[c];if(!k(d))return!1}return!0},createPath:function(a){return new L.Rectangle([[0,0],[1,1]],a)},setPath:function(a,b){a.setBounds(new L.LatLngBounds(d(b.latlngs))),l(a,b)}},circle:{isValid:function(a){var b=a.latlngs;return k(b)&&j(a.radius)},createPath:function(a){return new L.Circle([0,0],1,a)},setPath:function(a,b){a.setLatLng(e(b.latlngs)),h(b.radius)&&a.setRadius(b.radius),l(a,b)}},circleMarker:{isValid:function(a){var b=a.latlngs;return k(b)&&j(a.radius)},createPath:function(a){return new L.CircleMarker([0,0],a)},setPath:function(a,b){a.setLatLng(e(b.latlngs)),h(b.radius)&&a.setRadius(b.radius),l(a,b)}}},o=function(a){var b={};return a.latlngs&&(b.latlngs=a.latlngs),a.radius&&(b.radius=a.radius),b};return{setPathOptions:function(a,b,c){h(b)||(b="polyline"),n[b].setPath(a,c)},createPath:function(a,c,d){h(c.type)||(c.type="polyline");var e=g(c,d),f=o(c);return n[c.type].isValid(f)?n[c.type].createPath(e):void b.error("[AngularJS - Leaflet] Invalid data passed to the "+c.type+" path")}}}]),angular.module("leaflet-directive").factory("leafletBoundsHelpers",["$log","leafletHelpers",function(a,b){function c(a){return angular.isDefined(a)&&angular.isDefined(a.southWest)&&angular.isDefined(a.northEast)&&angular.isNumber(a.southWest.lat)&&angular.isNumber(a.southWest.lng)&&angular.isNumber(a.northEast.lat)&&angular.isNumber(a.northEast.lng)}var d=b.isArray,e=b.isNumber;return{createLeafletBounds:function(a){return c(a)?L.latLngBounds([a.southWest.lat,a.southWest.lng],[a.northEast.lat,a.northEast.lng]):void 0},isValidBounds:c,createBoundsFromArray:function(b){return d(b)&&2===b.length&&d(b[0])&&d(b[1])&&2===b[0].length&&2===b[1].length&&e(b[0][0])&&e(b[0][1])&&e(b[1][0])&&e(b[1][1])?{northEast:{lat:b[0][0],lng:b[0][1]},southWest:{lat:b[1][0],lng:b[1][1]}}:void a.error("[AngularJS - Leaflet] The bounds array is not valid.")}}}]),angular.module("leaflet-directive").factory("leafletMarkersHelpers",["$rootScope","leafletHelpers","$log",function(a,b,c){var d=b.isDefined,e=b.MarkerClusterPlugin,f=b.AwesomeMarkersPlugin,g=b.safeApply,h=b,i=b.isString,j=b.isNumber,k=b.isObject,l={},m=function(a){if(d(a)&&d(a.type)&&"awesomeMarker"===a.type)return f.isLoaded()||c.error("[AngularJS - Leaflet] The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(a);if(d(a)&&d(a.type)&&"div"===a.type)return new L.divIcon(a);var b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==",e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return d(a)?(d(a.iconUrl)||(a.iconUrl=b,a.shadowUrl=e),new L.Icon.Default(a)):new L.Icon.Default({iconUrl:b,shadowUrl:e})},n=function(a,b,c){if(a.closePopup(),d(c)&&d(c.overlays))for(var e in c.overlays)if(c.overlays[e]instanceof L.LayerGroup&&c.overlays[e].hasLayer(a))return void c.overlays[e].removeLayer(a);if(d(l))for(var f in l)l[f].hasLayer(a)&&l[f].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)};return{deleteMarker:n,createMarker:function(a){if(!d(a))return void c.error("[AngularJS - Leaflet] The marker definition is not valid.");var b={icon:m(a.icon),title:d(a.title)?a.title:"",draggable:d(a.draggable)?a.draggable:!1,clickable:d(a.clickable)?a.clickable:!0,riseOnHover:d(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:d(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:d(a.iconAngle)?a.iconAngle:0};return new L.marker(a,b)},addMarkerToGroup:function(a,b,f){return i(b)?e.isLoaded()?(d(l[b])||(l[b]=new L.MarkerClusterGroup,f.addLayer(l[b])),void l[b].addLayer(a)):void c.error("[AngularJS - Leaflet] The MarkerCluster plugin is not loaded."):void c.error("[AngularJS - Leaflet] The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c){a.on("popupopen",function(){g(c,function(){b.focus=!0})}),a.on("popupclose",function(){g(c,function(){b.focus=!1})})},addMarkerWatcher:function(a,b,e,f,g){var l=e.$watch("markers."+b,function(b,e){if(!d(b))return n(a,g,f),void l();if(d(e)){if(!j(b.lat)||!j(b.lng))return c.warn("There are problems with lat-lng data, please verify your marker model"),void n(a,g,f);if(i(b.layer)||i(e.layer)&&(d(f.overlays[e.layer])&&f.overlays[e.layer].hasLayer(a)&&(f.overlays[e.layer].removeLayer(a),a.closePopup()),g.hasLayer(a)||g.addLayer(a)),i(b.layer)&&e.layer!==b.layer){if(i(e.layer)&&d(f.overlays[e.layer])&&f.overlays[e.layer].hasLayer(a)&&f.overlays[e.layer].removeLayer(a),a.closePopup(),g.hasLayer(a)&&g.removeLayer(a),!d(f.overlays[b.layer]))return void c.error("[AngularJS - Leaflet] You must use a name of an existing layer");var o=f.overlays[b.layer];if(!(o instanceof L.LayerGroup))return void c.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"');o.addLayer(a),g.hasLayer(a)&&b.focus===!0&&a.openPopup()}if(b.draggable!==!0&&e.draggable===!0&&d(a.dragging)&&a.dragging.disable(),b.draggable===!0&&e.draggable!==!0&&(a.dragging?a.dragging.enable():L.Handler.MarkerDrag&&(a.dragging=new L.Handler.MarkerDrag(a),a.options.draggable=!0,a.dragging.enable())),k(b.icon)||k(e.icon)&&(a.setIcon(m()),a.closePopup(),a.unbindPopup(),i(b.message)&&a.bindPopup(b.message)),k(b.icon)&&k(e.icon)&&!angular.equals(b.icon,e.icon)){var p=!1;a.dragging&&(p=a.dragging.enabled()),a.setIcon(m(b.icon)),p&&a.dragging.enable(),a.closePopup(),a.unbindPopup(),i(b.message)&&a.bindPopup(b.message)}!i(b.message)&&i(e.message)&&(a.closePopup(),a.unbindPopup()),h.LabelPlugin.isLoaded()&&d(b.label)&&d(b.label.message)&&!angular.equals(b.label.message,e.label.message)&&a.updateLabelContent(b.label.message),i(b.message)&&!i(e.message)&&(a.bindPopup(b.message),b.focus===!0&&a.openPopup()),i(b.message)&&i(e.message)&&b.message!==e.message&&a.setPopupContent(b.message);var q=!1;b.focus!==!0&&e.focus===!0&&(a.closePopup(),q=!0),b.focus===!0&&e.focus!==!0&&(a.openPopup(),q=!0),e.focus===!0&&b.focus===!0&&(a.openPopup(),q=!0);var r=a.getLatLng(),s=i(b.layer)&&h.MarkerClusterPlugin.is(f.overlays[b.layer]);s?q?(b.lat!==e.lat||b.lng!==e.lng)&&(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):r.lat!==b.lat||r.lng!==b.lng?(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):(b.lat!==e.lat||b.lng!==e.lng)&&(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):(r.lat!==b.lat||r.lng!==b.lng)&&a.setLatLng([b.lat,b.lng])}},!0)}}}]),angular.module("leaflet-directive").factory("leafletHelpers",["$q","$log",function(a,b){function c(a,c){var d,e;if(angular.isDefined(c))d=c;else if(1===Object.keys(a).length)for(e in a)a.hasOwnProperty(e)&&(d=e);else 0===Object.keys(a).length?d="main":b.error("[AngularJS - Leaflet] - You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}return{isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:function(a){return angular.isDefined(a)&&null!==a},isNumber:function(a){return angular.isNumber(a)},isString:function(a){return angular.isString(a)},isArray:function(a){return angular.isArray(a)},isObject:function(a){return angular.isObject(a)},isFunction:function(a){return angular.isFunction(a)},equals:function(a,b){return angular.equals(a,b)},isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return c.lat===a.lat&&c.lng===a.lng&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$apply(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},DynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}}}}])}();
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0.tar.gz b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0.tar.gz
deleted file mode 100644
index 73456bf..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0.tar.gz
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/.travis.yml b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/.travis.yml
deleted file mode 100644
index 8c4c2c4..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-# blacklist the bower branch
-branches:
-  only:
-    - master
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/CHANGELOG.md b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/CHANGELOG.md
deleted file mode 100644
index 2713e5f..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/CHANGELOG.md
+++ /dev/null
@@ -1,8 +0,0 @@
-<a name="v0.1.0"></a>
-## v0.1.0 (2013-12-28)
-
-
-#### Features
-
-* **publisher:** initial publisher use commit ([a144e2f8](https://github.com/angular-ui/ui-codemirror/commit/a144e2f8b3134df9e4a9ce313778b0086ea82af9))
-
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/bower.json b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/bower.json
deleted file mode 100644
index 287d279..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/bower.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "name": "angular-ui-codemirror",
-  "version": "0.1.0",
-  "main": "./ui-codemirror.js",
-  "dependencies": {
-    "angular": ">=1.0.x",
-    "codemirror": "~3.19.0"
-  }
-}
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.js b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.js
deleted file mode 100644
index 2a56c17..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'use strict';
-angular.module('ui.codemirror', []).constant('uiCodemirrorConfig', {}).directive('uiCodemirror', [
-  'uiCodemirrorConfig',
-  function (uiCodemirrorConfig) {
-    return {
-      restrict: 'EA',
-      require: '?ngModel',
-      priority: 1,
-      compile: function compile(tElement) {
-        if (angular.isUndefined(window.CodeMirror)) {
-          throw new Error('ui-codemirror need CodeMirror to work... (o rly?)');
-        }
-        var value = tElement.text();
-        var codeMirror = new window.CodeMirror(function (cm_el) {
-            angular.forEach(tElement.prop('attributes'), function (a) {
-              if (a.name === 'ui-codemirror') {
-                cm_el.setAttribute('ui-codemirror-opts', a.textContent);
-              } else {
-                cm_el.setAttribute(a.name, a.textContent);
-              }
-            });
-            if (tElement.parent().length <= 0) {
-              tElement.wrap('<div>');
-            }
-            tElement.replaceWith(cm_el);
-          }, { value: value });
-        return function postLink(scope, iElement, iAttrs, ngModel) {
-          var options, opts;
-          options = uiCodemirrorConfig.codemirror || {};
-          opts = angular.extend({}, options, scope.$eval(iAttrs.uiCodemirror), scope.$eval(iAttrs.uiCodemirrorOpts));
-          function updateOptions(newValues) {
-            for (var key in newValues) {
-              if (newValues.hasOwnProperty(key)) {
-                codeMirror.setOption(key, newValues[key]);
-              }
-            }
-          }
-          updateOptions(opts);
-          if (angular.isDefined(scope.$eval(iAttrs.uiCodemirror))) {
-            scope.$watch(iAttrs.uiCodemirror, updateOptions, true);
-          }
-          codeMirror.on('change', function (instance) {
-            var newValue = instance.getValue();
-            if (ngModel && newValue !== ngModel.$viewValue) {
-              ngModel.$setViewValue(newValue);
-            }
-            if (!scope.$$phase) {
-              scope.$apply();
-            }
-          });
-          if (ngModel) {
-            ngModel.$formatters.push(function (value) {
-              if (angular.isUndefined(value) || value === null) {
-                return '';
-              } else if (angular.isObject(value) || angular.isArray(value)) {
-                throw new Error('ui-codemirror cannot use an object or an array as a model');
-              }
-              return value;
-            });
-            ngModel.$render = function () {
-              var safeViewValue = ngModel.$viewValue || '';
-              codeMirror.setValue(safeViewValue);
-            };
-          }
-          if (iAttrs.uiRefresh) {
-            scope.$watch(iAttrs.uiRefresh, function (newVal, oldVal) {
-              if (newVal !== oldVal) {
-                codeMirror.refresh();
-              }
-            });
-          }
-          if (angular.isFunction(opts.onLoad)) {
-            opts.onLoad(codeMirror);
-          }
-        };
-      }
-    };
-  }
-]);
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.min.js b/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.min.js
deleted file mode 100644
index 142c910..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror-0.1.0/ui-codemirror.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * angular-ui-codemirror - This directive allows you to add CodeMirror to your textarea elements.
- * @version v0.1.0 - 2013-12-28
- * @link http://angular-ui.github.com
- * @license MIT
- */
-"use strict";angular.module("ui.codemirror",[]).constant("uiCodemirrorConfig",{}).directive("uiCodemirror",["uiCodemirrorConfig",function(a){return{restrict:"EA",require:"?ngModel",priority:1,compile:function(b){if(angular.isUndefined(window.CodeMirror))throw new Error("ui-codemirror need CodeMirror to work... (o rly?)");var c=b.text(),d=new window.CodeMirror(function(a){angular.forEach(b.prop("attributes"),function(b){"ui-codemirror"===b.name?a.setAttribute("ui-codemirror-opts",b.textContent):a.setAttribute(b.name,b.textContent)}),b.parent().length<=0&&b.wrap("<div>"),b.replaceWith(a)},{value:c});return function(b,c,e,f){function g(a){for(var b in a)a.hasOwnProperty(b)&&d.setOption(b,a[b])}var h,i;h=a.codemirror||{},i=angular.extend({},h,b.$eval(e.uiCodemirror),b.$eval(e.uiCodemirrorOpts)),g(i),angular.isDefined(b.$eval(e.uiCodemirror))&&b.$watch(e.uiCodemirror,g,!0),d.on("change",function(a){var c=a.getValue();f&&c!==f.$viewValue&&f.$setViewValue(c),b.$$phase||b.$apply()}),f&&(f.$formatters.push(function(a){if(angular.isUndefined(a)||null===a)return"";if(angular.isObject(a)||angular.isArray(a))throw new Error("ui-codemirror cannot use an object or an array as a model");return a}),f.$render=function(){var a=f.$viewValue||"";d.setValue(a)}),e.uiRefresh&&b.$watch(e.uiRefresh,function(a,b){a!==b&&d.refresh()}),angular.isFunction(i.onLoad)&&i.onLoad(d)}}}}]);
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-codemirror.min.js b/dashboard/lib/assets/angular/extensions/ui-codemirror.min.js
deleted file mode 100644
index 142c910..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-codemirror.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * angular-ui-codemirror - This directive allows you to add CodeMirror to your textarea elements.
- * @version v0.1.0 - 2013-12-28
- * @link http://angular-ui.github.com
- * @license MIT
- */
-"use strict";angular.module("ui.codemirror",[]).constant("uiCodemirrorConfig",{}).directive("uiCodemirror",["uiCodemirrorConfig",function(a){return{restrict:"EA",require:"?ngModel",priority:1,compile:function(b){if(angular.isUndefined(window.CodeMirror))throw new Error("ui-codemirror need CodeMirror to work... (o rly?)");var c=b.text(),d=new window.CodeMirror(function(a){angular.forEach(b.prop("attributes"),function(b){"ui-codemirror"===b.name?a.setAttribute("ui-codemirror-opts",b.textContent):a.setAttribute(b.name,b.textContent)}),b.parent().length<=0&&b.wrap("<div>"),b.replaceWith(a)},{value:c});return function(b,c,e,f){function g(a){for(var b in a)a.hasOwnProperty(b)&&d.setOption(b,a[b])}var h,i;h=a.codemirror||{},i=angular.extend({},h,b.$eval(e.uiCodemirror),b.$eval(e.uiCodemirrorOpts)),g(i),angular.isDefined(b.$eval(e.uiCodemirror))&&b.$watch(e.uiCodemirror,g,!0),d.on("change",function(a){var c=a.getValue();f&&c!==f.$viewValue&&f.$setViewValue(c),b.$$phase||b.$apply()}),f&&(f.$formatters.push(function(a){if(angular.isUndefined(a)||null===a)return"";if(angular.isObject(a)||angular.isArray(a))throw new Error("ui-codemirror cannot use an object or an array as a model");return a}),f.$render=function(){var a=f.$viewValue||"";d.setValue(a)}),e.uiRefresh&&b.$watch(e.uiRefresh,function(a,b){a!==b&&d.refresh()}),angular.isFunction(i.onLoad)&&i.onLoad(d)}}}}]);
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1.zip b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1.zip
deleted file mode 100644
index 6059abe..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1.zip
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/.travis.yml b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/.travis.yml
deleted file mode 100644
index 8c4c2c4..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-# blacklist the bower branch
-branches:
-  only:
-    - master
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/CHANGELOG.md b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/CHANGELOG.md
deleted file mode 100644
index abbeec2..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/CHANGELOG.md
+++ /dev/null
@@ -1,31 +0,0 @@
-<a name="v0.1.0"></a>
-## v0.1.0 (2013-12-29)
-
-
-#### Bug Fixes
-
-* **mark:** TypeError: input is undefined ([5440d6fa](http://github.com/angular-ui/ui-utils/commit/5440d6fa8514ee86efc480b0abbf66cf244889ad))
-* **publisher:**
-  * don't throw error when 'dist/sub' don't exist ([bd319236](http://github.com/angular-ui/ui-utils/commit/bd31923668c0ea80311b9dbe7d72bfbe55956325))
-  * rename sub componenet stuff ([5dcdc379](http://github.com/angular-ui/ui-utils/commit/5dcdc3794efe66112522415aafe9ebe965a274f6))
-* **ui-scroll:**
-  * 'newitems' is not defined. ([796e310a](http://github.com/angular-ui/ui-utils/commit/796e310a26ac43a248c0c732877242890fdda2be))
-  * 'isArray' is not defined. ([3fd7fc47](http://github.com/angular-ui/ui-utils/commit/3fd7fc47de7d05460a55ca42e4afec60d8e8cc4d))
-  * 'setOffset' is not defined. ([32140e04](http://github.com/angular-ui/ui-utils/commit/32140e04be176c4b2a5954d2cf8e9ec3c48a6f5c))
-
-
-#### Features
-
-* **alias:** Created a new ui-alias module for renaming/combining directives ([1582d54e](http://github.com/angular-ui/ui-utils/commit/1582d54ecaf81cb516a28368c0d409b5d5fe7da9))
-* **grunt:**
-  * add 'changelog' task ([b7fed5a6](http://github.com/angular-ui/ui-utils/commit/b7fed5a6026121d0098f892aa0a221c0d9c14d56), closes [#145](http://github.com/angular-ui/ui-utils/issues/145))
-  * use Angular UI Publisher ([3c209713](http://github.com/angular-ui/ui-utils/commit/3c20971307e50741f88da21cb638077237e56da2), closes [#153](http://github.com/angular-ui/ui-utils/issues/153))
-  * new 'serve' task ([a18ed32c](http://github.com/angular-ui/ui-utils/commit/a18ed32ce134acabe7adc79b41e82ed6c52109ed))
-  * quality code more strict ([332ebff1](http://github.com/angular-ui/ui-utils/commit/332ebff1fdc7edf4d44d64f4796ec2f70e90947f))
-  * use ngmin in the 'dist' task ([93ba905f](http://github.com/angular-ui/ui-utils/commit/93ba905fadfd4d0970d384f7978e19a3561cea65))
-  * add ngmin build all subcomponents in dist/sub ([783140ab](http://github.com/angular-ui/ui-utils/commit/783140abe1b8d6c0f842eceb7fc24a0f16d73ca5))
-* **publisher:**
-  * change travis scripts to work with the component-publisher system ([12d97d3b](http://github.com/angular-ui/ui-utils/commit/12d97d3bf88da86875141093fc164f1537d0dfe2))
-  * add and config component-publisher system ([4cea7ea5](http://github.com/angular-ui/ui-utils/commit/4cea7ea5bb4c47ad74c4f5123121a2896bf6f717))
-* **travis:** add sub component auto publishing :) ([0d64db00](http://github.com/angular-ui/ui-utils/commit/0d64db00a5c50816cbf0b022aa5607fee29d5e2a))
-
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/bower.json b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/bower.json
deleted file mode 100644
index afaad2c..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/bower.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "angular-ui-utils",
-  "version": "0.1.1",
-  "main": "./ui-utils.js",
-  "dependencies": {
-    "angular": ">= 1.0.2"
-  }
-}
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.js b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.js
deleted file mode 100644
index a62222c..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
- * @version v0.1.1 - 2014-02-05
- * @link http://angular-ui.github.com
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-// READ: http://docs-next.angularjs.org/guide/ie
-// element tags are statically defined in order to accommodate lazy-loading whereby directives are also unknown
-
-// The ieshiv takes care of our ui.directives and AngularJS's ng-view, ng-include, ng-pluralize, ng-switch.
-// However, IF you have custom directives that can be used as html tags (yours or someone else's) then
-// add list of directives into <code>window.myCustomTags</code>
-
-// <!--[if lte IE 8]>
-//    <script>
-//    window.myCustomTags = [ 'yourCustomDirective', 'somebodyElsesDirective' ]; // optional
-//    </script>
-//    <script src="build/angular-ui-ieshiv.js"></script>
-// <![endif]-->
-
-(function (window, document) {
-  "use strict";
-
-  var tags = [ "ngInclude", "ngPluralize", "ngView", "ngSwitch", "uiCurrency", "uiCodemirror", "uiDate", "uiEvent",
-                "uiKeypress", "uiKeyup", "uiKeydown", "uiMask", "uiMapInfoWindow", "uiMapMarker", "uiMapPolyline",
-                "uiMapPolygon", "uiMapRectangle", "uiMapCircle", "uiMapGroundOverlay", "uiModal", "uiReset",
-                "uiScrollfix", "uiSelect2", "uiShow", "uiHide", "uiToggle", "uiSortable", "uiTinymce"
-                ];
-
-  window.myCustomTags =  window.myCustomTags || []; // externally defined by developer using angular-ui directives
-  tags.push.apply(tags, window.myCustomTags);
-
-  var toCustomElements = function (str) {
-    var result = [];
-    var dashed = str.replace(/([A-Z])/g, function ($1) {
-      return " " + $1.toLowerCase();
-    });
-    var tokens = dashed.split(" ");
-
-    // If a token is just a single name (i.e. no namespace) then we juse define the elements the name given
-    if (tokens.length === 1) {
-      var name = tokens[0];
-
-      result.push(name);
-      result.push("x-" + name);
-      result.push("data-" + name);
-    } else {
-      var ns = tokens[0];
-      var dirname = tokens.slice(1).join("-");
-
-      // this is finite list and it seemed senseless to create a custom method
-      result.push(ns + ":" + dirname);
-      result.push(ns + "-" + dirname);
-      result.push("x-" + ns + "-" + dirname);
-      result.push("data-" + ns + "-" + dirname);
-    }
-    return result;
-  };
-
-  for (var i = 0, tlen = tags.length; i < tlen; i++) {
-    var customElements = toCustomElements(tags[i]);
-    for (var j = 0, clen = customElements.length; j < clen; j++) {
-      var customElement = customElements[j];
-      document.createElement(customElement);
-    }
-  }
-
-})(window, document);
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.min.js b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.min.js
deleted file mode 100644
index 4290ac3..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils-ieshiv.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
- * @version v0.1.1 - 2014-02-05
- * @link http://angular-ui.github.com
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-!function(a,b){"use strict";var c=["ngInclude","ngPluralize","ngView","ngSwitch","uiCurrency","uiCodemirror","uiDate","uiEvent","uiKeypress","uiKeyup","uiKeydown","uiMask","uiMapInfoWindow","uiMapMarker","uiMapPolyline","uiMapPolygon","uiMapRectangle","uiMapCircle","uiMapGroundOverlay","uiModal","uiReset","uiScrollfix","uiSelect2","uiShow","uiHide","uiToggle","uiSortable","uiTinymce"];a.myCustomTags=a.myCustomTags||[],c.push.apply(c,a.myCustomTags);for(var d=function(a){var b=[],c=a.replace(/([A-Z])/g,function(a){return" "+a.toLowerCase()}),d=c.split(" ");if(1===d.length){var e=d[0];b.push(e),b.push("x-"+e),b.push("data-"+e)}else{var f=d[0],g=d.slice(1).join("-");b.push(f+":"+g),b.push(f+"-"+g),b.push("x-"+f+"-"+g),b.push("data-"+f+"-"+g)}return b},e=0,f=c.length;f>e;e++)for(var g=d(c[e]),h=0,i=g.length;i>h;h++){var j=g[h];b.createElement(j)}}(window,document);
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.js b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.js
deleted file mode 100644
index 6e1c26c..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.js
+++ /dev/null
@@ -1,2055 +0,0 @@
-/**
- * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
- * @version v0.1.1 - 2014-02-05
- * @link http://angular-ui.github.com
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-'use strict';
-
-angular.module('ui.alias', []).config(['$compileProvider', 'uiAliasConfig', function($compileProvider, uiAliasConfig){
-  uiAliasConfig = uiAliasConfig || {};
-  angular.forEach(uiAliasConfig, function(config, alias){
-    if (angular.isString(config)) {
-      config = {
-        replace: true,
-        template: config
-      };
-    }
-    $compileProvider.directive(alias, function(){
-      return config;
-    });
-  });
-}]);
-
-'use strict';
-
-/**
- * General-purpose Event binding. Bind any event not natively supported by Angular
- * Pass an object with keynames for events to ui-event
- * Allows $event object and $params object to be passed
- *
- * @example <input ui-event="{ focus : 'counter++', blur : 'someCallback()' }">
- * @example <input ui-event="{ myCustomEvent : 'myEventHandler($event, $params)'}">
- *
- * @param ui-event {string|object literal} The event to bind to as a string or a hash of events with their callbacks
- */
-angular.module('ui.event',[]).directive('uiEvent', ['$parse',
-  function ($parse) {
-    return function ($scope, elm, attrs) {
-      var events = $scope.$eval(attrs.uiEvent);
-      angular.forEach(events, function (uiEvent, eventName) {
-        var fn = $parse(uiEvent);
-        elm.bind(eventName, function (evt) {
-          var params = Array.prototype.slice.call(arguments);
-          //Take out first paramater (event object);
-          params = params.splice(1);
-          fn($scope, {$event: evt, $params: params});
-          if (!$scope.$$phase) {
-            $scope.$apply();
-          }
-        });
-      });
-    };
-  }]);
-
-'use strict';
-
-/**
- * A replacement utility for internationalization very similar to sprintf.
- *
- * @param replace {mixed} The tokens to replace depends on type
- *  string: all instances of $0 will be replaced
- *  array: each instance of $0, $1, $2 etc. will be placed with each array item in corresponding order
- *  object: all attributes will be iterated through, with :key being replaced with its corresponding value
- * @return string
- *
- * @example: 'Hello :name, how are you :day'.format({ name:'John', day:'Today' })
- * @example: 'Records $0 to $1 out of $2 total'.format(['10', '20', '3000'])
- * @example: '$0 agrees to all mentions $0 makes in the event that $0 hits a tree while $0 is driving drunk'.format('Bob')
- */
-angular.module('ui.format',[]).filter('format', function(){
-  return function(value, replace) {
-    var target = value;
-    if (angular.isString(target) && replace !== undefined) {
-      if (!angular.isArray(replace) && !angular.isObject(replace)) {
-        replace = [replace];
-      }
-      if (angular.isArray(replace)) {
-        var rlen = replace.length;
-        var rfx = function (str, i) {
-          i = parseInt(i, 10);
-          return (i>=0 && i<rlen) ? replace[i] : str;
-        };
-        target = target.replace(/\$([0-9]+)/g, rfx);
-      }
-      else {
-        angular.forEach(replace, function(value, key){
-          target = target.split(':'+key).join(value);
-        });
-      }
-    }
-    return target;
-  };
-});
-
-'use strict';
-
-/**
- * Wraps the
- * @param text {string} haystack to search through
- * @param search {string} needle to search for
- * @param [caseSensitive] {boolean} optional boolean to use case-sensitive searching
- */
-angular.module('ui.highlight',[]).filter('highlight', function () {
-  return function (text, search, caseSensitive) {
-    if (search || angular.isNumber(search)) {
-      text = text.toString();
-      search = search.toString();
-      if (caseSensitive) {
-        return text.split(search).join('<span class="ui-match">' + search + '</span>');
-      } else {
-        return text.replace(new RegExp(search, 'gi'), '<span class="ui-match">$&</span>');
-      }
-    } else {
-      return text;
-    }
-  };
-});
-
-'use strict';
-
-// modeled after: angular-1.0.7/src/ng/directive/ngInclude.js
-angular.module('ui.include',[])
-.directive('uiInclude', ['$http', '$templateCache', '$anchorScroll', '$compile',
-                 function($http,   $templateCache,   $anchorScroll,   $compile) {
-  return {
-    restrict: 'ECA',
-    terminal: true,
-    compile: function(element, attr) {
-      var srcExp = attr.uiInclude || attr.src,
-          fragExp = attr.fragment || '',
-          onloadExp = attr.onload || '',
-          autoScrollExp = attr.autoscroll;
-
-      return function(scope, element) {
-        var changeCounter = 0,
-            childScope;
-
-        var clearContent = function() {
-          if (childScope) {
-            childScope.$destroy();
-            childScope = null;
-          }
-
-          element.html('');
-        };
-
-        function ngIncludeWatchAction() {
-          var thisChangeId = ++changeCounter;
-          var src = scope.$eval(srcExp);
-          var fragment = scope.$eval(fragExp);
-
-          if (src) {
-            $http.get(src, {cache: $templateCache}).success(function(response) {
-              if (thisChangeId !== changeCounter) { return; }
-
-              if (childScope) { childScope.$destroy(); }
-              childScope = scope.$new();
-
-              var contents;
-              if (fragment) {
-                contents = angular.element('<div/>').html(response).find(fragment);
-              }
-              else {
-                contents = angular.element('<div/>').html(response).contents();
-              }
-              element.html(contents);
-              $compile(contents)(childScope);
-
-              if (angular.isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
-                $anchorScroll();
-              }
-
-              childScope.$emit('$includeContentLoaded');
-              scope.$eval(onloadExp);
-            }).error(function() {
-              if (thisChangeId === changeCounter) { clearContent(); }
-            });
-          } else { clearContent(); }
-        }
-
-        scope.$watch(fragExp, ngIncludeWatchAction);
-        scope.$watch(srcExp, ngIncludeWatchAction);
-      };
-    }
-  };
-}]);
-
-'use strict';
-
-/**
- * Provides an easy way to toggle a checkboxes indeterminate property
- *
- * @example <input type="checkbox" ui-indeterminate="isUnkown">
- */
-angular.module('ui.indeterminate',[]).directive('uiIndeterminate', [
-  function () {
-    return {
-      compile: function(tElm, tAttrs) {
-        if (!tAttrs.type || tAttrs.type.toLowerCase() !== 'checkbox') {
-          return angular.noop;
-        }
-
-        return function ($scope, elm, attrs) {
-          $scope.$watch(attrs.uiIndeterminate, function(newVal) {
-            elm[0].indeterminate = !!newVal;
-          });
-        };
-      }
-    };
-  }]);
-
-'use strict';
-
-/**
- * Converts variable-esque naming conventions to something presentational, capitalized words separated by space.
- * @param {String} value The value to be parsed and prettified.
- * @param {String} [inflector] The inflector to use. Default: humanize.
- * @return {String}
- * @example {{ 'Here Is my_phoneNumber' | inflector:'humanize' }} => Here Is My Phone Number
- *          {{ 'Here Is my_phoneNumber' | inflector:'underscore' }} => here_is_my_phone_number
- *          {{ 'Here Is my_phoneNumber' | inflector:'variable' }} => hereIsMyPhoneNumber
- */
-angular.module('ui.inflector',[]).filter('inflector', function () {
-  function ucwords(text) {
-    return text.replace(/^([a-z])|\s+([a-z])/g, function ($1) {
-      return $1.toUpperCase();
-    });
-  }
-
-  function breakup(text, separator) {
-    return text.replace(/[A-Z]/g, function (match) {
-      return separator + match;
-    });
-  }
-
-  var inflectors = {
-    humanize: function (value) {
-      return ucwords(breakup(value, ' ').split('_').join(' '));
-    },
-    underscore: function (value) {
-      return value.substr(0, 1).toLowerCase() + breakup(value.substr(1), '_').toLowerCase().split(' ').join('_');
-    },
-    variable: function (value) {
-      value = value.substr(0, 1).toLowerCase() + ucwords(value.split('_').join(' ')).substr(1).split(' ').join('');
-      return value;
-    }
-  };
-
-  return function (text, inflector) {
-    if (inflector !== false && angular.isString(text)) {
-      inflector = inflector || 'humanize';
-      return inflectors[inflector](text);
-    } else {
-      return text;
-    }
-  };
-});
-
-'use strict';
-
-/**
- * General-purpose jQuery wrapper. Simply pass the plugin name as the expression.
- *
- * It is possible to specify a default set of parameters for each jQuery plugin.
- * Under the jq key, namespace each plugin by that which will be passed to ui-jq.
- * Unfortunately, at this time you can only pre-define the first parameter.
- * @example { jq : { datepicker : { showOn:'click' } } }
- *
- * @param ui-jq {string} The $elm.[pluginName]() to call.
- * @param [ui-options] {mixed} Expression to be evaluated and passed as options to the function
- *     Multiple parameters can be separated by commas
- * @param [ui-refresh] {expression} Watch expression and refire plugin on changes
- *
- * @example <input ui-jq="datepicker" ui-options="{showOn:'click'},secondParameter,thirdParameter" ui-refresh="iChange">
- */
-angular.module('ui.jq',[]).
-  value('uiJqConfig',{}).
-  directive('uiJq', ['uiJqConfig', '$timeout', function uiJqInjectingFunction(uiJqConfig, $timeout) {
-
-  return {
-    restrict: 'A',
-    compile: function uiJqCompilingFunction(tElm, tAttrs) {
-
-      if (!angular.isFunction(tElm[tAttrs.uiJq])) {
-        throw new Error('ui-jq: The "' + tAttrs.uiJq + '" function does not exist');
-      }
-      var options = uiJqConfig && uiJqConfig[tAttrs.uiJq];
-
-      return function uiJqLinkingFunction(scope, elm, attrs) {
-
-        var linkOptions = [];
-
-        // If ui-options are passed, merge (or override) them onto global defaults and pass to the jQuery method
-        if (attrs.uiOptions) {
-          linkOptions = scope.$eval('[' + attrs.uiOptions + ']');
-          if (angular.isObject(options) && angular.isObject(linkOptions[0])) {
-            linkOptions[0] = angular.extend({}, options, linkOptions[0]);
-          }
-        } else if (options) {
-          linkOptions = [options];
-        }
-        // If change compatibility is enabled, the form input's "change" event will trigger an "input" event
-        if (attrs.ngModel && elm.is('select,input,textarea')) {
-          elm.bind('change', function() {
-            elm.trigger('input');
-          });
-        }
-
-        // Call jQuery method and pass relevant options
-        function callPlugin() {
-          $timeout(function() {
-            elm[attrs.uiJq].apply(elm, linkOptions);
-          }, 0, false);
-        }
-
-        // If ui-refresh is used, re-fire the the method upon every change
-        if (attrs.uiRefresh) {
-          scope.$watch(attrs.uiRefresh, function() {
-            callPlugin();
-          });
-        }
-        callPlugin();
-      };
-    }
-  };
-}]);
-
-'use strict';
-
-angular.module('ui.keypress',[]).
-factory('keypressHelper', ['$parse', function keypress($parse){
-  var keysByCode = {
-    8: 'backspace',
-    9: 'tab',
-    13: 'enter',
-    27: 'esc',
-    32: 'space',
-    33: 'pageup',
-    34: 'pagedown',
-    35: 'end',
-    36: 'home',
-    37: 'left',
-    38: 'up',
-    39: 'right',
-    40: 'down',
-    45: 'insert',
-    46: 'delete'
-  };
-
-  var capitaliseFirstLetter = function (string) {
-    return string.charAt(0).toUpperCase() + string.slice(1);
-  };
-
-  return function(mode, scope, elm, attrs) {
-    var params, combinations = [];
-    params = scope.$eval(attrs['ui'+capitaliseFirstLetter(mode)]);
-
-    // Prepare combinations for simple checking
-    angular.forEach(params, function (v, k) {
-      var combination, expression;
-      expression = $parse(v);
-
-      angular.forEach(k.split(' '), function(variation) {
-        combination = {
-          expression: expression,
-          keys: {}
-        };
-        angular.forEach(variation.split('-'), function (value) {
-          combination.keys[value] = true;
-        });
-        combinations.push(combination);
-      });
-    });
-
-    // Check only matching of pressed keys one of the conditions
-    elm.bind(mode, function (event) {
-      // No need to do that inside the cycle
-      var metaPressed = !!(event.metaKey && !event.ctrlKey);
-      var altPressed = !!event.altKey;
-      var ctrlPressed = !!event.ctrlKey;
-      var shiftPressed = !!event.shiftKey;
-      var keyCode = event.keyCode;
-
-      // normalize keycodes
-      if (mode === 'keypress' && !shiftPressed && keyCode >= 97 && keyCode <= 122) {
-        keyCode = keyCode - 32;
-      }
-
-      // Iterate over prepared combinations
-      angular.forEach(combinations, function (combination) {
-
-        var mainKeyPressed = combination.keys[keysByCode[keyCode]] || combination.keys[keyCode.toString()];
-
-        var metaRequired = !!combination.keys.meta;
-        var altRequired = !!combination.keys.alt;
-        var ctrlRequired = !!combination.keys.ctrl;
-        var shiftRequired = !!combination.keys.shift;
-
-        if (
-          mainKeyPressed &&
-          ( metaRequired === metaPressed ) &&
-          ( altRequired === altPressed ) &&
-          ( ctrlRequired === ctrlPressed ) &&
-          ( shiftRequired === shiftPressed )
-        ) {
-          // Run the function
-          scope.$apply(function () {
-            combination.expression(scope, { '$event': event });
-          });
-        }
-      });
-    });
-  };
-}]);
-
-/**
- * Bind one or more handlers to particular keys or their combination
- * @param hash {mixed} keyBindings Can be an object or string where keybinding expression of keys or keys combinations and AngularJS Exspressions are set. Object syntax: "{ keys1: expression1 [, keys2: expression2 [ , ... ]]}". String syntax: ""expression1 on keys1 [ and expression2 on keys2 [ and ... ]]"". Expression is an AngularJS Expression, and key(s) are dash-separated combinations of keys and modifiers (one or many, if any. Order does not matter). Supported modifiers are 'ctrl', 'shift', 'alt' and key can be used either via its keyCode (13 for Return) or name. Named keys are 'backspace', 'tab', 'enter', 'esc', 'space', 'pageup', 'pagedown', 'end', 'home', 'left', 'up', 'right', 'down', 'insert', 'delete'.
- * @example <input ui-keypress="{enter:'x = 1', 'ctrl-shift-space':'foo()', 'shift-13':'bar()'}" /> <input ui-keypress="foo = 2 on ctrl-13 and bar('hello') on shift-esc" />
- **/
-angular.module('ui.keypress').directive('uiKeydown', ['keypressHelper', function(keypressHelper){
-  return {
-    link: function (scope, elm, attrs) {
-      keypressHelper('keydown', scope, elm, attrs);
-    }
-  };
-}]);
-
-angular.module('ui.keypress').directive('uiKeypress', ['keypressHelper', function(keypressHelper){
-  return {
-    link: function (scope, elm, attrs) {
-      keypressHelper('keypress', scope, elm, attrs);
-    }
-  };
-}]);
-
-angular.module('ui.keypress').directive('uiKeyup', ['keypressHelper', function(keypressHelper){
-  return {
-    link: function (scope, elm, attrs) {
-      keypressHelper('keyup', scope, elm, attrs);
-    }
-  };
-}]);
-
-'use strict';
-
-/*
- Attaches input mask onto input element
- */
-angular.module('ui.mask', [])
-  .value('uiMaskConfig', {
-    'maskDefinitions': {
-      '9': /\d/,
-      'A': /[a-zA-Z]/,
-      '*': /[a-zA-Z0-9]/
-    }
-  })
-  .directive('uiMask', ['uiMaskConfig', function (maskConfig) {
-    return {
-      priority: 100,
-      require: 'ngModel',
-      restrict: 'A',
-      compile: function uiMaskCompilingFunction(){
-        var options = maskConfig;
-
-        return function uiMaskLinkingFunction(scope, iElement, iAttrs, controller){
-          var maskProcessed = false, eventsBound = false,
-            maskCaretMap, maskPatterns, maskPlaceholder, maskComponents,
-          // Minimum required length of the value to be considered valid
-            minRequiredLength,
-            value, valueMasked, isValid,
-          // Vars for initializing/uninitializing
-            originalPlaceholder = iAttrs.placeholder,
-            originalMaxlength = iAttrs.maxlength,
-          // Vars used exclusively in eventHandler()
-            oldValue, oldValueUnmasked, oldCaretPosition, oldSelectionLength;
-
-          function initialize(maskAttr){
-            if (!angular.isDefined(maskAttr)) {
-              return uninitialize();
-            }
-            processRawMask(maskAttr);
-            if (!maskProcessed) {
-              return uninitialize();
-            }
-            initializeElement();
-            bindEventListeners();
-            return true;
-          }
-
-          function initPlaceholder(placeholderAttr) {
-            if(! angular.isDefined(placeholderAttr)) {
-              return;
-            }
-
-            maskPlaceholder = placeholderAttr;
-
-            // If the mask is processed, then we need to update the value
-            if (maskProcessed) {
-              eventHandler();
-            }
-          }
-
-          function formatter(fromModelValue){
-            if (!maskProcessed) {
-              return fromModelValue;
-            }
-            value = unmaskValue(fromModelValue || '');
-            isValid = validateValue(value);
-            controller.$setValidity('mask', isValid);
-            return isValid && value.length ? maskValue(value) : undefined;
-          }
-
-          function parser(fromViewValue){
-            if (!maskProcessed) {
-              return fromViewValue;
-            }
-            value = unmaskValue(fromViewValue || '');
-            isValid = validateValue(value);
-            // We have to set viewValue manually as the reformatting of the input
-            // value performed by eventHandler() doesn't happen until after
-            // this parser is called, which causes what the user sees in the input
-            // to be out-of-sync with what the controller's $viewValue is set to.
-            controller.$viewValue = value.length ? maskValue(value) : '';
-            controller.$setValidity('mask', isValid);
-            if (value === '' && controller.$error.required !== undefined) {
-              controller.$setValidity('required', false);
-            }
-            return isValid ? value : undefined;
-          }
-
-          var linkOptions = {};
-
-          if (iAttrs.uiOptions) {
-            linkOptions = scope.$eval('[' + iAttrs.uiOptions + ']');
-            if (angular.isObject(linkOptions[0])) {
-              // we can't use angular.copy nor angular.extend, they lack the power to do a deep merge
-              linkOptions = (function(original, current){
-                for(var i in original) {
-                  if (Object.prototype.hasOwnProperty.call(original, i)) {
-                    if (!current[i]) {
-                      current[i] = angular.copy(original[i]);
-                    } else {
-                      angular.extend(current[i], original[i]);
-                    }
-                  }
-                }
-                return current;
-              })(options, linkOptions[0]);
-            }
-          } else {
-            linkOptions = options;
-          }
-
-          iAttrs.$observe('uiMask', initialize);
-          iAttrs.$observe('placeholder', initPlaceholder);
-          controller.$formatters.push(formatter);
-          controller.$parsers.push(parser);
-
-          function uninitialize(){
-            maskProcessed = false;
-            unbindEventListeners();
-
-            if (angular.isDefined(originalPlaceholder)) {
-              iElement.attr('placeholder', originalPlaceholder);
-            } else {
-              iElement.removeAttr('placeholder');
-            }
-
-            if (angular.isDefined(originalMaxlength)) {
-              iElement.attr('maxlength', originalMaxlength);
-            } else {
-              iElement.removeAttr('maxlength');
-            }
-
-            iElement.val(controller.$modelValue);
-            controller.$viewValue = controller.$modelValue;
-            return false;
-          }
-
-          function initializeElement(){
-            value = oldValueUnmasked = unmaskValue(controller.$modelValue || '');
-            valueMasked = oldValue = maskValue(value);
-            isValid = validateValue(value);
-            var viewValue = isValid && value.length ? valueMasked : '';
-            if (iAttrs.maxlength) { // Double maxlength to allow pasting new val at end of mask
-              iElement.attr('maxlength', maskCaretMap[maskCaretMap.length - 1] * 2);
-            }
-            iElement.attr('placeholder', maskPlaceholder);
-            iElement.val(viewValue);
-            controller.$viewValue = viewValue;
-            // Not using $setViewValue so we don't clobber the model value and dirty the form
-            // without any kind of user interaction.
-          }
-
-          function bindEventListeners(){
-            if (eventsBound) {
-              return;
-            }
-            iElement.bind('blur', blurHandler);
-            iElement.bind('mousedown mouseup', mouseDownUpHandler);
-            iElement.bind('input keyup click focus', eventHandler);
-            eventsBound = true;
-          }
-
-          function unbindEventListeners(){
-            if (!eventsBound) {
-              return;
-            }
-            iElement.unbind('blur', blurHandler);
-            iElement.unbind('mousedown', mouseDownUpHandler);
-            iElement.unbind('mouseup', mouseDownUpHandler);
-            iElement.unbind('input', eventHandler);
-            iElement.unbind('keyup', eventHandler);
-            iElement.unbind('click', eventHandler);
-            iElement.unbind('focus', eventHandler);
-            eventsBound = false;
-          }
-
-          function validateValue(value){
-            // Zero-length value validity is ngRequired's determination
-            return value.length ? value.length >= minRequiredLength : true;
-          }
-
-          function unmaskValue(value){
-            var valueUnmasked = '',
-              maskPatternsCopy = maskPatterns.slice();
-            // Preprocess by stripping mask components from value
-            value = value.toString();
-            angular.forEach(maskComponents, function (component){
-              value = value.replace(component, '');
-            });
-            angular.forEach(value.split(''), function (chr){
-              if (maskPatternsCopy.length && maskPatternsCopy[0].test(chr)) {
-                valueUnmasked += chr;
-                maskPatternsCopy.shift();
-              }
-            });
-            return valueUnmasked;
-          }
-
-          function maskValue(unmaskedValue){
-            var valueMasked = '',
-                maskCaretMapCopy = maskCaretMap.slice();
-
-            angular.forEach(maskPlaceholder.split(''), function (chr, i){
-              if (unmaskedValue.length && i === maskCaretMapCopy[0]) {
-                valueMasked  += unmaskedValue.charAt(0) || '_';
-                unmaskedValue = unmaskedValue.substr(1);
-                maskCaretMapCopy.shift();
-              }
-              else {
-                valueMasked += chr;
-              }
-            });
-            return valueMasked;
-          }
-
-          function getPlaceholderChar(i) {
-            var placeholder = iAttrs.placeholder;
-
-            if (typeof placeholder !== 'undefined' && placeholder[i]) {
-              return placeholder[i];
-            } else {
-              return '_';
-            }
-          }
-
-          // Generate array of mask components that will be stripped from a masked value
-          // before processing to prevent mask components from being added to the unmasked value.
-          // E.g., a mask pattern of '+7 9999' won't have the 7 bleed into the unmasked value.
-          // If a maskable char is followed by a mask char and has a mask
-          // char behind it, we'll split it into it's own component so if
-          // a user is aggressively deleting in the input and a char ahead
-          // of the maskable char gets deleted, we'll still be able to strip
-          // it in the unmaskValue() preprocessing.
-          function getMaskComponents() {
-            return maskPlaceholder.replace(/[_]+/g, '_').replace(/([^_]+)([a-zA-Z0-9])([^_])/g, '$1$2_$3').split('_');
-          }
-
-          function processRawMask(mask){
-            var characterCount = 0;
-
-            maskCaretMap    = [];
-            maskPatterns    = [];
-            maskPlaceholder = '';
-
-            if (typeof mask === 'string') {
-              minRequiredLength = 0;
-
-              var isOptional = false,
-                  splitMask  = mask.split('');
-
-              angular.forEach(splitMask, function (chr, i){
-                if (linkOptions.maskDefinitions[chr]) {
-
-                  maskCaretMap.push(characterCount);
-
-                  maskPlaceholder += getPlaceholderChar(i);
-                  maskPatterns.push(linkOptions.maskDefinitions[chr]);
-
-                  characterCount++;
-                  if (!isOptional) {
-                    minRequiredLength++;
-                  }
-                }
-                else if (chr === '?') {
-                  isOptional = true;
-                }
-                else {
-                  maskPlaceholder += chr;
-                  characterCount++;
-                }
-              });
-            }
-            // Caret position immediately following last position is valid.
-            maskCaretMap.push(maskCaretMap.slice().pop() + 1);
-
-            maskComponents = getMaskComponents();
-            maskProcessed  = maskCaretMap.length > 1 ? true : false;
-          }
-
-          function blurHandler(){
-            oldCaretPosition = 0;
-            oldSelectionLength = 0;
-            if (!isValid || value.length === 0) {
-              valueMasked = '';
-              iElement.val('');
-              scope.$apply(function (){
-                controller.$setViewValue('');
-              });
-            }
-          }
-
-          function mouseDownUpHandler(e){
-            if (e.type === 'mousedown') {
-              iElement.bind('mouseout', mouseoutHandler);
-            } else {
-              iElement.unbind('mouseout', mouseoutHandler);
-            }
-          }
-
-          iElement.bind('mousedown mouseup', mouseDownUpHandler);
-
-          function mouseoutHandler(){
-            /*jshint validthis: true */
-            oldSelectionLength = getSelectionLength(this);
-            iElement.unbind('mouseout', mouseoutHandler);
-          }
-
-          function eventHandler(e){
-            /*jshint validthis: true */
-            e = e || {};
-            // Allows more efficient minification
-            var eventWhich = e.which,
-              eventType = e.type;
-
-            // Prevent shift and ctrl from mucking with old values
-            if (eventWhich === 16 || eventWhich === 91) { return;}
-
-            var val = iElement.val(),
-              valOld = oldValue,
-              valMasked,
-              valUnmasked = unmaskValue(val),
-              valUnmaskedOld = oldValueUnmasked,
-              valAltered = false,
-
-              caretPos = getCaretPosition(this) || 0,
-              caretPosOld = oldCaretPosition || 0,
-              caretPosDelta = caretPos - caretPosOld,
-              caretPosMin = maskCaretMap[0],
-              caretPosMax = maskCaretMap[valUnmasked.length] || maskCaretMap.slice().shift(),
-
-              selectionLenOld = oldSelectionLength || 0,
-              isSelected = getSelectionLength(this) > 0,
-              wasSelected = selectionLenOld > 0,
-
-            // Case: Typing a character to overwrite a selection
-              isAddition = (val.length > valOld.length) || (selectionLenOld && val.length > valOld.length - selectionLenOld),
-            // Case: Delete and backspace behave identically on a selection
-              isDeletion = (val.length < valOld.length) || (selectionLenOld && val.length === valOld.length - selectionLenOld),
-              isSelection = (eventWhich >= 37 && eventWhich <= 40) && e.shiftKey, // Arrow key codes
-
-              isKeyLeftArrow = eventWhich === 37,
-            // Necessary due to "input" event not providing a key code
-              isKeyBackspace = eventWhich === 8 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === -1)),
-              isKeyDelete = eventWhich === 46 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === 0 ) && !wasSelected),
-
-            // Handles cases where caret is moved and placed in front of invalid maskCaretMap position. Logic below
-            // ensures that, on click or leftward caret placement, caret is moved leftward until directly right of
-            // non-mask character. Also applied to click since users are (arguably) more likely to backspace
-            // a character when clicking within a filled input.
-              caretBumpBack = (isKeyLeftArrow || isKeyBackspace || eventType === 'click') && caretPos > caretPosMin;
-
-            oldSelectionLength = getSelectionLength(this);
-
-            // These events don't require any action
-            if (isSelection || (isSelected && (eventType === 'click' || eventType === 'keyup'))) {
-              return;
-            }
-
-            // Value Handling
-            // ==============
-
-            // User attempted to delete but raw value was unaffected--correct this grievous offense
-            if ((eventType === 'input') && isDeletion && !wasSelected && valUnmasked === valUnmaskedOld) {
-              while (isKeyBackspace && caretPos > caretPosMin && !isValidCaretPosition(caretPos)) {
-                caretPos--;
-              }
-              while (isKeyDelete && caretPos < caretPosMax && maskCaretMap.indexOf(caretPos) === -1) {
-                caretPos++;
-              }
-              var charIndex = maskCaretMap.indexOf(caretPos);
-              // Strip out non-mask character that user would have deleted if mask hadn't been in the way.
-              valUnmasked = valUnmasked.substring(0, charIndex) + valUnmasked.substring(charIndex + 1);
-              valAltered = true;
-            }
-
-            // Update values
-            valMasked = maskValue(valUnmasked);
-
-            oldValue = valMasked;
-            oldValueUnmasked = valUnmasked;
-            iElement.val(valMasked);
-            if (valAltered) {
-              // We've altered the raw value after it's been $digest'ed, we need to $apply the new value.
-              scope.$apply(function (){
-                controller.$setViewValue(valUnmasked);
-              });
-            }
-
-            // Caret Repositioning
-            // ===================
-
-            // Ensure that typing always places caret ahead of typed character in cases where the first char of
-            // the input is a mask char and the caret is placed at the 0 position.
-            if (isAddition && (caretPos <= caretPosMin)) {
-              caretPos = caretPosMin + 1;
-            }
-
-            if (caretBumpBack) {
-              caretPos--;
-            }
-
-            // Make sure caret is within min and max position limits
-            caretPos = caretPos > caretPosMax ? caretPosMax : caretPos < caretPosMin ? caretPosMin : caretPos;
-
-            // Scoot the caret back or forth until it's in a non-mask position and within min/max position limits
-            while (!isValidCaretPosition(caretPos) && caretPos > caretPosMin && caretPos < caretPosMax) {
-              caretPos += caretBumpBack ? -1 : 1;
-            }
-
-            if ((caretBumpBack && caretPos < caretPosMax) || (isAddition && !isValidCaretPosition(caretPosOld))) {
-              caretPos++;
-            }
-            oldCaretPosition = caretPos;
-            setCaretPosition(this, caretPos);
-          }
-
-          function isValidCaretPosition(pos){ return maskCaretMap.indexOf(pos) > -1; }
-
-          function getCaretPosition(input){
-            if (!input) return 0;
-            if (input.selectionStart !== undefined) {
-              return input.selectionStart;
-            } else if (document.selection) {
-              // Curse you IE
-              input.focus();
-              var selection = document.selection.createRange();
-              selection.moveStart('character', -input.value.length);
-              return selection.text.length;
-            }
-            return 0;
-          }
-
-          function setCaretPosition(input, pos){
-            if (!input) return 0;
-            if (input.offsetWidth === 0 || input.offsetHeight === 0) {
-              return; // Input's hidden
-            }
-            if (input.setSelectionRange) {
-              input.focus();
-              input.setSelectionRange(pos, pos);
-            }
-            else if (input.createTextRange) {
-              // Curse you IE
-              var range = input.createTextRange();
-              range.collapse(true);
-              range.moveEnd('character', pos);
-              range.moveStart('character', pos);
-              range.select();
-            }
-          }
-
-          function getSelectionLength(input){
-            if (!input) return 0;
-            if (input.selectionStart !== undefined) {
-              return (input.selectionEnd - input.selectionStart);
-            }
-            if (document.selection) {
-              return (document.selection.createRange().text.length);
-            }
-            return 0;
-          }
-
-          // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf
-          if (!Array.prototype.indexOf) {
-            Array.prototype.indexOf = function (searchElement /*, fromIndex */){
-              if (this === null) {
-                throw new TypeError();
-              }
-              var t = Object(this);
-              var len = t.length >>> 0;
-              if (len === 0) {
-                return -1;
-              }
-              var n = 0;
-              if (arguments.length > 1) {
-                n = Number(arguments[1]);
-                if (n !== n) { // shortcut for verifying if it's NaN
-                  n = 0;
-                } else if (n !== 0 && n !== Infinity && n !== -Infinity) {
-                  n = (n > 0 || -1) * Math.floor(Math.abs(n));
-                }
-              }
-              if (n >= len) {
-                return -1;
-              }
-              var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
-              for (; k < len; k++) {
-                if (k in t && t[k] === searchElement) {
-                  return k;
-                }
-              }
-              return -1;
-            };
-          }
-
-        };
-      }
-    };
-  }
-]);
-
-'use strict';
-
-/**
- * Add a clear button to form inputs to reset their value
- */
-angular.module('ui.reset',[]).value('uiResetConfig',null).directive('uiReset', ['uiResetConfig', function (uiResetConfig) {
-  var resetValue = null;
-  if (uiResetConfig !== undefined){
-      resetValue = uiResetConfig;
-  }
-  return {
-    require: 'ngModel',
-    link: function (scope, elm, attrs, ctrl) {
-      var aElement;
-      aElement = angular.element('<a class="ui-reset" />');
-      elm.wrap('<span class="ui-resetwrap" />').after(aElement);
-      aElement.bind('click', function (e) {
-        e.preventDefault();
-        scope.$apply(function () {
-          if (attrs.uiReset){
-            ctrl.$setViewValue(scope.$eval(attrs.uiReset));
-          }else{
-            ctrl.$setViewValue(resetValue);
-          }
-          ctrl.$render();
-        });
-      });
-    }
-  };
-}]);
-
-'use strict';
-
-/**
- * Set a $uiRoute boolean to see if the current route matches
- */
-angular.module('ui.route', []).directive('uiRoute', ['$location', '$parse', function ($location, $parse) {
-  return {
-    restrict: 'AC',
-    scope: true,
-    compile: function(tElement, tAttrs) {
-      var useProperty;
-      if (tAttrs.uiRoute) {
-        useProperty = 'uiRoute';
-      } else if (tAttrs.ngHref) {
-        useProperty = 'ngHref';
-      } else if (tAttrs.href) {
-        useProperty = 'href';
-      } else {
-        throw new Error('uiRoute missing a route or href property on ' + tElement[0]);
-      }
-      return function ($scope, elm, attrs) {
-        var modelSetter = $parse(attrs.ngModel || attrs.routeModel || '$uiRoute').assign;
-        var watcher = angular.noop;
-
-        // Used by href and ngHref
-        function staticWatcher(newVal) {
-          var hash = newVal.indexOf('#');
-          if (hash > -1){
-            newVal = newVal.substr(hash + 1);
-          }
-          watcher = function watchHref() {
-            modelSetter($scope, ($location.path().indexOf(newVal) > -1));
-          };
-          watcher();
-        }
-        // Used by uiRoute
-        function regexWatcher(newVal) {
-          var hash = newVal.indexOf('#');
-          if (hash > -1){
-            newVal = newVal.substr(hash + 1);
-          }
-          watcher = function watchRegex() {
-            var regexp = new RegExp('^' + newVal + '$', ['i']);
-            modelSetter($scope, regexp.test($location.path()));
-          };
-          watcher();
-        }
-
-        switch (useProperty) {
-          case 'uiRoute':
-            // if uiRoute={{}} this will be undefined, otherwise it will have a value and $observe() never gets triggered
-            if (attrs.uiRoute){
-              regexWatcher(attrs.uiRoute);
-            }else{
-              attrs.$observe('uiRoute', regexWatcher);
-            }
-            break;
-          case 'ngHref':
-            // Setup watcher() every time ngHref changes
-            if (attrs.ngHref){
-              staticWatcher(attrs.ngHref);
-            }else{
-              attrs.$observe('ngHref', staticWatcher);
-            }
-            break;
-          case 'href':
-            // Setup watcher()
-            staticWatcher(attrs.href);
-        }
-
-        $scope.$on('$routeChangeSuccess', function(){
-          watcher();
-        });
-
-        //Added for compatibility with ui-router
-        $scope.$on('$stateChangeSuccess', function(){
-          watcher();
-        });
-      };
-    }
-  };
-}]);
-
-'use strict';
-
-angular.module('ui.scroll.jqlite', ['ui.scroll']).service('jqLiteExtras', [
-  '$log', '$window', function(console, window) {
-    return {
-      registerFor: function(element) {
-        var convertToPx, css, getMeasurements, getStyle, getWidthHeight, isWindow, scrollTo;
-        css = angular.element.prototype.css;
-        element.prototype.css = function(name, value) {
-          var elem, self;
-          self = this;
-          elem = self[0];
-          if (!(!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style)) {
-            return css.call(self, name, value);
-          }
-        };
-        isWindow = function(obj) {
-          return obj && obj.document && obj.location && obj.alert && obj.setInterval;
-        };
-        scrollTo = function(self, direction, value) {
-          var elem, method, preserve, prop, _ref;
-          elem = self[0];
-          _ref = {
-            top: ['scrollTop', 'pageYOffset', 'scrollLeft'],
-            left: ['scrollLeft', 'pageXOffset', 'scrollTop']
-          }[direction], method = _ref[0], prop = _ref[1], preserve = _ref[2];
-          if (isWindow(elem)) {
-            if (angular.isDefined(value)) {
-              return elem.scrollTo(self[preserve].call(self), value);
-            } else {
-              if (prop in elem) {
-                return elem[prop];
-              } else {
-                return elem.document.documentElement[method];
-              }
-            }
-          } else {
-            if (angular.isDefined(value)) {
-              return elem[method] = value;
-            } else {
-              return elem[method];
-            }
-          }
-        };
-        if (window.getComputedStyle) {
-          getStyle = function(elem) {
-            return window.getComputedStyle(elem, null);
-          };
-          convertToPx = function(elem, value) {
-            return parseFloat(value);
-          };
-        } else {
-          getStyle = function(elem) {
-            return elem.currentStyle;
-          };
-          convertToPx = function(elem, value) {
-            var core_pnum, left, result, rnumnonpx, rs, rsLeft, style;
-            core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
-            rnumnonpx = new RegExp('^(' + core_pnum + ')(?!px)[a-z%]+$', 'i');
-            if (!rnumnonpx.test(value)) {
-              return parseFloat(value);
-            } else {
-              style = elem.style;
-              left = style.left;
-              rs = elem.runtimeStyle;
-              rsLeft = rs && rs.left;
-              if (rs) {
-                rs.left = style.left;
-              }
-              style.left = value;
-              result = style.pixelLeft;
-              style.left = left;
-              if (rsLeft) {
-                rs.left = rsLeft;
-              }
-              return result;
-            }
-          };
-        }
-        getMeasurements = function(elem, measure) {
-          var base, borderA, borderB, computedMarginA, computedMarginB, computedStyle, dirA, dirB, marginA, marginB, paddingA, paddingB, _ref;
-          if (isWindow(elem)) {
-            base = document.documentElement[{
-              height: 'clientHeight',
-              width: 'clientWidth'
-            }[measure]];
-            return {
-              base: base,
-              padding: 0,
-              border: 0,
-              margin: 0
-            };
-          }
-          _ref = {
-            width: [elem.offsetWidth, 'Left', 'Right'],
-            height: [elem.offsetHeight, 'Top', 'Bottom']
-          }[measure], base = _ref[0], dirA = _ref[1], dirB = _ref[2];
-          computedStyle = getStyle(elem);
-          paddingA = convertToPx(elem, computedStyle['padding' + dirA]) || 0;
-          paddingB = convertToPx(elem, computedStyle['padding' + dirB]) || 0;
-          borderA = convertToPx(elem, computedStyle['border' + dirA + 'Width']) || 0;
-          borderB = convertToPx(elem, computedStyle['border' + dirB + 'Width']) || 0;
-          computedMarginA = computedStyle['margin' + dirA];
-          computedMarginB = computedStyle['margin' + dirB];
-          marginA = convertToPx(elem, computedMarginA) || 0;
-          marginB = convertToPx(elem, computedMarginB) || 0;
-          return {
-            base: base,
-            padding: paddingA + paddingB,
-            border: borderA + borderB,
-            margin: marginA + marginB
-          };
-        };
-        getWidthHeight = function(elem, direction, measure) {
-          var computedStyle, measurements, result;
-          measurements = getMeasurements(elem, direction);
-          if (measurements.base > 0) {
-            return {
-              base: measurements.base - measurements.padding - measurements.border,
-              outer: measurements.base,
-              outerfull: measurements.base + measurements.margin
-            }[measure];
-          } else {
-            computedStyle = getStyle(elem);
-            result = computedStyle[direction];
-            if (result < 0 || result === null) {
-              result = elem.style[direction] || 0;
-            }
-            result = parseFloat(result) || 0;
-            return {
-              base: result - measurements.padding - measurements.border,
-              outer: result,
-              outerfull: result + measurements.padding + measurements.border + measurements.margin
-            }[measure];
-          }
-        };
-        return angular.forEach({
-          before: function(newElem) {
-            var children, elem, i, parent, self, _i, _ref;
-            self = this;
-            elem = self[0];
-            parent = self.parent();
-            children = parent.contents();
-            if (children[0] === elem) {
-              return parent.prepend(newElem);
-            } else {
-              for (i = _i = 1, _ref = children.length - 1; 1 <= _ref ? _i <= _ref : _i >= _ref; i = 1 <= _ref ? ++_i : --_i) {
-                if (children[i] === elem) {
-                  angular.element(children[i - 1]).after(newElem);
-                  return;
-                }
-              }
-              throw new Error('invalid DOM structure ' + elem.outerHTML);
-            }
-          },
-          height: function(value) {
-            var self;
-            self = this;
-            if (angular.isDefined(value)) {
-              if (angular.isNumber(value)) {
-                value = value + 'px';
-              }
-              return css.call(self, 'height', value);
-            } else {
-              return getWidthHeight(this[0], 'height', 'base');
-            }
-          },
-          outerHeight: function(option) {
-            return getWidthHeight(this[0], 'height', option ? 'outerfull' : 'outer');
-          },
-          offset: function(value) {
-            var box, doc, docElem, elem, self, win;
-            self = this;
-            if (arguments.length) {
-              if (value === void 0) {
-                return self;
-              } else {
-                return value;
-
-              }
-            }
-            box = {
-              top: 0,
-              left: 0
-            };
-            elem = self[0];
-            doc = elem && elem.ownerDocument;
-            if (!doc) {
-              return;
-            }
-            docElem = doc.documentElement;
-            if (elem.getBoundingClientRect) {
-              box = elem.getBoundingClientRect();
-            }
-            win = doc.defaultView || doc.parentWindow;
-            return {
-              top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
-              left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
-            };
-          },
-          scrollTop: function(value) {
-            return scrollTo(this, 'top', value);
-          },
-          scrollLeft: function(value) {
-            return scrollTo(this, 'left', value);
-          }
-        }, function(value, key) {
-          if (!element.prototype[key]) {
-            return element.prototype[key] = value;
-          }
-        });
-      }
-    };
-  }
-]).run([
-  '$log', '$window', 'jqLiteExtras', function(console, window, jqLiteExtras) {
-    if (!window.jQuery) {
-      return jqLiteExtras.registerFor(angular.element);
-    }
-  }
-]);
-
-'use strict';
-/*
-
- List of used element methods available in JQuery but not in JQuery Lite
-
- element.before(elem)
- element.height()
- element.outerHeight(true)
- element.height(value) = only for Top/Bottom padding elements
- element.scrollTop()
- element.scrollTop(value)
- */
-
-angular.module('ui.scroll', []).directive('ngScrollViewport', [
-		'$log', function() {
-			return {
-				controller: [
-					'$scope', '$element', function(scope, element) {
-						return element;
-					}
-				]
-			};
-		}
-	]).directive('ngScroll', [
-		'$log', '$injector', '$rootScope', '$timeout', function(console, $injector, $rootScope, $timeout) {
-			return {
-				require: ['?^ngScrollViewport'],
-				transclude: 'element',
-				priority: 1000,
-				terminal: true,
-				compile: function(element, attr, linker) {
-					return function($scope, $element, $attr, controllers) {
-						var adapter, adjustBuffer, adjustRowHeight, bof, bottomVisiblePos, buffer, bufferPadding, bufferSize, clipBottom, clipTop, datasource, datasourceName, enqueueFetch, eof, eventListener, fetch, finalize, first, insert, isDatasource, isLoading, itemName, loading, match, next, pending, reload, removeFromBuffer, resizeHandler, scrollHandler, scrollHeight, shouldLoadBottom, shouldLoadTop, tempScope, topVisiblePos, viewport;
-						match = $attr.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/);
-						if (!match) {
-							throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "' + $attr.ngScroll + '"');
-						}
-						itemName = match[1];
-						datasourceName = match[2];
-						isDatasource = function(datasource) {
-							return angular.isObject(datasource) && datasource.get && angular.isFunction(datasource.get);
-						};
-						datasource = $scope[datasourceName];
-						if (!isDatasource(datasource)) {
-							datasource = $injector.get(datasourceName);
-							if (!isDatasource(datasource)) {
-								throw new Error(datasourceName + ' is not a valid datasource');
-							}
-						}
-						bufferSize = Math.max(3, +$attr.bufferSize || 10);
-						bufferPadding = function() {
-							return viewport.height() * Math.max(0.1, +$attr.padding || 0.1);
-						};
-						scrollHeight = function(elem) {
-							return elem[0].scrollHeight || elem[0].document.documentElement.scrollHeight;
-						};
-						adapter = null;
-						linker(tempScope = $scope.$new(), function(template) {
-							var bottomPadding, createPadding, padding, repeaterType, topPadding, viewport;
-							repeaterType = template[0].localName;
-							if (repeaterType === 'dl') {
-								throw new Error('ng-scroll directive does not support <' + template[0].localName + '> as a repeating tag: ' + template[0].outerHTML);
-							}
-							if (repeaterType !== 'li' && repeaterType !== 'tr') {
-								repeaterType = 'div';
-							}
-							viewport = controllers[0] || angular.element(window);
-							viewport.css({
-								'overflow-y': 'auto',
-								'display': 'block'
-							});
-							padding = function(repeaterType) {
-								var div, result, table;
-								switch (repeaterType) {
-									case 'tr':
-										table = angular.element('<table><tr><td><div></div></td></tr></table>');
-										div = table.find('div');
-										result = table.find('tr');
-										result.paddingHeight = function() {
-											return div.height.apply(div, arguments);
-										};
-										return result;
-									default:
-										result = angular.element('<' + repeaterType + '></' + repeaterType + '>');
-										result.paddingHeight = result.height;
-										return result;
-								}
-							};
-							createPadding = function(padding, element, direction) {
-								element[{
-									top: 'before',
-									bottom: 'after'
-								}[direction]](padding);
-								return {
-									paddingHeight: function() {
-										return padding.paddingHeight.apply(padding, arguments);
-									},
-									insert: function(element) {
-										return padding[{
-											top: 'after',
-											bottom: 'before'
-										}[direction]](element);
-									}
-								};
-							};
-							topPadding = createPadding(padding(repeaterType), element, 'top');
-							bottomPadding = createPadding(padding(repeaterType), element, 'bottom');
-							tempScope.$destroy();
-							return adapter = {
-								viewport: viewport,
-								topPadding: topPadding.paddingHeight,
-								bottomPadding: bottomPadding.paddingHeight,
-								append: bottomPadding.insert,
-								prepend: topPadding.insert,
-								bottomDataPos: function() {
-									return scrollHeight(viewport) - bottomPadding.paddingHeight();
-								},
-								topDataPos: function() {
-									return topPadding.paddingHeight();
-								}
-							};
-						});
-						viewport = adapter.viewport;
-						first = 1;
-						next = 1;
-						buffer = [];
-						pending = [];
-						eof = false;
-						bof = false;
-						loading = datasource.loading || function() {};
-						isLoading = false;
-						removeFromBuffer = function(start, stop) {
-							var i, _i;
-							for (i = _i = start; start <= stop ? _i < stop : _i > stop; i = start <= stop ? ++_i : --_i) {
-								buffer[i].scope.$destroy();
-								buffer[i].element.remove();
-							}
-							return buffer.splice(start, stop - start);
-						};
-						reload = function() {
-							first = 1;
-							next = 1;
-							removeFromBuffer(0, buffer.length);
-							adapter.topPadding(0);
-							adapter.bottomPadding(0);
-							pending = [];
-							eof = false;
-							bof = false;
-							return adjustBuffer(false);
-						};
-						bottomVisiblePos = function() {
-							return viewport.scrollTop() + viewport.height();
-						};
-						topVisiblePos = function() {
-							return viewport.scrollTop();
-						};
-						shouldLoadBottom = function() {
-							return !eof && adapter.bottomDataPos() < bottomVisiblePos() + bufferPadding();
-						};
-						clipBottom = function() {
-							var bottomHeight, i, itemHeight, overage, _i, _ref;
-							bottomHeight = 0;
-							overage = 0;
-							for (i = _i = _ref = buffer.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
-								itemHeight = buffer[i].element.outerHeight(true);
-								if (adapter.bottomDataPos() - bottomHeight - itemHeight > bottomVisiblePos() + bufferPadding()) {
-									bottomHeight += itemHeight;
-									overage++;
-									eof = false;
-								} else {
-									break;
-								}
-							}
-							if (overage > 0) {
-								adapter.bottomPadding(adapter.bottomPadding() + bottomHeight);
-								removeFromBuffer(buffer.length - overage, buffer.length);
-								next -= overage;
-								return console.log('clipped off bottom ' + overage + ' bottom padding ' + (adapter.bottomPadding()));
-							}
-						};
-						shouldLoadTop = function() {
-							return !bof && (adapter.topDataPos() > topVisiblePos() - bufferPadding());
-						};
-						clipTop = function() {
-							var item, itemHeight, overage, topHeight, _i, _len;
-							topHeight = 0;
-							overage = 0;
-							for (_i = 0, _len = buffer.length; _i < _len; _i++) {
-								item = buffer[_i];
-								itemHeight = item.element.outerHeight(true);
-								if (adapter.topDataPos() + topHeight + itemHeight < topVisiblePos() - bufferPadding()) {
-									topHeight += itemHeight;
-									overage++;
-									bof = false;
-								} else {
-									break;
-								}
-							}
-							if (overage > 0) {
-								adapter.topPadding(adapter.topPadding() + topHeight);
-								removeFromBuffer(0, overage);
-								first += overage;
-								return console.log('clipped off top ' + overage + ' top padding ' + (adapter.topPadding()));
-							}
-						};
-						enqueueFetch = function(direction, scrolling) {
-							if (!isLoading) {
-								isLoading = true;
-								loading(true);
-							}
-							if (pending.push(direction) === 1) {
-								return fetch(scrolling);
-							}
-						};
-						insert = function(index, item) {
-							var itemScope, toBeAppended, wrapper;
-							itemScope = $scope.$new();
-							itemScope[itemName] = item;
-							toBeAppended = index > first;
-							itemScope.$index = index;
-							if (toBeAppended) {
-								itemScope.$index--;
-							}
-							wrapper = {
-								scope: itemScope
-							};
-							linker(itemScope, function(clone) {
-								wrapper.element = clone;
-								if (toBeAppended) {
-									if (index === next) {
-										adapter.append(clone);
-										return buffer.push(wrapper);
-									} else {
-										buffer[index - first].element.after(clone);
-										return buffer.splice(index - first + 1, 0, wrapper);
-									}
-								} else {
-									adapter.prepend(clone);
-									return buffer.unshift(wrapper);
-								}
-							});
-							return {
-								appended: toBeAppended,
-								wrapper: wrapper
-							};
-						};
-						adjustRowHeight = function(appended, wrapper) {
-							var newHeight;
-							if (appended) {
-								return adapter.bottomPadding(Math.max(0, adapter.bottomPadding() - wrapper.element.outerHeight(true)));
-							} else {
-								newHeight = adapter.topPadding() - wrapper.element.outerHeight(true);
-								if (newHeight >= 0) {
-									return adapter.topPadding(newHeight);
-								} else {
-									return viewport.scrollTop(viewport.scrollTop() + wrapper.element.outerHeight(true));
-								}
-							}
-						};
-						adjustBuffer = function(scrolling, newItems, finalize) {
-							var doAdjustment;
-							doAdjustment = function() {
-								console.log('top {actual=' + (adapter.topDataPos()) + ' visible from=' + (topVisiblePos()) + ' bottom {visible through=' + (bottomVisiblePos()) + ' actual=' + (adapter.bottomDataPos()) + '}');
-								if (shouldLoadBottom()) {
-									enqueueFetch(true, scrolling);
-								} else {
-									if (shouldLoadTop()) {
-										enqueueFetch(false, scrolling);
-									}
-								}
-								if (finalize) {
-									return finalize();
-								}
-							};
-							if (newItems) {
-								return $timeout(function() {
-									var row, _i, _len;
-									for (_i = 0, _len = newItems.length; _i < _len; _i++) {
-										row = newItems[_i];
-										adjustRowHeight(row.appended, row.wrapper);
-									}
-									return doAdjustment();
-								});
-							} else {
-								return doAdjustment();
-							}
-						};
-						finalize = function(scrolling, newItems) {
-							return adjustBuffer(scrolling, newItems, function() {
-								pending.shift();
-								if (pending.length === 0) {
-									isLoading = false;
-									return loading(false);
-								} else {
-									return fetch(scrolling);
-								}
-							});
-						};
-						fetch = function(scrolling) {
-							var direction;
-							direction = pending[0];
-							if (direction) {
-								if (buffer.length && !shouldLoadBottom()) {
-									return finalize(scrolling);
-								} else {
-									return datasource.get(next, bufferSize, function(result) {
-										var item, newItems, _i, _len;
-										newItems = [];
-										if (result.length === 0) {
-											eof = true;
-											adapter.bottomPadding(0);
-											console.log('appended: requested ' + bufferSize + ' records starting from ' + next + ' recieved: eof');
-										} else {
-											clipTop();
-											for (_i = 0, _len = result.length; _i < _len; _i++) {
-												item = result[_i];
-												newItems.push(insert(++next, item));
-											}
-											console.log('appended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next);
-										}
-										return finalize(scrolling, newItems);
-									});
-								}
-							} else {
-								if (buffer.length && !shouldLoadTop()) {
-									return finalize(scrolling);
-								} else {
-									return datasource.get(first - bufferSize, bufferSize, function(result) {
-										var i, newItems, _i, _ref;
-										newItems = [];
-										if (result.length === 0) {
-											bof = true;
-											adapter.topPadding(0);
-											console.log('prepended: requested ' + bufferSize + ' records starting from ' + (first - bufferSize) + ' recieved: bof');
-										} else {
-											clipBottom();
-											for (i = _i = _ref = result.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
-												newItems.unshift(insert(--first, result[i]));
-											}
-											console.log('prepended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next);
-										}
-										return finalize(scrolling, newItems);
-									});
-								}
-							}
-						};
-						resizeHandler = function() {
-							if (!$rootScope.$$phase && !isLoading) {
-								adjustBuffer(false);
-								return $scope.$apply();
-							}
-						};
-						viewport.bind('resize', resizeHandler);
-						scrollHandler = function() {
-							if (!$rootScope.$$phase && !isLoading) {
-								adjustBuffer(true);
-								return $scope.$apply();
-							}
-						};
-						viewport.bind('scroll', scrollHandler);
-						$scope.$watch(datasource.revision, function() {
-							return reload();
-						});
-						if (datasource.scope) {
-							eventListener = datasource.scope.$new();
-						} else {
-							eventListener = $scope.$new();
-						}
-						$scope.$on('$destroy', function() {
-							eventListener.$destroy();
-							viewport.unbind('resize', resizeHandler);
-							return viewport.unbind('scroll', scrollHandler);
-						});
-						eventListener.$on('update.items', function(event, locator, newItem) {
-							var wrapper, _fn, _i, _len, _ref;
-							if (angular.isFunction(locator)) {
-								_fn = function(wrapper) {
-									return locator(wrapper.scope);
-								};
-								for (_i = 0, _len = buffer.length; _i < _len; _i++) {
-									wrapper = buffer[_i];
-									_fn(wrapper);
-								}
-							} else {
-								if ((0 <= (_ref = locator - first - 1) && _ref < buffer.length)) {
-									buffer[locator - first - 1].scope[itemName] = newItem;
-								}
-							}
-							return null;
-						});
-						eventListener.$on('delete.items', function(event, locator) {
-							var i, item, temp, wrapper, _fn, _i, _j, _k, _len, _len1, _len2, _ref;
-							if (angular.isFunction(locator)) {
-								temp = [];
-								for (_i = 0, _len = buffer.length; _i < _len; _i++) {
-									item = buffer[_i];
-									temp.unshift(item);
-								}
-								_fn = function(wrapper) {
-									if (locator(wrapper.scope)) {
-										removeFromBuffer(temp.length - 1 - i, temp.length - i);
-										return next--;
-									}
-								};
-								for (i = _j = 0, _len1 = temp.length; _j < _len1; i = ++_j) {
-									wrapper = temp[i];
-									_fn(wrapper);
-								}
-							} else {
-								if ((0 <= (_ref = locator - first - 1) && _ref < buffer.length)) {
-									removeFromBuffer(locator - first - 1, locator - first);
-									next--;
-								}
-							}
-							for (i = _k = 0, _len2 = buffer.length; _k < _len2; i = ++_k) {
-								item = buffer[i];
-								item.scope.$index = first + i;
-							}
-							return adjustBuffer(false);
-						});
-						return eventListener.$on('insert.item', function(event, locator, item) {
-							var i, inserted, temp, wrapper, _fn, _i, _j, _k, _len, _len1, _len2, _ref;
-							inserted = [];
-							if (angular.isFunction(locator)) {
-								temp = [];
-								for (_i = 0, _len = buffer.length; _i < _len; _i++) {
-									item = buffer[_i];
-									temp.unshift(item);
-								}
-								_fn = function(wrapper) {
-									var j, newItems, _k, _len2, _results;
-									if (newItems = locator(wrapper.scope)) {
-										insert = function(index, newItem) {
-											insert(index, newItem);
-											return next++;
-										};
-										if (angular.isArray(newItems)) {
-											_results = [];
-											for (j = _k = 0, _len2 = newItems.length; _k < _len2; j = ++_k) {
-												item = newItems[j];
-												_results.push(inserted.push(insert(i + j, item)));
-											}
-											return _results;
-										} else {
-											return inserted.push(insert(i, newItems));
-										}
-									}
-								};
-								for (i = _j = 0, _len1 = temp.length; _j < _len1; i = ++_j) {
-									wrapper = temp[i];
-									_fn(wrapper);
-								}
-							} else {
-								if ((0 <= (_ref = locator - first - 1) && _ref < buffer.length)) {
-									inserted.push(insert(locator, item));
-									next++;
-								}
-							}
-							for (i = _k = 0, _len2 = buffer.length; _k < _len2; i = ++_k) {
-								item = buffer[i];
-								item.scope.$index = first + i;
-							}
-							return adjustBuffer(false, inserted);
-						});
-					};
-				}
-			};
-		}
-	]);
-
-'use strict';
-
-/**
- * Adds a 'ui-scrollfix' class to the element when the page scrolls past it's position.
- * @param [offset] {int} optional Y-offset to override the detected offset.
- *   Takes 300 (absolute) or -300 or +300 (relative to detected)
- */
-angular.module('ui.scrollfix',[]).directive('uiScrollfix', ['$window', function ($window) {
-  return {
-    require: '^?uiScrollfixTarget',
-    link: function (scope, elm, attrs, uiScrollfixTarget) {
-      var top = elm[0].offsetTop,
-          $target = uiScrollfixTarget && uiScrollfixTarget.$element || angular.element($window);
-
-      if (!attrs.uiScrollfix) {
-        attrs.uiScrollfix = top;
-      } else if (typeof(attrs.uiScrollfix) === 'string') {
-        // charAt is generally faster than indexOf: http://jsperf.com/indexof-vs-charat
-        if (attrs.uiScrollfix.charAt(0) === '-') {
-          attrs.uiScrollfix = top - parseFloat(attrs.uiScrollfix.substr(1));
-        } else if (attrs.uiScrollfix.charAt(0) === '+') {
-          attrs.uiScrollfix = top + parseFloat(attrs.uiScrollfix.substr(1));
-        }
-      }
-
-      function onScroll() {
-        // if pageYOffset is defined use it, otherwise use other crap for IE
-        var offset;
-        if (angular.isDefined($window.pageYOffset)) {
-          offset = $window.pageYOffset;
-        } else {
-          var iebody = (document.compatMode && document.compatMode !== 'BackCompat') ? document.documentElement : document.body;
-          offset = iebody.scrollTop;
-        }
-        if (!elm.hasClass('ui-scrollfix') && offset > attrs.uiScrollfix) {
-          elm.addClass('ui-scrollfix');
-        } else if (elm.hasClass('ui-scrollfix') && offset < attrs.uiScrollfix) {
-          elm.removeClass('ui-scrollfix');
-        }
-      }
-
-      $target.on('scroll', onScroll);
-
-      // Unbind scroll event handler when directive is removed
-      scope.$on('$destroy', function() {
-        $target.off('scroll', onScroll);
-      });
-    }
-  };
-}]).directive('uiScrollfixTarget', [function () {
-  return {
-    controller: ['$element', function($element) {
-      this.$element = $element;
-    }]
-  };
-}]);
-
-'use strict';
-
-/**
- * uiShow Directive
- *
- * Adds a 'ui-show' class to the element instead of display:block
- * Created to allow tighter control  of CSS without bulkier directives
- *
- * @param expression {boolean} evaluated expression to determine if the class should be added
- */
-angular.module('ui.showhide',[])
-.directive('uiShow', [function () {
-  return function (scope, elm, attrs) {
-    scope.$watch(attrs.uiShow, function (newVal) {
-      if (newVal) {
-        elm.addClass('ui-show');
-      } else {
-        elm.removeClass('ui-show');
-      }
-    });
-  };
-}])
-
-/**
- * uiHide Directive
- *
- * Adds a 'ui-hide' class to the element instead of display:block
- * Created to allow tighter control  of CSS without bulkier directives
- *
- * @param expression {boolean} evaluated expression to determine if the class should be added
- */
-.directive('uiHide', [function () {
-  return function (scope, elm, attrs) {
-    scope.$watch(attrs.uiHide, function (newVal) {
-      if (newVal) {
-        elm.addClass('ui-hide');
-      } else {
-        elm.removeClass('ui-hide');
-      }
-    });
-  };
-}])
-
-/**
- * uiToggle Directive
- *
- * Adds a class 'ui-show' if true, and a 'ui-hide' if false to the element instead of display:block/display:none
- * Created to allow tighter control  of CSS without bulkier directives. This also allows you to override the
- * default visibility of the element using either class.
- *
- * @param expression {boolean} evaluated expression to determine if the class should be added
- */
-.directive('uiToggle', [function () {
-  return function (scope, elm, attrs) {
-    scope.$watch(attrs.uiToggle, function (newVal) {
-      if (newVal) {
-        elm.removeClass('ui-hide').addClass('ui-show');
-      } else {
-        elm.removeClass('ui-show').addClass('ui-hide');
-      }
-    });
-  };
-}]);
-
-'use strict';
-
-/**
- * Filters out all duplicate items from an array by checking the specified key
- * @param [key] {string} the name of the attribute of each object to compare for uniqueness
- if the key is empty, the entire object will be compared
- if the key === false then no filtering will be performed
- * @return {array}
- */
-angular.module('ui.unique',[]).filter('unique', ['$parse', function ($parse) {
-
-  return function (items, filterOn) {
-
-    if (filterOn === false) {
-      return items;
-    }
-
-    if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {
-      var newItems = [],
-        get = angular.isString(filterOn) ? $parse(filterOn) : function (item) { return item; };
-
-      var extractValueToCompare = function (item) {
-        return angular.isObject(item) ? get(item) : item;
-      };
-
-      angular.forEach(items, function (item) {
-        var isDuplicate = false;
-
-        for (var i = 0; i < newItems.length; i++) {
-          if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {
-            isDuplicate = true;
-            break;
-          }
-        }
-        if (!isDuplicate) {
-          newItems.push(item);
-        }
-
-      });
-      items = newItems;
-    }
-    return items;
-  };
-}]);
-
-'use strict';
-
-/**
- * General-purpose validator for ngModel.
- * angular.js comes with several built-in validation mechanism for input fields (ngRequired, ngPattern etc.) but using
- * an arbitrary validation function requires creation of a custom formatters and / or parsers.
- * The ui-validate directive makes it easy to use any function(s) defined in scope as a validator function(s).
- * A validator function will trigger validation on both model and input changes.
- *
- * @example <input ui-validate=" 'myValidatorFunction($value)' ">
- * @example <input ui-validate="{ foo : '$value > anotherModel', bar : 'validateFoo($value)' }">
- * @example <input ui-validate="{ foo : '$value > anotherModel' }" ui-validate-watch=" 'anotherModel' ">
- * @example <input ui-validate="{ foo : '$value > anotherModel', bar : 'validateFoo($value)' }" ui-validate-watch=" { foo : 'anotherModel' } ">
- *
- * @param ui-validate {string|object literal} If strings is passed it should be a scope's function to be used as a validator.
- * If an object literal is passed a key denotes a validation error key while a value should be a validator function.
- * In both cases validator function should take a value to validate as its argument and should return true/false indicating a validation result.
- */
-angular.module('ui.validate',[]).directive('uiValidate', function () {
-
-  return {
-    restrict: 'A',
-    require: 'ngModel',
-    link: function (scope, elm, attrs, ctrl) {
-      var validateFn, validators = {},
-          validateExpr = scope.$eval(attrs.uiValidate);
-
-      if (!validateExpr){ return;}
-
-      if (angular.isString(validateExpr)) {
-        validateExpr = { validator: validateExpr };
-      }
-
-      angular.forEach(validateExpr, function (exprssn, key) {
-        validateFn = function (valueToValidate) {
-          var expression = scope.$eval(exprssn, { '$value' : valueToValidate });
-          if (angular.isObject(expression) && angular.isFunction(expression.then)) {
-            // expression is a promise
-            expression.then(function(){
-              ctrl.$setValidity(key, true);
-            }, function(){
-              ctrl.$setValidity(key, false);
-            });
-            return valueToValidate;
-          } else if (expression) {
-            // expression is true
-            ctrl.$setValidity(key, true);
-            return valueToValidate;
-          } else {
-            // expression is false
-            ctrl.$setValidity(key, false);
-            return valueToValidate;
-          }
-        };
-        validators[key] = validateFn;
-        ctrl.$formatters.push(validateFn);
-        ctrl.$parsers.push(validateFn);
-      });
-
-      function apply_watch(watch)
-      {
-          //string - update all validators on expression change
-          if (angular.isString(watch))
-          {
-              scope.$watch(watch, function(){
-                  angular.forEach(validators, function(validatorFn){
-                      validatorFn(ctrl.$modelValue);
-                  });
-              });
-              return;
-          }
-
-          //array - update all validators on change of any expression
-          if (angular.isArray(watch))
-          {
-              angular.forEach(watch, function(expression){
-                  scope.$watch(expression, function()
-                  {
-                      angular.forEach(validators, function(validatorFn){
-                          validatorFn(ctrl.$modelValue);
-                      });
-                  });
-              });
-              return;
-          }
-
-          //object - update appropriate validator
-          if (angular.isObject(watch))
-          {
-              angular.forEach(watch, function(expression, validatorKey)
-              {
-                  //value is string - look after one expression
-                  if (angular.isString(expression))
-                  {
-                      scope.$watch(expression, function(){
-                          validators[validatorKey](ctrl.$modelValue);
-                      });
-                  }
-
-                  //value is array - look after all expressions in array
-                  if (angular.isArray(expression))
-                  {
-                      angular.forEach(expression, function(intExpression)
-                      {
-                          scope.$watch(intExpression, function(){
-                              validators[validatorKey](ctrl.$modelValue);
-                          });
-                      });
-                  }
-              });
-          }
-      }
-      // Support for ui-validate-watch
-      if (attrs.uiValidateWatch){
-          apply_watch( scope.$eval(attrs.uiValidateWatch) );
-      }
-    }
-  };
-});
-
-angular.module('ui.utils',  [
-  'ui.event',
-  'ui.format',
-  'ui.highlight',
-  'ui.include',
-  'ui.indeterminate',
-  'ui.inflector',
-  'ui.jq',
-  'ui.keypress',
-  'ui.mask',
-  'ui.reset',
-  'ui.route',
-  'ui.scrollfix',
-  'ui.scroll',
-  'ui.scroll.jqlite',
-  'ui.showhide',
-  'ui.unique',
-  'ui.validate'
-]);
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.min.js b/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.min.js
deleted file mode 100644
index dd7f2af..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils-0.1.1/ui-utils.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
- * @version v0.1.1 - 2014-02-05
- * @link http://angular-ui.github.com
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-"use strict";angular.module("ui.alias",[]).config(["$compileProvider","uiAliasConfig",function(a,b){b=b||{},angular.forEach(b,function(b,c){angular.isString(b)&&(b={replace:!0,template:b}),a.directive(c,function(){return b})})}]),angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join('<span class="ui-match">'+b+"</span>"):a.replace(new RegExp(b,"gi"),'<span class="ui-match">$&</span>')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("<div/>").html(a).find(p):angular.element("<div/>").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length<i.length||t&&h.length===i.length-t,D=d>=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(!a)return 0;if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(!a)return 0;if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return a?void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element('<a class="ui-reset" />'),c.wrap('<span class="ui-resetwrap" />').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){e.$setViewValue(d.uiReset?a.$eval(d.uiReset):b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){i(c,a.path().indexOf(b)>-1)})()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))})()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scroll.jqlite",["ui.scroll"]).service("jqLiteExtras",["$log","$window",function(a,b){return{registerFor:function(a){var c,d,e,f,g,h,i;return d=angular.element.prototype.css,a.prototype.css=function(a,b){var c,e;return e=this,c=e[0],c&&3!==c.nodeType&&8!==c.nodeType&&c.style?d.call(e,a,b):void 0},h=function(a){return a&&a.document&&a.location&&a.alert&&a.setInterval},i=function(a,b,c){var d,e,f,g,i;return d=a[0],i={top:["scrollTop","pageYOffset","scrollLeft"],left:["scrollLeft","pageXOffset","scrollTop"]}[b],e=i[0],g=i[1],f=i[2],h(d)?angular.isDefined(c)?d.scrollTo(a[f].call(a),c):g in d?d[g]:d.document.documentElement[e]:angular.isDefined(c)?d[e]=c:d[e]},b.getComputedStyle?(f=function(a){return b.getComputedStyle(a,null)},c=function(a,b){return parseFloat(b)}):(f=function(a){return a.currentStyle},c=function(a,b){var c,d,e,f,g,h,i;return c=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,f=new RegExp("^("+c+")(?!px)[a-z%]+$","i"),f.test(b)?(i=a.style,d=i.left,g=a.runtimeStyle,h=g&&g.left,g&&(g.left=i.left),i.left=b,e=i.pixelLeft,i.left=d,h&&(g.left=h),e):parseFloat(b)}),e=function(a,b){var d,e,g,i,j,k,l,m,n,o,p,q,r;return h(a)?(d=document.documentElement[{height:"clientHeight",width:"clientWidth"}[b]],{base:d,padding:0,border:0,margin:0}):(r={width:[a.offsetWidth,"Left","Right"],height:[a.offsetHeight,"Top","Bottom"]}[b],d=r[0],l=r[1],m=r[2],k=f(a),p=c(a,k["padding"+l])||0,q=c(a,k["padding"+m])||0,e=c(a,k["border"+l+"Width"])||0,g=c(a,k["border"+m+"Width"])||0,i=k["margin"+l],j=k["margin"+m],n=c(a,i)||0,o=c(a,j)||0,{base:d,padding:p+q,border:e+g,margin:n+o})},g=function(a,b,c){var d,g,h;return g=e(a,b),g.base>0?{base:g.base-g.padding-g.border,outer:g.base,outerfull:g.base+g.margin}[c]:(d=f(a),h=d[b],(0>h||null===h)&&(h=a.style[b]||0),h=parseFloat(h)||0,{base:h-g.padding-g.border,outer:h,outerfull:h+g.padding+g.border+g.margin}[c])},angular.forEach({before:function(a){var b,c,d,e,f,g,h;if(f=this,c=f[0],e=f.parent(),b=e.contents(),b[0]===c)return e.prepend(a);for(d=g=1,h=b.length-1;h>=1?h>=g:g>=h;d=h>=1?++g:--g)if(b[d]===c)return void angular.element(b[d-1]).after(a);throw new Error("invalid DOM structure "+c.outerHTML)},height:function(a){var b;return b=this,angular.isDefined(a)?(angular.isNumber(a)&&(a+="px"),d.call(b,"height",a)):g(this[0],"height","base")},outerHeight:function(a){return g(this[0],"height",a?"outerfull":"outer")},offset:function(a){var b,c,d,e,f,g;return f=this,arguments.length?void 0===a?f:a:(b={top:0,left:0},e=f[0],(c=e&&e.ownerDocument)?(d=c.documentElement,e.getBoundingClientRect&&(b=e.getBoundingClientRect()),g=c.defaultView||c.parentWindow,{top:b.top+(g.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(g.pageXOffset||d.scrollLeft)-(d.clientLeft||0)}):void 0)},scrollTop:function(a){return i(this,"top",a)},scrollLeft:function(a){return i(this,"left",a)}},function(b,c){return a.prototype[c]?void 0:a.prototype[c]=b})}}}]).run(["$log","$window","jqLiteExtras",function(a,b,c){return b.jQuery?void 0:c.registerFor(angular.element)}]),angular.module("ui.scroll",[]).directive("ngScrollViewport",["$log",function(){return{controller:["$scope","$element",function(a,b){return b}]}}]).directive("ngScroll",["$log","$injector","$rootScope","$timeout",function(a,b,c,d){return{require:["?^ngScrollViewport"],transclude:"element",priority:1e3,terminal:!0,compile:function(e,f,g){return function(f,h,i,j){var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;if(H=i.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/),!H)throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "'+i.ngScroll+'"');if(F=H[1],v=H[2],D=function(a){return angular.isObject(a)&&a.get&&angular.isFunction(a.get)},u=f[v],!D(u)&&(u=b.get(v),!D(u)))throw new Error(v+" is not a valid datasource");return r=Math.max(3,+i.bufferSize||10),q=function(){return T.height()*Math.max(.1,+i.padding||.1)},O=function(a){return a[0].scrollHeight||a[0].document.documentElement.scrollHeight},k=null,g(R=f.$new(),function(a){var b,c,d,f,g,h;if(f=a[0].localName,"dl"===f)throw new Error("ng-scroll directive does not support <"+a[0].localName+"> as a repeating tag: "+a[0].outerHTML);return"li"!==f&&"tr"!==f&&(f="div"),h=j[0]||angular.element(window),h.css({"overflow-y":"auto",display:"block"}),d=function(a){var b,c,d;switch(a){case"tr":return d=angular.element("<table><tr><td><div></div></td></tr></table>"),b=d.find("div"),c=d.find("tr"),c.paddingHeight=function(){return b.height.apply(b,arguments)},c;default:return c=angular.element("<"+a+"></"+a+">"),c.paddingHeight=c.height,c}},c=function(a,b,c){return b[{top:"before",bottom:"after"}[c]](a),{paddingHeight:function(){return a.paddingHeight.apply(a,arguments)},insert:function(b){return a[{top:"after",bottom:"before"}[c]](b)}}},g=c(d(f),e,"top"),b=c(d(f),e,"bottom"),R.$destroy(),k={viewport:h,topPadding:g.paddingHeight,bottomPadding:b.paddingHeight,append:b.insert,prepend:g.insert,bottomDataPos:function(){return O(h)-b.paddingHeight()},topDataPos:function(){return g.paddingHeight()}}}),T=k.viewport,B=1,I=1,p=[],J=[],x=!1,n=!1,G=u.loading||function(){},E=!1,L=function(a,b){var c,d;for(c=d=a;b>=a?b>d:d>b;c=b>=a?++d:--d)p[c].scope.$destroy(),p[c].element.remove();return p.splice(a,b-a)},K=function(){return B=1,I=1,L(0,p.length),k.topPadding(0),k.bottomPadding(0),J=[],x=!1,n=!1,l(!1)},o=function(){return T.scrollTop()+T.height()},S=function(){return T.scrollTop()},P=function(){return!x&&k.bottomDataPos()<o()+q()},s=function(){var b,c,d,e,f,g;for(b=0,e=0,c=f=g=p.length-1;(0>=g?0>=f:f>=0)&&(d=p[c].element.outerHeight(!0),k.bottomDataPos()-b-d>o()+q());c=0>=g?++f:--f)b+=d,e++,x=!1;return e>0?(k.bottomPadding(k.bottomPadding()+b),L(p.length-e,p.length),I-=e,a.log("clipped off bottom "+e+" bottom padding "+k.bottomPadding())):void 0},Q=function(){return!n&&k.topDataPos()>S()-q()},t=function(){var b,c,d,e,f,g;for(e=0,d=0,f=0,g=p.length;g>f&&(b=p[f],c=b.element.outerHeight(!0),k.topDataPos()+e+c<S()-q());f++)e+=c,d++,n=!1;return d>0?(k.topPadding(k.topPadding()+e),L(0,d),B+=d,a.log("clipped off top "+d+" top padding "+k.topPadding())):void 0},w=function(a,b){return E||(E=!0,G(!0)),1===J.push(a)?z(b):void 0},C=function(a,b){var c,d,e;return c=f.$new(),c[F]=b,d=a>B,c.$index=a,d&&c.$index--,e={scope:c},g(c,function(b){return e.element=b,d?a===I?(k.append(b),p.push(e)):(p[a-B].element.after(b),p.splice(a-B+1,0,e)):(k.prepend(b),p.unshift(e))}),{appended:d,wrapper:e}},m=function(a,b){var c;return a?k.bottomPadding(Math.max(0,k.bottomPadding()-b.element.outerHeight(!0))):(c=k.topPadding()-b.element.outerHeight(!0),c>=0?k.topPadding(c):T.scrollTop(T.scrollTop()+b.element.outerHeight(!0)))},l=function(b,c,e){var f;return f=function(){return a.log("top {actual="+k.topDataPos()+" visible from="+S()+" bottom {visible through="+o()+" actual="+k.bottomDataPos()+"}"),P()?w(!0,b):Q()&&w(!1,b),e?e():void 0},c?d(function(){var a,b,d;for(b=0,d=c.length;d>b;b++)a=c[b],m(a.appended,a.wrapper);return f()}):f()},A=function(a,b){return l(a,b,function(){return J.shift(),0===J.length?(E=!1,G(!1)):z(a)})},z=function(b){var c;return c=J[0],c?p.length&&!P()?A(b):u.get(I,r,function(c){var d,e,f,g;if(e=[],0===c.length)x=!0,k.bottomPadding(0),a.log("appended: requested "+r+" records starting from "+I+" recieved: eof");else{for(t(),f=0,g=c.length;g>f;f++)d=c[f],e.push(C(++I,d));a.log("appended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)}):p.length&&!Q()?A(b):u.get(B-r,r,function(c){var d,e,f,g;if(e=[],0===c.length)n=!0,k.topPadding(0),a.log("prepended: requested "+r+" records starting from "+(B-r)+" recieved: bof");else{for(s(),d=f=g=c.length-1;0>=g?0>=f:f>=0;d=0>=g?++f:--f)e.unshift(C(--B,c[d]));a.log("prepended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)})},M=function(){return c.$$phase||E?void 0:(l(!1),f.$apply())},T.bind("resize",M),N=function(){return c.$$phase||E?void 0:(l(!0),f.$apply())},T.bind("scroll",N),f.$watch(u.revision,function(){return K()}),y=u.scope?u.scope.$new():f.$new(),f.$on("$destroy",function(){return y.$destroy(),T.unbind("resize",M),T.unbind("scroll",N)}),y.$on("update.items",function(a,b,c){var d,e,f,g,h;if(angular.isFunction(b))for(e=function(a){return b(a.scope)},f=0,g=p.length;g>f;f++)d=p[f],e(d);else 0<=(h=b-B-1)&&h<p.length&&(p[b-B-1].scope[F]=c);return null}),y.$on("delete.items",function(a,b){var c,d,e,f,g,h,i,j,k,m,n,o;if(angular.isFunction(b)){for(e=[],h=0,k=p.length;k>h;h++)d=p[h],e.unshift(d);for(g=function(a){return b(a.scope)?(L(e.length-1-c,e.length-c),I--):void 0},c=i=0,m=e.length;m>i;c=++i)f=e[c],g(f)}else 0<=(o=b-B-1)&&o<p.length&&(L(b-B-1,b-B),I--);for(c=j=0,n=p.length;n>j;c=++j)d=p[c],d.scope.$index=B+c;return l(!1)}),y.$on("insert.item",function(a,b,c){var d,e,f,g,h,i,j,k,m,n,o,q;if(e=[],angular.isFunction(b)){for(f=[],i=0,m=p.length;m>i;i++)c=p[i],f.unshift(c);for(h=function(a){var f,g,h,i,j;if(g=b(a.scope)){if(C=function(a,b){return C(a,b),I++},angular.isArray(g)){for(j=[],f=h=0,i=g.length;i>h;f=++h)c=g[f],j.push(e.push(C(d+f,c)));return j}return e.push(C(d,g))}},d=j=0,n=f.length;n>j;d=++j)g=f[d],h(g)}else 0<=(q=b-B-1)&&q<p.length&&(e.push(C(b,c)),I++);for(d=k=0,o=p.length;o>k;d=++k)c=p[d],c.scope.$index=B+d;return l(!1,e)})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b<d.uiScrollfix&&c.removeClass("ui-scrollfix")}var g=c[0].offsetTop,h=e&&e.$element||angular.element(a);d.uiScrollfix?"string"==typeof d.uiScrollfix&&("-"===d.uiScrollfix.charAt(0)?d.uiScrollfix=g-parseFloat(d.uiScrollfix.substr(1)):"+"===d.uiScrollfix.charAt(0)&&(d.uiScrollfix=g+parseFloat(d.uiScrollfix.substr(1)))):d.uiScrollfix=g,h.on("scroll",f),b.$on("$destroy",function(){h.off("scroll",f)})}}}]).directive("uiScrollfixTarget",[function(){return{controller:["$element",function(a){this.$element=a}]}}]),angular.module("ui.showhide",[]).directive("uiShow",[function(){return function(a,b,c){a.$watch(c.uiShow,function(a){a?b.addClass("ui-show"):b.removeClass("ui-show")})}}]).directive("uiHide",[function(){return function(a,b,c){a.$watch(c.uiHide,function(a){a?b.addClass("ui-hide"):b.removeClass("ui-hide")})}}]).directive("uiToggle",[function(){return function(a,b,c){a.$watch(c.uiToggle,function(a){a?b.removeClass("ui-hide").addClass("ui-show"):b.removeClass("ui-show").addClass("ui-hide")})}}]),angular.module("ui.unique",[]).filter("unique",["$parse",function(a){return function(b,c){if(c===!1)return b;if((c||angular.isUndefined(c))&&angular.isArray(b)){var d=[],e=angular.isString(c)?a(c):function(a){return a},f=function(a){return angular.isObject(a)?e(a):a};angular.forEach(b,function(a){for(var b=!1,c=0;c<d.length;c++)if(angular.equals(f(d[c]),f(a))){b=!0;break}b||d.push(a)}),b=d}return b}}]),angular.module("ui.validate",[]).directive("uiValidate",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){function e(b){return angular.isString(b)?void a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})}):angular.isArray(b)?void angular.forEach(b,function(b){a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})})}):void(angular.isObject(b)&&angular.forEach(b,function(b,c){angular.isString(b)&&a.$watch(b,function(){g[c](d.$modelValue)}),angular.isArray(b)&&angular.forEach(b,function(b){a.$watch(b,function(){g[c](d.$modelValue)})})}))}var f,g={},h=a.$eval(c.uiValidate);h&&(angular.isString(h)&&(h={validator:h}),angular.forEach(h,function(b,c){f=function(e){var f=a.$eval(b,{$value:e});return angular.isObject(f)&&angular.isFunction(f.then)?(f.then(function(){d.$setValidity(c,!0)},function(){d.$setValidity(c,!1)}),e):f?(d.$setValidity(c,!0),e):(d.$setValidity(c,!1),e)},g[c]=f,d.$formatters.push(f),d.$parsers.push(f)}),c.uiValidateWatch&&e(a.$eval(c.uiValidateWatch)))}}}),angular.module("ui.utils",["ui.event","ui.format","ui.highlight","ui.include","ui.indeterminate","ui.inflector","ui.jq","ui.keypress","ui.mask","ui.reset","ui.route","ui.scrollfix","ui.scroll","ui.scroll.jqlite","ui.showhide","ui.unique","ui.validate"]);
\ No newline at end of file
diff --git a/dashboard/lib/assets/angular/extensions/ui-utils.min.js b/dashboard/lib/assets/angular/extensions/ui-utils.min.js
deleted file mode 100644
index dd7f2af..0000000
--- a/dashboard/lib/assets/angular/extensions/ui-utils.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
- * @version v0.1.1 - 2014-02-05
- * @link http://angular-ui.github.com
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-"use strict";angular.module("ui.alias",[]).config(["$compileProvider","uiAliasConfig",function(a,b){b=b||{},angular.forEach(b,function(b,c){angular.isString(b)&&(b={replace:!0,template:b}),a.directive(c,function(){return b})})}]),angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join('<span class="ui-match">'+b+"</span>"):a.replace(new RegExp(b,"gi"),'<span class="ui-match">$&</span>')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("<div/>").html(a).find(p):angular.element("<div/>").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length<i.length||t&&h.length===i.length-t,D=d>=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(!a)return 0;if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(!a)return 0;if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return a?void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element('<a class="ui-reset" />'),c.wrap('<span class="ui-resetwrap" />').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){e.$setViewValue(d.uiReset?a.$eval(d.uiReset):b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){i(c,a.path().indexOf(b)>-1)})()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))})()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scroll.jqlite",["ui.scroll"]).service("jqLiteExtras",["$log","$window",function(a,b){return{registerFor:function(a){var c,d,e,f,g,h,i;return d=angular.element.prototype.css,a.prototype.css=function(a,b){var c,e;return e=this,c=e[0],c&&3!==c.nodeType&&8!==c.nodeType&&c.style?d.call(e,a,b):void 0},h=function(a){return a&&a.document&&a.location&&a.alert&&a.setInterval},i=function(a,b,c){var d,e,f,g,i;return d=a[0],i={top:["scrollTop","pageYOffset","scrollLeft"],left:["scrollLeft","pageXOffset","scrollTop"]}[b],e=i[0],g=i[1],f=i[2],h(d)?angular.isDefined(c)?d.scrollTo(a[f].call(a),c):g in d?d[g]:d.document.documentElement[e]:angular.isDefined(c)?d[e]=c:d[e]},b.getComputedStyle?(f=function(a){return b.getComputedStyle(a,null)},c=function(a,b){return parseFloat(b)}):(f=function(a){return a.currentStyle},c=function(a,b){var c,d,e,f,g,h,i;return c=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,f=new RegExp("^("+c+")(?!px)[a-z%]+$","i"),f.test(b)?(i=a.style,d=i.left,g=a.runtimeStyle,h=g&&g.left,g&&(g.left=i.left),i.left=b,e=i.pixelLeft,i.left=d,h&&(g.left=h),e):parseFloat(b)}),e=function(a,b){var d,e,g,i,j,k,l,m,n,o,p,q,r;return h(a)?(d=document.documentElement[{height:"clientHeight",width:"clientWidth"}[b]],{base:d,padding:0,border:0,margin:0}):(r={width:[a.offsetWidth,"Left","Right"],height:[a.offsetHeight,"Top","Bottom"]}[b],d=r[0],l=r[1],m=r[2],k=f(a),p=c(a,k["padding"+l])||0,q=c(a,k["padding"+m])||0,e=c(a,k["border"+l+"Width"])||0,g=c(a,k["border"+m+"Width"])||0,i=k["margin"+l],j=k["margin"+m],n=c(a,i)||0,o=c(a,j)||0,{base:d,padding:p+q,border:e+g,margin:n+o})},g=function(a,b,c){var d,g,h;return g=e(a,b),g.base>0?{base:g.base-g.padding-g.border,outer:g.base,outerfull:g.base+g.margin}[c]:(d=f(a),h=d[b],(0>h||null===h)&&(h=a.style[b]||0),h=parseFloat(h)||0,{base:h-g.padding-g.border,outer:h,outerfull:h+g.padding+g.border+g.margin}[c])},angular.forEach({before:function(a){var b,c,d,e,f,g,h;if(f=this,c=f[0],e=f.parent(),b=e.contents(),b[0]===c)return e.prepend(a);for(d=g=1,h=b.length-1;h>=1?h>=g:g>=h;d=h>=1?++g:--g)if(b[d]===c)return void angular.element(b[d-1]).after(a);throw new Error("invalid DOM structure "+c.outerHTML)},height:function(a){var b;return b=this,angular.isDefined(a)?(angular.isNumber(a)&&(a+="px"),d.call(b,"height",a)):g(this[0],"height","base")},outerHeight:function(a){return g(this[0],"height",a?"outerfull":"outer")},offset:function(a){var b,c,d,e,f,g;return f=this,arguments.length?void 0===a?f:a:(b={top:0,left:0},e=f[0],(c=e&&e.ownerDocument)?(d=c.documentElement,e.getBoundingClientRect&&(b=e.getBoundingClientRect()),g=c.defaultView||c.parentWindow,{top:b.top+(g.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(g.pageXOffset||d.scrollLeft)-(d.clientLeft||0)}):void 0)},scrollTop:function(a){return i(this,"top",a)},scrollLeft:function(a){return i(this,"left",a)}},function(b,c){return a.prototype[c]?void 0:a.prototype[c]=b})}}}]).run(["$log","$window","jqLiteExtras",function(a,b,c){return b.jQuery?void 0:c.registerFor(angular.element)}]),angular.module("ui.scroll",[]).directive("ngScrollViewport",["$log",function(){return{controller:["$scope","$element",function(a,b){return b}]}}]).directive("ngScroll",["$log","$injector","$rootScope","$timeout",function(a,b,c,d){return{require:["?^ngScrollViewport"],transclude:"element",priority:1e3,terminal:!0,compile:function(e,f,g){return function(f,h,i,j){var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;if(H=i.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/),!H)throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "'+i.ngScroll+'"');if(F=H[1],v=H[2],D=function(a){return angular.isObject(a)&&a.get&&angular.isFunction(a.get)},u=f[v],!D(u)&&(u=b.get(v),!D(u)))throw new Error(v+" is not a valid datasource");return r=Math.max(3,+i.bufferSize||10),q=function(){return T.height()*Math.max(.1,+i.padding||.1)},O=function(a){return a[0].scrollHeight||a[0].document.documentElement.scrollHeight},k=null,g(R=f.$new(),function(a){var b,c,d,f,g,h;if(f=a[0].localName,"dl"===f)throw new Error("ng-scroll directive does not support <"+a[0].localName+"> as a repeating tag: "+a[0].outerHTML);return"li"!==f&&"tr"!==f&&(f="div"),h=j[0]||angular.element(window),h.css({"overflow-y":"auto",display:"block"}),d=function(a){var b,c,d;switch(a){case"tr":return d=angular.element("<table><tr><td><div></div></td></tr></table>"),b=d.find("div"),c=d.find("tr"),c.paddingHeight=function(){return b.height.apply(b,arguments)},c;default:return c=angular.element("<"+a+"></"+a+">"),c.paddingHeight=c.height,c}},c=function(a,b,c){return b[{top:"before",bottom:"after"}[c]](a),{paddingHeight:function(){return a.paddingHeight.apply(a,arguments)},insert:function(b){return a[{top:"after",bottom:"before"}[c]](b)}}},g=c(d(f),e,"top"),b=c(d(f),e,"bottom"),R.$destroy(),k={viewport:h,topPadding:g.paddingHeight,bottomPadding:b.paddingHeight,append:b.insert,prepend:g.insert,bottomDataPos:function(){return O(h)-b.paddingHeight()},topDataPos:function(){return g.paddingHeight()}}}),T=k.viewport,B=1,I=1,p=[],J=[],x=!1,n=!1,G=u.loading||function(){},E=!1,L=function(a,b){var c,d;for(c=d=a;b>=a?b>d:d>b;c=b>=a?++d:--d)p[c].scope.$destroy(),p[c].element.remove();return p.splice(a,b-a)},K=function(){return B=1,I=1,L(0,p.length),k.topPadding(0),k.bottomPadding(0),J=[],x=!1,n=!1,l(!1)},o=function(){return T.scrollTop()+T.height()},S=function(){return T.scrollTop()},P=function(){return!x&&k.bottomDataPos()<o()+q()},s=function(){var b,c,d,e,f,g;for(b=0,e=0,c=f=g=p.length-1;(0>=g?0>=f:f>=0)&&(d=p[c].element.outerHeight(!0),k.bottomDataPos()-b-d>o()+q());c=0>=g?++f:--f)b+=d,e++,x=!1;return e>0?(k.bottomPadding(k.bottomPadding()+b),L(p.length-e,p.length),I-=e,a.log("clipped off bottom "+e+" bottom padding "+k.bottomPadding())):void 0},Q=function(){return!n&&k.topDataPos()>S()-q()},t=function(){var b,c,d,e,f,g;for(e=0,d=0,f=0,g=p.length;g>f&&(b=p[f],c=b.element.outerHeight(!0),k.topDataPos()+e+c<S()-q());f++)e+=c,d++,n=!1;return d>0?(k.topPadding(k.topPadding()+e),L(0,d),B+=d,a.log("clipped off top "+d+" top padding "+k.topPadding())):void 0},w=function(a,b){return E||(E=!0,G(!0)),1===J.push(a)?z(b):void 0},C=function(a,b){var c,d,e;return c=f.$new(),c[F]=b,d=a>B,c.$index=a,d&&c.$index--,e={scope:c},g(c,function(b){return e.element=b,d?a===I?(k.append(b),p.push(e)):(p[a-B].element.after(b),p.splice(a-B+1,0,e)):(k.prepend(b),p.unshift(e))}),{appended:d,wrapper:e}},m=function(a,b){var c;return a?k.bottomPadding(Math.max(0,k.bottomPadding()-b.element.outerHeight(!0))):(c=k.topPadding()-b.element.outerHeight(!0),c>=0?k.topPadding(c):T.scrollTop(T.scrollTop()+b.element.outerHeight(!0)))},l=function(b,c,e){var f;return f=function(){return a.log("top {actual="+k.topDataPos()+" visible from="+S()+" bottom {visible through="+o()+" actual="+k.bottomDataPos()+"}"),P()?w(!0,b):Q()&&w(!1,b),e?e():void 0},c?d(function(){var a,b,d;for(b=0,d=c.length;d>b;b++)a=c[b],m(a.appended,a.wrapper);return f()}):f()},A=function(a,b){return l(a,b,function(){return J.shift(),0===J.length?(E=!1,G(!1)):z(a)})},z=function(b){var c;return c=J[0],c?p.length&&!P()?A(b):u.get(I,r,function(c){var d,e,f,g;if(e=[],0===c.length)x=!0,k.bottomPadding(0),a.log("appended: requested "+r+" records starting from "+I+" recieved: eof");else{for(t(),f=0,g=c.length;g>f;f++)d=c[f],e.push(C(++I,d));a.log("appended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)}):p.length&&!Q()?A(b):u.get(B-r,r,function(c){var d,e,f,g;if(e=[],0===c.length)n=!0,k.topPadding(0),a.log("prepended: requested "+r+" records starting from "+(B-r)+" recieved: bof");else{for(s(),d=f=g=c.length-1;0>=g?0>=f:f>=0;d=0>=g?++f:--f)e.unshift(C(--B,c[d]));a.log("prepended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)})},M=function(){return c.$$phase||E?void 0:(l(!1),f.$apply())},T.bind("resize",M),N=function(){return c.$$phase||E?void 0:(l(!0),f.$apply())},T.bind("scroll",N),f.$watch(u.revision,function(){return K()}),y=u.scope?u.scope.$new():f.$new(),f.$on("$destroy",function(){return y.$destroy(),T.unbind("resize",M),T.unbind("scroll",N)}),y.$on("update.items",function(a,b,c){var d,e,f,g,h;if(angular.isFunction(b))for(e=function(a){return b(a.scope)},f=0,g=p.length;g>f;f++)d=p[f],e(d);else 0<=(h=b-B-1)&&h<p.length&&(p[b-B-1].scope[F]=c);return null}),y.$on("delete.items",function(a,b){var c,d,e,f,g,h,i,j,k,m,n,o;if(angular.isFunction(b)){for(e=[],h=0,k=p.length;k>h;h++)d=p[h],e.unshift(d);for(g=function(a){return b(a.scope)?(L(e.length-1-c,e.length-c),I--):void 0},c=i=0,m=e.length;m>i;c=++i)f=e[c],g(f)}else 0<=(o=b-B-1)&&o<p.length&&(L(b-B-1,b-B),I--);for(c=j=0,n=p.length;n>j;c=++j)d=p[c],d.scope.$index=B+c;return l(!1)}),y.$on("insert.item",function(a,b,c){var d,e,f,g,h,i,j,k,m,n,o,q;if(e=[],angular.isFunction(b)){for(f=[],i=0,m=p.length;m>i;i++)c=p[i],f.unshift(c);for(h=function(a){var f,g,h,i,j;if(g=b(a.scope)){if(C=function(a,b){return C(a,b),I++},angular.isArray(g)){for(j=[],f=h=0,i=g.length;i>h;f=++h)c=g[f],j.push(e.push(C(d+f,c)));return j}return e.push(C(d,g))}},d=j=0,n=f.length;n>j;d=++j)g=f[d],h(g)}else 0<=(q=b-B-1)&&q<p.length&&(e.push(C(b,c)),I++);for(d=k=0,o=p.length;o>k;d=++k)c=p[d],c.scope.$index=B+d;return l(!1,e)})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b<d.uiScrollfix&&c.removeClass("ui-scrollfix")}var g=c[0].offsetTop,h=e&&e.$element||angular.element(a);d.uiScrollfix?"string"==typeof d.uiScrollfix&&("-"===d.uiScrollfix.charAt(0)?d.uiScrollfix=g-parseFloat(d.uiScrollfix.substr(1)):"+"===d.uiScrollfix.charAt(0)&&(d.uiScrollfix=g+parseFloat(d.uiScrollfix.substr(1)))):d.uiScrollfix=g,h.on("scroll",f),b.$on("$destroy",function(){h.off("scroll",f)})}}}]).directive("uiScrollfixTarget",[function(){return{controller:["$element",function(a){this.$element=a}]}}]),angular.module("ui.showhide",[]).directive("uiShow",[function(){return function(a,b,c){a.$watch(c.uiShow,function(a){a?b.addClass("ui-show"):b.removeClass("ui-show")})}}]).directive("uiHide",[function(){return function(a,b,c){a.$watch(c.uiHide,function(a){a?b.addClass("ui-hide"):b.removeClass("ui-hide")})}}]).directive("uiToggle",[function(){return function(a,b,c){a.$watch(c.uiToggle,function(a){a?b.removeClass("ui-hide").addClass("ui-show"):b.removeClass("ui-show").addClass("ui-hide")})}}]),angular.module("ui.unique",[]).filter("unique",["$parse",function(a){return function(b,c){if(c===!1)return b;if((c||angular.isUndefined(c))&&angular.isArray(b)){var d=[],e=angular.isString(c)?a(c):function(a){return a},f=function(a){return angular.isObject(a)?e(a):a};angular.forEach(b,function(a){for(var b=!1,c=0;c<d.length;c++)if(angular.equals(f(d[c]),f(a))){b=!0;break}b||d.push(a)}),b=d}return b}}]),angular.module("ui.validate",[]).directive("uiValidate",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){function e(b){return angular.isString(b)?void a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})}):angular.isArray(b)?void angular.forEach(b,function(b){a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})})}):void(angular.isObject(b)&&angular.forEach(b,function(b,c){angular.isString(b)&&a.$watch(b,function(){g[c](d.$modelValue)}),angular.isArray(b)&&angular.forEach(b,function(b){a.$watch(b,function(){g[c](d.$modelValue)})})}))}var f,g={},h=a.$eval(c.uiValidate);h&&(angular.isString(h)&&(h={validator:h}),angular.forEach(h,function(b,c){f=function(e){var f=a.$eval(b,{$value:e});return angular.isObject(f)&&angular.isFunction(f.then)?(f.then(function(){d.$setValidity(c,!0)},function(){d.$setValidity(c,!1)}),e):f?(d.$setValidity(c,!0),e):(d.$setValidity(c,!1),e)},g[c]=f,d.$formatters.push(f),d.$parsers.push(f)}),c.uiValidateWatch&&e(a.$eval(c.uiValidateWatch)))}}}),angular.module("ui.utils",["ui.event","ui.format","ui.highlight","ui.include","ui.indeterminate","ui.inflector","ui.jq","ui.keypress","ui.mask","ui.reset","ui.route","ui.scrollfix","ui.scroll","ui.scroll.jqlite","ui.showhide","ui.unique","ui.validate"]);
\ No newline at end of file
diff --git a/dashboard/lib/assets/bootstrap.min.js b/dashboard/lib/assets/bootstrap.min.js
deleted file mode 100644
index 1a6258e..0000000
--- a/dashboard/lib/assets/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
diff --git a/dashboard/lib/assets/codemirror.min.js b/dashboard/lib/assets/codemirror.min.js
deleted file mode 100644
index b89670a..0000000
--- a/dashboard/lib/assets/codemirror.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// This is CodeMirror (http://codemirror.net), a code editor
-// implemented in JavaScript on top of the browser's DOM.
-//
-// You can find some technical background for some of the code below
-// at http://marijnhaverbeke.nl/blog/#cm-internals .
-(function(e){if(typeof exports=="object"&&typeof module=="object")module.exports=e();else{if(typeof define=="function"&&define.amd)return define([],e);this.CodeMirror=e()}})(function(){"use strict";function N(e,n){if(!(this instanceof N))return new N(e,n);this.options=n=n||{};for(var r in Qr)n.hasOwnProperty(r)||(n[r]=Qr[r]);F(n);var i=n.value;typeof i=="string"&&(i=new ms(i,n.mode)),this.doc=i;var s=this.display=new C(e,i);s.wrapper.CodeMirror=this,H(this),D(this),n.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),n.autofocus&&!g&&Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new co},t&&setTimeout(xo(Rn,this,!0),20),Xn(this);var o=this;Nn(this,function(){o.curOp.forceUpdate=!0,ws(o,i),n.autofocus&&!g||Po()==s.input?setTimeout(xo(br,o),20):wr(o);for(var e in Gr)Gr.hasOwnProperty(e)&&Gr[e](o,n[e],Zr);for(var t=0;t<ri.length;++t)ri[t](o)})}function C(e,t){var r=this,i=r.input=Ao("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none");u?i.style.width="1000px":i.setAttribute("wrap","off"),m&&(i.style.border="1px solid black"),i.setAttribute("autocorrect","off"),i.setAttribute("autocapitalize","off"),i.setAttribute("spellcheck","false"),r.inputDiv=Ao("div",[i],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),r.scrollbarH=Ao("div",[Ao("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar"),r.scrollbarV=Ao("div",[Ao("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),r.scrollbarFiller=Ao("div",null,"CodeMirror-scrollbar-filler"),r.gutterFiller=Ao("div",null,"CodeMirror-gutter-filler"),r.lineDiv=Ao("div",null,"CodeMirror-code"),r.selectionDiv=Ao("div",null,null,"position: relative; z-index: 1"),r.cursorDiv=Ao("div",null,"CodeMirror-cursors"),r.measure=Ao("div",null,"CodeMirror-measure"),r.lineMeasure=Ao("div",null,"CodeMirror-measure"),r.lineSpace=Ao("div",[r.measure,r.lineMeasure,r.selectionDiv,r.cursorDiv,r.lineDiv],null,"position: relative; outline: none"),r.mover=Ao("div",[Ao("div",[r.lineSpace],"CodeMirror-lines")],null,"position: relative"),r.sizer=Ao("div",[r.mover],"CodeMirror-sizer"),r.heightForcer=Ao("div",null,null,"position: absolute; height: "+oo+"px; width: 1px;"),r.gutters=Ao("div",null,"CodeMirror-gutters"),r.lineGutter=null,r.scroller=Ao("div",[r.sizer,r.heightForcer,r.gutters],"CodeMirror-scroll"),r.scroller.setAttribute("tabIndex","-1"),r.wrapper=Ao("div",[r.inputDiv,r.scrollbarH,r.scrollbarV,r.scrollbarFiller,r.gutterFiller,r.scroller],"CodeMirror"),n&&(r.gutters.style.zIndex=-1,r.scroller.style.paddingRight=0),m&&(i.style.width="0px"),u||(r.scroller.draggable=!0),h&&(r.inputDiv.style.height="1px",r.inputDiv.style.position="absolute"),n&&(r.scrollbarH.style.minHeight=r.scrollbarV.style.minWidth="18px"),e.appendChild?e.appendChild(r.wrapper):e(r.wrapper),r.viewFrom=r.viewTo=t.first,r.view=[],r.externalMeasured=null,r.viewOffset=0,r.lastSizeC=0,r.updateLineNumbers=null,r.lineNumWidth=r.lineNumInnerWidth=r.lineNumChars=null,r.prevInput="",r.alignWidgets=!1,r.pollingFast=!1,r.poll=new co,r.cachedCharWidth=r.cachedTextHeight=r.cachedPaddingH=null,r.inaccurateSelection=!1,r.maxLine=null,r.maxLineLength=0,r.maxLineChanged=!1,r.wheelDX=r.wheelDY=r.wheelStartX=r.wheelStartY=null,r.shift=!1}function k(e){e.doc.mode=N.getMode(e.options,e.doc.modeOption),L(e)}function L(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.frontier=e.doc.first,zt(e,100),e.state.modeGen++,e.curOp&&Mn(e)}function A(e){e.options.lineWrapping?(e.display.wrapper.className+=" CodeMirror-wrap",e.display.sizer.style.minWidth=""):(e.display.wrapper.className=e.display.wrapper.className.replace(" CodeMirror-wrap",""),j(e)),M(e),Mn(e),an(e),setTimeout(function(){q(e)},100)}function O(e){var t=wn(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/En(e.display)-3);return function(i){if(Ui(e.doc,i))return 0;var s=0;if(i.widgets)for(var o=0;o<i.widgets.length;o++)i.widgets[o].height&&(s+=i.widgets[o].height);return n?s+(Math.ceil(i.text.length/r)||1)*t:s+t}}function M(e){var t=e.doc,n=O(e);t.iter(function(e){var t=n(e);t!=e.height&&Ts(e,t)})}function _(e){var t=ai[e.options.keyMap],n=t.style;e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-keymap-\S+/g,"")+(n?" cm-keymap-"+n:"")}function D(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),an(e)}function P(e){H(e),Mn(e),setTimeout(function(){U(e)},20)}function H(e){var t=e.display.gutters,n=e.options.gutters;Mo(t);for(var r=0;r<n.length;++r){var i=n[r],s=t.appendChild(Ao("div",null,"CodeMirror-gutter "+i));i=="CodeMirror-linenumbers"&&(e.display.lineGutter=s,s.style.width=(e.display.lineNumWidth||1)+"px")}t.style.display=r?"":"none";var o=t.offsetWidth;e.display.sizer.style.marginLeft=o+"px",r&&(e.display.scrollbarH.style.left=e.options.fixedGutter?o+"px":0)}function B(e){if(e.height==0)return 0;var t=e.text.length,n,r=e;while(n=Hi(r)){var i=n.find(0,!0);r=i.from.line,t+=i.from.ch-i.to.ch}r=e;while(n=Bi(r)){var i=n.find(0,!0);t-=r.text.length-i.from.ch,r=i.to.line,t+=r.text.length-i.to.ch}return t}function j(e){var t=e.display,n=e.doc;t.maxLine=Es(n,n.first),t.maxLineLength=B(t.maxLine),t.maxLineChanged=!0,n.iter(function(e){var n=B(e);n>t.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)})}function F(e){var t=bo(e.gutters,"CodeMirror-linenumbers");t==-1&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function I(e){var t=e.display.scroller;return{clientHeight:t.clientHeight,barHeight:e.display.scrollbarV.clientHeight,scrollWidth:t.scrollWidth,clientWidth:t.clientWidth,barWidth:e.display.scrollbarH.clientWidth,docHeight:Math.round(e.doc.height+Jt(e.display))}}function q(e,t){t||(t=I(e));var n=e.display,r=t.docHeight+oo,i=t.scrollWidth>t.clientWidth,s=r>t.clientHeight;s?(n.scrollbarV.style.display="block",n.scrollbarV.style.bottom=i?jo(n.measure)+"px":"0",n.scrollbarV.firstChild.style.height=Math.max(0,r-t.clientHeight+(t.barHeight||n.scrollbarV.clientHeight))+"px"):(n.scrollbarV.style.display="",n.scrollbarV.firstChild.style.height="0"),i?(n.scrollbarH.style.display="block",n.scrollbarH.style.right=s?jo(n.measure)+"px":"0",n.scrollbarH.firstChild.style.width=t.scrollWidth-t.clientWidth+(t.barWidth||n.scrollbarH.clientWidth)+"px"):(n.scrollbarH.style.display="",n.scrollbarH.firstChild.style.width="0"),i&&s?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=n.scrollbarFiller.style.width=jo(n.measure)+"px"):n.scrollbarFiller.style.display="",i&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=jo(n.measure)+"px",n.gutterFiller.style.width=n.gutters.offsetWidth+"px"):n.gutterFiller.style.display="";if(p&&jo(n.measure)===0){n.scrollbarV.style.minWidth=n.scrollbarH.style.minHeight=d?"18px":"12px";var o=function(t){Js(t)!=n.scrollbarV&&Js(t)!=n.scrollbarH&&Cn(e,Jn)(t)};Qs(n.scrollbarV,"mousedown",o),Qs(n.scrollbarH,"mousedown",o)}}function R(e,t,n){var r=n&&n.top!=null?n.top:e.scroller.scrollTop;r=Math.floor(r-$t(e));var i=n&&n.bottom!=null?n.bottom:r+e.wrapper.clientHeight,s=Cs(t,r),o=Cs(t,i);if(n&&n.ensure){var u=n.ensure.from.line,a=n.ensure.to.line;if(u<s)return{from:u,to:Cs(t,ks(Es(t,u))+e.wrapper.clientHeight)};if(Math.min(a,t.lastLine())>=o)return{from:Cs(t,ks(Es(t,a))-e.wrapper.clientHeight),to:a}}return{from:s,to:o}}function U(e){var t=e.display,n=t.view;if(!t.alignWidgets&&(!t.gutters.firstChild||!e.options.fixedGutter))return;var r=X(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,s=r+"px";for(var o=0;o<n.length;o++)if(!n[o].hidden){e.options.fixedGutter&&n[o].gutter&&(n[o].gutter.style.left=s);var u=n[o].alignable;if(u)for(var a=0;a<u.length;a++)u[a].style.left=s}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}function z(e){if(!e.options.lineNumbers)return!1;var t=e.doc,n=W(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(Ao("div",[Ao("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),s=i.firstChild.offsetWidth,o=i.offsetWidth-s;r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(s,r.lineGutter.offsetWidth-o),r.lineNumWidth=r.lineNumInnerWidth+o,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px";var u=r.gutters.offsetWidth;return r.scrollbarH.style.left=e.options.fixedGutter?u+"px":0,r.sizer.style.marginLeft=u+"px",!0}return!1}function W(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function X(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function V(e,t,n){var r=e.display.viewFrom,i=e.display.viewTo,s,o=R(e.display,e.doc,t);for(var u=!0;;u=!1){var a=e.display.scroller.clientWidth;if(!$(e,o,n))break;s=!0,e.display.maxLineChanged&&!e.options.lineWrapping&&J(e);var f=I(e);It(e),K(e,f),q(e,f);if(u&&e.options.lineWrapping&&a!=e.display.scroller.clientWidth){n=!0;continue}n=!1,t&&t.top!=null&&(t={top:Math.min(f.docHeight-oo-f.clientHeight,t.top)}),o=R(e.display,e.doc,t);if(o.from>=e.display.viewFrom&&o.to<=e.display.viewTo)break}return e.display.updateLineNumbers=null,s&&(to(e,"update",e),(e.display.viewFrom!=r||e.display.viewTo!=i)&&to(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo)),s}function $(e,t,n){var r=e.display,i=e.doc;if(!r.wrapper.offsetWidth){Dn(e);return}if(!n&&t.from>=r.viewFrom&&t.to<=r.viewTo&&jn(e)==0)return;z(e)&&Dn(e);var s=Y(e),o=i.first+i.size,u=Math.max(t.from-e.options.viewportMargin,i.first),a=Math.min(o,t.to+e.options.viewportMargin);r.viewFrom<u&&u-r.viewFrom<20&&(u=Math.max(i.first,r.viewFrom)),r.viewTo>a&&r.viewTo-a<20&&(a=Math.min(o,r.viewTo)),T&&(u=qi(e.doc,u),a=Ri(e.doc,a));var f=u!=r.viewFrom||a!=r.viewTo||r.lastSizeC!=r.wrapper.clientHeight;Bn(e,u,a),r.viewOffset=ks(Es(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var l=jn(e);if(!f&&l==0&&!n)return;var c=Po();return l>4&&(r.lineDiv.style.display="none"),Z(e,r.updateLineNumbers,s),l>4&&(r.lineDiv.style.display=""),c&&Po()!=c&&c.offsetHeight&&c.focus(),Mo(r.cursorDiv),Mo(r.selectionDiv),f&&(r.lastSizeC=r.wrapper.clientHeight,zt(e,400)),Q(e),!0}function J(e){var t=e.display,n=Zt(e,t.maxLine,t.maxLine.text.length).left;t.maxLineChanged=!1;var r=Math.max(0,n+3),i=Math.max(0,t.sizer.offsetLeft+r+oo-t.scroller.clientWidth);t.sizer.style.minWidth=r+"px",i<e.doc.scrollLeft&&or(e,Math.min(t.scroller.scrollLeft,i),!0)}function K(e,t){e.display.sizer.style.minHeight=e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=Math.max(t.docHeight,t.clientHeight-oo)+"px"}function Q(e){var t=e.display,r=t.lineDiv.offsetTop;for(var i=0;i<t.view.length;i++){var s=t.view[i],o;if(s.hidden)continue;if(n){var u=s.node.offsetTop+s.node.offsetHeight;o=u-r,r=u}else{var a=s.node.getBoundingClientRect();o=a.bottom-a.top}var f=s.line.height-o;o<2&&(o=wn(t));if(f>.001||f<-0.001){Ts(s.line,o),G(s.line);if(s.rest)for(var l=0;l<s.rest.length;l++)G(s.rest[l])}}}function G(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t)e.widgets[t].height=e.widgets[t].node.offsetHeight}function Y(e){var t=e.display,n={},r={};for(var i=t.gutters.firstChild,s=0;i;i=i.nextSibling,++s)n[e.options.gutters[s]]=i.offsetLeft,r[e.options.gutters[s]]=i.offsetWidth;return{fixedPos:X(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Z(e,t,n){function a(t){var n=t.nextSibling;return u&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}var r=e.display,i=e.options.lineNumbers,s=r.lineDiv,o=s.firstChild,f=r.view,l=r.viewFrom;for(var c=0;c<f.length;c++){var h=f[c];if(!h.hidden)if(!h.node){var p=at(e,h,l,n);s.insertBefore(p,o)}else{while(o!=h.node)o=a(o);var d=i&&t!=null&&t<=l&&h.lineNumber;h.changes&&(bo(h.changes,"gutter")>-1&&(d=!1),et(e,h,l,n)),d&&(Mo(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(W(e.options,l)))),o=h.node.nextSibling}l+=h.size}while(o)o=a(o)}function et(e,t,n,r){for(var i=0;i<t.changes.length;i++){var s=t.changes[i];s=="text"?it(e,t):s=="gutter"?ot(e,t,n,r):s=="class"?st(t):s=="widget"&&ut(t,r)}t.changes=null}function tt(e){return e.node==e.text&&(e.node=Ao("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),n&&(e.node.style.zIndex=2)),e.node}function nt(e){var t=e.bgClass?e.bgClass+" "+(e.line.bgClass||""):e.line.bgClass;t&&(t+=" CodeMirror-linebackground");if(e.background)t?e.background.className=t:(e.background.parentNode.removeChild(e.background),e.background=null);else if(t){var n=tt(e);e.background=n.insertBefore(Ao("div",null,t),n.firstChild)}}function rt(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):is(e,t)}function it(e,t){var n=t.text.className,r=rt(e,t);t.text==t.node&&(t.node=r.pre),t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,st(t)):n&&(t.text.className=n)}function st(e){nt(e),e.line.wrapClass?tt(e).className=e.line.wrapClass:e.node!=e.text&&(e.node.className="");var t=e.textClass?e.textClass+" "+(e.line.textClass||""):e.line.textClass;e.text.className=t||""}function ot(e,t,n,r){t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null);var i=t.line.gutterMarkers;if(e.options.lineNumbers||i){var s=tt(t),o=t.gutter=s.insertBefore(Ao("div",null,"CodeMirror-gutter-wrapper","position: absolute; left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px"),t.text);e.options.lineNumbers&&(!i||!i["CodeMirror-linenumbers"])&&(t.lineNumber=o.appendChild(Ao("div",W(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px")));if(i)for(var u=0;u<e.options.gutters.length;++u){var a=e.options.gutters[u],f=i.hasOwnProperty(a)&&i[a];f&&o.appendChild(Ao("div",[f],"CodeMirror-gutter-elt","left: "+r.gutterLeft[a]+"px; width: "+r.gutterWidth[a]+"px"))}}}function ut(e,t){e.alignable&&(e.alignable=null);for(var n=e.node.firstChild,r;n;n=r){var r=n.nextSibling;n.className=="CodeMirror-linewidget"&&e.node.removeChild(n)}ft(e,t)}function at(e,t,n,r){var i=rt(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),st(t),ot(e,t,n,r),ft(t,r),t.node}function ft(e,t){lt(e.line,e,t,!0);if(e.rest)for(var n=0;n<e.rest.length;n++)lt(e.rest[n],e,t,!1)}function lt(e,t,n,r){if(!e.widgets)return;var i=tt(t);for(var s=0,o=e.widgets;s<o.length;++s){var u=o[s],a=Ao("div",[u.node],"CodeMirror-linewidget");u.handleMouseEvents||(a.ignoreEvents=!0),ct(u,a,t,n),r&&u.above?i.insertBefore(a,t.gutter||t.text):i.appendChild(a),to(u,"redraw")}}function ct(e,t,n,r){if(e.noHScroll){(n.alignable||(n.alignable=[])).push(t);var i=r.wrapperWidth;t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}function dt(e){return ht(e.line,e.ch)}function vt(e,t){return pt(e,t)<0?t:e}function mt(e,t){return pt(e,t)<0?e:t}function gt(e,t){this.ranges=e,this.primIndex=t}function yt(e,t){this.anchor=e,this.head=t}function bt(e,t){var n=e[t];e.sort(function(e,t){return pt(e.from(),t.from())}),t=bo(e,n);for(var r=1;r<e.length;r++){var i=e[r],s=e[r-1];if(pt(s.to(),i.from())>=0){var o=mt(s.from(),i.from()),u=vt(s.to(),i.to()),a=s.empty()?i.from()==i.head:s.from()==s.head;r<=t&&--t,e.splice(--r,2,new yt(a?u:o,a?o:u))}}return new gt(e,t)}function wt(e,t){return new gt([new yt(e,t||e)],0)}function Et(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function St(e,t){if(t.line<e.first)return ht(e.first,0);var n=e.first+e.size-1;return t.line>n?ht(n,Es(e,n).text.length):xt(t,Es(e,t.line).text.length)}function xt(e,t){var n=e.ch;return n==null||n>t?ht(e.line,t):n<0?ht(e.line,0):e}function Tt(e,t){return t>=e.first&&t<e.first+e.size}function Nt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=St(e,t[r]);return n}function Ct(e,t,n,r){if(e.cm&&e.cm.display.shift||e.extend){var i=t.anchor;if(r){var s=pt(n,i)<0;s!=pt(r,i)<0?(i=n,n=r):s!=pt(n,r)<0&&(n=r)}return new yt(i,n)}return new yt(r||n,n)}function kt(e,t,n,r){Dt(e,new gt([Ct(e,e.sel.primary(),t,n)],0),r)}function Lt(e,t,n){for(var r=[],i=0;i<e.sel.ranges.length;i++)r[i]=Ct(e,e.sel.ranges[i],t[i],null);var s=bt(r,e.sel.primIndex);Dt(e,s,n)}function At(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Dt(e,bt(i,e.sel.primIndex),r)}function Ot(e,t,n,r){Dt(e,wt(t,n),r)}function Mt(e,t){var n={ranges:t.ranges,update:function(t){this.ranges=[];for(var n=0;n<t.length;n++)this.ranges[n]=new yt(St(e,t[n].anchor),St(e,t[n].head))}};return Ys(e,"beforeSelectionChange",e,n),e.cm&&Ys(e.cm,"beforeSelectionChange",e.cm,n),n.ranges!=t.ranges?bt(n.ranges,n.ranges.length-1):t}function _t(e,t,n){var r=e.history.done,i=go(r);i&&i.ranges?(r[r.length-1]=t,Pt(e,t,n)):Dt(e,t,n)}function Dt(e,t,n){Pt(e,t,n),Hs(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Pt(e,t,n){if(io(e,"beforeSelectionChange")||e.cm&&io(e.cm,"beforeSelectionChange"))t=Mt(e,t);var r=pt(t.primary().head,e.sel.primary().head)<0?-1:1;Ht(e,jt(e,t,r,!0)),(!n||n.scroll!==!1)&&e.cm&&Ur(e.cm)}function Ht(e,t){if(t.equals(e.sel))return;e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=e.cm.curOp.cursorActivity=!0),to(e,"cursorActivity",e)}function Bt(e){Ht(e,jt(e,e.sel,null,!1),ao)}function jt(e,t,n,r){var i;for(var s=0;s<t.ranges.length;s++){var o=t.ranges[s],u=Ft(e,o.anchor,n,r),a=Ft(e,o.head,n,r);if(i||u!=o.anchor||a!=o.head)i||(i=t.ranges.slice(0,s)),i[s]=new yt(u,a)}return i?bt(i,t.primIndex):t}function Ft(e,t,n,r){var i=!1,s=t,o=n||1;e.cantEdit=!1;e:for(;;){var u=Es(e,s.line);if(u.markedSpans)for(var a=0;a<u.markedSpans.length;++a){var f=u.markedSpans[a],l=f.marker;if((f.from==null||(l.inclusiveLeft?f.from<=s.ch:f.from<s.ch))&&(f.to==null||(l.inclusiveRight?f.to>=s.ch:f.to>s.ch))){if(r){Ys(l,"beforeCursorEnter");if(l.explicitlyCleared){if(!u.markedSpans)break;--a;continue}}if(!l.atomic)continue;var c=l.find(o<0?-1:1);if(pt(c,s)==0){c.ch+=o,c.ch<0?c.line>e.first?c=St(e,ht(c.line-1)):c=null:c.ch>u.text.length&&(c.line<e.first+e.size-1?c=ht(c.line+1,0):c=null);if(!c){if(i)return r?(e.cantEdit=!0,ht(e.first,0)):Ft(e,t,n,!0);i=!0,c=t,o=-o}}s=c;continue e}}return s}}function It(e){var t=e.display,n=e.doc,r=document.createDocumentFragment(),i=document.createDocumentFragment();for(var s=0;s<n.sel.ranges.length;s++){var o=n.sel.ranges[s],u=o.empty();(u||e.options.showCursorWhenSelecting)&&qt(e,o,r),u||Rt(e,o,i)}if(e.options.moveInputWithCursor){var a=dn(e,n.sel.primary().head,"div"),f=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect(),c=Math.max(0,Math.min(t.wrapper.clientHeight-10,a.top+l.top-f.top)),h=Math.max(0,Math.min(t.wrapper.clientWidth-10,a.left+l.left-f.left));t.inputDiv.style.top=c+"px",t.inputDiv.style.left=h+"px"}_o(t.cursorDiv,r),_o(t.selectionDiv,i)}function qt(e,t,n){var r=dn(e,t.head,"div"),i=n.appendChild(Ao("div"," ","CodeMirror-cursor"));i.style.left=r.left+"px",i.style.top=r.top+"px",i.style.height=Math.max(0,r.bottom-r.top)*e.options.cursorHeight+"px";if(r.other){var s=n.appendChild(Ao("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));s.style.display="",s.style.left=r.other.left+"px",s.style.top=r.other.top+"px",s.style.height=(r.other.bottom-r.other.top)*.85+"px"}}function Rt(e,t,n){function f(e,t,n,r){t<0&&(t=0),s.appendChild(Ao("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px; top: "+t+"px; width: "+(n==null?a-e:n)+"px; height: "+(r-t)+"px"))}function l(t,n,r){function h(n,r){return pn(e,ht(t,n),"div",s,r)}var s=Es(i,t),o=s.text.length,l,c;return Vo(Ls(s),n||0,r==null?o:r,function(e,t,i){var s=h(e,"left"),p,d,v;if(e==t)p=s,d=v=s.left;else{p=h(t-1,"right");if(i=="rtl"){var m=s;s=p,p=m}d=s.left,v=p.right}n==null&&e==0&&(d=u),p.top-s.top>3&&(f(d,s.top,null,s.bottom),d=u,s.bottom<p.top&&f(d,s.bottom,null,p.top)),r==null&&t==o&&(v=a);if(!l||s.top<l.top||s.top==l.top&&s.left<l.left)l=s;if(!c||p.bottom>c.bottom||p.bottom==c.bottom&&p.right>c.right)c=p;d<u+1&&(d=u),f(d,p.top,v-d,p.bottom)}),{start:l,end:c}}var r=e.display,i=e.doc,s=document.createDocumentFragment(),o=Kt(e.display),u=o.left,a=r.lineSpace.offsetWidth-o.right,c=t.from(),h=t.to();if(c.line==h.line)l(c.line,c.ch,h.ch);else{var p=Es(i,c.line),d=Es(i,h.line),v=Fi(p)==Fi(d),m=l(c.line,c.ch,v?p.text.length+1:null).end,g=l(h.line,v?0:null,h.ch).start;v&&(m.top<g.top-2?(f(m.right,m.top,null,m.bottom),f(u,g.top,g.left,g.bottom)):f(m.right,m.top,g.left-m.right,m.bottom)),m.bottom<g.top&&f(u,m.bottom,null,g.top)}n.appendChild(s)}function Ut(e){if(!e.state.focused)return;var t=e.display;clearInterval(t.blinker);var n=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0&&(t.blinker=setInterval(function(){t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate))}function zt(e,t){e.doc.mode.startState&&e.doc.frontier<e.display.viewTo&&e.state.highlight.set(t,xo(Wt,e))}function Wt(e){var t=e.doc;t.frontier<t.first&&(t.frontier=t.first);if(t.frontier>=e.display.viewTo)return;var n=+(new Date)+e.options.workTime,r=si(t.mode,Vt(e,t.frontier));Nn(e,function(){t.iter(t.frontier,Math.min(t.first+t.size,e.display.viewTo+500),function(i){if(t.frontier>=e.display.viewFrom){var s=i.styles;i.styles=Yi(e,i,r,!0);var o=!s||s.length!=i.styles.length;for(var u=0;!o&&u<s.length;++u)o=s[u]!=i.styles[u];o&&_n(e,t.frontier,"text"),i.stateAfter=si(t.mode,r)}else es(e,i.text,r),i.stateAfter=t.frontier%5==0?si(t.mode,r):null;++t.frontier;if(+(new Date)>n)return zt(e,e.options.workDelay),!0})})}function Xt(e,t,n){var r,i,s=e.doc,o=n?-1:t-(e.doc.mode.innerMode?1e3:100);for(var u=t;u>o;--u){if(u<=s.first)return s.first;var a=Es(s,u-1);if(a.stateAfter&&(!n||u<=s.frontier))return u;var f=ho(a.text,null,e.options.tabSize);if(i==null||r>f)i=u-1,r=f}return i}function Vt(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return!0;var s=Xt(e,t,n),o=s>r.first&&Es(r,s-1).stateAfter;return o?o=si(r.mode,o):o=oi(r.mode),r.iter(s,t,function(n){es(e,n.text,o);var u=s==t-1||s%5==0||s>=i.viewFrom&&s<i.viewTo;n.stateAfter=u?si(r.mode,o):null,++s}),n&&(r.frontier=s),o}function $t(e){return e.lineSpace.offsetTop}function Jt(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Kt(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=_o(e.measure,Ao("pre","x")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle;return e.cachedPaddingH={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)}}function Qt(e,t,n){var r=e.options.lineWrapping,i=r&&e.display.scroller.clientWidth;if(!t.measure.heights||r&&t.measure.width!=i){var s=t.measure.heights=[];if(r){t.measure.width=i;var o=t.text.firstChild.getClientRects();for(var u=0;u<o.length-1;u++){var a=o[u],f=o[u+1];Math.abs(a.bottom-f.bottom)>2&&s.push((a.bottom+f.top)/2-n.top)}}s.push(n.bottom-n.top)}}function Gt(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var r=0;r<e.rest.length;r++)if(Ns(e.rest[r])>n)return{map:e.measure.maps[r],cache:e.measure.caches[r],before:!0}}function Yt(e,t){t=Fi(t);var n=Ns(t),r=e.display.externalMeasured=new An(e.doc,t,n);r.lineN=n;var i=r.built=is(e,r);return r.text=i.pre,_o(e.display.lineMeasure,i.pre),r}function Zt(e,t,n,r){return nn(e,tn(e,t),n,r)}function en(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[Pn(e,t)];var n=e.display.externalMeasured;if(n&&t>=n.lineN&&t<n.lineN+n.size)return n}function tn(e,t){var n=Ns(t),r=en(e,n);r&&!r.text?r=null:r&&r.changes&&et(e,r,n,Y(e)),r||(r=Yt(e,t));var i=Gt(r,t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function nn(e,t,n,r){t.before&&(n=-1);var i=n+(r||""),s;return t.cache.hasOwnProperty(i)?s=t.cache[i]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(Qt(e,t.view,t.rect),t.hasHeights=!0),s=sn(e,t,n,r),s.bogus||(t.cache[i]=s)),{left:s.left,right:s.right,top:s.top,bottom:s.bottom}}function sn(e,t,n,i){var s=t.map,u,a,f,l;for(var c=0;c<s.length;c+=3){var h=s[c],p=s[c+1];if(n<h)a=0,f=1,l="left";else if(n<p)a=n-h,f=a+1;else if(c==s.length-3||n==p&&s[c+3]>n)f=p-h,a=f-1,n>=p&&(l="right");if(a!=null){u=s[c+2],h==p&&i==(u.insertLeft?"left":"right")&&(l=i);if(i=="left"&&a==0)while(c&&s[c-2]==s[c-3]&&s[c-1].insertLeft)u=s[(c-=3)+2],l="left";if(i=="right"&&a==p-h)while(c<s.length-3&&s[c+3]==s[c+4]&&!s[c+5].insertLeft)u=s[(c+=3)+2],l="right";break}}var d;if(u.nodeType==3){while(a&&Lo(t.line.text.charAt(h+a)))--a;while(h+f<p&&Lo(t.line.text.charAt(h+f)))++f;if(r&&a==0&&f==p-h)d=u.parentNode.getBoundingClientRect();else if(o&&e.options.lineWrapping){var v=Oo(u,a,f).getClientRects();v.length?d=v[i=="right"?v.length-1:0]:d=rn}else d=Oo(u,a,f).getBoundingClientRect()}else{a>0&&(l=i="right");var v;e.options.lineWrapping&&(v=u.getClientRects()).length>1?d=v[i=="right"?v.length-1:0]:d=u.getBoundingClientRect()}if(r&&!a&&(!d||!d.left&&!d.right)){var m=u.parentNode.getClientRects()[0];m?d={left:m.left,right:m.left+En(e.display),top:m.top,bottom:m.bottom}:d=rn}var g,y=(d.bottom+d.top)/2-t.rect.top,b=t.view.measure.heights;for(var c=0;c<b.length-1;c++)if(y<b[c])break;g=c?b[c-1]:0,y=b[c];var w={left:(l=="right"?d.right:d.left)-t.rect.left,right:(l=="left"?d.left:d.right)-t.rect.left,top:g,bottom:y};return!d.left&&!d.right&&(w.bogus=!0),w}function on(e){if(e.measure){e.measure.cache={},e.measure.heights=null;if(e.rest)for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}}function un(e){e.display.externalMeasure=null,Mo(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)on(e.display.view[t])}function an(e){un(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function fn(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function ln(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function cn(e,t,n,r){if(t.widgets)for(var i=0;i<t.widgets.length;++i)if(t.widgets[i].above){var s=Vi(t.widgets[i]);n.top+=s,n.bottom+=s}if(r=="line")return n;r||(r="local");var o=ks(t);r=="local"?o+=$t(e.display):o-=e.display.viewOffset;if(r=="page"||r=="window"){var u=e.display.lineSpace.getBoundingClientRect();o+=u.top+(r=="window"?0:ln());var a=u.left+(r=="window"?0:fn());n.left+=a,n.right+=a}return n.top+=o,n.bottom+=o,n}function hn(e,t,n){if(n=="div")return t;var r=t.left,i=t.top;if(n=="page")r-=fn(),i-=ln();else if(n=="local"||!n){var s=e.display.sizer.getBoundingClientRect();r+=s.left,i+=s.top}var o=e.display.lineSpace.getBoundingClientRect();return{left:r-o.left,top:i-o.top}}function pn(e,t,n,r,i){return r||(r=Es(e.doc,t.line)),cn(e,r,Zt(e,r,t.ch,i),n)}function dn(e,t,n,r,i){function s(t,s){var o=nn(e,i,t,s?"right":"left");return s?o.left=o.right:o.right=o.left,cn(e,r,o,n)}function o(e,t){var n=u[t],r=n.level%2;return e==$o(n)&&t&&n.level<u[t-1].level?(n=u[--t],e=Jo(n)-(n.level%2?0:1),r=!0):e==Jo(n)&&t<u.length-1&&n.level<u[t+1].level&&(n=u[++t],e=$o(n)-n.level%2,r=!1),r&&e==n.to&&e>n.from?s(e-1):s(e,r)}r=r||Es(e.doc,t.line),i||(i=tn(e,r));var u=Ls(r),a=t.ch;if(!u)return s(a);var f=tu(u,a),l=o(a,f);return eu!=null&&(l.other=o(a,eu)),l}function vn(e,t){var n=0,t=St(e.doc,t);e.options.lineWrapping||(n=En(e.display)*t.ch);var r=Es(e.doc,t.line),i=ks(r)+$t(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function mn(e,t,n,r){var i=ht(e,t);return i.xRel=r,n&&(i.outside=!0),i}function gn(e,t,n){var r=e.doc;n+=e.display.viewOffset;if(n<0)return mn(r.first,0,!0,-1);var i=Cs(r,n),s=r.first+r.size-1;if(i>s)return mn(r.first+r.size-1,Es(r,s).text.length,!0,1);t<0&&(t=0);var o=Es(r,i);for(;;){var u=yn(e,o,i,t,n),a=Bi(o),f=a&&a.find(0,!0);if(!a||!(u.ch>f.from.ch||u.ch==f.from.ch&&u.xRel>0))return u;i=Ns(o=f.to.line)}}function yn(e,t,n,r,i){function f(r){var i=dn(e,ht(n,r),"line",t,a);return o=!0,s>i.bottom?i.left-u:s<i.top?i.left+u:(o=!1,i.left)}var s=i-ks(t),o=!1,u=2*e.display.wrapper.clientWidth,a=tn(e,t),l=Ls(t),c=t.text.length,h=Ko(t),p=Qo(t),d=f(h),v=o,m=f(p),g=o;if(r>m)return mn(n,p,g,1);for(;;){if(l?p==h||p==ru(t,h,1):p-h<=1){var y=r<d||r-d<=m-r?h:p,b=r-(y==h?d:m);while(Lo(t.text.charAt(y)))++y;var w=mn(n,y,y==h?v:g,b<-1?-1:b>1?1:0);return w}var E=Math.ceil(c/2),S=h+E;if(l){S=h;for(var x=0;x<E;++x)S=ru(t,S,1)}var T=f(S);if(T>r){p=S,m=T;if(g=o)m+=1e3;c=E}else h=S,d=T,v=o,c-=E}}function wn(e){if(e.cachedTextHeight!=null)return e.cachedTextHeight;if(bn==null){bn=Ao("pre");for(var t=0;t<49;++t)bn.appendChild(document.createTextNode("x")),bn.appendChild(Ao("br"));bn.appendChild(document.createTextNode("x"))}_o(e.measure,bn);var n=bn.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),Mo(e.measure),n||1}function En(e){if(e.cachedCharWidth!=null)return e.cachedCharWidth;var t=Ao("span","xxxxxxxxxx"),n=Ao("pre",[t]);_o(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function xn(e){e.curOp={viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivity:!1,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,id:++Sn},eo++||(Zs=[])}function Tn(e){var t=e.curOp,n=e.doc,r=e.display;e.curOp=null,t.updateMaxLine&&j(e);if(t.viewChanged||t.forceUpdate||t.scrollTop!=null||t.scrollToPos&&(t.scrollToPos.from.line<r.viewFrom||t.scrollToPos.to.line>=r.viewTo)||r.maxLineChanged&&e.options.lineWrapping){var i=V(e,{top:t.scrollTop,ensure:t.scrollToPos},t.forceUpdate);e.display.scroller.offsetHeight&&(e.doc.scrollTop=e.display.scroller.scrollTop)}!i&&t.selectionChanged&&It(e),!i&&t.startHeight!=e.doc.height&&q(e);if(t.scrollTop!=null&&r.scroller.scrollTop!=t.scrollTop){var s=Math.max(0,Math.min(r.scroller.scrollHeight-r.scroller.clientHeight,t.scrollTop));r.scroller.scrollTop=r.scrollbarV.scrollTop=n.scrollTop=s}if(t.scrollLeft!=null&&r.scroller.scrollLeft!=t.scrollLeft){var o=Math.max(0,Math.min(r.scroller.scrollWidth-r.scroller.clientWidth,t.scrollLeft));r.scroller.scrollLeft=r.scrollbarH.scrollLeft=n.scrollLeft=o,U(e)}if(t.scrollToPos){var u=Fr(e,St(e.doc,t.scrollToPos.from),St(e.doc,t.scrollToPos.to),t.scrollToPos.margin);t.scrollToPos.isCursor&&e.state.focused&&jr(e,u)}t.selectionChanged&&Ut(e),e.state.focused&&t.updateInput&&Rn(e,t.typing);var a=t.maybeHiddenMarkers,f=t.maybeUnhiddenMarkers;if(a)for(var l=0;l<a.length;++l)a[l].lines.length||Ys(a[l],"hide");if(f)for(var l=0;l<f.length;++l)f[l].lines.length&&Ys(f[l],"unhide");var c;--eo||(c=Zs,Zs=null);if(t.changeObjs){for(var l=0;l<t.changeObjs.length;l++)Ys(e,"change",e,t.changeObjs[l]);Ys(e,"changes",e,t.changeObjs)}t.cursorActivity&&Ys(e,"cursorActivity",e);if(c)for(var l=0;l<c.length;++l)c[l]()}function Nn(e,t){if(e.curOp)return t();xn(e);try{return t()}finally{Tn(e)}}function Cn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);xn(e);try{return t.apply(e,arguments)}finally{Tn(e)}}}function kn(e){return function(){if(this.curOp)return e.apply(this,arguments);xn(this);try{return e.apply(this,arguments)}finally{Tn(this)}}}function Ln(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);xn(t);try{return e.apply(this,arguments)}finally{Tn(t)}}}function An(e,t,n){this.line=t,this.rest=Ii(t),this.size=this.rest?Ns(go(this.rest))-n+1:1,this.node=this.text=null,this.hidden=Ui(e,t)}function On(e,t,n){var r=[],i;for(var s=t;s<n;s=i){var o=new An(e.doc,Es(e.doc,s),s);i=s+o.size,r.push(o)}return r}function Mn(e,t,n,r){t==null&&(t=e.doc.first),n==null&&(n=e.doc.first+e.doc.size),r||(r=0);var i=e.display;r&&n<i.viewTo&&(i.updateLineNumbers==null||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0;if(t>=i.viewTo)T&&qi(e.doc,t)<i.viewTo&&Dn(e);else if(n<=i.viewFrom)T&&Ri(e.doc,n+r)>i.viewFrom?Dn(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)Dn(e);else if(t<=i.viewFrom){var s=Hn(e,n,n+r,1);s?(i.view=i.view.slice(s.index),i.viewFrom=s.lineN,i.viewTo+=r):Dn
-(e)}else if(n>=i.viewTo){var s=Hn(e,t,t,-1);s?(i.view=i.view.slice(0,s.index),i.viewTo=s.lineN):Dn(e)}else{var o=Hn(e,t,t,-1),u=Hn(e,n,n+r,1);o&&u?(i.view=i.view.slice(0,o.index).concat(On(e,o.lineN,u.lineN)).concat(i.view.slice(u.index)),i.viewTo+=r):Dn(e)}var a=i.externalMeasured;a&&(n<a.lineN?a.lineN+=r:t<a.lineN+a.size&&(i.externalMeasured=null))}function _n(e,t,n){e.curOp.viewChanged=!0;var r=e.display,i=e.display.externalMeasured;i&&t>=i.lineN&&t<i.lineN+i.size&&(r.externalMeasured=null);if(t<r.viewFrom||t>=r.viewTo)return;var s=r.view[Pn(e,t)];if(s.node==null)return;var o=s.changes||(s.changes=[]);bo(o,n)==-1&&o.push(n)}function Dn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Pn(e,t){if(t>=e.display.viewTo)return null;t-=e.display.viewFrom;if(t<0)return null;var n=e.display.view;for(var r=0;r<n.length;r++){t-=n[r].size;if(t<0)return r}}function Hn(e,t,n,r){var i=Pn(e,t),s,o=e.display.view;if(!T)return{index:i,lineN:n};for(var u=0,a=e.display.viewFrom;u<i;u++)a+=o[u].size;if(a!=t){if(r>0){if(i==o.length-1)return null;s=a+o[i].size-t,i++}else s=a-t;t+=s,n+=s}while(qi(e.doc,n)!=n){if(i==(r<0?0:o.length-1))return null;n+=r*o[i-(r<0?1:0)].size,i+=r}return{index:i,lineN:n}}function Bn(e,t,n){var r=e.display,i=r.view;i.length==0||t>=r.viewTo||n<=r.viewFrom?(r.view=On(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=On(e,t,r.viewFrom).concat(r.view):r.viewFrom<t&&(r.view=r.view.slice(Pn(e,t))),r.viewFrom=t,r.viewTo<n?r.view=r.view.concat(On(e,r.viewTo,n)):r.viewTo>n&&(r.view=r.view.slice(0,Pn(e,n)))),r.viewTo=n}function jn(e){var t=e.display.view,n=0;for(var r=0;r<t.length;r++){var i=t[r];!i.hidden&&(!i.node||i.changes)&&++n}return n}function Fn(e){if(e.display.pollingFast)return;e.display.poll.set(e.options.pollInterval,function(){qn(e),e.state.focused&&Fn(e)})}function In(e){function n(){var r=qn(e);!r&&!t?(t=!0,e.display.poll.set(60,n)):(e.display.pollingFast=!1,Fn(e))}var t=!1;e.display.pollingFast=!0,e.display.poll.set(20,n)}function qn(e){var t=e.display.input,n=e.display.prevInput,i=e.doc;if(!e.state.focused||zo(t)||Wn(e)||e.options.disableInput)return!1;var s=t.value;if(s==n&&!e.somethingSelected())return!1;if(o&&!r&&e.display.inputHasSelection===s)return Rn(e),!1;var u=!e.curOp;u&&xn(e),e.display.shift=!1;var a=0,f=Math.min(n.length,s.length);while(a<f&&n.charCodeAt(a)==s.charCodeAt(a))++a;var l=s.slice(a),c=Uo(l),h=e.state.pasteIncoming&&c.length>1&&i.sel.ranges.length==c.length;for(var p=i.sel.ranges.length-1;p>=0;p--){var d=i.sel.ranges[p],v=d.from(),m=d.to();a<n.length?v=ht(v.line,v.ch-(n.length-a)):e.state.overwrite&&d.empty()&&!e.state.pasteIncoming&&(m=ht(m.line,Math.min(Es(i,m.line).text.length,m.ch+go(c).length)));var g=e.curOp.updateInput,y={from:v,to:m,text:h?[c[p]]:c,origin:e.state.pasteIncoming?"paste":e.state.cutIncoming?"cut":"+input"};Or(e.doc,y),to(e,"inputRead",e,y);if(l&&!e.state.pasteIncoming&&e.options.electricChars&&e.options.smartIndent&&d.head.ch<100&&(!p||i.sel.ranges[p-1].head.line!=d.head.line)){var b=e.getModeAt(d.head).electricChars;if(b)for(var w=0;w<b.length;w++)if(l.indexOf(b.charAt(w))>-1){Wr(e,d.head.line,"smart");break}}}return Ur(e),e.curOp.updateInput=g,e.curOp.typing=!0,s.length>1e3||s.indexOf("\n")>-1?t.value=e.display.prevInput="":e.display.prevInput=s,u&&Tn(e),e.state.pasteIncoming=e.state.cutIncoming=!1,!0}function Rn(e,t){var n,i,s=e.doc;if(e.somethingSelected()){e.display.prevInput="";var u=s.sel.primary();n=Wo&&(u.to().line-u.from().line>100||(i=e.getSelection()).length>1e3);var a=n?"-":i||e.getSelection();e.display.input.value=a,e.state.focused&&yo(e.display.input),o&&!r&&(e.display.inputHasSelection=a)}else t||(e.display.prevInput=e.display.input.value="",o&&!r&&(e.display.inputHasSelection=null));e.display.inaccurateSelection=n}function Un(e){e.options.readOnly!="nocursor"&&(!g||Po()!=e.display.input)&&e.display.input.focus()}function zn(e){e.state.focused||(Un(e),br(e))}function Wn(e){return e.options.readOnly||e.doc.cantEdit}function Xn(e){function i(){e.state.focused&&setTimeout(xo(Un,e),0)}function u(){s==null&&(s=setTimeout(function(){s=null,n.cachedCharWidth=n.cachedTextHeight=n.cachedPaddingH=Bo=null,e.setSize()},100))}function a(){Do(document.body,n.wrapper)?setTimeout(a,5e3):Gs(window,"resize",u)}function f(t){ro(e,t)||$s(t)}function l(t){n.inaccurateSelection&&(n.prevInput="",n.inaccurateSelection=!1,n.input.value=e.getSelection(),yo(n.input)),t.type=="cut"&&(e.state.cutIncoming=!0)}var n=e.display;Qs(n.scroller,"mousedown",Cn(e,Jn)),t?Qs(n.scroller,"dblclick",Cn(e,function(t){if(ro(e,t))return;var n=$n(e,t);if(!n||tr(e,t)||Vn(e.display,t))return;Ws(t);var r=Kr(e.doc,n);kt(e.doc,r.anchor,r.head)})):Qs(n.scroller,"dblclick",function(t){ro(e,t)||Ws(t)}),Qs(n.lineSpace,"selectstart",function(e){Vn(n,e)||Ws(e)}),S||Qs(n.scroller,"contextmenu",function(t){Sr(e,t)}),Qs(n.scroller,"scroll",function(){n.scroller.clientHeight&&(sr(e,n.scroller.scrollTop),or(e,n.scroller.scrollLeft,!0),Ys(e,"scroll",e))}),Qs(n.scrollbarV,"scroll",function(){n.scroller.clientHeight&&sr(e,n.scrollbarV.scrollTop)}),Qs(n.scrollbarH,"scroll",function(){n.scroller.clientHeight&&or(e,n.scrollbarH.scrollLeft)}),Qs(n.scroller,"mousewheel",function(t){fr(e,t)}),Qs(n.scroller,"DOMMouseScroll",function(t){fr(e,t)}),Qs(n.scrollbarH,"mousedown",i),Qs(n.scrollbarV,"mousedown",i),Qs(n.wrapper,"scroll",function(){n.wrapper.scrollTop=n.wrapper.scrollLeft=0});var s;Qs(window,"resize",u),setTimeout(a,5e3),Qs(n.input,"keyup",Cn(e,gr)),Qs(n.input,"input",function(){o&&!r&&e.display.inputHasSelection&&(e.display.inputHasSelection=null),In(e)}),Qs(n.input,"keydown",Cn(e,mr)),Qs(n.input,"keypress",Cn(e,yr)),Qs(n.input,"focus",xo(br,e)),Qs(n.input,"blur",xo(wr,e)),e.options.dragDrop&&(Qs(n.scroller,"dragstart",function(t){ir(e,t)}),Qs(n.scroller,"dragenter",f),Qs(n.scroller,"dragover",f),Qs(n.scroller,"drop",Cn(e,rr))),Qs(n.scroller,"paste",function(t){if(Vn(n,t))return;e.state.pasteIncoming=!0,Un(e),In(e)}),Qs(n.input,"paste",function(){e.state.pasteIncoming=!0,In(e)}),Qs(n.input,"cut",l),Qs(n.input,"copy",l),h&&Qs(n.sizer,"mouseup",function(){Po()==n.input&&n.input.blur(),Un(e)})}function Vn(e,t){for(var n=Js(t);n!=e.wrapper;n=n.parentNode)if(!n||n.ignoreEvents||n.parentNode==e.sizer&&n!=e.mover)return!0}function $n(e,t,n,r){var i=e.display;if(!n){var s=Js(t);if(s==i.scrollbarH||s==i.scrollbarV||s==i.scrollbarFiller||s==i.gutterFiller)return null}var o,u,a=i.lineSpace.getBoundingClientRect();try{o=t.clientX-a.left,u=t.clientY-a.top}catch(t){return null}var f=gn(e,o,u),l;if(r&&f.xRel==1&&(l=Es(e.doc,f.line).text).length==f.ch){var c=ho(l,l.length,e.options.tabSize)-l.length;f=ht(f.line,Math.round((o-Kt(e.display).left)/En(e.display))-c)}return f}function Jn(e){if(ro(this,e))return;var t=this,n=t.display;n.shift=e.shiftKey;if(Vn(n,e)){u||(n.scroller.draggable=!1,setTimeout(function(){n.scroller.draggable=!0},100));return}if(tr(t,e))return;var r=$n(t,e);window.focus();switch(Ks(e)){case 1:r?Gn(t,e,r):Js(e)==n.scroller&&Ws(e);break;case 2:u&&(t.state.lastMiddleDown=+(new Date)),r&&kt(t.doc,r),setTimeout(xo(Un,t),20),Ws(e);break;case 3:S&&Sr(t,e)}}function Gn(e,t,n){setTimeout(xo(zn,e),0);var r=+(new Date),i;Qn&&Qn.time>r-400&&pt(Qn.pos,n)==0?i="triple":Kn&&Kn.time>r-400&&pt(Kn.pos,n)==0?(i="double",Qn={time:r,pos:n}):(i="single",Kn={time:r,pos:n});var s=e.doc.sel,o=y?t.metaKey:t.ctrlKey;e.options.dragDrop&&Ho&&!o&&!Wn(e)&&i=="single"&&s.contains(n)>-1&&s.somethingSelected()?Yn(e,t,n):Zn(e,t,n,i,o)}function Yn(e,n,i){var s=e.display,o=Cn(e,function(a){u&&(s.scroller.draggable=!1),e.state.draggingText=!1,Gs(document,"mouseup",o),Gs(s.scroller,"drop",o),Math.abs(n.clientX-a.clientX)+Math.abs(n.clientY-a.clientY)<10&&(Ws(a),kt(e.doc,i),Un(e),t&&!r&&setTimeout(function(){document.body.focus(),Un(e)},20))});u&&(s.scroller.draggable=!0),e.state.draggingText=o,s.scroller.dragDrop&&s.scroller.dragDrop(),Qs(document,"mouseup",o),Qs(s.scroller,"drop",o)}function Zn(e,t,n,r,s){function v(t){if(pt(d,t)==0)return;d=t;if(r=="rect"){var i=[],s=e.options.tabSize,o=ho(Es(a,n.line).text,n.ch,s),u=ho(Es(a,t.line).text,t.ch,s),h=Math.min(o,u),p=Math.max(o,u);for(var v=Math.min(n.line,t.line),m=Math.min(e.lastLine(),Math.max(n.line,t.line));v<=m;v++){var g=Es(a,v).text,y=po(g,h,s);h==p?i.push(new yt(ht(v,y),ht(v,y))):g.length>y&&i.push(new yt(ht(v,y),ht(v,po(g,p,s))))}i.length||i.push(new yt(n,n)),Dt(a,bt(c.ranges.slice(0,l).concat(i),l),fo)}else{var b=f,w=b.anchor,E=t;if(r!="single"){if(r=="double")var S=Kr(a,t);else var S=new yt(ht(t.line,0),St(a,ht(t.line+1,0)));pt(S.anchor,w)>0?(E=S.head,w=mt(b.from(),S.anchor)):(E=S.anchor,w=vt(b.to(),S.head))}var i=c.ranges.slice(0);i[l]=new yt(St(a,w),E),Dt(a,bt(i,l),fo)}}function y(t){var n=++g,i=$n(e,t,!0,r=="rect");if(!i)return;if(pt(i,d)!=0){zn(e),v(i);var s=R(u,a);(i.line>=s.to||i.line<s.from)&&setTimeout(Cn(e,function(){g==n&&y(t)}),150)}else{var o=t.clientY<m.top?-20:t.clientY>m.bottom?20:0;o&&setTimeout(Cn(e,function(){if(g!=n)return;u.scroller.scrollTop+=o,y(t)}),50)}}function b(t){g=Infinity,Ws(t),Un(e),Gs(document,"mousemove",w),Gs(document,"mouseup",E),a.history.lastSelOrigin=null}var u=e.display,a=e.doc;Ws(t);var f,l,c=a.sel;s?(l=a.sel.contains(n),l>-1?f=a.sel.ranges[l]:f=new yt(n,n)):f=a.sel.primary();if(t.altKey)r="rect",s||(f=new yt(n,n)),n=$n(e,t,!0,!0),l=-1;else if(r=="double"){var h=Kr(a,n);e.display.shift||a.extend?f=Ct(a,f,h.anchor,h.head):f=h}else if(r=="triple"){var p=new yt(ht(n.line,0),St(a,ht(n.line+1,0)));e.display.shift||a.extend?f=Ct(a,f,p.anchor,p.head):f=p}else f=Ct(a,f,n);s?l>-1?At(a,l,f,fo):(l=a.sel.ranges.length,Dt(a,bt(a.sel.ranges.concat([f]),l),{scroll:!1,origin:"*mouse"})):(l=0,Dt(a,new gt([f],0),fo));var d=n,m=u.wrapper.getBoundingClientRect(),g=0,w=Cn(e,function(e){(o&&!i?!e.buttons:!Ks(e))?b(e):y(e)}),E=Cn(e,b);Qs(document,"mousemove",w),Qs(document,"mouseup",E)}function er(e,t,n,r,i){try{var s=t.clientX,o=t.clientY}catch(t){return!1}if(s>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ws(t);var u=e.display,a=u.lineDiv.getBoundingClientRect();if(o>a.bottom||!io(e,n))return Vs(t);o-=a.top-u.viewOffset;for(var f=0;f<e.options.gutters.length;++f){var l=u.gutters.childNodes[f];if(l&&l.getBoundingClientRect().right>=s){var c=Cs(e.doc,o),h=e.options.gutters[f];return i(e,n,e,c,h,t),Vs(t)}}}function tr(e,t){return er(e,t,"gutterClick",!0,to)}function rr(e){var n=this;if(ro(n,e)||Vn(n.display,e))return;Ws(e),t&&(nr=+(new Date));var r=$n(n,e,!0),i=e.dataTransfer.files;if(!r||Wn(n))return;if(i&&i.length&&window.FileReader&&window.File){var s=i.length,o=Array(s),u=0,a=function(e,t){var i=new FileReader;i.onload=function(){o[t]=i.result;if(++u==s){r=St(n.doc,r);var e={from:r,to:r,text:Uo(o.join("\n")),origin:"paste"};Or(n.doc,e),_t(n.doc,wt(r,Tr(e)))}},i.readAsText(e)};for(var f=0;f<s;++f)a(i[f],f)}else{if(n.state.draggingText&&n.doc.sel.contains(r)>-1){n.state.draggingText(e),setTimeout(xo(Un,n),20);return}try{var o=e.dataTransfer.getData("Text");if(o){var l=n.state.draggingText&&n.listSelections();Pt(n.doc,wt(r,r));if(l)for(var f=0;f<l.length;++f)Br(n.doc,"",l[f].anchor,l[f].head,"drag");n.replaceSelection(o,"around","paste"),Un(n)}}catch(e){}}}function ir(e,n){if(t&&(!e.state.draggingText||+(new Date)-nr<100)){$s(n);return}if(ro(e,n)||Vn(e.display,n))return;n.dataTransfer.setData("Text",e.getSelection());if(n.dataTransfer.setDragImage&&!c){var r=Ao("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",l&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),l&&r.parentNode.removeChild(r)}}function sr(t,n){if(Math.abs(t.doc.scrollTop-n)<2)return;t.doc.scrollTop=n,e||V(t,{top:n}),t.display.scroller.scrollTop!=n&&(t.display.scroller.scrollTop=n),t.display.scrollbarV.scrollTop!=n&&(t.display.scrollbarV.scrollTop=n),e&&V(t),zt(t,100)}function or(e,t,n){if(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)return;t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),e.doc.scrollLeft=t,U(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbarH.scrollLeft!=t&&(e.display.scrollbarH.scrollLeft=t)}function fr(t,n){var r=n.wheelDeltaX,i=n.wheelDeltaY;r==null&&n.detail&&n.axis==n.HORIZONTAL_AXIS&&(r=n.detail),i==null&&n.detail&&n.axis==n.VERTICAL_AXIS?i=n.detail:i==null&&(i=n.wheelDelta);var s=t.display,o=s.scroller;if(!(r&&o.scrollWidth>o.clientWidth||i&&o.scrollHeight>o.clientHeight))return;if(i&&y&&u)e:for(var a=n.target,f=s.view;a!=o;a=a.parentNode)for(var c=0;c<f.length;c++)if(f[c].node==a){t.display.currentWheelTarget=a;break e}if(r&&!e&&!l&&ar!=null){i&&sr(t,Math.max(0,Math.min(o.scrollTop+i*ar,o.scrollHeight-o.clientHeight))),or(t,Math.max(0,Math.min(o.scrollLeft+r*ar,o.scrollWidth-o.clientWidth))),Ws(n),s.wheelStartX=null;return}if(i&&ar!=null){var h=i*ar,p=t.doc.scrollTop,d=p+s.wrapper.clientHeight;h<0?p=Math.max(0,p+h-50):d=Math.min(t.doc.height,d+h+50),V(t,{top:p,bottom:d})}ur<20&&(s.wheelStartX==null?(s.wheelStartX=o.scrollLeft,s.wheelStartY=o.scrollTop,s.wheelDX=r,s.wheelDY=i,setTimeout(function(){if(s.wheelStartX==null)return;var e=o.scrollLeft-s.wheelStartX,t=o.scrollTop-s.wheelStartY,n=t&&s.wheelDY&&t/s.wheelDY||e&&s.wheelDX&&e/s.wheelDX;s.wheelStartX=s.wheelStartY=null;if(!n)return;ar=(ar*ur+n)/(ur+1),++ur},200)):(s.wheelDX+=r,s.wheelDY+=i))}function lr(e,t,n){if(typeof t=="string"){t=ui[t];if(!t)return!1}e.display.pollingFast&&qn(e)&&(e.display.pollingFast=!1);var r=e.display.shift,i=!1;try{Wn(e)&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=uo}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}function cr(e){var t=e.state.keyMaps.slice(0);return e.options.extraKeys&&t.push(e.options.extraKeys),t.push(e.options.keyMap),t}function pr(e,t){var n=fi(e.options.keyMap),r=n.auto;clearTimeout(hr),r&&!ci(t)&&(hr=setTimeout(function(){fi(e.options.keyMap)==n&&(e.options.keyMap=r.call?r.call(null,e):r,_(e))},50));var i=hi(t,!0),s=!1;if(!i)return!1;var o=cr(e);return t.shiftKey?s=li("Shift-"+i,o,function(t){return lr(e,t,!0)})||li(i,o,function(t){if(typeof t=="string"?/^go[A-Z]/.test(t):t.motion)return lr(e,t)}):s=li(i,o,function(t){return lr(e,t)}),s&&(Ws(t),Ut(e),to(e,"keyHandled",e,i,t)),s}function dr(e,t,n){var r=li("'"+n+"'",cr(e),function(t){return lr(e,t,!0)});return r&&(Ws(t),Ut(e),to(e,"keyHandled",e,"'"+n+"'",t)),r}function mr(e){var n=this;zn(n);if(ro(n,e))return;t&&e.keyCode==27&&(e.returnValue=!1);var r=e.keyCode;n.display.shift=r==16||e.shiftKey;var i=pr(n,e);l&&(vr=i?r:null,!i&&r==88&&!Wo&&(y?e.metaKey:e.ctrlKey)&&n.replaceSelection("",null,"cut"))}function gr(e){if(ro(this,e))return;e.keyCode==16&&(this.doc.sel.shift=!1)}function yr(e){var t=this;if(ro(t,e))return;var n=e.keyCode,i=e.charCode;if(l&&n==vr){vr=null,Ws(e);return}if((l&&(!e.which||e.which<10)||h)&&pr(t,e))return;var s=String.fromCharCode(i==null?n:i);if(dr(t,e,s))return;o&&!r&&(t.display.inputHasSelection=null),In(t)}function br(e){if(e.options.readOnly=="nocursor")return;e.state.focused||(Ys(e,"focus",e),e.state.focused=!0,e.display.wrapper.className.search(/\bCodeMirror-focused\b/)==-1&&(e.display.wrapper.className+=" CodeMirror-focused"),e.curOp||(Rn(e),u&&setTimeout(xo(Rn,e,!0),0))),Fn(e),Ut(e)}function wr(e){e.state.focused&&(Ys(e,"blur",e),e.state.focused=!1,e.display.wrapper.className=e.display.wrapper.className.replace(" CodeMirror-focused","")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150)}function Sr(e,t){function f(){if(n.input.selectionStart!=null){var t=n.input.value="​"+(e.somethingSelected()?n.input.value:"");n.prevInput="​",n.input.selectionStart=1,n.input.selectionEnd=t.length}}function c(){n.inputDiv.style.position="relative",n.input.style.cssText=a,r&&(n.scrollbarV.scrollTop=n.scroller.scrollTop=s),Fn(e);if(n.input.selectionStart!=null){(!o||r)&&f(),clearTimeout(Er);var t=0,i=function(){n.prevInput=="​"&&n.input.selectionStart==0?Cn(e,ui.selectAll)(e):t++<10?Er=setTimeout(i,500):Rn(e)};Er=setTimeout(i,200)}}if(ro(e,t,"contextmenu"))return;var n=e.display;if(Vn(n,t)||xr(e,t))return;var i=$n(e,t),s=n.scroller.scrollTop;if(!i||l)return;var u=e.options.resetSelectionOnContextMenu;u&&e.doc.sel.contains(i)==-1&&Cn(e,Dt)(e.doc,wt(i),ao);var a=n.input.style.cssText;n.inputDiv.style.position="absolute",n.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(t.clientY-5)+"px; left: "+(t.clientX-5)+"px; z-index: 1000; background: "+(o?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",Un(e),Rn(e),e.somethingSelected()||(n.input.value=n.prevInput=" "),o&&!r&&f();if(S){$s(t);var h=function(){Gs(window,"mouseup",h),setTimeout(c,20)};Qs(window,"mouseup",h)}else setTimeout(c,50)}function xr(e,t){return io(e,"gutterContextMenu")?er(e,t,"gutterContextMenu",!1,Ys):!1}function Nr(e,t){if(pt(e,t.from)<0)return e;if(pt(e,t.to)<=0)return Tr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=Tr(t).ch-t.to.ch),ht(n,r)}function Cr(e,t){var n=[];for(var r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new yt(Nr(i.anchor,t),Nr(i.head,t)))}return bt(n,e.sel.primIndex)}function kr(e,t,n){return e.line==t.line?ht(n.line,e.ch-t.ch+n.ch):ht(n.line+(e.line-t.line),e.ch)}function Lr(e,t,n){var r=[],i=ht(e.first,0),s=i;for(var o=0;o<t.length;o++){var u=t[o],a=kr(u.from,i,s),f=kr(Tr(u),i,s);i=u.to,s=f;if(n=="around"){var l=e.sel.ranges[o],c=pt(l.head,l.anchor)<0;r[o]=new yt(c?f:a,c?a:f)}else r[o]=new yt(a,a)}return new gt(r,e.sel.primIndex)}function Ar(e,t,n){var r={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){this.canceled=!0}};return n&&(r.update=function(t,n,r,i){t&&(this.from=St(e,t)),n&&(this.to=St(e,n)),r&&(this.text=r),i!==undefined&&(this.origin=i)}),Ys(e,"beforeChange",e,r),e.cm&&Ys(e.cm,"beforeChange",e.cm,r),r.canceled?null:{from:r.from,to:r.to,text:r.text,origin:r.origin}}function Or(e,t,n){if(e.cm){if(!e.cm.curOp)return Cn(e.cm,Or)(e,t,n);if(e.cm.state.suppressEdits)return}if(io(e,"beforeChange")||e.cm&&io(e.cm,"beforeChange")){t=Ar(e,t,!0);if(!t)return}var r=x&&!n&&Li(e,t.from,t.to);if(r)for(var i=r.length-1;i>=0;--i)Mr(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text});else Mr(e,t)}function Mr(e,t){if(t.text.length==1&&t.text[0]==""&&pt(t.from,t.to)==0)return;var n=Cr(e,t);Ds(e,t,n,e.cm?e.cm.curOp.id:NaN),Pr(e,t,n,Ni(e,t));var r=[];bs(e,function(e,n){!n&&bo(r,e.history)==-1&&(zs(e.history,t),r.push(e.history)),Pr(e,t,null,Ni(e,t))})}function _r(e,t,n){if(e.cm&&e.cm.state.suppressEdits)return;var r=e.history,i,s=e.sel,o=t=="undo"?r.done:r.undone,u=t=="undo"?r.undone:r.done;for(var a=0;a<o.length;a++){i=o[a];if(n?i.ranges&&!i.equals(e.sel):!i.ranges)break}if(a==o.length)return;r.lastOrigin=r.lastSelOrigin=null;for(;;){i=o.pop();if(!i.ranges)break;Bs(i,u);if(n&&!i.equals(e.sel)){Dt(e,i,{clearRedo:!1});return}s=i}var f=[];Bs(s,u),u.push({changes:f,generation:r.generation}),r.generation=i.generation||++r.maxGeneration;var l=io(e,"beforeChange")||e.cm&&io(e.cm,"beforeChange");for(var a=i.changes.length-1;a>=0;--a){var c=i.changes[a];c.origin=t;if(l&&!Ar(e,c,!1)){o.length=0;return}f.push(Os(e,c));var h=a?Cr(e,c,null):go(o);Pr(e,c,h,ki(e,c)),e.cm&&Ur(e.cm);var p=[];bs(e,function(e,t){!t&&bo(p,e.history)==-1&&(zs(e.history,c),p.push(e.history)),Pr(e,c,null,ki(e,c))})}}function Dr(e,t){e.first+=t,e.sel=new gt(wo(e.sel.ranges,function(e){return new yt(ht(e.anchor.line+t,e.anchor.ch),ht(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm&&Mn(e.cm,e.first,e.first-t,t)}function Pr(e,t,n,r){if(e.cm&&!e.cm.curOp)return Cn(e.cm,Pr)(e,t,n,r);if(t.to.line<e.first){Dr(e,t.text.length-1-(t.to.line-t.from.line));return}if(t.from.line>e.lastLine())return;if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);Dr(e,i),t={from:ht(e.first,0),to:ht(t.to.line+i,t.to.ch),text:[go(t.text)],origin:t.origin}}var s=e.lastLine();t.to.line>s&&(t={from:t.from,to:ht(s,Es(e,s).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ss(e,t.from,t.to),n||(n=Cr(e,t,null)),e.cm?Hr(e.cm,t,r):hs(e,t,r),Pt(e,n,ao)}function Hr(e,t,n){var r=e.doc,i=e.display,s=t.from,o=t.to,u=!1,a=s.line;e.options.lineWrapping||(a=Ns(Fi(Es(r,s.line))),r.iter(a,o.line+1,function(e){if(e==i.maxLine)return u=!0,!0})),r.sel.contains(t.from,t.to)>-1&&(e.curOp.cursorActivity=!0),hs(r,t,n,O(e)),e.options.lineWrapping||(r.iter(a,s.line+t.text.length,function(e){var t=B(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,u=!1)}),u&&(e.curOp.updateMaxLine=!0)),r.frontier=Math.min(r.frontier,s.line),zt(e,400);var f=t.text.length-(o.line-s.line)-1;s.line==o.line&&t.text.length==1&&!cs(e.doc,t)?_n(e,s.line,"text"):Mn(e,s.line,o.line+1,f),(io(e,"change")||io(e,"changes"))&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push({from:s,to:o,text:t.text,removed:t.removed,origin:t.origin})}function Br(e,t,n,r,i){r||(r=n);if(pt(r,n)<0){var s=r;r=n,n=s}typeof t=="string"&&(t=Uo(t)),Or(e,{from:n,to:r,text:t,origin:i})}function jr(e,t){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null;t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1);if(i!=null&&!v){var s=Ao("div","​",null,"position: absolute; top: "+(t.top-n.viewOffset-$t(e.display))+"px; height: "+(t.bottom-t.top+oo)+"px; left: "+t.left+"px; width: 2px;");e.display.lineSpace.appendChild(s),s.scrollIntoView(i),e.display.lineSpace.removeChild(s)}}function Fr(e,t,n,r){r==null&&(r=0);for(;;){var i=!1,s=dn(e,t),o=!n||n==t?s:dn(e,n),u=qr(e,Math.min(s.left,o.left),Math.min(s.top,o.top)-r,Math.max(s.left,o.left),Math.max(s.bottom,o.bottom)+r),a=e.doc.scrollTop,f=e.doc.scrollLeft;u.scrollTop!=null&&(sr(e,u.scrollTop),Math.abs(e.doc.scrollTop-a)>1&&(i=!0)),u.scrollLeft!=null&&(or(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-f)>1&&(i=!0));if(!i)return s}}function Ir(e,t,n,r,i){var s=qr(e,t,n,r,i);s.scrollTop!=null&&sr(e,s.scrollTop),s.scrollLeft!=null&&or(e,s.scrollLeft)}function qr(e,t,n,r,i){var s=e.display,o=wn(e.display);n<0&&(n=0);var u=e.curOp&&e.curOp.scrollTop!=null?e.curOp.scrollTop:s.scroller.scrollTop,a=s.scroller.clientHeight-oo,f={},l=e.doc.height+Jt(s),c=n<o,h=i>l-o;if(n<u)f.scrollTop=c?0:n;else if(i>u+a){var p=Math.min(n,(h?l:i)-a);p!=u&&(f.scrollTop=p)}var d=e.curOp&&e.curOp.scrollLeft!=null?e.curOp.scrollLeft:s.scroller.scrollLeft,v=s.scroller.clientWidth-oo;t+=s.gutters.offsetWidth,r+=s.gutters.offsetWidth;var m=s.gutters.offsetWidth,g=t<m+10;return t<d+m||g?(g&&(t=0),f.scrollLeft=Math.max(0,t-10-m)):r>v+d-3&&(f.scrollLeft=r+10-v),f}function Rr(e,t,n){(t!=null||n!=null)&&zr(e),t!=null&&(e.curOp.scrollLeft=(e.curOp.scrollLeft==null?e.doc.scrollLeft:e.curOp.scrollLeft)+t),n!=null&&(e.curOp.scrollTop=(e.curOp.scrollTop==null?e.doc.scrollTop:e.curOp.scrollTop)+n)}function Ur(e){zr(e);var t=e.getCursor(),n=t,r=t;e.options.lineWrapping||(n=t.ch?ht(t.line,t.ch-1):t,r=ht(t.line,t.ch+1)),e.curOp.scrollToPos={from:n,to:r,margin:e.options.cursorScrollMargin,isCursor:!0}}function zr(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=vn(e,t.from),r=vn(e,t.to),i=qr(e,Math.min(n.left,r.left),Math.min(n.top,r.top)-t.margin,Math.max(n.right,r.right),Math.max(n.bottom,r.bottom)+t.margin);e.scrollTo(i.scrollLeft,i.scrollTop)}}function Wr(e,t,n,r){var i=e.doc,s;n==null&&(n="add"),n=="smart"&&(e.doc.mode.indent?s=Vt(e,t):n="prev");var o=e.options.tabSize,u=Es(i,t),a=ho(u.text,null,o);u.stateAfter&&(u.stateAfter=null);var f=u.text.match(/^\s*/)[0],l;if(!r&&!/\S/.test(u.text))l=0,n="not";else if(n=="smart"){l=e.doc.mode.indent(s,u.text.slice(f.length),u.text);if(l==uo){if(!r)return;n="prev"}}n=="prev"?t>i.first?l=ho(Es(i,t-1).text,null,o):l=0:n=="add"?l=a+e.options.indentUnit:n=="subtract"?l=a-e.options.indentUnit:typeof n=="number"&&(l=a+n),l=Math.max(0,l);var c="",h=0;if(e.options.indentWithTabs)for(var p=Math.floor(l/o);p;--p)h+=o,c+="	";h<l&&(c+=mo(l-h));if(c!=f)Br(e.doc,c,ht(t,0),ht(t,f.length),"+input");else for(var p=0;p<i.sel.ranges.length;p++){var d=i.sel.ranges[p];if(d.head.line==t&&d.head.ch<f.length){var h=ht(t,f.length);At(i,p,new yt(h,h));break}}u.stateAfter=null}function Xr(e,t,n,r){var i=t,s=t,o=e.doc;return typeof t=="number"?s=Es(o,Et(o,t)):i=Ns(t),i==null?null:r(s,i)?(_n(e,i,n),s):null}function Vr(e,t){var n=e.doc.sel.ranges,r=[];for(var i=0;i<n.length;i++){var s=t(n[i]);while(r.length&&pt(s.from,go(r).to)<=0){var o=r.pop();if(pt(o.from,s.from)<0){s.from=o.from;break}}r.push(s)}Nn(e,function(){for(var t=r.length-1;t>=0;t--)Br(e.doc,"",r[t].from,r[t].to,"+delete");Ur(e)})}function $r(e,t,n,r,i){function l(){var t=s+n;return t<e.first||t>=e.first+e.size?f=!1:(s=t,a=Es(e,t))}function c(e){var t=(i?ru:iu)(a,o,n,!0);if(t==null){if(!!e||!l())return f=!1;i?o=(n<0?Qo:Ko)(a):o=n<0?a.text.length:0}else o=t;return!0}var s=t.line,o=t.ch,u=n,a=Es(e,s),f=!0;if(r=="char")c();else if(r=="column")c(!0);else if(r=="word"||r=="group"){var h=null,p=r=="group";for(var d=!0;;d=!1){if(n<0&&!c(!d))break;var v=a.text.charAt(o)||"\n",m=No(v)?"w":p&&v=="\n"?"n":!p||/\s/.test(v)?null:"p";p&&!d&&!m&&(m="s");if(h&&h!=m){n<0&&(n=1,c());break}m&&(h=m);if(n>0&&!c(!d))break}}var g=Ft(e,ht(s,o),u,!0);return f||(g.hitSide=!0),g}function Jr(e,t,n,r){var i=e.doc,s=t.left,o;if(r=="page"){var u=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);o=t.top+n*(u-(n<0?1.5:.5)*wn(e.display))}else r=="line"&&(o=n>0?t.bottom+3:t.top-3);for(;;){var a=gn(e,s,o);if(!a.outside)break;if(n<0?o<=0:o>=i.height){a.hitSide=!0;break}o+=n*5}return a}function Kr(e,t){var n=Es(e,t.line).text,r=t.ch,i=t.ch;if(n){(t.xRel<0||i==n.length)&&r?--r:++i;var s=n.charAt(r),o=No(s)?No:/\s/.test(s)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!No(e)};while(r>0&&o(n.charAt(r-1)))--r;while(i<n.length&&o(n.charAt(i)))++i}return new yt(ht(t.line,r),ht(t.line,i))}function Yr(e,t,n,r){N.defaults[e]=t,n&&(Gr[e]=r?function(e,t,r){r!=Zr&&n(e,t,r)}:n)}function fi(e){return typeof e=="string"?ai[e]:e}function mi(e,t,n,r,i){if(r&&r.shared)return yi(e,t,n,r,i);if(e.cm&&!e.cm.curOp)return Cn(e.cm,mi)(e,t,n,r,i);var s=new di(e,i),o=pt(t,n);r&&So(r,s);if(o>0||o==0&&s.clearWhenEmpty!==!1)return s;s.replacedWith&&(s.collapsed=!0,s.widgetNode=Ao("span",[s.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||(s.widgetNode.ignoreEvents=!0),r.insertLeft&&(s.widgetNode.insertLeft=!0));if(s.collapsed){if(ji(e,t.line,t,n,s)||t.line!=n.line&&ji(e,n.line,t,n,s))throw new Error("Inserting collapsed marker partially overlapping an existing one");T=!0}s.addToHistory&&Ds(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var u=t.line,a=e.cm,f;e.iter(u,n.line+1,function(e){a&&s.collapsed&&!a.options.lineWrapping&&Fi(e)==a.display.maxLine&&(f=!0),s.collapsed&&u!=t.line&&Ts(e,0),Si(e,new bi(s,u==t.line?t.ch:null,u==n.line?n.ch:null)),++u}),s.collapsed&&e.iter(t.line,n.line+1,function(t){Ui(e,t)&&Ts(t,0)}),s.clearOnEnter&&Qs(s,"beforeCursorEnter",function(){s.clear()}),s.readOnly&&(x=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),s.collapsed&&(s.id=++vi,s.atomic=!0);if(a){f&&(a.curOp.updateMaxLine=!0);if(s.collapsed)Mn(a,t.line,n.line+1);else if(s.className||s.title||s.startStyle||s.endStyle)for(var l=t.line;l<=n.line;l++)_n(a,l,"text");s.atomic&&Bt(a.doc),to(a,"markerAdded",a,s)}return s}function yi(e,t,n,r,i){r=So(r),r.shared=!1;var s=[mi(e,t,n,r,i)],o=s[0],u=r.widgetNode;return bs(e,function(e){u&&(r.widgetNode=u.cloneNode(!0)),s.push(mi(e,St(e,t),St(e,n),r,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;o=go(s)}),new gi(s,o)}function bi(e,t,n){this.marker=e,this.from=t,this.to=n}function wi(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Ei(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n||(n=[])).push(e[r]);return n}function Si(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}function xi(e,t,n){if(e)for(var r=0,i;r<e.length;++r){var s=e[r],o=s.marker,u=s.from==null||(o.inclusiveLeft?s.from<=t:s.from<t);if(u||s.from==t&&o.type=="bookmark"&&(!n||!s.marker.insertLeft)){var a=s.to==null||(o.inclusiveRight?s.to>=t:s.to>t);(i||(i=[])).push(new bi(o,s.from,a?null:s.to))}}return i}function Ti(e,t,n){if(e)for(var r=0,i;r<e.length;++r){var s=e[r],o=s.marker,u=s.to==null||(o.inclusiveRight?s.to>=t:s.to>t);if(u||s.from==t&&o.type=="bookmark"&&(!n||s.marker.insertLeft)){var a=s.from==null||(o.inclusiveLeft?s.from<=t:s.from<t);(i||(i=[])).push(new bi(o,a?null:s.from-t,s.to==null?null:s.to-t))}}return i}function Ni(e,t){var n=Tt(e,t.from.line)&&Es(e,t.from.line).markedSpans,r=Tt(e,t.to.line)&&Es(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,s=t.to.ch,o=pt(t.from,t.to)==0,u=xi(n,i,o),a=Ti(r,s,o),f=t.text.length==1,l=go(t.text).length+(f?i:0);if(u)for(var c=0;c<u.length;++c){var h=u[c];if(h.to==null){var p=wi(a,h.marker);p?f&&(h.to=p.to==null?null:p.to+l):h.to=i}}if(a)for(var c=0;c<a.length;++c){var h=a[c];h.to!=null&&(h.to+=l);if(h.from==null){var p=wi(u,h.marker);p||(h.from=l,f&&(u||(u=[])).push(h))}else h.from+=l,f&&(u||(u=[])).push(h)}u&&(u=Ci(u)),a&&a!=u&&(a=Ci(a));var d=[u];if(!f){var v=t.text.length-2,m;if(v>0&&u)for(var c=0;c<u.length;++c)u[c].to==null&&(m||(m=[])).push(new bi(u[c].marker,null,null));for(var c=0;c<v;++c)d.push(m);d.push(a)}return d}function Ci(e){for(var t=0;t<e.length;++t){var n=e[t];n.from!=null&&n.from==n.to&&n.marker.clearWhenEmpty!==!1&&e.splice(t--,1)}return e.length?e:null}function ki(e,t){var n=Is(e,t),r=Ni(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var s=n[i],o=r[i];if(s&&o)e:for(var u=0;u<o.length;++u){var a=o[u];for(var f=0;f<s.length;++f)if(s[f].marker==a.marker)continue e;s.push(a)}else o&&(n[i]=o)}return n}function Li(e,t,n){var r=null;e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;n.readOnly&&(!r||bo(r,n)==-1)&&(r||(r=[])).push(n)}});if(!r)return null;var i=[{from:t,to:n}];for(var s=0;s<r.length;++s){var o=r[s],u=o.find(0);for(var a=0;a<i.length;++a){var f=i[a];if(pt(f.to,u.from)<0||pt(f.from,u.to)>0)continue;var l=[a,1],c=pt(f.from,u.from),h=pt(f.to,u.to);(c<0||!o.inclusiveLeft&&!c)&&l.push({from:f.from,to:u.from}),(h>0||!o.inclusiveRight&&!h)&&l.push({from:u.to,to:f.to}),i.splice.apply(i,l),a+=l.length-1}}return i}function Ai(e){var t=e.markedSpans;if(!t)return;for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}function Oi(e,t){if(!t)return;for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}function Mi(e){return e.inclusiveLeft?-1:0}function _i(e){return e.inclusiveRight?1:0}function Di(e,t){var n=e.lines.length-t.lines.length;if(n!=0)return n;var r=e.find(),i=t.find(),s=pt(r.from,i.from)||Mi(e)-Mi(t);if(s)return-s;var o=pt(r.to,i.to)||_i(e)-_i(t);return o?o:t.id-e.id}function Pi(e,t){var n=T&&e.markedSpans,r;if(n)for(var i,s=0;s<n.length;++s)i=n[s],i.marker.collapsed&&(t?i.from:i.to)==null&&(!r||Di(r,i.marker)<0)&&(r=i.marker);return r}function Hi(e){return Pi(e,!0)}function Bi(e){return Pi(e,!1)}function ji(e,t,n,r,i){var s=Es(e,t),o=T&&s.markedSpans;if(o)for(var u=0;u<o.length;++u){var a=o[u];if(!a.marker.collapsed)continue;var f=a.marker.find(0),l=pt(f.from,n)||Mi(a.marker)-Mi(i),c=pt(f.to,r)||_i(a.marker)-_i(i);if(l>=0&&c<=0||l<=0&&c>=0)continue;if(l<=0&&(pt(f.to,n)||_i(a.marker)-Mi(i))>0||l>=0&&(pt(f.from,r)||Mi(a.marker)-_i(i))<0)return!0}}function Fi(e){var t;while(t=Hi(e))e=t.find(-1,!0).line;return e}function Ii(e){var t,n;while(t=Bi(e))e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function qi(e,t){var n=Es(e,t),r=Fi(n);return n==r?t:Ns(r)}function Ri(e,t){if(t>e.lastLine())return t;var n=Es(e,t),r;if(!Ui(e,n))return t;while(r=Bi(n))n=r.find(1,!0).line;return Ns(n)+1}function Ui(e,t){var n=T&&t.markedSpans;if(n)for(var r,i=0;i<n.length;++i){r=n[i];if(!r.marker.collapsed)continue;if(r.from==null)return!0;if(r.marker.widgetNode)continue;if(r.from==0&&r.marker.inclusiveLeft&&zi(e,t,r))return!0}}function zi(e,t,n){if(n.to==null){var r=n.marker.find(1,!0);return zi(e,r.line,wi(r.line.markedSpans,n.marker))}if(n.marker.inclusiveRight&&n.to==t.text.length)return!0;for(var i,s=0;s<t.markedSpans.length;++s){i=t.markedSpans[s];if(i.marker.collapsed&&!i.marker.widgetNode&&i.from==n.to&&(i.to==null||i.to!=n.from)&&(i.marker.inclusiveLeft||n.marker.inclusiveRight)&&zi(e,t,i))return!0}}function Xi(e,t,n){ks(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Rr(e,null,n)}function Vi(e){return e.height!=null?e.height:(Do(document.body,e.node)||_o(e.cm.display.measure,Ao("div",[e.node],null,"position: relative")),e.height=e.node.offsetHeight)}function $i
-(e,t,n,r){var i=new Wi(e,n,r);return i.noHScroll&&(e.display.alignWidgets=!0),Xr(e,t,"widget",function(t){var n=t.widgets||(t.widgets=[]);i.insertAt==null?n.push(i):n.splice(Math.min(n.length-1,Math.max(0,i.insertAt)),0,i),i.line=t;if(!Ui(e.doc,t)){var r=ks(t)<e.doc.scrollTop;Ts(t,t.height+Vi(i)),r&&Rr(e,null,i.height),e.curOp.forceUpdate=!0}return!0}),i}function Ki(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),e.order!=null&&(e.order=null),Ai(e),Oi(e,n);var i=r?r(e):1;i!=e.height&&Ts(e,i)}function Qi(e){e.parent=null,Ai(e)}function Gi(e,t,n,r,i,s){var o=n.flattenSpans;o==null&&(o=e.options.flattenSpans);var u=0,a=null,f=new pi(t,e.options.tabSize),l;t==""&&n.blankLine&&n.blankLine(r);while(!f.eol()){f.pos>e.options.maxHighlightLength?(o=!1,s&&es(e,t,r,f.pos),f.pos=t.length,l=null):l=n.token(f,r);if(e.options.addModeClass){var c=N.innerMode(n,r).mode.name;c&&(l="m-"+(l?c+" "+l:c))}if(!o||a!=l)u<f.start&&i(f.start,a),u=f.start,a=l;f.start=f.pos}while(u<f.pos){var h=Math.min(f.pos,u+5e4);i(h,a),u=h}}function Yi(e,t,n,r){var i=[e.state.modeGen];Gi(e,t.text,e.doc.mode,n,function(e,t){i.push(e,t)},r);for(var s=0;s<e.state.overlays.length;++s){var o=e.state.overlays[s],u=1,a=0;Gi(e,t.text,o.mode,!0,function(e,t){var n=u;while(a<e){var r=i[u];r>e&&i.splice(u,1,e,i[u+1],r),u+=2,a=Math.min(e,r)}if(!t)return;if(o.opaque)i.splice(n,u-n,e,t),u=n+2;else for(;n<u;n+=2){var s=i[n+1];i[n+1]=s?s+" "+t:t}})}return i}function Zi(e,t){if(!t.styles||t.styles[0]!=e.state.modeGen)t.styles=Yi(e,t,t.stateAfter=Vt(e,Ns(t)));return t.styles}function es(e,t,n,r){var i=e.doc.mode,s=new pi(t,e.options.tabSize);s.start=s.pos=r||0,t==""&&i.blankLine&&i.blankLine(n);while(!s.eol()&&s.pos<=e.options.maxHighlightLength)i.token(s,n),s.start=s.pos}function rs(e,t){if(!e)return null;for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";t[r]==null?t[r]=n[2]:(new RegExp("(?:^|s)"+n[2]+"(?:$|s)")).test(t[r])||(t[r]+=" "+n[2])}if(/^\s*$/.test(e))return null;var i=t.cm.options.addModeClass?ns:ts;return i[e]||(i[e]=e.replace(/\S+/g,"cm-$&"))}function is(e,t){var n=Ao("span",null,null,u?"padding-right: .1px":null),r={pre:Ao("pre",[n]),content:n,col:0,pos:0,cm:e};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var s=i?t.rest[i-1]:t.line,a;r.pos=0,r.addToken=os,(o||u)&&e.getOption("lineWrapping")&&(r.addToken=us(r.addToken)),Ro(e.display.measure)&&(a=Ls(s))&&(r.addToken=as(r.addToken,a)),r.map=[],ls(s,r,Zi(e,s)),r.map.length==0&&r.map.push(0,0,r.content.appendChild(Io(e.display.measure))),i==0?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return Ys(e,"renderLine",e,t.line,r.pre),r}function ss(e){var t=Ao("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t}function os(e,t,n,i,s,o){if(!t)return;var u=e.cm.options.specialChars,a=!1;if(!u.test(t)){e.col+=t.length;var f=document.createTextNode(t);e.map.push(e.pos,e.pos+t.length,f),r&&(a=!0),e.pos+=t.length}else{var f=document.createDocumentFragment(),l=0;for(;;){u.lastIndex=l;var c=u.exec(t),h=c?c.index-l:t.length-l;if(h){var p=document.createTextNode(t.slice(l,l+h));r?f.appendChild(Ao("span",[p])):f.appendChild(p),e.map.push(e.pos,e.pos+h,p),e.col+=h,e.pos+=h}if(!c)break;l+=h+1;if(c[0]=="	"){var d=e.cm.options.tabSize,v=d-e.col%d,p=f.appendChild(Ao("span",mo(v),"cm-tab"));e.col+=v}else{var p=e.cm.options.specialCharPlaceholder(c[0]);r?f.appendChild(Ao("span",[p])):f.appendChild(p),e.col+=1}e.map.push(e.pos,e.pos+1,p),e.pos++}}if(n||i||s||a){var m=n||"";i&&(m+=i),s&&(m+=s);var g=Ao("span",[f],m);return o&&(g.title=o),e.content.appendChild(g)}e.content.appendChild(f)}function us(e){function t(e){var t=" ";for(var n=0;n<e.length-2;++n)t+=n%2?" ":" ";return t+=" ",t}return function(n,r,i,s,o,u){e(n,r.replace(/ {3,}/g,t),i,s,o,u)}}function as(e,t){return function(n,r,i,s,o,u){i=i?i+" cm-force-border":"cm-force-border";var a=n.pos,f=a+r.length;for(;;){for(var l=0;l<t.length;l++){var c=t[l];if(c.to>a&&c.from<=a)break}if(c.to>=f)return e(n,r,i,s,o,u);e(n,r.slice(0,c.to-a),i,s,null,u),s=null,r=r.slice(c.to-a),a=c.to}}}function fs(e,t,n,r){var i=!r&&n.widgetNode;i&&(e.map.push(e.pos,e.pos+t,i),e.content.appendChild(i)),e.pos+=t}function ls(e,t,n){var r=e.markedSpans,i=e.text,s=0;if(!r){for(var o=1;o<n.length;o+=2)t.addToken(t,i.slice(s,s=n[o]),rs(n[o+1],t));return}var u=i.length,a=0,o=1,f="",l,c=0,h,p,d,v,m;for(;;){if(c==a){h=p=d=v="",m=null,c=Infinity;var g=[];for(var y=0;y<r.length;++y){var b=r[y],w=b.marker;b.from<=a&&(b.to==null||b.to>a)?(b.to!=null&&c>b.to&&(c=b.to,p=""),w.className&&(h+=" "+w.className),w.startStyle&&b.from==a&&(d+=" "+w.startStyle),w.endStyle&&b.to==c&&(p+=" "+w.endStyle),w.title&&!v&&(v=w.title),w.collapsed&&(!m||Di(m.marker,w)<0)&&(m=b)):b.from>a&&c>b.from&&(c=b.from),w.type=="bookmark"&&b.from==a&&w.widgetNode&&g.push(w)}if(m&&(m.from||0)==a){fs(t,(m.to==null?u+1:m.to)-a,m.marker,m.from==null);if(m.to==null)return}if(!m&&g.length)for(var y=0;y<g.length;++y)fs(t,0,g[y])}if(a>=u)break;var E=Math.min(u,c);for(;;){if(f){var S=a+f.length;if(!m){var x=S>E?f.slice(0,E-a):f;t.addToken(t,x,l?l+h:h,d,a+x.length==c?p:"",v)}if(S>=E){f=f.slice(E-a),a=E;break}a=S,d=""}f=i.slice(s,s=n[o++]),l=rs(n[o++],t)}}}function cs(e,t){return t.from.ch==0&&t.to.ch==0&&go(t.text)==""&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function hs(e,t,n,r){function i(e){return n?n[e]:null}function s(e,n,i){Ki(e,n,i,r),to(e,"change",e,t)}var o=t.from,u=t.to,a=t.text,f=Es(e,o.line),l=Es(e,u.line),c=go(a),h=i(a.length-1),p=u.line-o.line;if(cs(e,t)){for(var d=0,v=[];d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));s(l,l.text,h),p&&e.remove(o.line,p),v.length&&e.insert(o.line,v)}else if(f==l)if(a.length==1)s(f,f.text.slice(0,o.ch)+c+f.text.slice(u.ch),h);else{for(var v=[],d=1;d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));v.push(new Ji(c+f.text.slice(u.ch),h,r)),s(f,f.text.slice(0,o.ch)+a[0],i(0)),e.insert(o.line+1,v)}else if(a.length==1)s(f,f.text.slice(0,o.ch)+a[0]+l.text.slice(u.ch),i(0)),e.remove(o.line+1,p);else{s(f,f.text.slice(0,o.ch)+a[0],i(0)),s(l,c+l.text.slice(u.ch),h);for(var d=1,v=[];d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));p>1&&e.remove(o.line+1,p-1),e.insert(o.line+1,v)}to(e,"change",e,t)}function ps(e){this.lines=e,this.parent=null;for(var t=0,n=0;t<e.length;++t)e[t].parent=this,n+=e[t].height;this.height=n}function ds(e){this.children=e;var t=0,n=0;for(var r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}function bs(e,t,n){function r(e,i,s){if(e.linked)for(var o=0;o<e.linked.length;++o){var u=e.linked[o];if(u.doc==i)continue;var a=s&&u.sharedHist;if(n&&!a)continue;t(u.doc,a),r(u.doc,e,a)}}r(e,null,!0)}function ws(e,t){if(t.cm)throw new Error("This document is already in use.");e.doc=t,t.cm=e,M(e),k(e),e.options.lineWrapping||j(e),e.options.mode=t.modeOption,Mn(e)}function Es(e,t){t-=e.first;if(t<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],s=i.chunkSize();if(t<s){n=i;break}t-=s}return n.lines[t]}function Ss(e,t,n){var r=[],i=t.line;return e.iter(t.line,n.line+1,function(e){var s=e.text;i==n.line&&(s=s.slice(0,n.ch)),i==t.line&&(s=s.slice(t.ch)),r.push(s),++i}),r}function xs(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function Ts(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function Ns(e){if(e.parent==null)return null;var t=e.parent,n=bo(t.lines,e);for(var r=t.parent;r;t=r,r=r.parent)for(var i=0;;++i){if(r.children[i]==t)break;n+=r.children[i].chunkSize()}return n+t.first}function Cs(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],s=i.height;if(t<s){e=i;continue e}t-=s,n+=i.chunkSize()}return n}while(!e.lines);for(var r=0;r<e.lines.length;++r){var o=e.lines[r],u=o.height;if(t<u)break;t-=u}return n+r}function ks(e){e=Fi(e);var t=0,n=e.parent;for(var r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var s=n.parent;s;n=s,s=n.parent)for(var r=0;r<s.children.length;++r){var o=s.children[r];if(o==n)break;t+=o.height}return t}function Ls(e){var t=e.order;return t==null&&(t=e.order=su(e.text)),t}function As(e){this.done=[],this.undone=[],this.undoDepth=Infinity,this.lastModTime=this.lastSelTime=0,this.lastOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Os(e,t){var n={from:dt(t.from),to:Tr(t),text:Ss(e,t.from,t.to)};return js(e,n,t.from.line,t.to.line+1),bs(e,function(e){js(e,n,t.from.line,t.to.line+1)},!0),n}function Ms(e){while(e.length){var t=go(e);if(!t.ranges)break;e.pop()}}function _s(e,t){if(t)return Ms(e.done),go(e.done);if(e.done.length&&!go(e.done).ranges)return go(e.done);if(e.done.length>1&&!e.done[e.done.length-2].ranges)return e.done.pop(),go(e.done)}function Ds(e,t,n,r){var i=e.history;i.undone.length=0;var s=+(new Date),o;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&(t.origin.charAt(0)=="+"&&e.cm&&i.lastModTime>s-e.cm.options.historyEventDelay||t.origin.charAt(0)=="*"))&&(o=_s(i,i.lastOp==r))){var u=go(o.changes);pt(t.from,t.to)==0&&pt(t.from,u.to)==0?u.to=Tr(t):o.changes.push(Os(e,t))}else{var a=go(i.done);(!a||!a.ranges)&&Bs(e.sel,i.done),o={changes:[Os(e,t)],generation:i.generation},i.done.push(o);while(i.done.length>i.undoDepth)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,u||Ys(e,"historyAdded")}function Ps(e,t,n,r){var i=t.charAt(0);return i=="*"||i=="+"&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function Hs(e,t,n,r){var i=e.history,s=r&&r.origin;n==i.lastOp||s&&i.lastSelOrigin==s&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==s||Ps(e,s,go(i.done),t))?i.done[i.done.length-1]=t:Bs(t,i.done),i.lastSelTime=+(new Date),i.lastSelOrigin=s,i.lastOp=n,r&&r.clearRedo!==!1&&Ms(i.undone)}function Bs(e,t){var n=go(t);n&&n.ranges&&n.equals(e)||t.push(e)}function js(e,t,n,r){var i=t["spans_"+e.id],s=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[s]=n.markedSpans),++s})}function Fs(e){if(!e)return null;for(var t=0,n;t<e.length;++t)e[t].marker.explicitlyCleared?n||(n=e.slice(0,t)):n&&n.push(e[t]);return n?n.length?n:null:e}function Is(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=0,i=[];r<t.text.length;++r)i.push(Fs(n[r]));return i}function qs(e,t,n){for(var r=0,i=[];r<e.length;++r){var s=e[r];if(s.ranges){i.push(n?gt.prototype.deepCopy.call(s):s);continue}var o=s.changes,u=[];i.push({changes:u});for(var a=0;a<o.length;++a){var f=o[a],l;u.push({from:f.from,to:f.to,text:f.text});if(t)for(var c in f)(l=c.match(/^spans_(\d+)$/))&&bo(t,Number(l[1]))>-1&&(go(u)[c]=f[c],delete f[c])}}return i}function Rs(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function Us(e,t,n,r){for(var i=0;i<e.length;++i){var s=e[i],o=!0;if(s.ranges){s.copied||(s=e[i]=s.deepCopy(),s.copied=!0);for(var u=0;u<s.ranges.length;u++)Rs(s.ranges[u].anchor,t,n,r),Rs(s.ranges[u].head,t,n,r);continue}for(var u=0;u<s.changes.length;++u){var a=s.changes[u];if(n<a.from.line)a.from=ht(a.from.line+r,a.from.ch),a.to=ht(a.to.line+r,a.to.ch);else if(t<=a.to.line){o=!1;break}}o||(e.splice(0,i+1),i=0)}}function zs(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;Us(e.done,n,r,i),Us(e.undone,n,r,i)}function Vs(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==0}function Js(e){return e.target||e.srcElement}function Ks(e){var t=e.which;return t==null&&(e.button&1?t=1:e.button&2?t=3:e.button&4&&(t=2)),y&&e.ctrlKey&&t==1&&(t=3),t}function to(e,t){function i(e){return function(){e.apply(null,r)}}var n=e._handlers&&e._handlers[t];if(!n)return;var r=Array.prototype.slice.call(arguments,2);Zs||(++eo,Zs=[],setTimeout(no,0));for(var s=0;s<n.length;++s)Zs.push(i(n[s]))}function no(){--eo;var e=Zs;Zs=null;for(var t=0;t<e.length;++t)e[t]()}function ro(e,t,n){return Ys(e,n||t.type,e,t),Vs(t)||t.codemirrorIgnore}function io(e,t){var n=e._handlers&&e._handlers[t];return n&&n.length>0}function so(e){e.prototype.on=function(e,t){Qs(this,e,t)},e.prototype.off=function(e,t){Gs(this,e,t)}}function co(){this.id=null}function po(e,t,n){for(var r=0,i=0;;){var s=e.indexOf("	",r);s==-1&&(s=e.length);var o=s-r;if(s==e.length||i+o>=t)return r+Math.min(o,t-i);i+=s-r,i+=n-i%n,r=s+1;if(i>=t)return r}}function mo(e){while(vo.length<=e)vo.push(go(vo)+" ");return vo[e]}function go(e){return e[e.length-1]}function bo(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}function wo(e,t){var n=[];for(var r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Eo(e,t){var n;if(Object.create)n=Object.create(e);else{var r=function(){};r.prototype=e,n=new r}return t&&So(t,n),n}function So(e,t){t||(t={});for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function xo(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function Co(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function Lo(e){return e.charCodeAt(0)>=768&&ko.test(e)}function Ao(e,t,n,r){var i=document.createElement(e);n&&(i.className=n),r&&(i.style.cssText=r);if(typeof t=="string")i.appendChild(document.createTextNode(t));else if(t)for(var s=0;s<t.length;++s)i.appendChild(t[s]);return i}function Mo(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function _o(e,t){return Mo(e).appendChild(t)}function Do(e,t){if(e.contains)return e.contains(t);while(t=t.parentNode)if(t==e)return!0}function Po(){return document.activeElement}function jo(e){if(Bo!=null)return Bo;var t=Ao("div",null,null,"width: 50px; height: 50px; overflow-x: scroll");return _o(e,t),t.offsetWidth&&(Bo=t.offsetHeight-t.clientHeight),Bo||0}function Io(e){if(Fo==null){var t=Ao("span","​");_o(e,Ao("span",[t,document.createTextNode("x")])),e.firstChild.offsetHeight!=0&&(Fo=t.offsetWidth<=1&&t.offsetHeight>2&&!n)}return Fo?Ao("span","​"):Ao("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px")}function Ro(e){if(qo!=null)return qo;var t=_o(e,document.createTextNode("AخA")),n=Oo(t,0,1).getBoundingClientRect();if(n.left==n.right)return!1;var r=Oo(t,1,2).getBoundingClientRect();return qo=r.right-n.right<3}function Vo(e,t,n,r){if(!e)return r(t,n,"ltr");var i=!1;for(var s=0;s<e.length;++s){var o=e[s];if(o.from<n&&o.to>t||t==n&&o.to==t)r(Math.max(o.from,t),Math.min(o.to,n),o.level==1?"rtl":"ltr"),i=!0}i||r(t,n,"ltr")}function $o(e){return e.level%2?e.to:e.from}function Jo(e){return e.level%2?e.from:e.to}function Ko(e){var t=Ls(e);return t?$o(t[0]):0}function Qo(e){var t=Ls(e);return t?Jo(go(t)):e.text.length}function Go(e,t){var n=Es(e.doc,t),r=Fi(n);r!=n&&(t=Ns(r));var i=Ls(r),s=i?i[0].level%2?Qo(r):Ko(r):0;return ht(t,s)}function Yo(e,t){var n,r=Es(e.doc,t);while(n=Bi(r))r=n.find(1,!0).line,t=null;var i=Ls(r),s=i?i[0].level%2?Ko(r):Qo(r):r.text.length;return ht(t==null?Ns(r):t,s)}function Zo(e,t,n){var r=e[0].level;return t==r?!0:n==r?!1:t<n}function tu(e,t){eu=null;for(var n=0,r;n<e.length;++n){var i=e[n];if(i.from<t&&i.to>t)return n;if(i.from==t||i.to==t){if(r!=null)return Zo(e,i.level,e[r].level)?(i.from!=i.to&&(eu=r),n):(i.from!=i.to&&(eu=n),r);r=n}}return r}function nu(e,t,n,r){if(!r)return t+n;do t+=n;while(t>0&&Lo(e.text.charAt(t)));return t}function ru(e,t,n,r){var i=Ls(e);if(!i)return iu(e,t,n,r);var s=tu(i,t),o=i[s],u=nu(e,t,o.level%2?-n:n,r);for(;;){if(u>o.from&&u<o.to)return u;if(u==o.from||u==o.to)return tu(i,u)==s?u:(o=i[s+=n],n>0==o.level%2?o.to:o.from);o=i[s+=n];if(!o)return null;n>0==o.level%2?u=nu(e,o.to,-1,r):u=nu(e,o.from,1,r)}}function iu(e,t,n,r){var i=t+n;if(r)while(i>0&&Lo(e.text.charAt(i)))i+=n;return i<0||i>e.text.length?null:i}var e=/gecko\/\d/i.test(navigator.userAgent),t=/MSIE \d/.test(navigator.userAgent),n=t&&(document.documentMode==null||document.documentMode<8),r=t&&(document.documentMode==null||document.documentMode<9),i=t&&(document.documentMode==null||document.documentMode<10),s=/Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent),o=t||s,u=/WebKit\//.test(navigator.userAgent),a=u&&/Qt\/\d+\.\d+/.test(navigator.userAgent),f=/Chrome\//.test(navigator.userAgent),l=/Opera\//.test(navigator.userAgent),c=/Apple Computer/.test(navigator.vendor),h=/KHTML\//.test(navigator.userAgent),p=/Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),v=/PhantomJS/.test(navigator.userAgent),m=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),g=m||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),y=m||/Mac/.test(navigator.platform),b=/win/i.test(navigator.platform),w=l&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);w&&(w=Number(w[1])),w&&w>=15&&(l=!1,u=!0);var E=y&&(a||l&&(w==null||w<12.11)),S=e||o&&!r,x=!1,T=!1,ht=N.Pos=function(e,t){if(!(this instanceof ht))return new ht(e,t);this.line=e,this.ch=t},pt=N.cmpPos=function(e,t){return e.line-t.line||e.ch-t.ch};gt.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(pt(n.anchor,r.anchor)!=0||pt(n.head,r.head)!=0)return!1}return!0},deepCopy:function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new yt(dt(this.ranges[t].anchor),dt(this.ranges[t].head));return new gt(e,this.primIndex)},somethingSelected:function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},contains:function(e,t){t||(t=e);for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(pt(t,r.from())>=0&&pt(e,r.to())<=0)return n}return-1}},yt.prototype={from:function(){return mt(this.anchor,this.head)},to:function(){return vt(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var rn={left:0,right:0,top:0,bottom:0},bn,Sn=0,Kn,Qn,nr=0,ur=0,ar=null;o?ar=-0.53:e?ar=15:f?ar=-0.7:c&&(ar=-1/3);var hr,vr=null,Er,Tr=N.changeEnd=function(e){return e.text?ht(e.from.line+e.text.length-1,go(e.text).length+(e.text.length==1?e.from.ch:0)):e.to};N.prototype={constructor:N,focus:function(){window.focus(),Un(this),In(this)},setOption:function(e,t){var n=this.options,r=n[e];if(n[e]==t&&e!="mode")return;n[e]=t,Gr.hasOwnProperty(e)&&Cn(this,Gr[e])(this,t,r)},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](e)},removeKeyMap:function(e){var t=this.state.keyMaps;for(var n=0;n<t.length;++n)if(t[n]==e||typeof t[n]!="string"&&t[n].name==e)return t.splice(n,1),!0},addOverlay:kn(function(e,t){var n=e.token?e:N.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:n,modeSpec:e,opaque:t&&t.opaque}),this.state.modeGen++,Mn(this)}),removeOverlay:kn(function(e){var t=this.state.overlays;for(var n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||typeof e=="string"&&r.name==e){t.splice(n,1),this.state.modeGen++,Mn(this);return}}}),indentLine:kn(function(e,t,n){typeof t!="string"&&typeof t!="number"&&(t==null?t=this.options.smartIndent?"smart":"prev":t=t?"add":"subtract"),Tt(this.doc,e)&&Wr(this,e,t,n)}),indentSelection:kn(function(e){var t=this.doc.sel.ranges,n=-1;for(var r=0;r<t.length;r++){var i=t[r];if(!i.empty()){var s=Math.max(n,i.from().line),o=i.to();n=Math.min(this.lastLine(),o.line-(o.ch?0:1))+1;for(var u=s;u<n;++u)Wr(this,u,e)}else i.head.line>n&&(Wr(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Ur(this))}}),getTokenAt:function(e,t){var n=this.doc;e=St(n,e);var r=Vt(this,e.line,t),i=this.doc.mode,s=Es(n,e.line),o=new pi(s.text,this.options.tabSize);while(o.pos<e.ch&&!o.eol()){o.start=o.pos;var u=i.token(o,r)}return{start:o.start,end:o.pos,string:o.current(),type:u||null,state:r}},getTokenTypeAt:function(e){e=St(this.doc,e);var t=Zi(this,Es(this.doc,e.line)),n=0,r=(t.length-1)/2,i=e.ch;if(i==0)return t[2];for(;;){var s=n+r>>1;if((s?t[s*2-1]:0)>=i)r=s;else{if(!(t[s*2+1]<i))return t[s*2+2];n=s+1}}},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?N.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!ii.hasOwnProperty(t))return ii;var r=ii[t],i=this.getModeAt(e);if(typeof i[t]=="string")r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var s=0;s<i[t].length;s++){var o=r[i[t][s]];o&&n.push(o)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var u=r._global[s];u.pred(i,this)&&bo(n,u.val)==-1&&n.push(u.val)}return n},getStateAfter:function(e,t){var n=this.doc;return e=Et(n,e==null?n.first+n.size-1:e),Vt(this,e+1,t)},cursorCoords:function(e,t){var n,r=this.doc.sel.primary();return e==null?n=r.head:typeof e=="object"?n=St(this.doc,e):n=e?r.from():r.to(),dn(this,n,t||"page")},charCoords:function(e,t){return pn(this,St(this.doc,e),t||"page")},coordsChar:function(e,t){return e=hn(this,e,t||"page"),gn(this,e.left,e.top)},lineAtHeight:function(e,t){return e=hn(this,{top:e,left:0},t||"page").top,Cs(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t){var n=!1,r=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>r&&(e=r,n=!0);var i=Es(this.doc,e);return cn(this,i,{top:0,left:0},t||"page").top+(n?this.doc.height-ks(i):0)},defaultTextHeight:function(){return wn(this.display)},defaultCharWidth:function(){return En(this.display)},setGutterMarker:kn(function(e,t,n){return Xr(this,e,"gutter",function(e){var r=e.gutterMarkers||(e.gutterMarkers={});return r[t]=n,!n&&Co(r)&&(e.gutterMarkers=null),!0})}),clearGutter:kn(function(e){var t=this,n=t.doc,r=n.first;n.iter(function(n){n.gutterMarkers&&n.gutterMarkers[e]&&(n.gutterMarkers[e]=null,_n(t,r,"gutter"),Co(n.gutterMarkers)&&(n.gutterMarkers=null)),++r})}),addLineClass:kn(function(e,t,n){return Xr(this,e,"class",function(e){var r=t=="text"?"textClass":t=="background"?"bgClass":"wrapClass";if(!e[r])e[r]=n;else{if((new RegExp("(?:^|\\s)"+n+"(?:$|\\s)")).test(e[r]))return!1;e[r]+=" "+n}return!0})}),removeLineClass:kn(function(e,t,n){return Xr(this,e,"class",function(e){var r=t=="text"?"textClass":t=="background"?"bgClass":"wrapClass",i=e[r];if(!i)return!1;if(n==null)e[r]=null;else{var s=i.match(new RegExp("(?:^|\\s+)"+n+"(?:$|\\s+)"));if(!s)return!1;var o=s.index+s[0].length;e[r]=i.slice(0,s.index)+(!s.index||o==i.length?"":" ")+i.slice(o)||null}return!0})}),addLineWidget:kn(function(e,t,n){return $i(this,e,t,n)}),removeLineWidget:function(e){e.clear()},lineInfo:function(e){if(typeof e=="number"){if(!Tt(this.doc,e))return null;var t=e;e=Es(this.doc,e);if(!e)return null}else{var t=Ns(e);if(t==null)return null}return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var s=this.display;e=dn(this,St(this.doc,e));var o=e.bottom,u=e.left;t.style.position="absolute",s.sizer.appendChild(t);if(r=="over")o=e.top;else if(r=="above"||r=="near"){var a=Math.max(s.wrapper.clientHeight,this.doc.height),f=Math.max(s.sizer.clientWidth,s.lineSpace.clientWidth);(r=="above"||e.bottom+t.offsetHeight>a)&&e.top>t.offsetHeight?o=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=a&&(o=e.bottom),u+t.offsetWidth>f&&(u=f-t.offsetWidth)}t.style.top=o+"px",t.style.left=t.style.right="",i=="right"?(u=s.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):(i=="left"?u=0:i=="middle"&&(u=(s.sizer.clientWidth-t.offsetWidth)/2),t.style.left=u+"px"),n&&Ir(this,u,o,u+t.offsetWidth,o+t.offsetHeight)},triggerOnKeyDown:kn(mr),triggerOnKeyPress:kn(yr),triggerOnKeyUp:kn(gr),execCommand:function(e){if(ui.hasOwnProperty(e))return ui[e](this)},findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var s=0,o=St(this.doc,e);s<t;++s){o=$r(this.doc,o,i,n,r);if(o.hitSide)break}return o},moveH:kn(function(e,t){var n=this;n.extendSelectionsBy(function(r){return n.display.shift||n.doc.extend||r.empty()?$r(n.doc,r.head,e,t,n.options.rtlMoveVisually):e<0?r.from():r.to()},lo)}),deleteH:kn(function(e,t){var n=this.doc.sel,r=this.doc;n.somethingSelected()?r.replaceSelection("",null,"+delete"):Vr(this,function(n){var i=$r(r,n.head,e,t,!1);return e<0?{from:i,to:n.head}:{from:n.head,to:i}})}),findPosV:function(e,t,n,r){var i=1,s=r;t<0&&(i=-1,t=-t);for(var o=0,u=St(this.doc,e);o<t;++o){var a=dn(this,u,"div");s==null?s=a.left:a.left=s,u=Jr(this,a,i,n);if(u.hitSide)break}return u},moveV:kn(function(e,t){var n=this,r=this.doc,i=[],s=!n.display.shift&&!r.extend&&r.sel.somethingSelected();r.extendSelectionsBy(function(o){if(s)return e<0?o.from():o.to();var u=dn(n,o.head,"div");o.goalColumn!=null&&(u.left=o.goalColumn),i.push(u.left);var a=Jr(n,u,e,t);return t=="page"&&o==r.sel.primary()&&Rr(n,null,pn(n,a,"div").top-u.top),a},lo);if(i.length)for(var o=0;o<r.sel.ranges.length;o++)r.sel.ranges[o].goalColumn=i[o]}),toggleOverwrite:function(e){if(e!=null&&e==this.state.overwrite)return;(this.state.overwrite=!this.state.overwrite)?this.display.cursorDiv.className+=" CodeMirror-overwrite":this.display.cursorDiv.className=this.display.cursorDiv.className.replace(" CodeMirror-overwrite",""),Ys(this,"overwriteToggle",this,this.state.overwrite)},hasFocus:function(){return Po()==this.display.input},scrollTo:kn(function(e,t){(e!=null||t!=null)&&zr(this),e!=null&&(this.curOp.scrollLeft=e),t!=null&&(this.curOp.scrollTop=t)}),getScrollInfo:function(){var e=this.display.scroller,t=oo;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-t,width:e.scrollWidth-t,clientHeight:e.clientHeight-t,clientWidth:e.clientWidth-t}},scrollIntoView:kn(function(e,t){e==null?(e={from:this.doc.sel.primary().head,to:null},t==null&&(t=this.options.cursorScrollMargin)):typeof e=="number"?e={from:ht(e,0),to:null}:e.from==null&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0;if(e.from.line!=null)zr(this),this.curOp.scrollToPos=e;else{var n=qr(this,Math.min(e.from.left,e.to.left),Math.min(e.from.top,e.to.top)-e.margin,Math.max(e.from.right,e.to.right),Math.max(e.from.bottom,e.to.bottom)+e.margin);this.scrollTo(n.scrollLeft,n.scrollTop)}}),setSize:kn(function(e,t){function n(e){return typeof e=="number"||/^\d+$/.test(String(e))?e+"px":e}e!=null&&(this.display.wrapper.style.width=n(e)),t!=null&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&un(this),this.curOp.forceUpdate=!0,Ys(this,"refresh",this)}),operation:function(e){return Nn(this,e)},refresh:kn(function(){var e=this.display.cachedTextHeight;Mn(this),an(this),this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop),(e==null||Math.abs(e-wn(this.display))>.5)&&M(this),Ys(this,"refresh",this)}),swapDoc:kn(function(e){var t=this.doc;return t.cm=null,ws(this,e),an(this),Rn(this),this.scrollTo(e.scrollLeft,e.scrollTop),to(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},so(N);var Qr=N.defaults={},Gr=N.optionHandlers={},Zr=N.Init={toString:function(){return"CodeMirror.Init"}};Yr("value","",function(e,t){e.setValue(t)},!0),Yr("mode",null,function(e,t){e.doc.modeOption=t,k(e)},!0),Yr("indentUnit",2,k,!0),Yr("indentWithTabs",!1),Yr("smartIndent",!0),Yr("tabSize",4,function(e){L(e),an(e),Mn(e)},!0),Yr("specialChars",/[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g,function(e,t){e.options.specialChars=new RegExp(t.source+(t.test("	")?"":"|	"),"g"),e.refresh()},!0),Yr("specialCharPlaceholder",ss,function(e){e.refresh()},!0),Yr("electricChars",!0),Yr("rtlMoveVisually",!b),Yr("wholeLineUpdateBefore",!0),Yr("theme","default",function(e){D(e),P(e)},!0),Yr("keyMap","default",_),Yr("extraKeys",null),Yr("lineWrapping",!1,A,!0),Yr("gutters",[],function(e){F(e.options),P(e)},!0),Yr("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?X(e.display)+"px":"0",e.refresh()},!0),Yr("coverGutterNextToScrollbar",!1,q,!0),Yr("lineNumbers",!1,function(e){F(e.options),P(e)},!0),Yr("firstLineNumber",1,P,!0),Yr("lineNumberFormatter",function(e){return e},P,!0),Yr("showCursorWhenSelecting",!1,It,!0),Yr("resetSelectionOnContextMenu",!0),Yr("readOnly",!1,function(e,t){t=="nocursor"?(wr(e),e.display.input.blur(),e.display.disabled=!0):(e.display.disabled=!1,t||Rn(e))}),Yr("disableInput",!1,function(e,t){t||Rn(e)},!0),Yr("dragDrop",!0),Yr("cursorBlinkRate",530),Yr("cursorScrollMargin",0),Yr("cursorHeight",1),Yr("workTime",100),Yr("workDelay",100),Yr("flattenSpans",!0,L,!0),Yr("addModeClass",!1,L,!0),Yr("pollInterval",100),Yr("undoDepth",200,function(e,t){e.doc.history.undoDepth=t}),Yr("historyEventDelay",1250),Yr("viewportMargin",10,function(e){e.refresh()},!0),Yr("maxHighlightLength",1e4,L,!0),Yr("moveInputWithCursor",!0,function(e,t){t||(e.display.inputDiv.style.top=e.display.inputDiv.style.left=0)}),Yr("tabindex",null,function(e,t){e.display.input.tabIndex=t||""}),Yr("autofocus",null);var ei=N.modes={},ti=N.mimeModes={};N.defineMode=function(e,t){!N.defaults.mode&&e!="null"&&(N.defaults.mode=e);if(arguments.length>2){t.dependencies=[];for(var n=2;n<arguments.length;++n)t.dependencies.push(arguments[n])}ei[e]=t},N.defineMIME=function(e,t){ti[e]=t},N.resolveMode=function(e){if(typeof e=="string"&&ti.hasOwnProperty(e))e=ti[e];else if(e&&typeof e.name=="string"&&ti.hasOwnProperty(e.name)){var t=ti[e.name];typeof t=="string"&&(t={name:t}),e=Eo(t,e),e.name=t.name}else if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return N.resolveMode("application/xml");return typeof e=="string"?{name:e}:e||{name:"null"}},N.getMode=function(e,t){var t=N.resolveMode(t),n=ei[t.name];if(!n)return N.getMode(e,"text/plain");var r=n(e,t);if(ni.hasOwnProperty(t.name)){var i=ni[t.name];for(var s in i){if(!i.hasOwnProperty(s))continue;r.hasOwnProperty(s)&&(r["_"+s]=r[s]),r[s]=i[s]}}r.name=t.name,t.helperType&&(r.helperType=t.helperType);if(t.modeProps)for(var s in t.modeProps)r[s]=t.modeProps[s];return r},N.defineMode("null",function(){return{token:function(e){e.skipToEnd()}}}),N.defineMIME("text/plain","null");var ni=N.modeExtensions={};N.extendMode=function(e,t){var n=ni.hasOwnProperty(e)?ni[e]:ni[e]={};So(t,n)},N.defineExtension=function(e,t){N.prototype[e]=t},N.defineDocExtension=function(e,t){ms.prototype[e]=t},N.defineOption=Yr;var ri=[];N.defineInitHook=function(e){ri.push(e)};var ii=N.helpers={};N.registerHelper=function(e,t,n){ii.hasOwnProperty(e)||(ii[e]=N[e]={_global:[]}),ii[e][t]=n},N.registerGlobalHelper=function(e,t,n,r){N.registerHelper(e,t,r),ii[e]._global.push({pred:n,val:r})};var si=N.copyState=function(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n},oi=N.startState=function(e,t,n){return e.startState?e.startState(t,n):!0};N.innerMode=function(e,t){while(e.innerMode){var n=e.innerMode(t);if(!n||n.mode==e)break;t=n.state,e=n.mode}return n||{mode:e,state:t}};var ui=N.commands={selectAll:function(e){e.setSelection(ht(e.firstLine(),0),ht(e.lastLine()),ao)},singleSelection:function(e){e.setSelection(e.getCursor("anchor"),e.getCursor("head"),ao)},killLine:function(e){Vr(e,function(t){if(t.empty()){var n=Es(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line<e.lastLine()?{from:t.head,to:ht(t.head.line+1,0)}:{from:t.head,to:ht(t.head.line,n)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){Vr(e,function(t){return{from:ht(t.from().line,0),to:St(e.doc,ht(t.to().line+1,0))}})},delLineLeft:function(e){Vr(e,function(e){return{from:ht(e.from().line,0),to:e.from()}})},undo:function(e){e.undo()},redo:function(e){e.redo()},undoSelection:function(e){e.undoSelection()},redoSelection:function(e){e.redoSelection()},goDocStart:function(e){e.extendSelection(ht(e.firstLine(),0))},goDocEnd:function(e){e.extendSelection(ht(e.lastLine()))},goLineStart:function(e){e.extendSelectionsBy(function(t){return Go(e,t.head.line)},lo)},goLineStartSmart:function(e){e.extendSelectionsBy(function(t){var n=Go(e,t.head.line),r=e.getLineHandle(n.line),i=Ls(r);if(!i||i[0].level==0){var s=Math.max(0,r.text.search(/\S/)),o=t.head.line==n.line&&t.head.ch<=s&&t.head.ch;return ht(n.line,o?0:s)}return n},lo)},goLineEnd:function(e){e.extendSelectionsBy(function(
-t){return Yo(e,t.head.line)},lo)},goLineRight:function(e){e.extendSelectionsBy(function(t){var n=e.charCoords(t.head,"div").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:n},"div")},lo)},goLineLeft:function(e){e.extendSelectionsBy(function(t){var n=e.charCoords(t.head,"div").top+5;return e.coordsChar({left:0,top:n},"div")},lo)},goLineUp:function(e){e.moveV(-1,"line")},goLineDown:function(e){e.moveV(1,"line")},goPageUp:function(e){e.moveV(-1,"page")},goPageDown:function(e){e.moveV(1,"page")},goCharLeft:function(e){e.moveH(-1,"char")},goCharRight:function(e){e.moveH(1,"char")},goColumnLeft:function(e){e.moveH(-1,"column")},goColumnRight:function(e){e.moveH(1,"column")},goWordLeft:function(e){e.moveH(-1,"word")},goGroupRight:function(e){e.moveH(1,"group")},goGroupLeft:function(e){e.moveH(-1,"group")},goWordRight:function(e){e.moveH(1,"word")},delCharBefore:function(e){e.deleteH(-1,"char")},delCharAfter:function(e){e.deleteH(1,"char")},delWordBefore:function(e){e.deleteH(-1,"word")},delWordAfter:function(e){e.deleteH(1,"word")},delGroupBefore:function(e){e.deleteH(-1,"group")},delGroupAfter:function(e){e.deleteH(1,"group")},indentAuto:function(e){e.indentSelection("smart")},indentMore:function(e){e.indentSelection("add")},indentLess:function(e){e.indentSelection("subtract")},insertTab:function(e){e.replaceSelection("	")},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(e){Nn(e,function(){var t=e.listSelections();for(var n=0;n<t.length;n++){var r=t[n].head,i=Es(e.doc,r.line).text;r.ch>0&&r.ch<i.length-1&&e.replaceRange(i.charAt(r.ch)+i.charAt(r.ch-1),ht(r.line,r.ch-1),ht(r.line,r.ch+1))}})},newlineAndIndent:function(e){Nn(e,function(){var t=e.listSelections().length;for(var n=0;n<t;n++){var r=e.listSelections()[n];e.replaceRange("\n",r.anchor,r.head,"+input"),e.indentLine(r.from().line+1,null,!0),Ur(e)}})},toggleOverwrite:function(e){e.toggleOverwrite()}},ai=N.keyMap={};ai.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},ai.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},ai.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineStart","Cmd-Right":"goLineEnd","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delLineLeft","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection",fallthrough:["basic","emacsy"]},ai.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},ai["default"]=y?ai.macDefault:ai.pcDefault;var li=N.lookupKey=function(e,t,n){function r(t){t=fi(t);var i=t[e];if(i===!1)return"stop";if(i!=null&&n(i))return!0;if(t.nofallthrough)return"stop";var s=t.fallthrough;if(s==null)return!1;if(Object.prototype.toString.call(s)!="[object Array]")return r(s);for(var o=0;o<s.length;++o){var u=r(s[o]);if(u)return u}return!1}for(var i=0;i<t.length;++i){var s=r(t[i]);if(s)return s!="stop"}},ci=N.isModifierKey=function(e){var t=Xo[e.keyCode];return t=="Ctrl"||t=="Alt"||t=="Shift"||t=="Mod"},hi=N.keyName=function(e,t){if(l&&e.keyCode==34&&e["char"])return!1;var n=Xo[e.keyCode];if(n==null||e.altGraphKey)return!1;e.altKey&&(n="Alt-"+n);if(E?e.metaKey:e.ctrlKey)n="Ctrl-"+n;if(E?e.ctrlKey:e.metaKey)n="Cmd-"+n;return!t&&e.shiftKey&&(n="Shift-"+n),n};N.fromTextArea=function(e,t){function r(){e.value=a.getValue()}t||(t={}),t.value=e.value,!t.tabindex&&e.tabindex&&(t.tabindex=e.tabindex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder);if(t.autofocus==null){var n=Po();t.autofocus=n==e||e.getAttribute("autofocus")!=null&&n==document.body}if(e.form){Qs(e.form,"submit",r);if(!t.leaveSubmitMethodAlone){var i=e.form,s=i.submit;try{var o=i.submit=function(){r(),i.submit=s,i.submit(),i.submit=o}}catch(u){}}}e.style.display="none";var a=N(function(t){e.parentNode.insertBefore(t,e.nextSibling)},t);return a.save=r,a.getTextArea=function(){return e},a.toTextArea=function(){r(),e.parentNode.removeChild(a.getWrapperElement()),e.style.display="",e.form&&(Gs(e.form,"submit",r),typeof e.form.submit=="function"&&(e.form.submit=s))},a};var pi=N.StringStream=function(e,t){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};pi.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(e){var t=this.string.charAt(this.pos);if(typeof e=="string")var n=t==e;else var n=t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},eatWhile:function(e){var t=this.pos;while(this.eat(e));return this.pos>t},eatSpace:function(){var e=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},backUp:function(e){this.pos-=e},column:function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=ho(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?ho(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return ho(this.string,null,this.tabSize)-(this.lineStart?ho(this.string,this.lineStart,this.tabSize):0)},match:function(e,t,n){if(typeof e!="string"){var s=this.string.slice(this.pos).match(e);return s&&s.index>0?null:(s&&t!==!1&&(this.pos+=s[0].length),s)}var r=function(e){return n?e.toLowerCase():e},i=this.string.substr(this.pos,e.length);if(r(i)==r(e))return t!==!1&&(this.pos+=e.length),!0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}};var di=N.TextMarker=function(e,t){this.lines=[],this.type=t,this.doc=e};so(di),di.prototype.clear=function(){if(this.explicitlyCleared)return;var e=this.doc.cm,t=e&&!e.curOp;t&&xn(e);if(io(this,"clear")){var n=this.find();n&&to(this,"clear",n.from,n.to)}var r=null,i=null;for(var s=0;s<this.lines.length;++s){var o=this.lines[s],u=wi(o.markedSpans,this);e&&!this.collapsed?_n(e,Ns(o),"text"):e&&(u.to!=null&&(i=Ns(o)),u.from!=null&&(r=Ns(o))),o.markedSpans=Ei(o.markedSpans,u),u.from==null&&this.collapsed&&!Ui(this.doc,o)&&e&&Ts(o,wn(e.display))}if(e&&this.collapsed&&!e.options.lineWrapping)for(var s=0;s<this.lines.length;++s){var a=Fi(this.lines[s]),f=B(a);f>e.display.maxLineLength&&(e.display.maxLine=a,e.display.maxLineLength=f,e.display.maxLineChanged=!0)}r!=null&&e&&this.collapsed&&Mn(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Bt(e.doc)),e&&to(e,"markerCleared",e,this),t&&Tn(e)},di.prototype.find=function(e,t){e==null&&this.type=="bookmark"&&(e=1);var n,r;for(var i=0;i<this.lines.length;++i){var s=this.lines[i],o=wi(s.markedSpans,this);if(o.from!=null){n=ht(t?s:Ns(s),o.from);if(e==-1)return n}if(o.to!=null){r=ht(t?s:Ns(s),o.to);if(e==1)return r}}return n&&{from:n,to:r}},di.prototype.changed=function(){var e=this.find(-1,!0),t=this,n=this.doc.cm;if(!e||!n)return;Nn(n,function(){var r=e.line,i=Ns(e.line),s=en(n,i);s&&(on(s),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0;if(!Ui(t.doc,r)&&t.height!=null){var o=t.height;t.height=null;var u=Vi(t)-o;u&&Ts(r,r.height+u)}})},di.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(!t.maybeHiddenMarkers||bo(t.maybeHiddenMarkers,this)==-1)&&(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},di.prototype.detachLine=function(e){this.lines.splice(bo(this.lines,e),1);if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}};var vi=0,gi=N.SharedTextMarker=function(e,t){this.markers=e,this.primary=t;for(var n=0,r=this;n<e.length;++n)e[n].parent=this,Qs(e[n],"clear",function(){r.clear()})};so(gi),gi.prototype.clear=function(){if(this.explicitlyCleared)return;this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();to(this,"clear")},gi.prototype.find=function(e,t){return this.primary.find(e,t)};var Wi=N.LineWidget=function(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.cm=e,this.node=t};so(Wi),Wi.prototype.clear=function(){var e=this.cm,t=this.line.widgets,n=this.line,r=Ns(n);if(r==null||!t)return;for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var s=Vi(this);Nn(e,function(){Xi(e,n,-s),_n(e,r,"widget"),Ts(n,Math.max(0,n.height-s))})},Wi.prototype.changed=function(){var e=this.height,t=this.cm,n=this.line;this.height=null;var r=Vi(this)-e;if(!r)return;Nn(t,function(){t.curOp.forceUpdate=!0,Xi(t,n,r),Ts(n,n.height+r)})};var Ji=N.Line=function(e,t,n){this.text=e,Oi(this,t),this.height=n?n(this):1};so(Ji),Ji.prototype.lineNo=function(){return Ns(this)};var ts={},ns={};ps.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n=e,r=e+t;n<r;++n){var i=this.lines[n];this.height-=i.height,Qi(i),to(i,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},ds.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n=0;n<this.children.length;++n){var r=this.children[n],i=r.chunkSize();if(e<i){var s=Math.min(t,i-e),o=r.height;r.removeInner(e,s),this.height-=o-r.height,i==s&&(this.children.splice(n--,1),r.parent=null);if((t-=s)==0)break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ps))){var u=[];this.collapse(u),this.children=[new ps(u)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],s=i.chunkSize();if(e<=s){i.insertInner(e,t,n);if(i.lines&&i.lines.length>50){while(i.lines.length>50){var o=i.lines.splice(i.lines.length-25,25),u=new ps(o);i.height-=u.height,this.children.splice(r+1,0,u),u.parent=this}this.maybeSpill()}break}e-=s}},maybeSpill:function(){if(this.children.length<=10)return;var e=this;do{var t=e.children.splice(e.children.length-5,5),n=new ds(t);if(!e.parent){var r=new ds(e.children);r.parent=e,e.children=[r,n],e=r}else{e.size-=n.size,e.height-=n.height;var i=bo(e.parent.children,e);e.parent.children.splice(i+1,0,n)}n.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],s=i.chunkSize();if(e<s){var o=Math.min(t,s-e);if(i.iterN(e,o,n))return!0;if((t-=o)==0)break;e=0}else e-=s}}};var vs=0,ms=N.Doc=function(e,t,n){if(!(this instanceof ms))return new ms(e,t,n);n==null&&(n=0),ds.call(this,[new ps([new Ji("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=n;var r=ht(n,0);this.sel=wt(r),this.history=new As(null),this.id=++vs,this.modeOption=t,typeof e=="string"&&(e=Uo(e)),hs(this,{from:r,to:r,text:e}),Dt(this,wt(r),ao)};ms.prototype=Eo(ds.prototype,{constructor:ms,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){var n=0;for(var r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=xs(this,this.first,this.first+this.size);return e===!1?t:t.join(e||"\n")},setValue:Ln(function(e){var t=ht(this.first,0),n=this.first+this.size-1;Or(this,{from:t,to:ht(n,Es(this,n).text.length),text:Uo(e),origin:"setValue"},!0),Dt(this,wt(t))}),replaceRange:function(e,t,n,r){t=St(this,t),n=n?St(this,n):t,Br(this,e,t,n,r)},getRange:function(e,t,n){var r=Ss(this,St(this,e),St(this,t));return n===!1?r:r.join(n||"\n")},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(Tt(this,e))return Es(this,e)},getLineNumber:function(e){return Ns(e)},getLineHandleVisualStart:function(e){return typeof e=="number"&&(e=Es(this,e)),Fi(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return St(this,e)},getCursor:function(e){var t=this.sel.primary(),n;return e==null||e=="head"?n=t.head:e=="anchor"?n=t.anchor:e=="end"||e=="to"||e===!1?n=t.to():n=t.from(),n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Ln(function(e,t,n){Ot(this,St(this,typeof e=="number"?ht(e,t||0):e),null,n)}),setSelection:Ln(function(e,t,n){Ot(this,St(this,e),St(this,t||e),n)}),extendSelection:Ln(function(e,t,n){kt(this,St(this,e),t&&St(this,t),n)}),extendSelections:Ln(function(e,t){Lt(this,Nt(this,e,t))}),extendSelectionsBy:Ln(function(e,t){Lt(this,wo(this.sel.ranges,e),t)}),setSelections:Ln(function(e,t,n){if(!e.length)return;for(var r=0,i=[];r<e.length;r++)i[r]=new yt(St(this,e[r].anchor),St(this,e[r].head));t==null&&(t=Math.min(e.length-1,this.sel.primIndex)),Dt(this,bt(i,t),n)}),addSelection:Ln(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new yt(St(this,e),St(this,t||e))),Dt(this,bt(r,r.length-1),n)}),getSelection:function(e){var t=this.sel.ranges,n;for(var r=0;r<t.length;r++){var i=Ss(this,t[r].from(),t[r].to());n=n?n.concat(i):i}return e===!1?n:n.join(e||"\n")},getSelections:function(e){var t=[],n=this.sel.ranges;for(var r=0;r<n.length;r++){var i=Ss(this,n[r].from(),n[r].to());e!==!1&&(i=i.join(e||"\n")),t[r]=i}return t},replaceSelection:Ln(function(e,t,n){var r=[];for(var i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")}),replaceSelections:function(e,t,n){var r=[],i=this.sel;for(var s=0;s<i.ranges.length;s++){var o=i.ranges[s];r[s]={from:o.from(),to:o.to(),text:Uo(e[s]),origin:n}}var u=t&&t!="end"&&Lr(this,r,t);for(var s=r.length-1;s>=0;s--)Or(this,r[s]);u?_t(this,u):this.cm&&Ur(this.cm)},undo:Ln(function(){_r(this,"undo")}),redo:Ln(function(){_r(this,"redo")}),undoSelection:Ln(function(){_r(this,"undo",!0)}),redoSelection:Ln(function(){_r(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){var e=this.history,t=0,n=0;for(var r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var r=0;r<e.undone.length;r++)e.undone[r].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){this.history=new As(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:qs(this.history.done),undone:qs(this.history.undone)}},setHistory:function(e){var t=this.history=new As(this.history.maxGeneration);t.done=qs(e.done.slice(0),null,!0),t.undone=qs(e.undone.slice(0),null,!0)},markText:function(e,t,n){return mi(this,St(this,e),St(this,t),n,"range")},setBookmark:function(e,t){var n={replacedWith:t&&(t.nodeType==null?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared};return e=St(this,e),mi(this,e,e,n,"bookmark")},findMarksAt:function(e){e=St(this,e);var t=[],n=Es(this,e.line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(i.from==null||i.from<=e.ch)&&(i.to==null||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t){e=St(this,e),t=St(this,t);var n=[],r=e.line;return this.iter(e.line,t.line+1,function(i){var s=i.markedSpans;if(s)for(var o=0;o<s.length;o++){var u=s[o];r==e.line&&e.ch>u.to||u.from==null&&r!=e.line||r==t.line&&u.from>t.ch||n.push(u.marker.parent||u.marker)}++r}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;r<n.length;++r)n[r].from!=null&&e.push(n[r].marker)}),e},posFromIndex:function(e){var t,n=this.first;return this.iter(function(r){var i=r.text.length+1;if(i>e)return t=e,!0;e-=i,++n}),St(this,ht(n,t))},indexFromPos:function(e){e=St(this,e);var t=e.ch;return e.line<this.first||e.ch<0?0:(this.iter(this.first,e.line,function(e){t+=e.text.length+1}),t)},copy:function(e){var t=new ms(xs(this,this.first,this.first+this.size),this.modeOption,this.first);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,n=this.first+this.size;e.from!=null&&e.from>t&&(t=e.from),e.to!=null&&e.to<n&&(n=e.to);var r=new ms(xs(this,t,n),e.mode||this.modeOption,t);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],r},unlinkDoc:function(e){e instanceof N&&(e=e.doc);if(this.linked)for(var t=0;t<this.linked.length;++t){var n=this.linked[t];if(n.doc!=e)continue;this.linked.splice(t,1),e.unlinkDoc(this);break}if(e.history==this.history){var r=[e.id];bs(e,function(e){r.push(e.id)},!0),e.history=new As(null),e.history.done=qs(this.history.done,r),e.history.undone=qs(this.history.undone,r)}},iterLinkedDocs:function(e){bs(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm}}),ms.prototype.eachLine=ms.prototype.iter;var gs="iter insert remove copy getEditor".split(" ");for(var ys in ms.prototype)ms.prototype.hasOwnProperty(ys)&&bo(gs,ys)<0&&(N.prototype[ys]=function(e){return function(){return e.apply(this.doc,arguments)}}(ms.prototype[ys]));so(ms);var Ws=N.e_preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},Xs=N.e_stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},$s=N.e_stop=function(e){Ws(e),Xs(e)},Qs=N.on=function(e,t,n){if(e.addEventListener)e.addEventListener(t,n,!1);else if(e.attachEvent)e.attachEvent("on"+t,n);else{var r=e._handlers||(e._handlers={}),i=r[t]||(r[t]=[]);i.push(n)}},Gs=N.off=function(e,t,n){if(e.removeEventListener)e.removeEventListener(t,n,!1);else if(e.detachEvent)e.detachEvent("on"+t,n);else{var r=e._handlers&&e._handlers[t];if(!r)return;for(var i=0;i<r.length;++i)if(r[i]==n){r.splice(i,1);break}}},Ys=N.signal=function(e,t){var n=e._handlers&&e._handlers[t];if(!n)return;var r=Array.prototype.slice.call(arguments,2);for(var i=0;i<n.length;++i)n[i].apply(null,r)},Zs,eo=0,oo=30,uo=N.Pass={toString:function(){return"CodeMirror.Pass"}},ao={scroll:!1},fo={origin:"*mouse"},lo={origin:"+move"};co.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var ho=N.countColumn=function(e,t,n,r,i){t==null&&(t=e.search(/[^\s\u00a0]/),t==-1&&(t=e.length));for(var s=r||0,o=i||0;;){var u=e.indexOf("	",s);if(u<0||u>=t)return o+(t-s);o+=u-s,o+=n-o%n,s=u+1}},vo=[""],yo=function(e){e.select()};m?yo=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:o&&(yo=function(e){try{e.select()}catch(t){}}),[].indexOf&&(bo=function(e,t){return e.indexOf(t)}),[].map&&(wo=function(e,t){return e.map(t)});var To=/[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,No=N.isWordChar=function(e){return/\w/.test(e)||e>""&&(e.toUpperCase()!=e.toLowerCase()||To.test(e))},ko=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,Oo;document.createRange?Oo=function(e,t,n){var r=document.createRange();return r.setEnd(e,n),r.setStart(e,t),r}:Oo=function(e,t,n){var r=document.body.createTextRange();return r.moveToElementText(e.parentNode),r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r},t&&(Po=function(){try{return document.activeElement}catch(e){return document.body}});var Ho=function(){if(r)return!1;var e=Ao("div");return"draggable"in e||"dragDrop"in e}(),Bo,Fo,qo,Uo=N.splitLines="\n\nb".split(/\n/).length!=3?function(e){var t=0,n=[],r=e.length;while(t<=r){var i=e.indexOf("\n",t);i==-1&&(i=e.length);var s=e.slice(t,e.charAt(i-1)=="\r"?i-1:i),o=s.indexOf("\r");o!=-1?(n.push(s.slice(0,o)),t+=o+1):(n.push(s),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},zo=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(t){return!1}}:function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!t||t.parentElement()!=e?!1:t.compareEndPoints("StartToEnd",t)!=0},Wo=function(){var e=Ao("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),typeof e.oncopy=="function")}(),Xo={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};N.keyNames=Xo,function(){for(var e=0;e<10;e++)Xo[e+48]=Xo[e+96]=String(e);for(var e=65;e<=90;e++)Xo[e]=String.fromCharCode(e);for(var e=1;e<=12;e++)Xo[e+111]=Xo[e+63235]="F"+e}();var eu,su=function(){function n(n){return n<=247?e.charAt(n):1424<=n&&n<=1524?"R":1536<=n&&n<=1773?t.charAt(n-1536):1774<=n&&n<=2220?"r":8192<=n&&n<=8203?"w":n==8204?"b":"L"}function f(e,t,n){this.level=e,this.from=t,this.to=n}var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,i=/[stwN]/,s=/[LRr]/,o=/[Lb1n]/,u=/[1n]/,a="L";return function(e){if(!r.test(e))return!1;var t=e.length,l=[];for(var c=0,h;c<t;++c)l.push(h=n(e.charCodeAt(c)));for(var c=0,p=a;c<t;++c){var h=l[c];h=="m"?l[c]=p:p=h}for(var c=0,d=a;c<t;++c){var h=l[c];h=="1"&&d=="r"?l[c]="n":s.test(h)&&(d=h,h=="r"&&(l[c]="R"))}for(var c=1,p=l[0];c<t-1;++c){var h=l[c];h=="+"&&p=="1"&&l[c+1]=="1"?l[c]="1":h==","&&p==l[c+1]&&(p=="1"||p=="n")&&(l[c]=p),p=h}for(var c=0;c<t;++c){var h=l[c];if(h==",")l[c]="N";else if(h=="%"){for(var v=c+1;v<t&&l[v]=="%";++v);var m=c&&l[c-1]=="!"||v<t&&l[v]=="1"?"1":"N";for(var g=c;g<v;++g)l[g]=m;c=v-1}}for(var c=0,d=a;c<t;++c){var h=l[c];d=="L"&&h=="1"?l[c]="L":s.test(h)&&(d=h)}for(var c=0;c<t;++c)if(i.test(l[c])){for(var v=c+1;v<t&&i.test(l[v]);++v);var y=(c?l[c-1]:a)=="L",b=(v<t?l[v]:a)=="L",m=y||b?"L":"R";for(var g=c;g<v;++g)l[g]=m;c=v-1}var w=[],E;for(var c=0;c<t;)if(o.test(l[c])){var S=c;for(++c;c<t&&o.test(l[c]);++c);w.push(new f(0,S,c))}else{var x=c,T=w.length;for(++c;c<t&&l[c]!="L";++c);for(var g=x;g<c;)if(u.test(l[g])){x<g&&w.splice(T,0,new f(1,x,g));var N=g;for(++g;g<c&&u.test(l[g]);++g);w.splice(T,0,new f(2,N,g)),x=g}else++g;x<c&&w.splice(T,0,new f(1,x,c))}return w[0].level==1&&(E=e.match(/^\s+/))&&(w[0].from=E[0].length,w.unshift(new f(0,0,E[0].length))),go(w).level==1&&(E=e.match(/\s+$/))&&(go(w).to-=E[0].length,w.push(new f(0,t-E[0].length,t))),w[0].level!=go(w).level&&w.push(new f(w[0].level,t,t)),w}}();return N.version="4.0.3",N});
\ No newline at end of file
diff --git a/dashboard/lib/assets/crossfilter.min.js b/dashboard/lib/assets/crossfilter.min.js
deleted file mode 100644
index e70d279..0000000
--- a/dashboard/lib/assets/crossfilter.min.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(r){function n(r){return r}function t(r,n){for(var t=0,e=n.length,u=Array(e);e>t;++t)u[t]=r[n[t]];return u}function e(r){function n(n,t,e,u){for(;u>e;){var f=e+u>>>1;r(n[f])<t?e=f+1:u=f}return e}function t(n,t,e,u){for(;u>e;){var f=e+u>>>1;t<r(n[f])?u=f:e=f+1}return e}return t.right=t,t.left=n,t}function u(r){function n(r,n,t){for(var u=t-n,f=(u>>>1)+1;--f>0;)e(r,f,u,n);return r}function t(r,n,t){for(var u,f=t-n;--f>0;)u=r[n],r[n]=r[n+f],r[n+f]=u,e(r,1,f,n);return r}function e(n,t,e,u){for(var f,o=n[--u+t],i=r(o);(f=t<<1)<=e&&(e>f&&r(n[u+f])>r(n[u+f+1])&&f++,!(i<=r(n[u+f])));)n[u+t]=n[u+f],t=f;n[u+t]=o}return n.sort=t,n}function f(r){function n(n,e,u,f){var o,i,a,c,l=Array(f=Math.min(u-e,f));for(i=0;f>i;++i)l[i]=n[e++];if(t(l,0,f),u>e){o=r(l[0]);do(a=r(c=n[e])>o)&&(l[0]=c,o=r(t(l,0,f)[0]));while(++e<u)}return l}var t=u(r);return n}function o(r){function n(n,t,e){for(var u=t+1;e>u;++u){for(var f=u,o=n[u],i=r(o);f>t&&r(n[f-1])>i;--f)n[f]=n[f-1];n[f]=o}return n}return n}function i(r){function n(r,n,u){return(U>u-n?e:t)(r,n,u)}function t(t,e,u){var f,o=0|(u-e)/6,i=e+o,a=u-1-o,c=e+u-1>>1,l=c-o,v=c+o,s=t[i],h=r(s),d=t[l],p=r(d),g=t[c],y=r(g),m=t[v],b=r(m),A=t[a],k=r(A);h>p&&(f=s,s=d,d=f,f=h,h=p,p=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f),h>y&&(f=s,s=g,g=f,f=h,h=y,y=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),h>b&&(f=s,s=m,m=f,f=h,h=b,b=f),y>b&&(f=g,g=m,m=f,f=y,y=b,b=f),p>k&&(f=d,d=A,A=f,f=p,p=k,k=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f);var x=d,w=p,E=m,O=b;t[i]=s,t[l]=t[e],t[c]=g,t[v]=t[u-1],t[a]=A;var M=e+1,U=u-2,z=O>=w&&w>=O;if(z)for(var N=M;U>=N;++N){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>w)for(;;){var q=r(t[U]);{if(!(q>w)){if(w>q){t[N]=t[M],t[M++]=t[U],t[U--]=C;break}t[N]=t[U],t[U--]=C;break}U--}}}else for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>O)for(;;){var q=r(t[U]);{if(!(q>O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}if(t[e]=t[M-1],t[M-1]=x,t[u-1]=t[U+1],t[U+1]=E,n(t,e,M-1),n(t,U+2,u),z)return t;if(i>M&&U>a){for(var F,q;(F=r(t[M]))<=w&&F>=w;)++M;for(;(q=r(t[U]))<=O&&q>=O;)--U;for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>=S&&S>=w)N!==M&&(t[N]=t[M],t[M]=C),M++;else if(O>=S&&S>=O)for(;;){var q=r(t[U]);{if(!(O>=q&&q>=O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}}return n(t,M,U+1)}var e=o(r);return n}function a(r){return Array(r)}function c(r,n){return function(t){var e=t.length;return[r.left(t,n,0,e),r.right(t,n,0,e)]}}function l(r,n){var t=n[0],e=n[1];return function(n){var u=n.length;return[r.left(n,t,0,u),r.left(n,e,0,u)]}}function v(r){return[0,r.length]}function s(){return null}function h(){return 0}function d(r){return r+1}function p(r){return r-1}function g(r){return function(n,t){return n+ +r(t)}}function y(r){return function(n,t){return n-r(t)}}function m(){function r(r){var n=E,t=r.length;return t&&(w=w.concat(r),U=S(U,E+=t),C.forEach(function(e){e(r,n,t)})),m}function e(r){function e(n,e,u){P=n.map(r),Q=Y(A(u),0,u),P=t(P,Q);var f,o,i=Z(P),a=i[0],c=i[1];if(T)for(f=0;u>f;++f)T(P[f],o=Q[f]+e)||(U[o]|=W);else{for(f=0;a>f;++f)U[Q[f]+e]|=W;for(f=c;u>f;++f)U[Q[f]+e]|=W}if(!e)return K=P,L=Q,rn=a,nn=c,void 0;var l=K,v=L,s=0,h=0;for(K=Array(E),L=b(E,E),f=0;e>s&&u>h;++f)l[s]<P[h]?(K[f]=l[s],L[f]=v[s++]):(K[f]=P[h],L[f]=Q[h++]+e);for(;e>s;++s,++f)K[f]=l[s],L[f]=v[s];for(;u>h;++h,++f)K[f]=P[h],L[f]=Q[h]+e;i=Z(K),rn=i[0],nn=i[1]}function o(r,n,t){$.forEach(function(r){r(P,Q,n,t)}),P=Q=null}function a(r){var n=r[0],t=r[1];if(T)return T=null,B(function(r,e){return e>=n&&t>e}),rn=n,nn=t,V;var e,u,f,o=[],i=[];if(rn>n)for(e=n,u=Math.min(rn,t);u>e;++e)U[f=L[e]]^=W,o.push(f);else if(n>rn)for(e=rn,u=Math.min(n,nn);u>e;++e)U[f=L[e]]^=W,i.push(f);if(t>nn)for(e=Math.max(n,nn),u=t;u>e;++e)U[f=L[e]]^=W,o.push(f);else if(nn>t)for(e=Math.max(rn,t),u=nn;u>e;++e)U[f=L[e]]^=W,i.push(f);return rn=n,nn=t,N.forEach(function(r){r(W,o,i)}),V}function m(r){return null==r?R():Array.isArray(r)?F(r):"function"==typeof r?j(r):z(r)}function z(r){return a((Z=c(x,r))(K))}function F(r){return a((Z=l(x,r))(K))}function R(){return a((Z=v)(K))}function j(r){return Z=v,B(T=r),rn=0,nn=E,V}function B(r){var n,t,e,u=[],f=[];for(n=0;E>n;++n)!(U[t=L[n]]&W)^(e=r(K[n],t))&&(e?(U[t]&=X,u.push(t)):(U[t]|=W,f.push(t)));N.forEach(function(r){r(W,u,f)})}function D(r){for(var n,t=[],e=nn;--e>=rn&&r>0;)U[n=L[e]]||(t.push(w[n]),--r);return t}function G(r){for(var n,t=[],e=rn;nn>e&&r>0;)U[n=L[e]]||(t.push(w[n]),--r),e++;return t}function H(r){function t(n,t,u,f){function c(){++P===J&&(m=q(m,I<<=1),R=q(R,I),J=k(I))}var l,v,h,d,p,g,y=F,m=b(P,J),A=D,x=H,O=P,M=0,z=0;for(V&&(A=x=s),F=Array(P),P=0,R=O>1?S(R,E):b(E,J),O&&(h=(v=y[0]).key);f>z&&!((d=r(n[z]))>=d);)++z;for(;f>z;){for(v&&d>=h?(p=v,g=h,m[M]=P,(v=y[++M])&&(h=v.key)):(p={key:d,value:x()},g=d),F[P]=p;!(d>g||(R[l=t[z]+u]=P,U[l]&X||(p.value=A(p.value,w[l])),++z>=f));)d=r(n[z]);c()}for(;O>M;)F[m[M]=P]=y[M++],c();if(P>M)for(M=0;u>M;++M)R[M]=m[R[M]];l=N.indexOf(Q),P>1?(Q=e,T=i):(1===P?(Q=o,T=a):(Q=s,T=s),R=null),N[l]=Q}function e(r,n,t){if(r!==W&&!V){var e,u,f,o;for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o=F[R[u]],o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o=F[R[u]],o.value=G(o.value,w[u]))}}function o(r,n,t){if(r!==W&&!V){var e,u,f,o=F[0];for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o.value=G(o.value,w[u]))}}function i(){var r,n;for(r=0;P>r;++r)F[r].value=H();for(r=0;E>r;++r)U[r]&X||(n=F[R[r]],n.value=D(n.value,w[r]))}function a(){var r,n=F[0];for(n.value=H(),r=0;E>r;++r)U[r]&X||(n.value=D(n.value,w[r]))}function c(){return V&&(T(),V=!1),F}function l(r){var n=j(c(),0,F.length,r);return B.sort(n,0,n.length)}function v(r,n,t){return D=r,G=n,H=t,V=!0,C}function m(){return v(d,p,h)}function A(r){return v(g(r),y(r),h)}function x(r){function n(n){return r(n.value)}return j=f(n),B=u(n),C}function O(){return x(n)}function M(){return P}function z(){var r=N.indexOf(Q);return r>=0&&N.splice(r,1),r=$.indexOf(t),r>=0&&$.splice(r,1),C}var C={top:l,all:c,reduce:v,reduceCount:m,reduceSum:A,order:x,orderNatural:O,size:M,remove:z};_.push(C);var F,R,j,B,D,G,H,I=8,J=k(I),P=0,Q=s,T=s,V=!0;return arguments.length<1&&(r=n),N.push(Q),$.push(t),t(K,L,0,E),m().orderNatural()}function I(){var r=H(s),n=r.all;return delete r.all,delete r.top,delete r.order,delete r.orderNatural,delete r.size,r.value=function(){return n()[0].value},r}function J(){_.forEach(function(r){r.remove()});var r=C.indexOf(e);for(r>=0&&C.splice(r,1),r=C.indexOf(o),r>=0&&C.splice(r,1),r=0;E>r;++r)U[r]&=X;return O&=X,V}var K,L,P,Q,T,V={filter:m,filterExact:z,filterRange:F,filterFunction:j,filterAll:R,top:D,bottom:G,group:H,groupAll:I,remove:J},W=~O&-~O,X=~W,Y=i(function(r){return P[r]}),Z=v,$=[],_=[],rn=0,nn=0;return C.unshift(e),C.push(o),O|=W,(M>=32?!W:O&(1<<M)-1)&&(U=q(U,M<<=1)),e(w,0,E),o(w,0,E),V}function o(){function r(r,n){var t;if(!m)for(t=n;E>t;++t)U[t]||(a=c(a,w[t]))}function n(r,n,t){var e,u,f;if(!m){for(e=0,f=n.length;f>e;++e)U[u=n[e]]||(a=c(a,w[u]));for(e=0,f=t.length;f>e;++e)U[u=t[e]]===r&&(a=l(a,w[u]))}}function t(){var r;for(a=v(),r=0;E>r;++r)U[r]||(a=c(a,w[r]))}function e(r,n,t){return c=r,l=n,v=t,m=!0,s}function u(){return e(d,p,h)}function f(r){return e(g(r),y(r),h)}function o(){return m&&(t(),m=!1),a}function i(){var t=N.indexOf(n);return t>=0&&N.splice(t),t=C.indexOf(r),t>=0&&C.splice(t),s}var a,c,l,v,s={reduce:e,reduceCount:u,reduceSum:f,value:o,remove:i},m=!0;return N.push(n),C.push(r),r(w,0,E),u()}function a(){return E}var m={add:r,dimension:e,groupAll:o,size:a},w=[],E=0,O=0,M=8,U=z(0),N=[],C=[];return arguments.length?r(arguments[0]):m}function b(r,n){return(257>n?z:65537>n?N:C)(r)}function A(r){for(var n=b(r,r),t=-1;++t<r;)n[t]=t;return n}function k(r){return 8===r?256:16===r?65536:4294967296}m.version="1.2.0",m.permute=t;var x=m.bisect=e(n);x.by=e;var w=m.heap=u(n);w.by=u;var E=m.heapselect=f(n);E.by=f;var O=m.insertionsort=o(n);O.by=o;var M=m.quicksort=i(n);M.by=i;var U=32,z=a,N=a,C=a,S=n,q=n;"undefined"!=typeof Uint8Array&&(z=function(r){return new Uint8Array(r)},N=function(r){return new Uint16Array(r)},C=function(r){return new Uint32Array(r)},S=function(r,n){var t=new r.constructor(n);return t.set(r),t},q=function(r,n){var t;switch(n){case 16:t=N(r.length);break;case 32:t=C(r.length);break;default:throw Error("invalid array width!")}return t.set(r),t}),r.crossfilter=m})(this);
\ No newline at end of file
diff --git a/dashboard/lib/assets/d3.min.js b/dashboard/lib/assets/d3.min.js
deleted file mode 100644
index 91fa2eb..0000000
--- a/dashboard/lib/assets/d3.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function i(){}function u(){}function a(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function o(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=Ca.length;r>e;++e){var i=Ca[e]+t;if(i in n)return i}}function c(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}function l(n){return Array.prototype.slice.call(n)}function s(){}function f(){}function h(n){function t(){for(var t,r=e,i=-1,u=r.length;++i<u;)(t=r[i].on)&&t.apply(this,arguments);return n}var e=[],r=new i;return t.on=function(t,i){var u,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,u=e.indexOf(a)).concat(e.slice(u+1)),r.remove(t)),i&&e.push(r.set(t,{on:i})),n)},t}function g(){ya.event.preventDefault()}function p(){for(var n,t=ya.event;n=t.sourceEvent;)t=n;return t}function m(n){for(var t=new f,e=0,r=arguments.length;++e<r;)t[arguments[e]]=h(t);return t.of=function(e,r){return function(i){try{var u=i.sourceEvent=ya.event;i.target=n,ya.event=i,t[i.type].apply(e,r)}finally{ya.event=u}}},t}function d(n){return La(n,Ya),n}function v(n){return"function"==typeof n?n:function(){return Ha(n,this)}}function y(n){return"function"==typeof n?n:function(){return Fa(n,this)}}function M(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function i(){this.setAttribute(n,t)}function u(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ya.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?o:a:n.local?u:i}function x(n){return n.trim().replace(/\s+/g," ")}function b(n){return new RegExp("(?:^|\\s+)"+ya.requote(n)+"(?:\\s+|$)","g")}function _(n,t){function e(){for(var e=-1;++e<i;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<i;)n[e](this,r)}n=n.trim().split(/\s+/).map(w);var i=n.length;return"function"==typeof t?r:e}function w(n){var t=b(n);return function(e,r){if(i=e.classList)return r?i.add(n):i.remove(n);var i=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(i)||e.setAttribute("class",x(i+" "+n))):e.setAttribute("class",x(i.replace(t," ")))}}function S(n,t,e){function r(){this.style.removeProperty(n)}function i(){this.style.setProperty(n,t,e)}function u(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?u:i}function E(n,t){function e(){delete this[n]}function r(){this[n]=t}function i(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?i:r}function k(n){return"function"==typeof n?n:(n=ya.ns.qualify(n)).local?function(){return Ma.createElementNS(n.space,n.local)}:function(){return Ma.createElementNS(this.namespaceURI,n)}}function A(n){return{__data__:n}}function N(n){return function(){return Oa(this,n)}}function q(n){return arguments.length||(n=ya.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function T(n,t){for(var e=0,r=n.length;r>e;e++)for(var i,u=n[e],a=0,o=u.length;o>a;a++)(i=u[a])&&t(i,a,e);return n}function C(n){return La(n,Ua),n}function z(n){var t,e;return function(r,i,u){var a,o=n[u].update,c=o.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(a=o[t])&&++t<c;);return a}}function D(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function i(){var i=c(t,za(arguments));r.call(this),this.addEventListener(n,this[a]=i,i.$=e),i._=t}function u(){var t,e=new RegExp("^__on([^.]+)"+ya.requote(n)+"$");for(var r in this)if(t=r.match(e)){var i=this[r];this.removeEventListener(t[1],i,i.$),delete this[r]}}var a="__on"+n,o=n.indexOf("."),c=j;o>0&&(n=n.substring(0,o));var l=Va.get(n);return l&&(n=l,c=L),o?t?i:r:t?s:u}function j(n,t){return function(e){var r=ya.event;ya.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ya.event=r}}}function L(n,t){var e=j(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function H(){var n=".dragsuppress-"+ ++Za,t="touchmove"+n,e="selectstart"+n,r="dragstart"+n,i="click"+n,u=ya.select(ba).on(t,g).on(e,g).on(r,g),a=xa.style,o=a[Xa];return a[Xa]="none",function(t){function e(){u.on(i,null)}u.on(n,null),a[Xa]=o,t&&(u.on(i,function(){g(),e()},!0),setTimeout(e,0))}}function F(n,t){var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Ba&&(ba.scrollX||ba.scrollY)){e=ya.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var i=e[0][0].getScreenCTM();Ba=!(i.f||i.e),e.remove()}return Ba?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var u=n.getBoundingClientRect();return[t.clientX-u.left-n.clientLeft,t.clientY-u.top-n.clientTop]}function P(){}function O(n,t,e){return new Y(n,t,e)}function Y(n,t,e){this.h=n,this.s=t,this.l=e}function R(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(a-u)*n/60:180>n?a:240>n?u+(a-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,u=2*e-a,at(i(n+120),i(n),i(n-120))}function U(n){return n>0?1:0>n?-1:0}function I(n){return n>1?0:-1>n?Ka:Math.acos(n)}function V(n){return n>1?Ka/2:-1>n?-Ka/2:Math.asin(n)}function X(n){return(Math.exp(n)-Math.exp(-n))/2}function Z(n){return(Math.exp(n)+Math.exp(-n))/2}function B(n){return(n=Math.sin(n/2))*n}function $(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=to)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=tt(i)*uo,r=tt(r)*ao,u=tt(u)*oo,at(rt(3.2404542*i-1.5371385*r-.4985314*u),rt(-.969266*i+1.8760108*r+.041556*u),rt(.0556434*i-.2040259*r+1.0572252*u))}function nt(n,t,e){return n>0?$(Math.atan2(e,t)*eo,Math.sqrt(t*t+e*e),n):$(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function it(n){return at(n>>16,255&n>>8,255&n)}function ut(n){return it(n)+""}function at(n,t,e){return new ot(n,t,e)}function ot(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function lt(n,t,e){var r,i,u,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(gt(i[0]),gt(i[1]),gt(i[2]))}return(u=so.get(n))?t(u.r,u.g,u.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(a=n.charAt(1),a+=a,o=n.charAt(2),o+=o,c=n.charAt(3),c+=c):7===n.length&&(a=n.substring(1,3),o=n.substring(3,5),c=n.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),t(a,o,c))}function st(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-u,c=(a+u)/2;return o?(i=.5>c?o/(a+u):o/(2-a-u),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=0/0,i=c>0&&1>c?0:r),O(r,i,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/uo),i=et((.2126729*n+.7151522*t+.072175*e)/ao),u=et((.0193339*n+.119192*t+.9503041*e)/oo);return G(116*i-16,500*(r-i),200*(i-u))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function mt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),vt(t,e,n,r)}}function vt(n,t,e,r){function i(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(u,c)}catch(r){return a.error.call(u,r),void 0}a.load.call(u,n)}else a.error.call(u,c)}var u={},a=ya.dispatch("progress","load","error"),o={},c=new XMLHttpRequest,l=null;return!ba.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=i:c.onreadystatechange=function(){c.readyState>3&&i()},c.onprogress=function(n){var t=ya.event;ya.event=n;try{a.progress.call(u,c)}finally{ya.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(l=n,u):l},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(za(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),c.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),c.setRequestHeader)for(var a in o)c.setRequestHeader(a,o[a]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),c.send(null==r?null:r),u},u.abort=function(){return c.abort(),u},ya.rebind(u,a,"on"),null==r?u:u.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Mt(){var n=bt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(po),po=setTimeout(Mt,t)),go=0):(go=1,vo(Mt))}function xt(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now()),mo.callback=n,mo.time=e+t}function bt(){var n=Date.now();for(mo=fo;mo;)n>=mo.time&&(mo.flush=mo.callback(n-mo.time)),mo=mo.next;return n}function _t(){for(var n,t=fo,e=1/0;t;)t.flush?t=n?n.next=t.next:fo=t.next:(t.time<e&&(e=t.time),t=(n=t).next);return ho=n,e}function wt(n,t){var e=Math.pow(10,3*Math.abs(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function St(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Et(n){return n+""}function kt(){}function At(n,t,e){var r=e.s=n+t,i=r-n,u=r-i;e.t=n-u+(t-i)}function Nt(n,t){n&&qo.hasOwnProperty(n.type)&&qo[n.type](n,t)}function qt(n,t,e){var r,i=-1,u=n.length-e;for(t.lineStart();++i<u;)r=n[i],t.point(r[0],r[1]);t.lineEnd()}function Tt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)qt(n[e],t,1);t.polygonEnd()}function Ct(){function n(n,t){n*=to,t=t*to/2+Ka/4;var e=n-r,a=Math.cos(t),o=Math.sin(t),c=u*o,l=i*a+c*Math.cos(e),s=c*Math.sin(e);Co.add(Math.atan2(s,l)),r=n,i=a,u=o}var t,e,r,i,u;zo.point=function(a,o){zo.point=n,r=(t=a)*to,i=Math.cos(o=(e=o)*to/2+Ka/4),u=Math.sin(o)},zo.lineEnd=function(){n(t,e)}}function zt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function Dt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function jt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Lt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Ht(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Ft(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Pt(n){return[Math.atan2(n[1],n[0]),V(n[2])]}function Ot(n,t){return Math.abs(n[0]-t[0])<Qa&&Math.abs(n[1]-t[1])<Qa}function Yt(n,t){n*=to;var e=Math.cos(t*=to);Rt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Rt(n,t,e){++Do,Lo+=(n-Lo)/Do,Ho+=(t-Ho)/Do,Fo+=(e-Fo)/Do}function Ut(){function n(n,i){n*=to;var u=Math.cos(i*=to),a=u*Math.cos(n),o=u*Math.sin(n),c=Math.sin(i),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-t*c)*l+(l=t*o-e*a)*l),t*a+e*o+r*c);jo+=l,Po+=l*(t+(t=a)),Oo+=l*(e+(e=o)),Yo+=l*(r+(r=c)),Rt(t,e,r)}var t,e,r;Vo.point=function(i,u){i*=to;var a=Math.cos(u*=to);t=a*Math.cos(i),e=a*Math.sin(i),r=Math.sin(u),Vo.point=n,Rt(t,e,r)}}function It(){Vo.point=Yt}function Vt(){function n(n,t){n*=to;var e=Math.cos(t*=to),a=e*Math.cos(n),o=e*Math.sin(n),c=Math.sin(t),l=i*c-u*o,s=u*a-r*c,f=r*o-i*a,h=Math.sqrt(l*l+s*s+f*f),g=r*a+i*o+u*c,p=h&&-I(g)/h,m=Math.atan2(h,g);Ro+=p*l,Uo+=p*s,Io+=p*f,jo+=m,Po+=m*(r+(r=a)),Oo+=m*(i+(i=o)),Yo+=m*(u+(u=c)),Rt(r,i,u)}var t,e,r,i,u;Vo.point=function(a,o){t=a,e=o,Vo.point=n,a*=to;var c=Math.cos(o*=to);r=c*Math.cos(a),i=c*Math.sin(a),u=Math.sin(o),Rt(r,i,u)},Vo.lineEnd=function(){n(t,e),Vo.lineEnd=It,Vo.point=Yt}}function Xt(){return!0}function Zt(n,t,e,r,i){var u=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(Ot(e,r)){i.lineStart();for(var o=0;t>o;++o)i.point((e=n[o])[0],e[1]);return i.lineEnd(),void 0}var c={point:e,points:n,other:null,visited:!1,entry:!0,subject:!0},l={point:e,points:[e],other:c,visited:!1,entry:!1,subject:!1};c.other=l,u.push(c),a.push(l),c={point:r,points:[r],other:null,visited:!1,entry:!1,subject:!0},l={point:r,points:[r],other:c,visited:!1,entry:!0,subject:!1},c.other=l,u.push(c),a.push(l)}}),a.sort(t),Bt(u),Bt(a),u.length){if(e)for(var o=1,c=!e(a[0].point),l=a.length;l>o;++o)a[o].entry=c=!c;for(var s,f,h,g=u[0];;){for(s=g;s.visited;)if((s=s.next)===g)return;f=s.points,i.lineStart();do{if(s.visited=s.other.visited=!0,s.entry){if(s.subject)for(var o=0;o<f.length;o++)i.point((h=f[o])[0],h[1]);else r(s.point,s.next.point,1,i);s=s.next}else{if(s.subject){f=s.prev.points;for(var o=f.length;--o>=0;)i.point((h=f[o])[0],h[1])}else r(s.point,s.prev.point,-1,i);s=s.prev}s=s.other,f=s.points}while(!s.visited);i.lineEnd()}}}function Bt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r<t;)i.next=e=n[r],e.prev=i,i=e;i.next=e=n[0],e.prev=i}}function $t(n,t,e,r){return function(i){function u(t,e){n(t,e)&&i.point(t,e)}function a(n,t){m.point(n,t)}function o(){d.point=a,m.lineStart()}function c(){d.point=u,m.lineEnd()}function l(n,t){y.point(n,t),p.push([n,t])}function s(){y.lineStart(),p=[]}function f(){l(p[0][0],p[0][1]),y.lineEnd();var n,t=y.clean(),e=v.buffer(),r=e.length;if(p.pop(),g.push(p),p=null,r){if(1&t){n=e[0];var u,r=n.length-1,a=-1;for(i.lineStart();++a<r;)i.point((u=n[a])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),h.push(e.filter(Wt))}}var h,g,p,m=t(i),d={point:u,lineStart:o,lineEnd:c,polygonStart:function(){d.point=l,d.lineStart=s,d.lineEnd=f,h=[],g=[],i.polygonStart()},polygonEnd:function(){d.point=u,d.lineStart=o,d.lineEnd=c,h=ya.merge(h),h.length?Zt(h,Gt,null,e,i):r(g)&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),h=g=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},v=Jt(),y=t(v);return d}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:s,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.point)[0]<0?n[1]-Ka/2-Qa:Ka/2-n[1])-((t=t.point)[0]<0?t[1]-Ka/2-Qa:Ka/2-t[1])}function Kt(n,t){var e=n[0],r=n[1],i=[Math.sin(e),-Math.cos(e),0],u=0,a=!1,o=!1,c=0;Co.reset();for(var l=0,s=t.length;s>l;++l){var f=t[l],h=f.length;if(h){for(var g=f[0],p=g[0],m=g[1]/2+Ka/4,d=Math.sin(m),v=Math.cos(m),y=1;;){y===h&&(y=0),n=f[y];var M=n[0],x=n[1]/2+Ka/4,b=Math.sin(x),_=Math.cos(x),w=M-p,S=Math.abs(w)>Ka,E=d*b;if(Co.add(Math.atan2(E*Math.sin(w),v*_+E*Math.cos(w))),Math.abs(x)<Qa&&(o=!0),u+=S?w+(w>=0?2:-2)*Ka:w,S^p>=e^M>=e){var k=jt(zt(g),zt(n));Ft(k);var A=jt(i,k);Ft(A);var N=(S^w>=0?-1:1)*V(A[2]);r>N&&(c+=S^w>=0?1:-1)}if(!y++)break;p=M,d=b,v=_,g=n}Math.abs(u)>Qa&&(a=!0)}}return(!o&&!a&&0>Co||-Qa>u)^1&c}function Qt(n){var t,e=0/0,r=0/0,i=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(u,a){var o=u>0?Ka:-Ka,c=Math.abs(u-e);Math.abs(c-Ka)<Qa?(n.point(e,r=(r+a)/2>0?Ka/2:-Ka/2),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(u,r),t=0):i!==o&&c>=Ka&&(Math.abs(e-i)<Qa&&(e-=i*Qa),Math.abs(u-o)<Qa&&(u-=o*Qa),r=ne(e,r,u,a),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=u,r=a),i=o},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var i,u,a=Math.sin(n-e);return Math.abs(a)>Qa?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*a)):(t+r)/2}function te(n,t,e,r){var i;if(null==n)i=e*Ka/2,r.point(-Ka,i),r.point(0,i),r.point(Ka,i),r.point(Ka,0),r.point(Ka,-i),r.point(0,-i),r.point(-Ka,-i),r.point(-Ka,0),r.point(-Ka,i);else if(Math.abs(n[0]-t[0])>Qa){var u=(n[0]<t[0]?1:-1)*Ka;i=e*u/2,r.point(-u,i),r.point(0,i),r.point(u,i)}else r.point(t[0],t[1])}function ee(n){return Kt(Zo,n)}function re(n){function t(n,t){return Math.cos(n)*Math.cos(t)>a}function e(n){var e,u,a,c,s;return{lineStart:function(){c=a=!1,s=1},point:function(f,h){var g,p=[f,h],m=t(f,h),d=o?m?0:i(f,h):m?i(f+(0>f?Ka:-Ka),h):0;if(!e&&(c=a=m)&&n.lineStart(),m!==a&&(g=r(e,p),(Ot(e,g)||Ot(p,g))&&(p[0]+=Qa,p[1]+=Qa,m=t(p[0],p[1]))),m!==a)s=0,m?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(l&&e&&o^m){var v;d&u||!(v=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(v[0][0],v[0][1]),n.point(v[1][0],v[1][1]),n.lineEnd()):(n.point(v[1][0],v[1][1]),n.lineEnd(),n.lineStart(),n.point(v[0][0],v[0][1])))}!m||e&&Ot(e,p)||n.point(p[0],p[1]),e=p,a=m,u=d},lineEnd:function(){a&&n.lineEnd(),e=null},clean:function(){return s|(c&&a)<<1}}}function r(n,t,e){var r=zt(n),i=zt(t),u=[1,0,0],o=jt(r,i),c=Dt(o,o),l=o[0],s=c-l*l;if(!s)return!e&&n;var f=a*c/s,h=-a*l/s,g=jt(u,o),p=Ht(u,f),m=Ht(o,h);Lt(p,m);var d=g,v=Dt(p,d),y=Dt(d,d),M=v*v-y*(Dt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Ht(d,(-v-x)/y);if(Lt(b,p),b=Pt(b),!e)return b;var _,w=n[0],S=t[0],E=n[1],k=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=Math.abs(A-Ka)<Qa,q=N||Qa>A;if(!N&&E>k&&(_=E,E=k,k=_),q?N?E+k>0^b[1]<(Math.abs(b[0]-w)<Qa?E:k):E<=b[1]&&b[1]<=k:A>Ka^(w<=b[0]&&b[0]<=S)){var T=Ht(d,(-v+x)/y);return Lt(T,p),[b,Pt(T)]}}}function i(t,e){var r=o?n:Ka-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}function u(n){return Kt(c,n)}var a=Math.cos(n),o=a>0,c=[n,0],l=Math.abs(a)>Qa,s=Ne(n,6*to);return $t(t,e,s,u)}function ie(n,t,e,r){function i(r,i){return Math.abs(r[0]-n)<Qa?i>0?0:3:Math.abs(r[0]-e)<Qa?i>0?2:1:Math.abs(r[1]-t)<Qa?i>0?1:0:i>0?3:2}function u(n,t){return a(n.point,t.point)}function a(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}function o(i,u){var a=u[0]-i[0],o=u[1]-i[1],c=[0,1];return Math.abs(a)<Qa&&Math.abs(o)<Qa?n<=i[0]&&i[0]<=e&&t<=i[1]&&i[1]<=r:ue(n-i[0],a,c)&&ue(i[0]-e,-a,c)&&ue(t-i[1],o,c)&&ue(i[1]-r,-o,c)?(c[1]<1&&(u[0]=i[0]+c[1]*a,u[1]=i[1]+c[1]*o),c[0]>0&&(i[0]+=c[0]*a,i[1]+=c[0]*o),!0):!1}return function(c){function l(u){var a=i(u,-1),o=s([0===a||3===a?n:e,a>1?r:t]);return o}function s(n){for(var t=0,e=M.length,r=n[1],i=0;e>i;++i)for(var u,a=1,o=M[i],c=o.length,l=o[0];c>a;++a)u=o[a],l[1]<=r?u[1]>r&&f(l,u,n)>0&&++t:u[1]<=r&&f(l,u,n)<0&&--t,l=u;return 0!==t}function f(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function h(u,o,c,l){var s=0,f=0;if(null==u||(s=i(u,c))!==(f=i(o,c))||a(u,o)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(o[0],o[1])}function g(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function p(n,t){g(n,t)&&c.point(n,t)}function m(){T.point=v,M&&M.push(x=[]),A=!0,k=!1,S=E=0/0}function d(){y&&(v(b,_),w&&k&&q.rejoin(),y.push(q.buffer())),T.point=p,k&&c.lineEnd()}function v(n,t){n=Math.max(-Bo,Math.min(Bo,n)),t=Math.max(-Bo,Math.min(Bo,t));var e=g(n,t);if(M&&x.push([n,t]),A)b=n,_=t,w=e,A=!1,e&&(c.lineStart(),c.point(n,t));else if(e&&k)c.point(n,t);else{var r=[S,E],i=[n,t];o(r,i)?(k||(c.lineStart(),c.point(r[0],r[1])),c.point(i[0],i[1]),e||c.lineEnd()):e&&(c.lineStart(),c.point(n,t))}S=n,E=t,k=e}var y,M,x,b,_,w,S,E,k,A,N=c,q=Jt(),T={point:p,lineStart:m,lineEnd:d,polygonStart:function(){c=q,y=[],M=[]},polygonEnd:function(){c=N,(y=ya.merge(y)).length?(c.polygonStart(),Zt(y,u,l,h,c),c.polygonEnd()):s([n,t])&&(c.polygonStart(),c.lineStart(),h(null,null,1,c),c.lineEnd(),c.polygonEnd()),y=M=x=null}};return T}}function ue(n,t,e){if(Math.abs(t)<Qa)return 0>=n;var r=n/t;if(t>0){if(r>e[1])return!1;r>e[0]&&(e[0]=r)}else{if(r<e[0])return!1;r<e[1]&&(e[1]=r)}return!0}function ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=Ka/3,r=be(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Ka/180,e=n[1]*Ka/180):[180*(t/Ka),180*(e/Ka)]},i}function ce(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),a-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),a=Math.sqrt(u)/i;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/i,V((u-(n*n+e*e)*i*i)/(2*i))]},e}function le(){function n(n,t){Wo+=i*n-r*t,r=n,i=t}var t,e,r,i;nc.point=function(u,a){nc.point=n,t=r=u,e=i=a},nc.lineEnd=function(){n(t,e)}}function se(n,t){Jo>n&&(Jo=n),n>Ko&&(Ko=n),Go>t&&(Go=t),t>Qo&&(Qo=t)}function fe(){function n(n,t){a.push("M",n,",",t,u)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function i(){a.push("Z")}var u=he(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return u=he(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function he(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function ge(n,t){Lo+=n,Ho+=t,++Fo}function pe(){function n(n,r){var i=n-t,u=r-e,a=Math.sqrt(i*i+u*u);Po+=a*(t+n)/2,Oo+=a*(e+r)/2,Yo+=a,ge(t=n,e=r)}var t,e;ec.point=function(r,i){ec.point=n,ge(t=r,e=i)}}function me(){ec.point=ge}function de(){function n(n,t){var e=n-r,u=t-i,a=Math.sqrt(e*e+u*u);Po+=a*(r+n)/2,Oo+=a*(i+t)/2,Yo+=a,a=i*n-r*t,Ro+=a*(r+n),Uo+=a*(i+t),Io+=3*a,ge(r=n,i=t)}var t,e,r,i;ec.point=function(u,a){ec.point=n,ge(t=r=u,e=i=a)},ec.lineEnd=function(){n(t,e)}}function ve(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,a,0,2*Ka)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function i(){o.point=t}function u(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:i,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=i,o.point=t},pointRadius:function(n){return a=n,o},result:s};return o}function ye(n){function t(t){function r(e,r){e=n(e,r),t.point(e[0],e[1])}function i(){M=0/0,S.point=a,t.lineStart()}function a(r,i){var a=zt([r,i]),o=n(r,i);e(M,x,y,b,_,w,M=o[0],x=o[1],y=r,b=a[0],_=a[1],w=a[2],u,t),t.point(M,x)}function o(){S.point=r,t.lineEnd()}function c(){i(),S.point=l,S.lineEnd=s}function l(n,t){a(f=n,h=t),g=M,p=x,m=b,d=_,v=w,S.point=a}function s(){e(M,x,y,b,_,w,g,p,f,m,d,v,u,t),S.lineEnd=o,o()}var f,h,g,p,m,d,v,y,M,x,b,_,w,S={point:r,lineStart:i,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=i}};return S}function e(t,u,a,o,c,l,s,f,h,g,p,m,d,v){var y=s-t,M=f-u,x=y*y+M*M;if(x>4*r&&d--){var b=o+g,_=c+p,w=l+m,S=Math.sqrt(b*b+_*_+w*w),E=Math.asin(w/=S),k=Math.abs(Math.abs(w)-1)<Qa?(a+h)/2:Math.atan2(_,b),A=n(k,E),N=A[0],q=A[1],T=N-t,C=q-u,z=M*T-y*C;(z*z/x>r||Math.abs((y*T+M*C)/x-.5)>.3||i>o*g+c*p+l*m)&&(e(t,u,a,o,c,l,N,q,k,b/=S,_/=S,w,d,v),v.point(N,q),e(N,q,k,b,_,w,s,f,h,g,p,m,d,v))}}var r=.5,i=Math.cos(30*to),u=16;return t.precision=function(n){return arguments.length?(u=(r=n*n)>0&&16,t):Math.sqrt(r)},t}function Me(n){var t=ye(function(t,e){return n([t*eo,e*eo])});return function(n){return n=t(n),{point:function(t,e){n.point(t*to,e*to)},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}}function xe(n){return be(function(){return n})()}function be(n){function t(n){return n=o(n[0]*to,n[1]*to),[n[0]*h+c,l-n[1]*h]}function e(n){return n=o.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*eo,n[1]*eo]}function r(){o=ae(a=Se(v,y,M),u);var n=u(m,d);return c=g-n[0]*h,l=p+n[1]*h,i()}function i(){return s&&(s.valid=!1,s=null),t}var u,a,o,c,l,s,f=ye(function(n,t){return n=u(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,m=0,d=0,v=0,y=0,M=0,x=Xo,b=mt,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=_e(a,x(f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Xo):re((_=+n)*to),i()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=null==n?mt:ie(n[0][0],n[0][1],n[1][0],n[1][1]),i()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(m=n[0]%360*to,d=n[1]%360*to,r()):[m*eo,d*eo]},t.rotate=function(n){return arguments.length?(v=n[0]%360*to,y=n[1]%360*to,M=n.length>2?n[2]%360*to:0,r()):[v*eo,y*eo,M*eo]},ya.rebind(t,f,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function _e(n,t){return{point:function(e,r){r=n(e*to,r*to),e=r[0],t.point(e>Ka?e-2*Ka:-Ka>e?e+2*Ka:e,r[1])},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function we(n,t){return[n,t]}function Se(n,t,e){return n?t||e?ae(ke(n),Ae(t,e)):ke(n):t||e?Ae(t,e):we}function Ee(n){return function(t,e){return t+=n,[t>Ka?t-2*Ka:-Ka>t?t+2*Ka:t,e]}}function ke(n){var t=Ee(n);return t.invert=Ee(-n),t}function Ae(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+o*i;return[Math.atan2(c*u-s*a,o*r-l*i),V(s*u+c*a)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*u-c*a;return[Math.atan2(c*u+l*a,o*r+s*i),V(s*r-o*i)]},e}function Ne(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,a,o){null!=i?(i=qe(e,i),u=qe(e,u),(a>0?u>i:i>u)&&(i+=2*a*Ka)):(i=n+2*a*Ka,u=n);for(var c,l=a*t,s=i;a>0?s>u:u>s;s-=l)o.point((c=Pt([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function qe(n,t){var e=zt(t);e[0]-=n,Ft(e);var r=I(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Qa)%(2*Math.PI)}function Te(n,t,e){var r=ya.range(n,t-Qa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function Ce(n,t,e){var r=ya.range(n,t-Qa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function ze(n){return n.source}function De(n){return n.target}function je(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),a=Math.cos(r),o=Math.sin(r),c=i*Math.cos(n),l=i*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(B(r-t)+i*a*B(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,i=e*l+t*f,a=e*u+t*o;return[Math.atan2(i,r)*eo,Math.atan2(a,Math.sqrt(r*r+i*i))*eo]}:function(){return[n*eo,t*eo]};return p.distance=h,p}function Le(){function n(n,i){var u=Math.sin(i*=to),a=Math.cos(i),o=Math.abs((n*=to)-t),c=Math.cos(o);rc+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*u-e*a*c)*o),e*u+r*a*c),t=n,e=u,r=a}var t,e,r;ic.point=function(i,u){t=i*to,e=Math.sin(u*=to),r=Math.cos(u),ic.point=n},ic.lineEnd=function(){ic.point=ic.lineEnd=s}}function He(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),a=Math.cos(i);return[Math.atan2(n*u,r*a),Math.asin(r&&e*u/r)]},e}function Fe(n,t){function e(n,t){var e=Math.abs(Math.abs(t)-Ka/2)<Qa?0:a/Math.pow(i(t),u);return[e*Math.sin(u*n),a-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Ka/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),a=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=a-t,r=U(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(a/r,1/u))-Ka/2]},e):Oe}function Pe(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return Math.abs(i)<Qa?we:(e.invert=function(n,t){var e=u-t;return[Math.atan2(n,e)/i,u-U(i)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(Ka/4+t/2))]}function Ye(n){var t,e=xe(n),r=e.scale,i=e.translate,u=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=i.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=u.apply(e,arguments);if(a===e){if(t=null==n){var o=Ka*r(),c=i();u([[c[0]-o,c[1]-o],[c[0]+o,c[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Re(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ue(n){function t(t){function a(){l.push("M",u(n(s),o))}for(var c,l=[],s=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)i.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(a(),s=[]);return s.length&&a(),l.length?l.join(""):null}var e=Ie,r=Ve,i=Xt,u=Xe,a=u.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(i=n,t):i},t.interpolate=function(n){return arguments.length?(a="function"==typeof n?u=n:(u=sc.get(n)||Xe).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function Ie(n){return n[0]}function Ve(n){return n[1]}function Xe(n){return n.join("L")}function Ze(n){return Xe(n)+"Z"}function Be(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function $e(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("V",(r=n[t])[1],"H",r[0]);return i.join("")}function We(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r=n[t])[0],"V",r[1]);return i.join("")}function Je(n,t){return n.length<4?Xe(n):n[1]+Qe(n.slice(1,n.length-1),nr(n,t))}function Ge(n,t){return n.length<3?Xe(n):n[0]+Qe((n.push(n[0]),n),nr([n[n.length-2]].concat(n,[n[1]]),t))}function Ke(n,t){return n.length<3?Xe(n):n[0]+Qe(n,nr(n,t))}function Qe(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Xe(n);var e=n.length!=t.length,r="",i=n[0],u=n[1],a=t[0],o=a,c=1;if(e&&(r+="Q"+(u[0]-2*a[0]/3)+","+(u[1]-2*a[1]/3)+","+u[0]+","+u[1],i=n[1],c=2),t.length>1){o=t[1],u=n[c],c++,r+="C"+(i[0]+a[0])+","+(i[1]+a[1])+","+(u[0]-o[0])+","+(u[1]-o[1])+","+u[0]+","+u[1];for(var l=2;l<t.length;l++,c++)u=n[c],o=t[l],r+="S"+(u[0]-o[0])+","+(u[1]-o[1])+","+u[0]+","+u[1]}if(e){var s=n[c];r+="Q"+(u[0]+2*o[0]/3)+","+(u[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function nr(n,t){for(var e,r=[],i=(1-t)/2,u=n[0],a=n[1],o=1,c=n.length;++o<c;)e=u,u=a,a=n[o],r.push([i*(a[0]-e[0]),i*(a[1]-e[1])]);return r}function tr(n){if(n.length<3)return Xe(n);var t=1,e=n.length,r=n[0],i=r[0],u=r[1],a=[i,i,i,(r=n[1])[0]],o=[u,u,u,r[1]],c=[i,",",u,"L",ur(gc,a),",",ur(gc,o)];for(n.push(n[e-1]);++t<=e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),ar(c,a,o);return n.pop(),c.push("L",r),c.join("")}function er(n){if(n.length<4)return Xe(n);for(var t,e=[],r=-1,i=n.length,u=[0],a=[0];++r<3;)t=n[r],u.push(t[0]),a.push(t[1]);for(e.push(ur(gc,u)+","+ur(gc,a)),--r;++r<i;)t=n[r],u.shift(),u.push(t[0]),a.shift(),a.push(t[1]),ar(e,u,a);return e.join("")}function rr(n){for(var t,e,r=-1,i=n.length,u=i+4,a=[],o=[];++r<4;)e=n[r%i],a.push(e[0]),o.push(e[1]);for(t=[ur(gc,a),",",ur(gc,o)],--r;++r<u;)e=n[r%i],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),ar(t,a,o);return t.join("")}function ir(n,t){var e=n.length-1;if(e)for(var r,i,u=n[0][0],a=n[0][1],o=n[e][0]-u,c=n[e][1]-a,l=-1;++l<=e;)r=n[l],i=l/e,r[0]=t*r[0]+(1-t)*(u+i*o),r[1]=t*r[1]+(1-t)*(a+i*c);return tr(n)}function ur(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]
-}function ar(n,t,e){n.push("C",ur(fc,t),",",ur(fc,e),",",ur(hc,t),",",ur(hc,e),",",ur(gc,t),",",ur(gc,e))}function or(n,t){return(t[1]-n[1])/(t[0]-n[0])}function cr(n){for(var t=0,e=n.length-1,r=[],i=n[0],u=n[1],a=r[0]=or(i,u);++t<e;)r[t]=(a+(a=or(i=u,u=n[t+1])))/2;return r[t]=a,r}function lr(n){for(var t,e,r,i,u=[],a=cr(n),o=-1,c=n.length-1;++o<c;)t=or(n[o],n[o+1]),Math.abs(t)<1e-6?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,i=e*e+r*r,i>9&&(i=3*t/Math.sqrt(i),a[o]=i*e,a[o+1]=i*r));for(o=-1;++o<=c;)i=(n[Math.min(c,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),u.push([i||0,a[o]*i||0]);return u}function sr(n){return n.length<3?Xe(n):n[0]+Qe(n,lr(n))}function fr(n,t,e,r){var i,u,a,o,c,l,s;return i=r[n],u=i[0],a=i[1],i=r[t],o=i[0],c=i[1],i=r[e],l=i[0],s=i[1],(s-a)*(o-u)-(c-a)*(l-u)>0}function hr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function gr(n,t,e,r){var i=n[0],u=e[0],a=t[0]-i,o=r[0]-u,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(o*(c-l)-f*(i-u))/(f*a-o*s);return[i+h*a,c+h*s]}function pr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function mr(n,t){var e={list:n.map(function(n,t){return{index:t,x:n[0],y:n[1]}}).sort(function(n,t){return n.y<t.y?-1:n.y>t.y?1:n.x<t.x?-1:n.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(n,t){return{edge:n,side:t,vertex:null,l:null,r:null}},insert:function(n,t){t.l=n,t.r=n.r,n.r.l=t,n.r=t},leftBound:function(n){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,n));return t=t.l},del:function(n){n.l.r=n.r,n.r.l=n.l,n.edge=null},right:function(n){return n.r},left:function(n){return n.l},leftRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[n.side]},rightRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[mc[n.side]]}},i={bisect:function(n,t){var e={region:{l:n,r:t},ep:{l:null,r:null}},r=t.x-n.x,i=t.y-n.y,u=r>0?r:-r,a=i>0?i:-i;return e.c=n.x*r+n.y*i+.5*(r*r+i*i),u>a?(e.a=1,e.b=i/r,e.c/=r):(e.b=1,e.a=r/i,e.c/=i),e},intersect:function(n,t){var e=n.edge,r=t.edge;if(!e||!r||e.region.r==r.region.r)return null;var i=e.a*r.b-e.b*r.a;if(Math.abs(i)<1e-10)return null;var u,a,o=(e.c*r.b-r.c*e.b)/i,c=(r.c*e.a-e.c*r.a)/i,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(u=n,a=e):(u=t,a=r);var f=o>=a.region.r.x;return f&&"l"===u.side||!f&&"r"===u.side?null:{x:o,y:c}},rightOf:function(n,t){var e=n.edge,r=e.region.r,i=t.x>r.x;if(i&&"l"===n.side)return 1;if(!i&&"r"===n.side)return 0;if(1===e.a){var u=t.y-r.y,a=t.x-r.x,o=0,c=0;if(!i&&e.b<0||i&&e.b>=0?c=o=u>=e.b*a:(c=t.x+t.y*e.b>e.c,e.b<0&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-u*u)<l*u*(1+2*a/l+e.b*e.b),e.b<0&&(c=!c)}}else{var s=e.c-e.a*t.x,f=t.y-s,h=t.x-r.x,g=s-r.y;c=f*f>h*h+g*g}return"l"===n.side?c:!c},endPoint:function(n,e,r){n.ep[e]=r,n.ep[mc[e]]&&t(n)},distance:function(n,t){var e=n.x-t.x,r=n.y-t.y;return Math.sqrt(e*e+r*r)}},u={list:[],insert:function(n,t,e){n.vertex=t,n.ystar=t.y+e;for(var r=0,i=u.list,a=i.length;a>r;r++){var o=i[r];if(!(n.ystar>o.ystar||n.ystar==o.ystar&&t.x>o.vertex.x))break}i.splice(r,0,n)},del:function(n){for(var t=0,e=u.list,r=e.length;r>t&&e[t]!=n;++t);e.splice(t,1)},empty:function(){return 0===u.list.length},nextEvent:function(n){for(var t=0,e=u.list,r=e.length;r>t;++t)if(e[t]==n)return e[t+1];return null},min:function(){var n=u.list[0];return{x:n.vertex.x,y:n.ystar}},extractMin:function(){return u.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,s,f,h,g,p,m,d,v,y,M=e.list.shift();;)if(u.empty()||(a=u.min()),M&&(u.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=i.bisect(h,M),f=r.createHalfEdge(v,"l"),r.insert(o,f),m=i.intersect(o,f),m&&(u.del(o),u.insert(o,m,i.distance(m,M))),o=f,f=r.createHalfEdge(v,"r"),r.insert(o,f),m=i.intersect(f,c),m&&u.insert(f,m,i.distance(m,M)),M=e.list.shift();else{if(u.empty())break;o=u.extractMin(),l=r.left(o),c=r.right(o),s=r.right(c),h=r.leftRegion(o),g=r.rightRegion(c),d=o.vertex,i.endPoint(o.edge,o.side,d),i.endPoint(c.edge,c.side,d),r.del(o),u.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),v=i.bisect(h,g),f=r.createHalfEdge(v,y),r.insert(l,f),i.endPoint(v,mc[y],d),m=i.intersect(l,f),m&&(u.del(l),u.insert(l,m,i.distance(m,h))),m=i.intersect(f,s),m&&u.insert(f,m,i.distance(m,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))t(o.edge)}function dr(n){return n.x}function vr(n){return n.y}function yr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Mr(n,t,e,r,i,u){if(!n(t,e,r,i,u)){var a=.5*(e+i),o=.5*(r+u),c=t.nodes;c[0]&&Mr(n,c[0],e,r,a,o),c[1]&&Mr(n,c[1],a,r,i,o),c[2]&&Mr(n,c[2],e,o,a,u),c[3]&&Mr(n,c[3],a,o,i,u)}}function xr(n,t){n=ya.rgb(n),t=ya.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,a=t.g-r,o=t.b-i;return function(n){return"#"+ct(Math.round(e+u*n))+ct(Math.round(r+a*n))+ct(Math.round(i+o*n))}}function br(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Sr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function _r(n,t){return t-=n=+n,function(e){return n+t*e}}function wr(n,t){var e,r,i,u,a,o=0,c=0,l=[],s=[];for(n+="",t+="",dc.lastIndex=0,r=0;e=dc.exec(t);++r)e.index&&l.push(t.substring(o,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),o=dc.lastIndex;for(o<t.length&&l.push(t.substring(o)),r=0,u=s.length;(e=dc.exec(n))&&u>r;++r)if(a=s[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),i=r+1;u>i;++i)s[i].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),i=r+1;u>i;++i)s[i].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),i=r+1;u>i;++i)s[i].i--;s.splice(r,1),u--,r--}else a.x=_r(parseFloat(e[0]),parseFloat(a.x));for(;u>r;)a=s.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),u--;return 1===l.length?null==l[0]?(a=s[0].x,function(n){return a(n)+""}):function(){return t}:function(n){for(r=0;u>r;++r)l[(a=s[r]).i]=a.x(n);return l.join("")}}function Sr(n,t){for(var e,r=ya.interpolators.length;--r>=0&&!(e=ya.interpolators[r](n,t)););return e}function Er(n,t){var e,r=[],i=[],u=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Sr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;a>e;++e)i[e]=t[e];return function(n){for(e=0;o>e;++e)i[e]=r[e](n);return i}}function kr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Ar(n){return function(t){return 1-n(1-t)}}function Nr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function qr(n){return n*n}function Tr(n){return n*n*n}function Cr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function zr(n){return function(t){return Math.pow(t,n)}}function Dr(n){return 1-Math.cos(n*Ka/2)}function jr(n){return Math.pow(2,10*(n-1))}function Lr(n){return 1-Math.sqrt(1-n*n)}function Hr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/(2*Ka)*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ka/t)}}function Fr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Pr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Or(n,t){n=ya.hcl(n),t=ya.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,a=t.c-r,o=t.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return J(e+u*n,r+a*n,i+o*n)+""}}function Yr(n,t){n=ya.hsl(n),t=ya.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,a=t.s-r,o=t.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return R(e+u*n,r+a*n,i+o*n)+""}}function Rr(n,t){n=ya.lab(n),t=ya.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,a=t.a-r,o=t.b-i;return function(n){return Q(e+u*n,r+a*n,i+o*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ir(n){var t=[n.a,n.b],e=[n.c,n.d],r=Xr(t),i=Vr(t,e),u=Xr(Zr(e,t,-i))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*eo,this.translate=[n.e,n.f],this.scale=[r,u],this.skew=u?Math.atan2(i,u)*eo:0}function Vr(n,t){return n[0]*t[0]+n[1]*t[1]}function Xr(n){var t=Math.sqrt(Vr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Zr(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Br(n,t){var e,r=[],i=[],u=ya.transform(n),a=ya.transform(t),o=u.translate,c=a.translate,l=u.rotate,s=a.rotate,f=u.skew,h=a.skew,g=u.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),i.push({i:1,x:_r(o[0],c[0])},{i:3,x:_r(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),i.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:_r(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?i.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:_r(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),i.push({i:e-4,x:_r(g[0],p[0])},{i:e-2,x:_r(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=i.length,function(n){for(var t,u=-1;++u<e;)r[(t=i[u]).i]=t.x(n);return r.join("")}}function $r(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Wr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),i=[t];t!==r;)t=t.parent,i.push(t);for(var u=i.length;e!==r;)i.splice(u,0,e),e=e.parent;return i}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),i=e.pop(),u=r.pop(),a=null;i===u;)a=i,i=e.pop(),u=r.pop();return a}function Qr(n){n.fixed|=2}function ni(n){n.fixed&=-7}function ti(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ei(n){n.fixed&=-5}function ri(n,t,e){var r=0,i=0;if(n.charge=0,!n.leaf)for(var u,a=n.nodes,o=a.length,c=-1;++c<o;)u=a[c],null!=u&&(ri(u,t,e),n.charge+=u.charge,r+=u.charge*u.cx,i+=u.charge*u.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,i+=l*n.point.y}n.cx=r/n.charge,n.cy=i/n.charge}function ii(n,t){return ya.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ci,n}function ui(n){return n.children}function ai(n){return n.value}function oi(n,t){return t.value-n.value}function ci(n){return ya.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function li(n){return n.x}function si(n){return n.y}function fi(n,t,e){n.y0=t,n.y=e}function hi(n){return ya.range(n.length)}function gi(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function pi(n){for(var t,e=1,r=0,i=n[0][1],u=n.length;u>e;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function mi(n){return n.reduce(di,0)}function di(n,t){return n+t[1]}function vi(n,t){return yi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function yi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function Mi(n){return[ya.min(n),ya.max(n)]}function xi(n,t){return n.parent==t.parent?1:2}function bi(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function _i(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function wi(n,t){var e=n.children;if(e&&(i=e.length))for(var r,i,u=-1;++u<i;)t(r=wi(e[u],t),n)>0&&(n=r);return n}function Si(n,t){return n.x-t.x}function Ei(n,t){return t.x-n.x}function ki(n,t){return n.depth-t.depth}function Ai(n,t){function e(n,r){var i=n.children;if(i&&(a=i.length))for(var u,a,o=null,c=-1;++c<a;)u=i[c],e(u,o),o=u;t(n,r)}e(n,null)}function Ni(n){for(var t,e=0,r=0,i=n.children,u=i.length;--u>=0;)t=i[u]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function qi(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function Ti(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Ci(n,t){return n.value-t.value}function zi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Di(n,t){n._pack_next=t,t._pack_prev=n}function ji(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Li(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,i,u,a,o,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Hi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(i=e[1],i.x=i.r,i.y=0,t(i),l>2))for(u=e[2],Oi(r,i,u),t(u),zi(r,u),r._pack_prev=u,zi(u,i),i=r._pack_next,a=3;l>a;a++){Oi(r,i,u=e[a]);var p=0,m=1,d=1;for(o=i._pack_next;o!==i;o=o._pack_next,m++)if(ji(o,u)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!ji(c,u);c=c._pack_prev,d++);p?(d>m||m==d&&i.r<r.r?Di(r,i=o):Di(r=c,i),a--):(zi(r,u),i=u,t(u))}var v=(s+f)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)u=e[a],u.x-=v,u.y-=y,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Fi)}}function Hi(n){n._pack_next=n._pack_prev=n}function Fi(n){delete n._pack_next,delete n._pack_prev}function Pi(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,a=i.length;++u<a;)Pi(i[u],t,e,r)}function Oi(n,t,e){var r=n.r+e.r,i=t.x-n.x,u=t.y-n.y;if(r&&(i||u)){var a=t.r+e.r,o=i*i+u*u;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+c*i+l*u,e.y=n.y+c*u-l*i}else e.x=n.x+r,e.y=n.y}function Yi(n){return 1+ya.max(n,function(n){return n.y})}function Ri(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ui(n){var t=n.children;return t&&t.length?Ui(t[0]):n}function Ii(n){var t,e=n.children;return e&&(t=e.length)?Ii(e[t-1]):n}function Vi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Xi(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Zi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Bi(n){return n.rangeExtent?n.rangeExtent():Zi(n.range())}function $i(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Wi(n,t){var e,r=0,i=n.length-1,u=n[r],a=n[i];return u>a&&(e=r,r=i,i=e,e=u,u=a,a=e),n[r]=t.floor(u),n[i]=t.ceil(a),n}function Ji(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:kc}function Gi(n,t,e,r){var i=[],u=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)i.push(e(n[a-1],n[a])),u.push(r(t[a-1],t[a]));return function(t){var e=ya.bisect(n,t,1,o)-1;return u[e](i[e](t))}}function Ki(n,t,e,r){function i(){var i=Math.min(n.length,t.length)>2?Gi:$i,c=r?Wr:$r;return a=i(n,t,c,e),o=i(t,n,c,Sr),u}function u(n){return a(n)}var a,o;return u.invert=function(n){return o(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return ru(n,t)},u.tickFormat=function(t,e){return iu(n,t,e)},u.nice=function(t){return nu(n,t),i()},u.copy=function(){return Ki(n,t,e,r)},i()}function Qi(n,t){return ya.rebind(n,t,"range","rangeRound","interpolate","clamp")}function nu(n,t){return Wi(n,Ji(t?eu(n,t)[2]:tu(n)))}function tu(n){var t=Zi(n),e=t[1]-t[0];return Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1)}function eu(n,t){var e=Zi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function ru(n,t){return ya.range.apply(ya,eu(n,t))}function iu(n,t,e){var r=-Math.floor(Math.log(eu(n,t)[2])/Math.LN10+.01);return ya.format(e?e.replace(wo,function(n,t,e,i,u,a,o,c,l,s){return[t,e,i,u,a,o,c,l||"."+(r-2*("%"===s)),s].join("")}):",."+r+"f")}function uu(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(i(t))}return a.invert=function(t){return u(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),a):t},a.nice=function(){var t=Wi(r.map(i),e?Math:Nc);return n.domain(t),r=t.map(u),a},a.ticks=function(){var n=Zi(r),a=[],o=n[0],c=n[1],l=Math.floor(i(o)),s=Math.ceil(i(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)a.push(u(l)*h);a.push(u(l))}else for(a.push(u(l));l++<s;)for(var h=f-1;h>0;h--)a.push(u(l)*h);for(l=0;a[l]<o;l++);for(s=a.length;a[s-1]>c;s--);a=a.slice(l,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return Ac;arguments.length<2?t=Ac:"function"!=typeof t&&(t=ya.format(t));var r,o=Math.max(.1,n/a.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/u(c(i(n)+r))<=o?t(n):""}},a.copy=function(){return uu(n.copy(),t,e,r)},Qi(a,n)}function au(n,t,e){function r(t){return n(i(t))}var i=ou(t),u=ou(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return ru(e,n)},r.tickFormat=function(n,t){return iu(e,n,t)},r.nice=function(n){return r.domain(nu(e,n))},r.exponent=function(a){return arguments.length?(i=ou(t=a),u=ou(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return au(n.copy(),t,e)},Qi(r,n)}function ou(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function cu(n,t){function e(t){return a[((u.get(t)||u.set(t,n.push(t)))-1)%a.length]}function r(t,e){return ya.range(n.length).map(function(n){return t+e*n})}var u,a,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new i;for(var a,o=-1,c=r.length;++o<c;)u.has(a=r[o])||u.set(a,n.push(a));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(a=n,o=0,t={t:"range",a:arguments},e):a},e.rangePoints=function(i,u){arguments.length<2&&(u=0);var c=i[0],l=i[1],s=(l-c)/(Math.max(1,n.length-1)+u);return a=r(n.length<2?(c+l)/2:c+s*u/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(i,u,c){arguments.length<2&&(u=0),arguments.length<3&&(c=u);var l=i[1]<i[0],s=i[l-0],f=i[1-l],h=(f-s)/(n.length-u+2*c);return a=r(s+h*c,h),l&&a.reverse(),o=h*(1-u),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,u,c){arguments.length<2&&(u=0),arguments.length<3&&(c=u);var l=i[1]<i[0],s=i[l-0],f=i[1-l],h=Math.floor((f-s)/(n.length-u+2*c)),g=f-s-(n.length-u)*h;return a=r(s+Math.round(g/2),h),l&&a.reverse(),o=Math.round(h*(1-u)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Zi(t.a[0])},e.copy=function(){return cu(n,t)},e.domain(n)}function lu(n,t){function e(){var e=0,u=t.length;for(i=[];++e<u;)i[e-1]=ya.quantile(n,e/u);return r}function r(n){return isNaN(n=+n)?void 0:t[ya.bisect(i,n)]}var i;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(ya.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return i},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?i[e-1]:n[0],e<i.length?i[e]:n[n.length-1]]},r.copy=function(){return lu(n,t)},e()}function su(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(u*(t-n))))]}function i(){return u=e.length/(t-n),a=e.length-1,r}var u,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],i()):[n,t]},r.range=function(n){return arguments.length?(e=n,i()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/u+n,[t,t+1/u]},r.copy=function(){return su(n,t,e)},i()}function fu(n,t){function e(e){return e>=e?t[ya.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return fu(n,t)},e}function hu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return ru(n,t)},t.tickFormat=function(t,e){return iu(n,t,e)},t.copy=function(){return hu(n)},t}function gu(n){return n.innerRadius}function pu(n){return n.outerRadius}function mu(n){return n.startAngle}function du(n){return n.endAngle}function vu(n){for(var t,e,r,i=-1,u=n.length;++i<u;)t=n[i],e=t[0],r=t[1]+Dc,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function yu(n){function t(t){function c(){m.push("M",o(n(v),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,m=[],d=[],v=[],y=-1,M=t.length,x=pt(e),b=pt(i),_=e===r?function(){return g}:pt(r),w=i===u?function(){return p}:pt(u);++y<M;)a.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),v.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],v=[]);return d.length&&c(),m.length?m.join(""):null}var e=Ie,r=Ie,i=0,u=Ve,a=Xt,o=Xe,c=o.key,l=o,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(i=u=n,t):u},t.y0=function(n){return arguments.length?(i=n,t):i},t.y1=function(n){return arguments.length?(u=n,t):u},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?o=n:(o=sc.get(n)||Xe).key,l=o.reverse||o,s=o.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Mu(n){return n.radius}function xu(n){return[n.x,n.y]}function bu(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+Dc;return[e*Math.cos(r),e*Math.sin(r)]}}function _u(){return 64}function wu(){return"circle"}function Su(n){var t=Math.sqrt(n/Ka);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Eu(n,t){return La(n,Yc),n.id=t,n}function ku(n,t,e,r){var i=n.id;return T(n,"function"==typeof e?function(n,u,a){n.__transition__[i].tween.set(t,r(e.call(n,n.__data__,u,a)))}:(e=r(e),function(n){n.__transition__[i].tween.set(t,e)}))}function Au(n){return null==n&&(n=""),function(){this.textContent=n}}function Nu(n,t,e,r){var u=n.__transition__||(n.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;a=u[e]={tween:new i,time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,ya.timer(function(r){function i(r){return u.active>e?l():(u.active=e,a.event&&a.event.start.call(n,s,t),a.tween.forEach(function(e,r){(r=r.call(n,s,t))&&p.push(r)}),c(r)?1:(xt(c,0,o),void 0))}function c(r){if(u.active!==e)return l();for(var i=(r-h)/g,o=f(i),c=p.length;c>0;)p[--c].call(n,o);return i>=1?(l(),a.event&&a.event.end.call(n,s,t),1):void 0}function l(){return--u.count?delete u[e]:delete n.__transition__,1}var s=n.__data__,f=a.ease,h=a.delay,g=a.duration,p=[];return r>=h?i(r):(xt(i,h,o),void 0)},0,o)}}function qu(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Tu(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Cu(n,t,e){if(r=[],e&&t.length>1){for(var r,i,u,a=Zi(n.domain()),o=-1,c=t.length,l=(t[1]-t[0])/++e;++o<c;)for(i=e;--i>0;)(u=+t[o]-i*l)>=a[0]&&r.push(u);for(--o,i=0;++i<e&&(u=+t[o]+i*l)<a[1];)r.push(u)}return r}function zu(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Du(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new Zc(e-1)),1),e}function u(n,e){return t(n=new Zc(+n),e),n}function a(n,r,u){var a=i(n),o=[];if(u>1)for(;r>a;)e(a)%u||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{Zc=zu;var r=new zu;return r._=n,a(r,t,e)}finally{Zc=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=a;var c=n.utc=ju(n);return c.floor=c,c.round=ju(r),c.ceil=ju(i),c.offset=ju(u),c.range=o,n}function ju(n){return function(t,e){try{Zc=zu;var r=new zu;return r._=t,n(r,e)._}finally{Zc=Date}}}function Lu(n,t,e,r){for(var i,u,a=0,o=t.length,c=e.length;o>a;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(u=gl[t.charAt(a++)],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function Hu(n){return new RegExp("^(?:"+n.map(ya.requote).join("|")+")","i")}function Fu(n){for(var t=new i,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Pu(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Ou(n,t,e){il.lastIndex=0;var r=il.exec(t.substring(e));return r?(n.w=ul.get(r[0].toLowerCase()),e+r[0].length):-1}function Yu(n,t,e){el.lastIndex=0;var r=el.exec(t.substring(e));return r?(n.w=rl.get(r[0].toLowerCase()),e+r[0].length):-1}function Ru(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Uu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Iu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Vu(n,t,e){cl.lastIndex=0;var r=cl.exec(t.substring(e));return r?(n.m=ll.get(r[0].toLowerCase()),e+r[0].length):-1}function Xu(n,t,e){al.lastIndex=0;var r=al.exec(t.substring(e));return r?(n.m=ol.get(r[0].toLowerCase()),e+r[0].length):-1}function Zu(n,t,e){return Lu(n,hl.c.toString(),t,e)}function Bu(n,t,e){return Lu(n,hl.x.toString(),t,e)}function $u(n,t,e){return Lu(n,hl.X.toString(),t,e)}function Wu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ju(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.y=Gu(+r[0]),e+r[0].length):-1}function Gu(n){return n+(n>68?1900:2e3)}function Ku(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qu(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function na(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function ta(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ea(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ra(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ia(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ua(n,t,e){var r=ml.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function aa(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return e+Pu(r,"0",2)+Pu(i,"0",2)}function oa(n,t,e){sl.lastIndex=0;var r=sl.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ca(n){return n.toISOString()}function la(n,t,e){function r(t){return n(t)}return r.invert=function(t){return sa(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(sa)},r.nice=function(n){return r.domain(Wi(r.domain(),n))},r.ticks=function(e,i){var u=Zi(r.domain());if("function"!=typeof e){var a=u[1]-u[0],o=a/e,c=ya.bisect(vl,o);if(c==vl.length)return t.year(u,e);if(!c)return n.ticks(e).map(sa);o/vl[c-1]<vl[c]/o&&--c,e=t[c],i=e[1],e=e[0].range}return e(u[0],new Date(+u[1]+1),i)},r.tickFormat=function(){return e},r.copy=function(){return la(n.copy(),t,e)},Qi(r,n)}function sa(n){return new Date(n)}function fa(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function ha(n){var t=new Date(n,0,1);return t.setFullYear(n),t}function ga(n){var t=n.getFullYear(),e=ha(t),r=ha(t+1);return t+(n-e)/(r-e)}function pa(n){var t=new Date(Date.UTC(n,0,1));return t.setUTCFullYear(n),t}function ma(n){var t=n.getUTCFullYear(),e=pa(t),r=pa(t+1);return t+(n-e)/(r-e)}function da(n){return JSON.parse(n.responseText)}function va(n){var t=Ma.createRange();return t.selectNode(Ma.body),t.createContextualFragment(n.responseText)}var ya={version:"3.2.8"};Date.now||(Date.now=function(){return+new Date});var Ma=document,xa=Ma.documentElement,ba=window;try{Ma.createElement("div").style.setProperty("opacity",0,"")}catch(_a){var wa=ba.Element.prototype,Sa=wa.setAttribute,Ea=wa.setAttributeNS,ka=ba.CSSStyleDeclaration.prototype,Aa=ka.setProperty;wa.setAttribute=function(n,t){Sa.call(this,n,t+"")},wa.setAttributeNS=function(n,t,e){Ea.call(this,n,t,e+"")},ka.setProperty=function(n,t,e){Aa.call(this,n,t+"",e)}}ya.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},ya.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ya.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u&&!(null!=(e=n[i])&&e>=e);)e=void 0;for(;++i<u;)null!=(r=n[i])&&e>r&&(e=r)}else{for(;++i<u&&!(null!=(e=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<u;)null!=(r=t.call(n,n[i],i))&&e>r&&(e=r)}return e},ya.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u&&!(null!=(e=n[i])&&e>=e);)e=void 0;for(;++i<u;)null!=(r=n[i])&&r>e&&(e=r)}else{for(;++i<u&&!(null!=(e=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<u;)null!=(r=t.call(n,n[i],i))&&r>e&&(e=r)}return e},ya.extent=function(n,t){var e,r,i,u=-1,a=n.length;if(1===arguments.length){for(;++u<a&&!(null!=(e=i=n[u])&&e>=e);)e=i=void 0;for(;++u<a;)null!=(r=n[u])&&(e>r&&(e=r),r>i&&(i=r))}else{for(;++u<a&&!(null!=(e=i=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<a;)null!=(r=t.call(n,n[u],u))&&(e>r&&(e=r),r>i&&(i=r))}return[e,i]},ya.sum=function(n,t){var e,r=0,i=n.length,u=-1;if(1===arguments.length)for(;++u<i;)isNaN(e=+n[u])||(r+=e);else for(;++u<i;)isNaN(e=+t.call(n,n[u],u))||(r+=e);return r},ya.mean=function(t,e){var r,i=t.length,u=0,a=-1,o=0;if(1===arguments.length)for(;++a<i;)n(r=t[a])&&(u+=(r-u)/++o);else for(;++a<i;)n(r=e.call(t,t[a],a))&&(u+=(r-u)/++o);return o?u:void 0},ya.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),i=+n[r-1],u=e-r;return u?i+u*(n[r]-i):i},ya.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?ya.quantile(t.sort(ya.ascending),.5):void 0},ya.bisector=function(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n.call(t,t[u],u)<e?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;e<n.call(t,t[u],u)?i=u:r=u+1}return r}}};var Na=ya.bisector(function(n){return n});ya.bisectLeft=Na.left,ya.bisect=ya.bisectRight=Na.right,ya.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},ya.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ya.zip=function(){if(!(i=arguments.length))return[];for(var n=-1,e=ya.min(arguments,t),r=new Array(e);++n<e;)for(var i,u=-1,a=r[n]=new Array(i);++u<i;)a[u]=arguments[u][n];return r},ya.transpose=function(n){return ya.zip.apply(ya,n)},ya.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ya.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ya.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ya.merge=function(n){return Array.prototype.concat.apply([],n)},ya.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var i,u=[],a=e(Math.abs(r)),o=-1;if(n*=a,t*=a,r*=a,0>r)for(;(i=n+r*++o)>t;)u.push(i/a);else for(;(i=n+r*++o)<t;)u.push(i/a);return u},ya.map=function(n){var t=new i;if(n instanceof i)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(i,{has:function(n){return qa+n in this},get:function(n){return this[qa+n]},set:function(n,t){return this[qa+n]=t},remove:function(n){return n=qa+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];
-return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Ta&&n.call(this,t.substring(1),this[t])}});var qa="\0",Ta=qa.charCodeAt(0);ya.nest=function(){function n(t,o,c){if(c>=a.length)return r?r.call(u,o):e?o.sort(e):o;for(var l,s,f,h,g=-1,p=o.length,m=a[c++],d=new i;++g<p;)(h=d.get(l=m(s=o[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),d.forEach(f),s}function t(n,e){if(e>=a.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,u={},a=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ya.map,e,0),0)},u.key=function(n){return a.push(n),u},u.sortKeys=function(n){return o[a.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ya.set=function(n){var t=new u;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(u,{has:function(n){return qa+n in this},add:function(n){return this[qa+n]=!0,n},remove:function(n){return n=qa+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Ta&&n.call(this,t.substring(1))}}),ya.behavior={},ya.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r<i;)n[e=arguments[r]]=a(n,t,t[e]);return n};var Ca=["webkit","ms","moz","Moz","o","O"],za=l;try{za(xa.childNodes)[0].nodeType}catch(Da){za=c}ya.dispatch=function(){for(var n=new f,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=h(n);return n},f.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ya.event=null,ya.requote=function(n){return n.replace(ja,"\\$&")};var ja=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,La={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ha=function(n,t){return t.querySelector(n)},Fa=function(n,t){return t.querySelectorAll(n)},Pa=xa[o(xa,"matchesSelector")],Oa=function(n,t){return Pa.call(n,t)};"function"==typeof Sizzle&&(Ha=function(n,t){return Sizzle(n,t)[0]||null},Fa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},Oa=Sizzle.matchesSelector),ya.selection=function(){return Ia};var Ya=ya.selection.prototype=[];Ya.select=function(n){var t,e,r,i,u=[];n=v(n);for(var a=-1,o=this.length;++a<o;){u.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;++c<l;)(i=r[c])?(t.push(e=n.call(i,i.__data__,c,a)),e&&"__data__"in i&&(e.__data__=i.__data__)):t.push(null)}return d(u)},Ya.selectAll=function(n){var t,e,r=[];n=y(n);for(var i=-1,u=this.length;++i<u;)for(var a=this[i],o=-1,c=a.length;++o<c;)(e=a[o])&&(r.push(t=za(n.call(e,e.__data__,o,i))),t.parentNode=e);return d(r)};var Ra={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ya.ns={prefix:Ra,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),Ra.hasOwnProperty(e)?{space:Ra[e],local:n}:n}},Ya.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ya.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},Ya.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,i=-1;if(t=e.classList){for(;++i<r;)if(!t.contains(n[i]))return!1}else for(t=e.getAttribute("class");++i<r;)if(!b(n[i]).test(t))return!1;return!0}for(t in n)this.each(_(t,n[t]));return this}return this.each(_(n,t))},Ya.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(S(e,n[e],t));return this}if(2>r)return ba.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(S(n,t,e))},Ya.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(E(t,n[t]));return this}return this.each(E(n,t))},Ya.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Ya.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Ya.append=function(n){return n=k(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Ya.insert=function(n,t){return n=k(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments))})},Ya.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},Ya.data=function(n,t){function e(n,e){var r,u,a,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),m=new Array(o);if(t){var d,v=new i,y=new i,M=[];for(r=-1;++r<o;)d=t.call(u=n[r],u.__data__,r),v.has(d)?m[r]=u:v.set(d,u),M.push(d);for(r=-1;++r<f;)d=t.call(e,a=e[r],r),(u=v.get(d))?(g[r]=u,u.__data__=a):y.has(d)||(p[r]=A(a)),y.set(d,a),v.remove(d);for(r=-1;++r<o;)v.has(M[r])&&(m[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],a=e[r],u?(u.__data__=a,g[r]=u):p[r]=A(a);for(;f>r;++r)p[r]=A(e[r]);for(;o>r;++r)m[r]=n[r]}p.update=g,p.parentNode=g.parentNode=m.parentNode=n.parentNode,c.push(p),l.push(g),s.push(m)}var r,u,a=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++a<o;)(u=r[a])&&(n[a]=u.__data__);return n}var c=C([]),l=d([]),s=d([]);if("function"==typeof n)for(;++a<o;)e(r=this[a],n.call(r,r.parentNode.__data__,a));else for(;++a<o;)e(r=this[a],n);return l.enter=function(){return c},l.exit=function(){return s},l},Ya.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Ya.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=N(n));for(var u=0,a=this.length;a>u;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return d(i)},Ya.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],i=r.length-1,u=r[i];--i>=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Ya.sort=function(n){n=q.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Ya.each=function(n){return T(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Ya.call=function(n){var t=za(arguments);return n.apply(t[0]=this,t),this},Ya.empty=function(){return!this.node()},Ya.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Ya.size=function(){var n=0;return this.each(function(){++n}),n};var Ua=[];ya.selection.enter=C,ya.selection.enter.prototype=Ua,Ua.append=Ya.append,Ua.empty=Ya.empty,Ua.node=Ya.node,Ua.call=Ya.call,Ua.size=Ya.size,Ua.select=function(n){for(var t,e,r,i,u,a=[],o=-1,c=this.length;++o<c;){r=(i=this[o]).update,a.push(t=[]),t.parentNode=i.parentNode;for(var l=-1,s=i.length;++l<s;)(u=i[l])?(t.push(r[l]=e=n.call(i.parentNode,u.__data__,l,o)),e.__data__=u.__data__):t.push(null)}return d(a)},Ua.insert=function(n,t){return arguments.length<2&&(t=z(this)),Ya.insert.call(this,n,t)},Ya.transition=function(){for(var n,t,e=Hc||++Rc,r=[],i=Fc||{time:Date.now(),ease:Cr,delay:0,duration:250},u=-1,a=this.length;++u<a;){r.push(n=[]);for(var o=this[u],c=-1,l=o.length;++c<l;)(t=o[c])&&Nu(t,c,e,i),n.push(t)}return Eu(r,e)},ya.select=function(n){var t=["string"==typeof n?Ha(n,Ma):n];return t.parentNode=xa,d([t])},ya.selectAll=function(n){var t=za("string"==typeof n?Fa(n,Ma):n);return t.parentNode=xa,d([t])};var Ia=ya.select(xa);Ya.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(D(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(D(n,t,e))};var Va=ya.map({mouseenter:"mouseover",mouseleave:"mouseout"});Va.forEach(function(n){"on"+n in Ma&&Va.remove(n)});var Xa=o(xa.style,"userSelect"),Za=0;ya.mouse=function(n){return F(n,p())};var Ba=/WebKit/.test(ba.navigator.userAgent)?-1:0;ya.touches=function(n,t){return arguments.length<2&&(t=p().touches),t?za(t).map(function(t){var e=F(n,t);return e.identifier=t.identifier,e}):[]},ya.behavior.drag=function(){function n(){this.on("mousedown.drag",a).on("touchstart.drag",o)}function t(){return ya.event.changedTouches[0].identifier}function e(n,t){return ya.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function a(){if(!s)return o();var n=t(s,g),e=n[0]-m[0],r=n[1]-m[1];d|=e|r,m=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function o(){v.on(e+"."+p,null).on(r+"."+p,null),y(d&&ya.event.target===h),f({type:"dragend"})}var c,l=this,s=l.parentNode,f=i.of(l,arguments),h=ya.event.target,g=n(),p=null==g?"drag":"drag-"+g,m=t(s,g),d=0,v=ya.select(ba).on(e+"."+p,a).on(r+"."+p,o),y=H();u?(c=u.apply(l,arguments),c=[c.x-m[0],c.y-m[1]]):c=[0,0],f({type:"dragstart"})}}var i=m(n,"drag","dragstart","dragend"),u=null,a=r(s,ya.mouse,"mousemove","mouseup"),o=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ya.rebind(n,i,"on")},ya.behavior.zoom=function(){function n(){this.on(w,o).on(Ja+".zoom",l).on(S,s).on("dblclick.zoom",f).on(k,c)}function t(n){return[(n[0]-x[0])/b,(n[1]-x[1])/b]}function e(n){return[n[0]*b+x[0],n[1]*b+x[1]]}function r(n){b=Math.max(_[0],Math.min(_[1],n))}function i(n,t){t=e(t),x[0]+=n[0]-t[0],x[1]+=n[1]-t[1]}function u(){v&&v.domain(d.range().map(function(n){return(n-x[0])/b}).map(d.invert)),M&&M.domain(y.range().map(function(n){return(n-x[1])/b}).map(y.invert))}function a(n){u(),n({type:"zoom",scale:b,translate:x})}function o(){function n(){c=1,i(ya.mouse(r),f),a(u)}function e(){l.on(S,ba===r?s:null).on(E,null),h(c&&ya.event.target===o)}var r=this,u=q.of(r,arguments),o=ya.event.target,c=0,l=ya.select(ba).on(S,n).on(E,e),f=t(ya.mouse(r)),h=H()}function c(){function n(){var n=ya.touches(h);return f=b,s={},n.forEach(function(n){s[n.identifier]=t(n)}),n}function e(){var t=Date.now(),e=n();if(1===e.length){if(500>t-p){var u=e[0],o=s[u.identifier];r(2*b),i(u,o),g(),a(m)}p=t}else if(e.length>1){var u=e[0],c=e[1],l=u[0]-c[0],f=u[1]-c[1];d=l*l+f*f}}function u(){var n=ya.touches(h),t=n[0],e=s[t.identifier];if(u=n[1]){var u,o=s[u.identifier],c=ya.event.scale;if(null==c){var l=(l=u[0]-t[0])*l+(l=u[1]-t[1])*l;c=d&&Math.sqrt(l/d)}t=[(t[0]+u[0])/2,(t[1]+u[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(c*f)}p=null,i(t,e),a(m)}function l(){ya.event.touches.length?n():(v.on(A,null).on(N,null),y.on(w,o).on(k,c),M())}var s,f,h=this,m=q.of(h,arguments),d=0,v=ya.select(ba).on(A,u).on(N,l),y=ya.select(h).on(w,null).on(k,e),M=H();e()}function l(){g(),h||(h=t(ya.mouse(this))),r(Math.pow(2,.002*$a())*b),i(ya.mouse(this),h),a(q.of(this,arguments))}function s(){h=null}function f(){var n=ya.mouse(this),e=t(n),u=Math.log(b)/Math.LN2;r(Math.pow(2,ya.event.shiftKey?Math.ceil(u)-1:Math.floor(u)+1)),i(n,e),a(q.of(this,arguments))}var h,p,d,v,y,M,x=[0,0],b=1,_=Wa,w="mousedown.zoom",S="mousemove.zoom",E="mouseup.zoom",k="touchstart.zoom",A="touchmove.zoom",N="touchend.zoom",q=m(n,"zoom");return n.translate=function(t){return arguments.length?(x=t.map(Number),u(),n):x},n.scale=function(t){return arguments.length?(b=+t,u(),n):b},n.scaleExtent=function(t){return arguments.length?(_=null==t?Wa:t.map(Number),n):_},n.x=function(t){return arguments.length?(v=t,d=t.copy(),x=[0,0],b=1,n):v},n.y=function(t){return arguments.length?(M=t,y=t.copy(),x=[0,0],b=1,n):M},ya.rebind(n,q,"on")};var $a,Wa=[0,1/0],Ja="onwheel"in Ma?($a=function(){return-ya.event.deltaY*(ya.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Ma?($a=function(){return ya.event.wheelDelta},"mousewheel"):($a=function(){return-ya.event.detail},"MozMousePixelScroll");P.prototype.toString=function(){return this.rgb()+""},ya.hsl=function(n,t,e){return 1===arguments.length?n instanceof Y?O(n.h,n.s,n.l):lt(""+n,st,O):O(+n,+t,+e)};var Ga=Y.prototype=new P;Ga.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),O(this.h,this.s,this.l/n)},Ga.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),O(this.h,this.s,n*this.l)},Ga.rgb=function(){return R(this.h,this.s,this.l)};var Ka=Math.PI,Qa=1e-6,no=Qa*Qa,to=Ka/180,eo=180/Ka;ya.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?$(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=ya.rgb(n)).r,n.g,n.b)).l,n.a,n.b):$(+n,+t,+e)};var ro=W.prototype=new P;ro.brighter=function(n){return $(this.h,this.c,Math.min(100,this.l+io*(arguments.length?n:1)))},ro.darker=function(n){return $(this.h,this.c,Math.max(0,this.l-io*(arguments.length?n:1)))},ro.rgb=function(){return J(this.h,this.c,this.l).rgb()},ya.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=ya.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var io=18,uo=.95047,ao=1,oo=1.08883,co=K.prototype=new P;co.brighter=function(n){return G(Math.min(100,this.l+io*(arguments.length?n:1)),this.a,this.b)},co.darker=function(n){return G(Math.max(0,this.l-io*(arguments.length?n:1)),this.a,this.b)},co.rgb=function(){return Q(this.l,this.a,this.b)},ya.rgb=function(n,t,e){return 1===arguments.length?n instanceof ot?at(n.r,n.g,n.b):lt(""+n,at,R):at(~~n,~~t,~~e)};var lo=ot.prototype=new P;lo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),at(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):at(i,i,i)},lo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),at(~~(n*this.r),~~(n*this.g),~~(n*this.b))},lo.hsl=function(){return st(this.r,this.g,this.b)},lo.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var so=ya.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});so.forEach(function(n,t){so.set(n,it(t))}),ya.functor=pt,ya.xhr=dt(mt),ya.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var a=ya.xhr(n,t,u);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:i(n)):e},a.row(e)}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function a(t){return t.map(o).join(n)}function o(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(i)return i=!1,u;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(i=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(i=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>s;){var r=n.charCodeAt(s++),o=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.substring(t,s-o)}return n.substring(t)}for(var r,i,u={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==u&&r!==a;)h.push(r),r=e();(!t||(h=t(h,f++)))&&o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new u,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(a).join("\n")},e},ya.csv=ya.dsv(",","text/csv"),ya.tsv=ya.dsv("	","text/tab-separated-values");var fo,ho,go,po,mo,vo=ba[o(ba,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ya.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={callback:n,time:i,next:null};ho?ho.next=u:fo=u,ho=u,go||(po=clearTimeout(po),go=1,vo(Mt))},ya.timer.flush=function(){bt(),_t()};var yo=".",Mo=",",xo=[3,3],bo="$",_o=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(wt);ya.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ya.round(n,St(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),_o[8+e/3]},ya.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},ya.format=function(n){var t=wo.exec(n),e=t[1]||" ",r=t[2]||">",i=t[3]||"",u=t[4]||"",a=t[5],o=+t[6],c=t[7],l=t[8],s=t[9],f=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":"#"===u&&(u="0"+s.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":f=-1,s="r"}"#"===u?u="":"$"===u&&(u=bo),"r"!=s||l||(s="g"),null!=l&&("g"==s?l=Math.max(1,Math.min(21,l)):("e"==s||"f"==s)&&(l=Math.max(0,Math.min(20,l)))),s=So.get(s)||Et;var p=a&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):i;if(0>f){var m=ya.formatPrefix(n,l);n=m.scale(n),h=m.symbol}else n*=f;n=s(n,l);var d=n.lastIndexOf("."),v=0>d?n:n.substring(0,d),y=0>d?"":yo+n.substring(d+1);!a&&c&&(v=Eo(v));var M=u.length+v.length+y.length+(p?0:t.length),x=o>M?new Array(M=o-M+1).join(e):"";return p&&(v=Eo(x+v)),t+=u,n=v+y,("<"===r?t+n+x:">"===r?x+t+n:"^"===r?x.substring(0,M>>=1)+t+n+x.substring(M):t+(p?n:x+n))+h}};var wo=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,So=ya.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ya.round(n,St(n,t))).toFixed(Math.max(0,Math.min(20,St(n*(1+1e-15),t))))}}),Eo=mt;if(xo){var ko=xo.length;Eo=function(n){for(var t=n.length,e=[],r=0,i=xo[0];t>0&&i>0;)e.push(n.substring(t-=i,t+i)),i=xo[r=(r+1)%ko];return e.reverse().join(Mo)}}ya.geo={},kt.prototype={s:0,t:0,add:function(n){At(n,this.t,Ao),At(Ao.s,this.s,this),this.s?this.t+=Ao.t:this.s=Ao.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var Ao=new kt;ya.geo.stream=function(n,t){n&&No.hasOwnProperty(n.type)?No[n.type](n,t):Nt(n,t)};var No={Feature:function(n,t){Nt(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++r<i;)Nt(e[r].geometry,t)}},qo={Sphere:function(n,t){t.sphere()},Point:function(n,t){var e=n.coordinates;t.point(e[0],e[1])},MultiPoint:function(n,t){for(var e,r=n.coordinates,i=-1,u=r.length;++i<u;)e=r[i],t.point(e[0],e[1])},LineString:function(n,t){qt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)qt(e[r],t,0)},Polygon:function(n,t){Tt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,i=e.length;++r<i;)Tt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,i=e.length;++r<i;)Nt(e[r],t)}};ya.geo.area=function(n){return To=0,ya.geo.stream(n,zo),To};var To,Co=new kt,zo={sphere:function(){To+=4*Ka},point:s,lineStart:s,lineEnd:s,polygonStart:function(){Co.reset(),zo.lineStart=Ct},polygonEnd:function(){var n=2*Co;To+=0>n?4*Ka+n:n,zo.lineStart=zo.lineEnd=zo.point=s}};ya.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=zt([t*to,e*to]);if(v){var i=jt(v,r),u=[i[1],-i[0],0],a=jt(u,i);Ft(a),a=Pt(a);var c=t-p,l=c>0?1:-1,m=a[0]*eo*l,d=Math.abs(c)>180;if(d^(m>l*p&&l*t>m)){var y=a[1]*eo;y>g&&(g=y)}else if(m=(m+360)%360-180,d^(m>l*p&&l*t>m)){var y=-a[1]*eo;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);v=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,v=null}function i(n,e){if(v){var r=n-p;y+=Math.abs(r)>180?r+(r>0?360:-360):r}else m=n,d=e;zo.point(n,e),t(n,e)}function u(){zo.lineStart()}function a(){i(m,d),zo.lineEnd(),Math.abs(y)>Qa&&(s=-(h=180)),x[0]=s,x[1]=h,v=null}function o(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,m,d,v,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=i,b.lineStart=u,b.lineEnd=a,y=0,zo.polygonStart()},polygonEnd:function(){zo.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>Co?(s=-(h=180),f=-(g=90)):y>Qa?g=90:-Qa>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ya.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],l(e[0],i)||l(e[1],i)?(o(i[0],e[1])>o(i[0],i[1])&&(i[1]=e[1]),o(e[0],i[1])>o(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var a,e,p=-1/0,t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(a=o(i[1],e[0]))>p&&(p=a,s=e[0],h=i[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ya.geo.centroid=function(n){Do=jo=Lo=Ho=Fo=Po=Oo=Yo=Ro=Uo=Io=0,ya.geo.stream(n,Vo);var t=Ro,e=Uo,r=Io,i=t*t+e*e+r*r;return no>i&&(t=Po,e=Oo,r=Yo,Qa>jo&&(t=Lo,e=Ho,r=Fo),i=t*t+e*e+r*r,no>i)?[0/0,0/0]:[Math.atan2(e,t)*eo,V(r/Math.sqrt(i))*eo]};var Do,jo,Lo,Ho,Fo,Po,Oo,Yo,Ro,Uo,Io,Vo={sphere:s,point:Yt,lineStart:Ut,lineEnd:It,polygonStart:function(){Vo.lineStart=Vt},polygonEnd:function(){Vo.lineStart=Ut}},Xo=$t(Xt,Qt,te,ee),Zo=[-Ka,0],Bo=1e9;(ya.geo.conicEqualArea=function(){return oe(ce)}).raw=ce,ya.geo.albers=function(){return ya.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ya.geo.albersUsa=function(){function n(n){var u=n[0],a=n[1];return t=null,e(u,a),t||(r(u,a),t)||i(u,a),t}var t,e,r,i,u=ya.geo.albers(),a=ya.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=ya.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?a:i>=.166&&.234>i&&r>=-.214&&-.115>r?o:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),a.precision(t),o.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),a.scale(.35*t),o.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var l=u.scale(),s=+t[0],f=+t[1];return e=u.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=a.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Qa,f+.12*l+Qa],[s-.214*l-Qa,f+.234*l-Qa]]).stream(c).point,i=o.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Qa,f+.166*l+Qa],[s-.115*l-Qa,f+.234*l-Qa]]).stream(c).point,n},n.scale(1070)};var $o,Wo,Jo,Go,Ko,Qo,nc={point:s,lineStart:s,lineEnd:s,polygonStart:function(){Wo=0,nc.lineStart=le},polygonEnd:function(){nc.lineStart=nc.lineEnd=nc.point=s,$o+=Math.abs(Wo/2)}},tc={point:se,lineStart:s,lineEnd:s,polygonStart:s,polygonEnd:s},ec={point:ge,lineStart:pe,lineEnd:me,polygonStart:function(){ec.lineStart=de},polygonEnd:function(){ec.point=ge,ec.lineStart=pe,ec.lineEnd=me}};ya.geo.path=function(){function n(n){return n&&("function"==typeof o&&u.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=i(u)),ya.geo.stream(n,a)),u.result()}function t(){return a=null,n}var e,r,i,u,a,o=4.5;return n.area=function(n){return $o=0,ya.geo.stream(n,i(nc)),$o},n.centroid=function(n){return Lo=Ho=Fo=Po=Oo=Yo=Ro=Uo=Io=0,ya.geo.stream(n,i(ec)),Io?[Ro/Io,Uo/Io]:Yo?[Po/Yo,Oo/Yo]:Fo?[Lo/Fo,Ho/Fo]:[0/0,0/0]},n.bounds=function(n){return Ko=Qo=-(Jo=Go=1/0),ya.geo.stream(n,i(tc)),[[Jo,Go],[Ko,Qo]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||Me(n):mt,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new fe:new ve(n),"function"!=typeof o&&u.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(u.pointRadius(+t),+t),n):o},n.projection(ya.geo.albersUsa()).context(null)},ya.geo.projection=xe,ya.geo.projectionMutator=be,(ya.geo.equirectangular=function(){return xe(we)}).raw=we.invert=we,ya.geo.rotation=function(n){function t(t){return t=n(t[0]*to,t[1]*to),t[0]*=eo,t[1]*=eo,t}return n=Se(n[0]%360*to,n[1]*to,n.length>2?n[2]*to:0),t.invert=function(t){return t=n.invert(t[0]*to,t[1]*to),t[0]*=eo,t[1]*=eo,t},t},ya.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Se(-n[0]*to,-n[1]*to,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=eo,n[1]*=eo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Ne((t=+r)*to,i*to),n):t},n.precision=function(r){return arguments.length?(e=Ne(t*to,(i=+r)*to),n):i},n.angle(90)},ya.geo.distance=function(n,t){var e,r=(t[0]-n[0])*to,i=n[1]*to,u=t[1]*to,a=Math.sin(r),o=Math.cos(r),c=Math.sin(i),l=Math.cos(i),s=Math.sin(u),f=Math.cos(u);return Math.atan2(Math.sqrt((e=f*a)*e+(e=l*s-c*f*o)*e),c*s+l*f*o)},ya.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ya.range(Math.ceil(u/d)*d,i,d).map(h).concat(ya.range(Math.ceil(l/v)*v,c,v).map(g)).concat(ya.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Math.abs(n%d)>Qa}).map(s)).concat(ya.range(Math.ceil(o/m)*m,a,m).filter(function(n){return Math.abs(n%v)>Qa}).map(f))}var e,r,i,u,a,o,c,l,s,f,h,g,p=10,m=p,d=90,v=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(g(c).slice(1),h(i).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],l=+t[0][1],c=+t[1][1],u>i&&(t=u,u=i,i=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[u,l],[i,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],v=+t[1],n):[d,v]},n.minorStep=function(t){return arguments.length?(p=+t[0],m=+t[1],n):[p,m]},n.precision=function(t){return arguments.length?(y=+t,s=Te(o,a,90),f=Ce(r,e,y),h=Te(l,c,90),g=Ce(u,i,y),n):y},n.majorExtent([[-180,-90+Qa],[180,90-Qa]]).minorExtent([[-180,-80-Qa],[180,80+Qa]])},ya.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=ze,i=De;return n.distance=function(){return ya.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ya.geo.interpolate=function(n,t){return je(n[0]*to,n[1]*to,t[0]*to,t[1]*to)},ya.geo.length=function(n){return rc=0,ya.geo.stream(n,ic),rc};var rc,ic={sphere:s,point:s,lineStart:Le,lineEnd:s,polygonStart:s,polygonEnd:s},uc=He(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ya.geo.azimuthalEqualArea=function(){return xe(uc)}).raw=uc;var ac=He(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},mt);(ya.geo.azimuthalEquidistant=function(){return xe(ac)}).raw=ac,(ya.geo.conicConformal=function(){return oe(Fe)}).raw=Fe,(ya.geo.conicEquidistant=function(){return oe(Pe)}).raw=Pe;var oc=He(function(n){return 1/n},Math.atan);(ya.geo.gnomonic=function(){return xe(oc)}).raw=oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ka/2]},(ya.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var cc=He(function(){return 1},Math.asin);(ya.geo.orthographic=function(){return xe(cc)}).raw=cc;var lc=He(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ya.geo.stereographic=function(){return xe(lc)}).raw=lc,Re.invert=function(n,t){return[Math.atan2(X(n),Math.cos(t)),V(Math.sin(t)/Z(n))]},(ya.geo.transverseMercator=function(){return Ye(Re)}).raw=Re,ya.geom={},ya.svg={},ya.svg.line=function(){return Ue(mt)};var sc=ya.map({linear:Xe,"linear-closed":Ze,step:Be,"step-before":$e,"step-after":We,basis:tr,"basis-open":er,"basis-closed":rr,bundle:ir,cardinal:Ke,"cardinal-open":Je,"cardinal-closed":Ge,monotone:sr});
-sc.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var fc=[0,2/3,1/3,0],hc=[0,1/3,2/3,0],gc=[0,1/6,2/3,1/6];ya.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i,u,a,o,c,l,s,f,h,g,p,m=pt(e),d=pt(r),v=n.length,y=v-1,M=[],x=[],b=0;if(m===Ie&&r===Ve)t=n;else for(u=0,t=[];v>u;++u)t.push([+m.call(this,i=n[u],u),+d.call(this,i,u)]);for(u=1;v>u;++u)(t[u][1]<t[b][1]||t[u][1]==t[b][1]&&t[u][0]<t[b][0])&&(b=u);for(u=0;v>u;++u)u!==b&&(c=t[u][1]-t[b][1],o=t[u][0]-t[b][0],M.push({angle:Math.atan2(c,o),index:u}));for(M.sort(function(n,t){return n.angle-t.angle}),g=M[0].angle,h=M[0].index,f=0,u=1;y>u;++u){if(a=M[u].index,g==M[u].angle){if(o=t[h][0]-t[b][0],c=t[h][1]-t[b][1],l=t[a][0]-t[b][0],s=t[a][1]-t[b][1],o*o+c*c>=l*l+s*s){M[u].index=-1;continue}M[f].index=-1}g=M[u].angle,f=u,h=a}for(x.push(b),u=0,a=0;2>u;++a)M[a].index>-1&&(x.push(M[a].index),u++);for(p=x.length;y>a;++a)if(!(M[a].index<0)){for(;!fr(x[p-2],x[p-1],M[a].index,t);)--p;x[p++]=M[a].index}var _=[];for(u=p-1;u>=0;--u)_.push(n[x[u]]);return _}var e=Ie,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ya.geom.polygon=function(n){return La(n,pc),n};var pc=ya.geom.polygon.prototype=[];pc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],i=0;++t<e;)n=r,r=this[t],i+=n[1]*r[0]-n[0]*r[1];return.5*i},pc.centroid=function(n){var t,e,r=-1,i=this.length,u=0,a=0,o=this[i-1];for(arguments.length||(n=-1/(6*this.area()));++r<i;)t=o,o=this[r],e=t[0]*o[1]-o[0]*t[1],u+=(t[0]+o[0])*e,a+=(t[1]+o[1])*e;return[u*n,a*n]},pc.clip=function(n){for(var t,e,r,i,u,a,o=pr(n),c=-1,l=this.length-pr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,i=this[c],u=t[(r=t.length-o)-1],e=-1;++e<r;)a=t[e],hr(a,s,i)?(hr(u,s,i)||n.push(gr(u,a,s,i)),n.push(a)):hr(u,s,i)&&n.push(gr(u,a,s,i)),u=a;o&&n.push(n[0]),s=i}return n},ya.geom.delaunay=function(n){var t=n.map(function(){return[]}),e=[];return mr(n,function(e){t[e.region.l.index].push(n[e.region.r.index])}),t.forEach(function(t,r){var i=n[r],u=i[0],a=i[1];t.forEach(function(n){n.angle=Math.atan2(n[0]-u,n[1]-a)}),t.sort(function(n,t){return n.angle-t.angle});for(var o=0,c=t.length-1;c>o;o++)e.push([i,t[o],t[o+1]])}),e},ya.geom.voronoi=function(n){function t(n){var t,u,a,o=n.map(function(){return[]}),c=pt(e),l=pt(r),s=n.length,f=1e6;if(c===Ie&&l===Ve)t=n;else for(t=new Array(s),a=0;s>a;++a)t[a]=[+c.call(this,u=n[a],a),+l.call(this,u,a)];if(mr(t,function(n){var t,e,r,i,u,a;1===n.a&&n.b>=0?(t=n.ep.r,e=n.ep.l):(t=n.ep.l,e=n.ep.r),1===n.a?(u=t?t.y:-f,r=n.c-n.b*u,a=e?e.y:f,i=n.c-n.b*a):(r=t?t.x:-f,u=n.c-n.a*r,i=e?e.x:f,a=n.c-n.a*i);var c=[r,u],l=[i,a];o[n.region.l.index].push(c,l),o[n.region.r.index].push(c,l)}),o=o.map(function(n,e){var r=t[e][0],i=t[e][1],u=n.map(function(n){return Math.atan2(n[0]-r,n[1]-i)}),a=ya.range(n.length).sort(function(n,t){return u[n]-u[t]});return a.filter(function(n,t){return!t||u[n]-u[a[t-1]]>Qa}).map(function(t){return n[t]})}),o.forEach(function(n,e){var r=n.length;if(!r)return n.push([-f,-f],[-f,f],[f,f],[f,-f]);if(!(r>2)){var i=t[e],u=n[0],a=n[1],o=i[0],c=i[1],l=u[0],s=u[1],h=a[0],g=a[1],p=Math.abs(h-l),m=g-s;if(Math.abs(m)<Qa){var d=s>c?-f:f;n.push([-f,d],[f,d])}else if(Qa>p){var v=l>o?-f:f;n.push([v,-f],[v,f])}else{var d=(l-o)*(g-s)>(h-l)*(s-c)?f:-f,y=Math.abs(m)-p;Math.abs(y)<Qa?n.push([0>m?d:-d,d]):(y>0&&(d*=-1),n.push([-f,d],[f,d]))}}}),i)for(a=0;s>a;++a)i.clip(o[a]);for(a=0;s>a;++a)o[a].point=n[a];return o}var e=Ie,r=Ve,i=null;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.clipExtent=function(n){if(!arguments.length)return i&&[i[0],i[2]];if(null==n)i=null;else{var e=+n[0][0],r=+n[0][1],u=+n[1][0],a=+n[1][1];i=ya.geom.polygon([[e,r],[e,a],[u,a],[u,r]])}return t},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):i&&i[2]},t.links=function(n){var t,i,u,a=n.map(function(){return[]}),o=[],c=pt(e),l=pt(r),s=n.length;if(c===Ie&&l===Ve)t=n;else for(t=new Array(s),u=0;s>u;++u)t[u]=[+c.call(this,i=n[u],u),+l.call(this,i,u)];return mr(t,function(t){var e=t.region.l.index,r=t.region.r.index;a[e][r]||(a[e][r]=a[r][e]=!0,o.push({source:n[e],target:n[r]}))}),o},t.triangles=function(n){if(e===Ie&&r===Ve)return ya.geom.delaunay(n);for(var t,i=new Array(c),u=pt(e),a=pt(r),o=-1,c=n.length;++o<c;)(i[o]=[+u.call(this,t=n[o],o),+a.call(this,t,o)]).data=t;return ya.geom.delaunay(i).map(function(n){return n.map(function(n){return n.data})})},t)};var mc={l:"r",r:"l"};ya.geom.quadtree=function(n,t,e,r,i){function u(n){function u(n,t,e,r,i,u,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(Math.abs(c-e)+Math.abs(s-r)<.01)l(n,t,e,r,i,u,a,o);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,i,u,a,o),l(n,t,e,r,i,u,a,o)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,i,u,a,o)}function l(n,t,e,r,i,a,o,c){var l=.5*(i+o),s=.5*(a+c),f=e>=l,h=r>=s,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=yr()),f?i=l:o=l,h?a=s:c=s,u(n,t,e,r,i,a,o,c)}var s,f,h,g,p,m,d,v,y,M=pt(o),x=pt(c);if(null!=t)m=t,d=e,v=r,y=i;else if(v=y=-(m=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.x<m&&(m=s.x),s.y<d&&(d=s.y),s.x>v&&(v=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);m>b&&(m=b),d>_&&(d=_),b>v&&(v=b),_>y&&(y=_),f.push(b),h.push(_)}var w=v-m,S=y-d;w>S?y=d+w:v=m+S;var E=yr();if(E.add=function(n){u(E,n,+M(n,++g),+x(n,g),m,d,v,y)},E.visit=function(n){Mr(n,E,m,d,v,y)},g=-1,null==t){for(;++g<p;)u(E,n[g],f[g],h[g],m,d,v,y);--g}else n.forEach(E.add);return f=h=n=s=null,E}var a,o=Ie,c=Ve;return(a=arguments.length)?(o=dr,c=vr,3===a&&(i=e,r=t,e=t=0),u(n)):(u.x=function(n){return arguments.length?(o=n,u):o},u.y=function(n){return arguments.length?(c=n,u):c},u.extent=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],i=+n[1][1]),u):null==t?null:[[t,e],[r,i]]},u.size=function(n){return arguments.length?(null==n?t=e=r=i=null:(t=e=0,r=+n[0],i=+n[1]),u):null==t?null:[r-t,i-e]},u)},ya.interpolateRgb=xr,ya.interpolateObject=br,ya.interpolateNumber=_r,ya.interpolateString=wr;var dc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;ya.interpolate=Sr,ya.interpolators=[function(n,t){var e=typeof t;return("string"===e?so.has(t)||/^(#|rgb\(|hsl\()/.test(t)?xr:wr:t instanceof P?xr:"object"===e?Array.isArray(t)?Er:br:_r)(n,t)}],ya.interpolateArray=Er;var vc=function(){return mt},yc=ya.map({linear:vc,poly:zr,quad:function(){return qr},cubic:function(){return Tr},sin:function(){return Dr},exp:function(){return jr},circle:function(){return Lr},elastic:Hr,back:Fr,bounce:function(){return Pr}}),Mc=ya.map({"in":mt,out:Ar,"in-out":Nr,"out-in":function(n){return Nr(Ar(n))}});ya.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=yc.get(e)||vc,r=Mc.get(r)||mt,kr(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},ya.interpolateHcl=Or,ya.interpolateHsl=Yr,ya.interpolateLab=Rr,ya.interpolateRound=Ur,ya.transform=function(n){var t=Ma.createElementNS(ya.ns.prefix.svg,"g");return(ya.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ir(e?e.matrix:xc)})(n)},Ir.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var xc={a:1,b:0,c:0,d:1,e:0,f:0};ya.interpolateTransform=Br,ya.layout={},ya.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},ya.layout.chord=function(){function n(){var n,l,f,h,g,p={},m=[],d=ya.range(u),v=[];for(e=[],r=[],n=0,h=-1;++h<u;){for(l=0,g=-1;++g<u;)l+=i[h][g];m.push(l),v.push(ya.range(u)),n+=l}for(a&&d.sort(function(n,t){return a(m[n],m[t])}),o&&v.forEach(function(n,t){n.sort(function(n,e){return o(i[t][n],i[t][e])})}),n=(2*Ka-s*u)/n,l=0,h=-1;++h<u;){for(f=l,g=-1;++g<u;){var y=d[h],M=v[y][g],x=i[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<u;)for(g=h-1;++g<u;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,i,u,a,o,c,l={},s=0;return l.matrix=function(n){return arguments.length?(u=(i=n)&&i.length,e=r=null,l):i},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(a=n,e=r=null,l):a},l.sortSubgroups=function(n){return arguments.length?(o=n,e=null,l):o},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ya.layout.force=function(){function n(n){return function(t,e,r,i){if(t.point!==n){var u=t.cx-n.x,a=t.cy-n.y,o=1/Math.sqrt(u*u+a*a);if(m>(i-e)*o){var c=t.charge*o*o;return n.px-=u*c,n.py-=a*c,!0}if(t.point&&isFinite(o)){var c=t.pointCharge*o*o;n.px-=u*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=ya.event.x,n.py=ya.event.y,o.resume()}var e,r,i,u,a,o={},c=ya.dispatch("start","tick","end"),l=[1,1],s=.9,f=bc,h=_c,g=-30,p=.1,m=.8,d=[],v=[];return o.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,o,f,h,m,y,M,x,b=d.length,_=v.length;for(e=0;_>e;++e)o=v[e],f=o.source,h=o.target,M=h.x-f.x,x=h.y-f.y,(m=M*M+x*x)&&(m=r*u[e]*((m=Math.sqrt(m))-i[e])/m,M*=m,x*=m,h.x-=M*(y=f.weight/(h.weight+f.weight)),h.y-=x*y,f.x+=M*(y=1-y),f.y+=x*y);if((y=r*p)&&(M=l[0]/2,x=l[1]/2,e=-1,y))for(;++e<b;)o=d[e],o.x+=(M-o.x)*y,o.y+=(x-o.y)*y;if(g)for(ri(t=ya.geom.quadtree(d),r,a),e=-1;++e<b;)(o=d[e]).fixed||t.visit(n(o));for(e=-1;++e<b;)o=d[e],o.fixed?(o.x=o.px,o.y=o.py):(o.x-=(o.px-(o.px=o.x))*s,o.y-=(o.py-(o.py=o.y))*s);c.tick({type:"tick",alpha:r})},o.nodes=function(n){return arguments.length?(d=n,o):d},o.links=function(n){return arguments.length?(v=n,o):v},o.size=function(n){return arguments.length?(l=n,o):l},o.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,o):f},o.distance=o.linkDistance,o.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,o):h},o.friction=function(n){return arguments.length?(s=+n,o):s},o.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,o):g},o.gravity=function(n){return arguments.length?(p=+n,o):p},o.theta=function(n){return arguments.length?(m=+n,o):m},o.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ya.timer(o.tick)),o):r},o.start=function(){function n(n,r){for(var i,u=t(e),a=-1,o=u.length;++a<o;)if(!isNaN(i=u[a][n]))return i;return Math.random()*r}function t(){if(!c){for(c=[],r=0;p>r;++r)c[r]=[];for(r=0;m>r;++r){var n=v[r];c[n.source.index].push(n.target),c[n.target.index].push(n.source)}}return c[e]}var e,r,c,s,p=d.length,m=v.length,y=l[0],M=l[1];for(e=0;p>e;++e)(s=d[e]).index=e,s.weight=0;for(e=0;m>e;++e)s=v[e],"number"==typeof s.source&&(s.source=d[s.source]),"number"==typeof s.target&&(s.target=d[s.target]),++s.source.weight,++s.target.weight;for(e=0;p>e;++e)s=d[e],isNaN(s.x)&&(s.x=n("x",y)),isNaN(s.y)&&(s.y=n("y",M)),isNaN(s.px)&&(s.px=s.x),isNaN(s.py)&&(s.py=s.y);if(i=[],"function"==typeof f)for(e=0;m>e;++e)i[e]=+f.call(this,v[e],e);else for(e=0;m>e;++e)i[e]=f;if(u=[],"function"==typeof h)for(e=0;m>e;++e)u[e]=+h.call(this,v[e],e);else for(e=0;m>e;++e)u[e]=h;if(a=[],"function"==typeof g)for(e=0;p>e;++e)a[e]=+g.call(this,d[e],e);else for(e=0;p>e;++e)a[e]=g;return o.resume()},o.resume=function(){return o.alpha(.1)},o.stop=function(){return o.alpha(0)},o.drag=function(){return e||(e=ya.behavior.drag().origin(mt).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?(this.on("mouseover.force",ti).on("mouseout.force",ei).call(e),void 0):e},ya.rebind(o,c,"on")};var bc=20,_c=1;ya.layout.hierarchy=function(){function n(t,a,o){var c=i.call(e,t,a);if(t.depth=a,o.push(t),c&&(l=c.length)){for(var l,s,f=-1,h=t.children=[],g=0,p=a+1;++f<l;)s=n(c[f],p,o),s.parent=t,h.push(s),g+=s.value;r&&h.sort(r),u&&(t.value=g)}else u&&(t.value=+u.call(e,t,a)||0);return t}function t(n,r){var i=n.children,a=0;if(i&&(o=i.length))for(var o,c=-1,l=r+1;++c<o;)a+=t(i[c],l);else u&&(a=+u.call(e,n,r)||0);return u&&(n.value=a),a}function e(t){var e=[];return n(t,0,e),e}var r=oi,i=ui,u=ai;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(i=n,e):i},e.value=function(n){return arguments.length?(u=n,e):u},e.revalue=function(n){return t(n,0),n},e},ya.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(a=u.length)){var a,o,c,l=-1;for(r=t.value?r/t.value:0;++l<a;)n(o=u[l],e,c=o.value*r,i),e+=c}}function t(n){var e=n.children,r=0;if(e&&(i=e.length))for(var i,u=-1;++u<i;)r=Math.max(r,t(e[u]));return 1+r}function e(e,u){var a=r.call(this,e,u);return n(a[0],0,i[0],i[1]/t(a[0])),a}var r=ya.layout.hierarchy(),i=[1,1];return e.size=function(n){return arguments.length?(i=n,e):i},ii(e,r)},ya.layout.pie=function(){function n(u){var a=u.map(function(e,r){return+t.call(n,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof i?i.apply(this,arguments):i)-o)/ya.sum(a),l=ya.range(u.length);null!=e&&l.sort(e===wc?function(n,t){return a[t]-a[n]}:function(n,t){return e(u[n],u[t])});var s=[];return l.forEach(function(n){var t;s[n]={data:u[n],value:t=a[n],startAngle:o,endAngle:o+=t*c}}),s}var t=Number,e=wc,r=0,i=2*Ka;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n};var wc={};ya.layout.stack=function(){function n(o,c){var l=o.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,c);l=ya.permute(l,f),s=ya.permute(s,f);var h,g,p,m=r.call(n,s,c),d=l.length,v=l[0].length;for(g=0;v>g;++g)for(i.call(n,l[0][g],p=m[g],s[0][g][1]),h=1;d>h;++h)i.call(n,l[h][g],p+=s[h-1][g][1],s[h][g][1]);return o}var t=mt,e=hi,r=gi,i=fi,u=li,a=si;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Sc.get(t)||hi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:Ec.get(t)||gi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(i=t,n):i},n};var Sc=ya.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(pi),u=n.map(mi),a=ya.range(r).sort(function(n,t){return i[n]-i[t]}),o=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=a[t],c>o?(o+=u[e],l.push(e)):(c+=u[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ya.range(n.length).reverse()},"default":hi}),Ec=ya.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,a=[],o=0,c=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;u>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(n){var t,e,r,i,u,a,o,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,i=0;s>t;++t)i+=n[t][e][1];for(t=0,u=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;u+=a*n[t][e][1]}g[e]=c-=i?u/i*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,i=n.length,u=n[0].length,a=1/i,o=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=a}for(e=0;u>e;++e)o[e]=0;return o},zero:gi});ya.layout.histogram=function(){function n(n,u){for(var a,o,c=[],l=n.map(e,this),s=r.call(this,l,u),f=i.call(this,s,l,u),u=-1,h=l.length,g=f.length-1,p=t?1:1/h;++u<g;)a=c[u]=[],a.dx=f[u+1]-(a.x=f[u]),a.y=0;if(g>0)for(u=-1;++u<h;)o=l[u],o>=s[0]&&o<=s[1]&&(a=c[ya.bisect(f,o,1,g)-1],a.y+=p,a.push(n[u]));return c}var t=!0,e=Number,r=Mi,i=vi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return yi(n,t)}:pt(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ya.layout.tree=function(){function n(n,u){function a(n,t){var r=n.children,i=n._tree;if(r&&(u=r.length)){for(var u,o,l,s=r[0],f=s,h=-1;++h<u;)l=r[h],a(l,o),f=c(l,o,f),o=l;Ni(n);var g=.5*(s._tree.prelim+l._tree.prelim);t?(i.prelim=t._tree.prelim+e(n,t),i.mod=i.prelim-g):i.prelim=g}else t&&(i.prelim=t._tree.prelim+e(n,t))}function o(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,i=-1;for(t+=n._tree.mod;++i<r;)o(e[i],t)}}function c(n,t,r){if(t){for(var i,u=n,a=n,o=t,c=n.parent.children[0],l=u._tree.mod,s=a._tree.mod,f=o._tree.mod,h=c._tree.mod;o=_i(o),u=bi(u),o&&u;)c=bi(c),a=_i(a),a._tree.ancestor=n,i=o._tree.prelim+f-u._tree.prelim-l+e(o,u),i>0&&(qi(Ti(o,n,r),n,i),l+=i,s+=i),f+=o._tree.mod,l+=u._tree.mod,h+=c._tree.mod,s+=a._tree.mod;o&&!_i(a)&&(a._tree.thread=o,a._tree.mod+=f-s),u&&!bi(c)&&(c._tree.thread=u,c._tree.mod+=l-h,r=n)}return r}var l=t.call(this,n,u),s=l[0];Ai(s,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),a(s),o(s,-s._tree.prelim);var f=wi(s,Ei),h=wi(s,Si),g=wi(s,ki),p=f.x-e(f,h)/2,m=h.x+e(h,f)/2,d=g.depth||1;return Ai(s,i?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(m-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),l}var t=ya.layout.hierarchy().sort(null).value(null),e=xi,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ya.layout.pack=function(){function n(n,u){var a=e.call(this,n,u),o=a[0],c=i[0],l=i[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,Ai(o,function(n){n.r=+s(n.value)}),Ai(o,Li),r){var f=r*(t?1:Math.max(2*o.r/c,2*o.r/l))/2;Ai(o,function(n){n.r+=f}),Ai(o,Li),Ai(o,function(n){n.r-=f})}return Pi(o,c/2,l/2,t?1:1/Math.max(2*o.r/c,2*o.r/l)),a}var t,e=ya.layout.hierarchy().sort(Ci),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ya.layout.cluster=function(){function n(n,u){var a,o=t.call(this,n,u),c=o[0],l=0;Ai(c,function(n){var t=n.children;t&&t.length?(n.x=Ri(t),n.y=Yi(t)):(n.x=a?l+=e(n,a):0,n.y=0,a=n)});var s=Ui(c),f=Ii(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Ai(c,i?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),o}var t=ya.layout.hierarchy().sort(null).value(null),e=xi,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ya.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++i<u;)r=(e=n[i]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var a,o,c,l=f(e),s=[],h=u.slice(),p=1/0,m="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,"squarify"!==g||(o=r(s,m))<=p?(h.pop(),p=o):(s.area-=s.pop().area,i(s,m,l,!1),m=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(i(s,m,l,!0),s.length=s.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,a=f(t),o=r.slice(),c=[];for(n(o,a.dx*a.dy/t.value),c.area=0;u=o.pop();)c.push(u),c.area+=u.area,null!=u.z&&(i(c,u.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(u>e&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*p/r,r/(t*u*p)):1/0}function i(n,t,e,r){var i,u=-1,a=n.length,o=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++u<a;)i=n[u],i.x=o,i.y=l,i.dy=s,o+=i.dx=Math.min(e.x+e.dx-o,s?c(i.area/s):0);i.z=!0,i.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++u<a;)i=n[u],i.x=o,i.y=l,i.dx=s,l+=i.dy=Math.min(e.y+e.dy-l,s?c(i.area/s):0);i.z=!1,i.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function u(r){var i=a||o(r),u=i[0];return u.x=0,u.y=0,u.dx=l[0],u.dy=l[1],a&&o.revalue(u),n([u],u.dx*u.dy/u.value),(a?e:t)(u),h&&(a=i),i}var a,o=ya.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Vi,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return u.size=function(n){return arguments.length?(l=n,u):l},u.padding=function(n){function t(t){var e=n.call(u,t,t.depth);return null==e?Vi(t):Xi(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Xi(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Vi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,u},u.round=function(n){return arguments.length?(c=n?Math.round:Number,u):c!=Number},u.sticky=function(n){return arguments.length?(h=n,a=null,u):h},u.ratio=function(n){return arguments.length?(p=n,u):p},u.mode=function(n){return arguments.length?(g=n+"",u):g},ii(u,o)},ya.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ya.random.normal.apply(ya,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},ya.scale={};var kc={floor:mt,ceil:mt};ya.scale.linear=function(){return Ki([0,1],[0,1],Sr,!1)},ya.scale.log=function(){return uu(ya.scale.linear().domain([0,1]),10,!0,[1,10])};var Ac=ya.format(".0e"),Nc={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ya.scale.pow=function(){return au(ya.scale.linear(),1,[0,1])},ya.scale.sqrt=function(){return ya.scale.pow().exponent(.5)},ya.scale.ordinal=function(){return cu([],{t:"range",a:[[]]})},ya.scale.category10=function(){return ya.scale.ordinal().range(qc)},ya.scale.category20=function(){return ya.scale.ordinal().range(Tc)},ya.scale.category20b=function(){return ya.scale.ordinal().range(Cc)},ya.scale.category20c=function(){return ya.scale.ordinal().range(zc)};var qc=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ut),Tc=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ut),Cc=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ut),zc=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ut);ya.scale.quantile=function(){return lu([],[])},ya.scale.quantize=function(){return su(0,1,[0,1])},ya.scale.threshold=function(){return fu([.5],[0,1])},ya.scale.identity=function(){return hu([0,1])},ya.svg.arc=function(){function n(){var n=t.apply(this,arguments),u=e.apply(this,arguments),a=r.apply(this,arguments)+Dc,o=i.apply(this,arguments)+Dc,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ka>c?"0":"1",s=Math.cos(a),f=Math.sin(a),h=Math.cos(o),g=Math.sin(o);return c>=jc?n?"M0,"+u+"A"+u+","+u+" 0 1,1 0,"+-u+"A"+u+","+u+" 0 1,1 0,"+u+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+u+"A"+u+","+u+" 0 1,1 0,"+-u+"A"+u+","+u+" 0 1,1 0,"+u+"Z":n?"M"+u*s+","+u*f+"A"+u+","+u+" 0 "+l+",1 "+u*h+","+u*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+l+",0 "+n*s+","+n*f+"Z":"M"+u*s+","+u*f+"A"+u+","+u+" 0 "+l+",1 "+u*h+","+u*g+"L0,0"+"Z"}var t=gu,e=pu,r=mu,i=du;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(i=pt(t),n):i},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,u=(r.apply(this,arguments)+i.apply(this,arguments))/2+Dc;return[Math.cos(u)*n,Math.sin(u)*n]},n};var Dc=-Ka/2,jc=2*Ka-1e-6;ya.svg.line.radial=function(){var n=Ue(vu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},$e.reverse=We,We.reverse=$e,ya.svg.area=function(){return yu(mt)},ya.svg.area.radial=function(){var n=yu(vu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ya.svg.chord=function(){function n(n,o){var c=t(this,u,n,o),l=t(this,a,n,o);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?i(c.r,c.p1,c.r,c.p0):i(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+i(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=o.call(n,i,r),a=c.call(n,i,r)+Dc,s=l.call(n,i,r)+Dc;return{r:u,a0:a,a1:s,p0:[u*Math.cos(a),u*Math.sin(a)],p1:[u*Math.cos(s),u*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Ka)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=ze,a=De,o=Mu,c=mu,l=du;return n.radius=function(t){return arguments.length?(o=pt(t),n):o},n.source=function(t){return arguments.length?(u=pt(t),n):u},n.target=function(t){return arguments.length?(a=pt(t),n):a},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(l=pt(t),n):l},n},ya.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),a=e.call(this,n,i),o=(u.y+a.y)/2,c=[u,{x:u.x,y:o},{x:a.x,y:o},a];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=ze,e=De,r=xu;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ya.svg.diagonal.radial=function(){var n=ya.svg.diagonal(),t=xu,e=n.projection;return n.projection=function(n){return arguments.length?e(bu(t=n)):t},n},ya.svg.symbol=function(){function n(n,r){return(Lc.get(t.call(this,n,r))||Su)(e.call(this,n,r))}var t=wu,e=_u;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var Lc=ya.map({circle:Su,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Oc)),e=t*Oc;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Pc),e=t*Pc/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Pc),e=t*Pc/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ya.svg.symbolTypes=Lc.keys();var Hc,Fc,Pc=Math.sqrt(3),Oc=Math.tan(30*to),Yc=[],Rc=0;Yc.call=Ya.call,Yc.empty=Ya.empty,Yc.node=Ya.node,Yc.size=Ya.size,ya.transition=function(n){return arguments.length?Hc?n.transition():n:Ia.transition()},ya.transition.prototype=Yc,Yc.select=function(n){var t,e,r,i=this.id,u=[];n=v(n);for(var a=-1,o=this.length;++a<o;){u.push(t=[]);for(var c=this[a],l=-1,s=c.length;++l<s;)(r=c[l])&&(e=n.call(r,r.__data__,l,a))?("__data__"in r&&(e.__data__=r.__data__),Nu(e,l,i,r.__transition__[i]),t.push(e)):t.push(null)}return Eu(u,i)},Yc.selectAll=function(n){var t,e,r,i,u,a=this.id,o=[];n=y(n);for(var c=-1,l=this.length;++c<l;)for(var s=this[c],f=-1,h=s.length;++f<h;)if(r=s[f]){u=r.__transition__[a],e=n.call(r,r.__data__,f,c),o.push(t=[]);for(var g=-1,p=e.length;++g<p;)(i=e[g])&&Nu(i,g,a,u),t.push(i)}return Eu(o,a)},Yc.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=N(n));for(var u=0,a=this.length;a>u;u++){i.push(t=[]);for(var e=this[u],o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return Eu(i,this.id)},Yc.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):T(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Yc.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?Br:Sr,o=ya.ns.qualify(n);return ku(this,"attr."+n,t,o.local?u:i)},Yc.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ya.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yc.style=function(n,t,e){function r(){this.style.removeProperty(n)}function i(t){return null==t?r:(t+="",function(){var r,i=ba.getComputedStyle(this,null).getPropertyValue(n);return i!==t&&(r=Sr(i,t),function(t){this.style.setProperty(n,r(t),e)})})}var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return ku(this,"style."+n,t,i)},Yc.styleTween=function(n,t,e){function r(r,i){var u=t.call(this,r,i,ba.getComputedStyle(this,null).getPropertyValue(n));return u&&function(t){this.style.setProperty(n,u(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Yc.text=function(n){return ku(this,"text",n,Au)},Yc.remove=function(){return this.each("end.transition",function(){var n;!this.__transition__&&(n=this.parentNode)&&n.removeChild(this)})},Yc.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=ya.ease.apply(ya,arguments)),T(this,function(e){e.__transition__[t].ease=n}))},Yc.delay=function(n){var t=this.id;return T(this,"function"==typeof n?function(e,r,i){e.__transition__[t].delay=0|n.call(e,e.__data__,r,i)}:(n|=0,function(e){e.__transition__[t].delay=n}))},Yc.duration=function(n){var t=this.id;return T(this,"function"==typeof n?function(e,r,i){e.__transition__[t].duration=Math.max(1,0|n.call(e,e.__data__,r,i))}:(n=Math.max(1,0|n),function(e){e.__transition__[t].duration=n}))},Yc.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Fc,i=Hc;Hc=e,T(this,function(t,r,i){Fc=t.__transition__[e],n.call(t,t.__data__,r,i)}),Fc=r,Hc=i}else T(this,function(r){var i=r.__transition__[e];(i.event||(i.event=ya.dispatch("start","end"))).on(n,t)});return this},Yc.transition=function(){for(var n,t,e,r,i=this.id,u=++Rc,a=[],o=0,c=this.length;c>o;o++){a.push(n=[]);for(var t=this[o],l=0,s=t.length;s>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[i]),r.delay+=r.duration,Nu(e,l,u,r)),n.push(e)}return Eu(a,u)},ya.svg.axis=function(){function n(n){n.each(function(){var n,f=ya.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,g=null==t?e.tickFormat?e.tickFormat.apply(e,c):String:t,p=Cu(e,h,s),m=f.selectAll(".tick.minor").data(p,String),d=m.enter().insert("line",".tick").attr("class","tick minor").style("opacity",1e-6),v=ya.transition(m.exit()).style("opacity",1e-6).remove(),y=ya.transition(m).style("opacity",1),M=f.selectAll(".tick.major").data(h,String),x=M.enter().insert("g",".domain").attr("class","tick major").style("opacity",1e-6),b=ya.transition(M.exit()).style("opacity",1e-6).remove(),_=ya.transition(M).style("opacity",1),w=Bi(e),S=f.selectAll(".domain").data([0]),E=(S.enter().append("path").attr("class","domain"),ya.transition(S)),k=e.copy(),A=this.__chart__||k;
-this.__chart__=k,x.append("line"),x.append("text");var N=x.select("line"),q=_.select("line"),T=M.select("text").text(g),C=x.select("text"),z=_.select("text");switch(r){case"bottom":n=qu,d.attr("y2",u),y.attr("x2",0).attr("y2",u),N.attr("y2",i),C.attr("y",Math.max(i,0)+o),q.attr("x2",0).attr("y2",i),z.attr("x",0).attr("y",Math.max(i,0)+o),T.attr("dy",".71em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":n=qu,d.attr("y2",-u),y.attr("x2",0).attr("y2",-u),N.attr("y2",-i),C.attr("y",-(Math.max(i,0)+o)),q.attr("x2",0).attr("y2",-i),z.attr("x",0).attr("y",-(Math.max(i,0)+o)),T.attr("dy","0em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":n=Tu,d.attr("x2",-u),y.attr("x2",-u).attr("y2",0),N.attr("x2",-i),C.attr("x",-(Math.max(i,0)+o)),q.attr("x2",-i).attr("y2",0),z.attr("x",-(Math.max(i,0)+o)).attr("y",0),T.attr("dy",".32em").style("text-anchor","end"),E.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":n=Tu,d.attr("x2",u),y.attr("x2",u).attr("y2",0),N.attr("x2",i),C.attr("x",Math.max(i,0)+o),q.attr("x2",i).attr("y2",0),z.attr("x",Math.max(i,0)+o).attr("y",0),T.attr("dy",".32em").style("text-anchor","start"),E.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.rangeBand){var D=k.rangeBand()/2,j=function(n){return k(n)+D};x.call(n,j),_.call(n,j)}else x.call(n,A),_.call(n,k),b.call(n,k),d.call(n,A),y.call(n,k),v.call(n,k)})}var t,e=ya.scale.linear(),r=Uc,i=6,u=6,a=6,o=3,c=[10],l=null,s=0;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ic?t+"":Uc,n):r},n.ticks=function(){return arguments.length?(c=arguments,n):c},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t,e){if(!arguments.length)return i;var r=arguments.length-1;return i=+t,u=r>1?+e:i,a=r>0?+arguments[r]:i,n},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(t){return arguments.length?(s=+t,n):s},n};var Uc="bottom",Ic={top:1,right:1,bottom:1,left:1};ya.svg.brush=function(){function n(u){u.each(function(){var u,a=ya.select(this),s=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),s.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Vc[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",n.empty()?"none":null),h.exit().remove(),o&&(u=Bi(o),s.attr("x",u[0]).attr("width",u[1]-u[0]),e(a)),c&&(u=Bi(c),s.attr("y",u[0]).attr("height",u[1]-u[0]),r(a)),t(a)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)][0]+","+s[+/^s/.test(n)][1]+")"})}function e(n){n.select(".extent").attr("x",s[0][0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1][0]-s[0][0])}function r(n){n.select(".extent").attr("y",s[0][1]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1][1]-s[0][1])}function i(){function i(){var n=ya.event.changedTouches;return n?ya.touches(M,n)[0]:ya.mouse(M)}function l(){32==ya.event.keyCode&&(k||(v=null,N[0]-=s[1][0],N[1]-=s[1][1],k=2),g())}function h(){32==ya.event.keyCode&&2==k&&(N[0]+=s[1][0],N[1]+=s[1][1],k=0,g())}function p(){var n=i(),u=!1;y&&(n[0]+=y[0],n[1]+=y[1]),k||(ya.event.altKey?(v||(v=[(s[0][0]+s[1][0])/2,(s[0][1]+s[1][1])/2]),N[0]=s[+(n[0]<v[0])][0],N[1]=s[+(n[1]<v[1])][1]):v=null),S&&m(n,o,0)&&(e(_),u=!0),E&&m(n,c,1)&&(r(_),u=!0),u&&(t(_),b({type:"brush",mode:k?"move":"resize"}))}function m(n,t,e){var r,i,a=Bi(t),o=a[0],c=a[1],l=N[e],h=s[1][e]-s[0][e];return k&&(o-=l,c-=h+l),r=f[e]?Math.max(o,Math.min(c,n[e])):n[e],k?i=(r+=l)+h:(v&&(l=Math.max(o,Math.min(c,2*v[e]-r))),r>l?(i=r,r=l):i=l),s[0][e]!==r||s[1][e]!==i?(u=null,s[0][e]=r,s[1][e]=i,!0):void 0}function d(){p(),_.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ya.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),A(),b({type:"brushend"})}var v,y,M=this,x=ya.select(ya.event.target),b=a.of(M,arguments),_=ya.select(M),w=x.datum(),S=!/^(n|s)$/.test(w)&&o,E=!/^(e|w)$/.test(w)&&c,k=x.classed("extent"),A=H(),N=i(),q=ya.select(ba).on("keydown.brush",l).on("keyup.brush",h);if(ya.event.changedTouches?q.on("touchmove.brush",p).on("touchend.brush",d):q.on("mousemove.brush",p).on("mouseup.brush",d),k)N[0]=s[0][0]-N[0],N[1]=s[0][1]-N[1];else if(w){var T=+/w$/.test(w),C=+/^n/.test(w);y=[s[1-T][0]-N[0],s[1-C][1]-N[1]],N[0]=s[T][0],N[1]=s[C][1]}else ya.event.altKey&&(v=N.slice());_.style("pointer-events","none").selectAll(".resize").style("display",null),ya.select("body").style("cursor",x.style("cursor")),b({type:"brushstart"}),p()}var u,a=m(n,"brushstart","brush","brushend"),o=null,c=null,l=Xc[0],s=[[0,0],[0,0]],f=[!0,!0];return n.x=function(t){return arguments.length?(o=t,l=Xc[!o<<1|!c],n):o},n.y=function(t){return arguments.length?(c=t,l=Xc[!o<<1|!c],n):c},n.clamp=function(t){return arguments.length?(o&&c?f=[!!t[0],!!t[1]]:(o||c)&&(f[+!o]=!!t),n):o&&c?f:o||c?f[+!o]:null},n.extent=function(t){var e,r,i,a,l;return arguments.length?(u=[[0,0],[0,0]],o&&(e=t[0],r=t[1],c&&(e=e[0],r=r[0]),u[0][0]=e,u[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),s[0][0]=0|e,s[1][0]=0|r),c&&(i=t[0],a=t[1],o&&(i=i[1],a=a[1]),u[0][1]=i,u[1][1]=a,c.invert&&(i=c(i),a=c(a)),i>a&&(l=i,i=a,a=l),s[0][1]=0|i,s[1][1]=0|a),n):(t=u||s,o&&(e=t[0][0],r=t[1][0],u||(e=s[0][0],r=s[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(i=t[0][1],a=t[1][1],u||(i=s[0][1],a=s[1][1],c.invert&&(i=c.invert(i),a=c.invert(a)),i>a&&(l=i,i=a,a=l))),o&&c?[[e,i],[r,a]]:o?[e,r]:c&&[i,a])},n.clear=function(){return u=null,s[0][0]=s[0][1]=s[1][0]=s[1][1]=0,n},n.empty=function(){return o&&s[0][0]===s[1][0]||c&&s[0][1]===s[1][1]},ya.rebind(n,a,"on")};var Vc={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Xc=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];ya.time={};var Zc=Date,Bc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];zu.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){$c.setUTCDate.apply(this._,arguments)},setDay:function(){$c.setUTCDay.apply(this._,arguments)},setFullYear:function(){$c.setUTCFullYear.apply(this._,arguments)},setHours:function(){$c.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){$c.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){$c.setUTCMinutes.apply(this._,arguments)},setMonth:function(){$c.setUTCMonth.apply(this._,arguments)},setSeconds:function(){$c.setUTCSeconds.apply(this._,arguments)},setTime:function(){$c.setTime.apply(this._,arguments)}};var $c=Date.prototype,Wc="%a %b %e %X %Y",Jc="%m/%d/%Y",Gc="%H:%M:%S",Kc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Qc=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],nl=["January","February","March","April","May","June","July","August","September","October","November","December"],tl=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];ya.time.year=Du(function(n){return n=ya.time.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ya.time.years=ya.time.year.range,ya.time.years.utc=ya.time.year.utc.range,ya.time.day=Du(function(n){var t=new Zc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ya.time.days=ya.time.day.range,ya.time.days.utc=ya.time.day.utc.range,ya.time.dayOfYear=function(n){var t=ya.time.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Bc.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=ya.time[n]=Du(function(n){return(n=ya.time.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ya.time.year(n).getDay();return Math.floor((ya.time.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ya.time[n+"s"]=e.range,ya.time[n+"s"].utc=e.utc.range,ya.time[n+"OfYear"]=function(n){var e=ya.time.year(n).getDay();return Math.floor((ya.time.dayOfYear(n)+(e+t)%7)/7)}}),ya.time.week=ya.time.sunday,ya.time.weeks=ya.time.sunday.range,ya.time.weeks.utc=ya.time.sunday.utc.range,ya.time.weekOfYear=ya.time.sundayOfYear,ya.time.format=function(n){function t(t){for(var r,i,u,a=[],o=-1,c=0;++o<e;)37===n.charCodeAt(o)&&(a.push(n.substring(c,o)),null!=(i=fl[r=n.charAt(++o)])&&(r=n.charAt(++o)),(u=hl[r])&&(r=u(t,null==i?"e"===r?" ":"0":i)),a.push(r),c=o+1);return a.push(n.substring(c,o)),a.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Lu(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var i=new Zc;return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H,e.M,e.S,e.L),i},t.toString=function(){return n},t};var el=Hu(Kc),rl=Fu(Kc),il=Hu(Qc),ul=Fu(Qc),al=Hu(nl),ol=Fu(nl),cl=Hu(tl),ll=Fu(tl),sl=/^%/,fl={"-":"",_:" ",0:"0"},hl={a:function(n){return Qc[n.getDay()]},A:function(n){return Kc[n.getDay()]},b:function(n){return tl[n.getMonth()]},B:function(n){return nl[n.getMonth()]},c:ya.time.format(Wc),d:function(n,t){return Pu(n.getDate(),t,2)},e:function(n,t){return Pu(n.getDate(),t,2)},H:function(n,t){return Pu(n.getHours(),t,2)},I:function(n,t){return Pu(n.getHours()%12||12,t,2)},j:function(n,t){return Pu(1+ya.time.dayOfYear(n),t,3)},L:function(n,t){return Pu(n.getMilliseconds(),t,3)},m:function(n,t){return Pu(n.getMonth()+1,t,2)},M:function(n,t){return Pu(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return Pu(n.getSeconds(),t,2)},U:function(n,t){return Pu(ya.time.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Pu(ya.time.mondayOfYear(n),t,2)},x:ya.time.format(Jc),X:ya.time.format(Gc),y:function(n,t){return Pu(n.getFullYear()%100,t,2)},Y:function(n,t){return Pu(n.getFullYear()%1e4,t,4)},Z:aa,"%":function(){return"%"}},gl={a:Ou,A:Yu,b:Vu,B:Xu,c:Zu,d:Qu,e:Qu,H:ta,I:ta,j:na,L:ia,m:Ku,M:ea,p:ua,S:ra,U:Uu,w:Ru,W:Iu,x:Bu,X:$u,y:Ju,Y:Wu,"%":oa},pl=/^\s*\d+/,ml=ya.map({am:0,pm:1});ya.time.format.utc=function(n){function t(n){try{Zc=zu;var t=new Zc;return t._=n,e(t)}finally{Zc=Date}}var e=ya.time.format(n);return t.parse=function(n){try{Zc=zu;var t=e.parse(n);return t&&t._}finally{Zc=Date}},t.toString=e.toString,t};var dl=ya.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");ya.time.format.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ca:dl,ca.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ca.toString=dl.toString,ya.time.second=Du(function(n){return new Zc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ya.time.seconds=ya.time.second.range,ya.time.seconds.utc=ya.time.second.utc.range,ya.time.minute=Du(function(n){return new Zc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ya.time.minutes=ya.time.minute.range,ya.time.minutes.utc=ya.time.minute.utc.range,ya.time.hour=Du(function(n){var t=n.getTimezoneOffset()/60;return new Zc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ya.time.hours=ya.time.hour.range,ya.time.hours.utc=ya.time.hour.utc.range,ya.time.month=Du(function(n){return n=ya.time.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ya.time.months=ya.time.month.range,ya.time.months.utc=ya.time.month.utc.range;var vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],yl=[[ya.time.second,1],[ya.time.second,5],[ya.time.second,15],[ya.time.second,30],[ya.time.minute,1],[ya.time.minute,5],[ya.time.minute,15],[ya.time.minute,30],[ya.time.hour,1],[ya.time.hour,3],[ya.time.hour,6],[ya.time.hour,12],[ya.time.day,1],[ya.time.day,2],[ya.time.week,1],[ya.time.month,1],[ya.time.month,3],[ya.time.year,1]],Ml=[[ya.time.format("%Y"),Xt],[ya.time.format("%B"),function(n){return n.getMonth()}],[ya.time.format("%b %d"),function(n){return 1!=n.getDate()}],[ya.time.format("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[ya.time.format("%I %p"),function(n){return n.getHours()}],[ya.time.format("%I:%M"),function(n){return n.getMinutes()}],[ya.time.format(":%S"),function(n){return n.getSeconds()}],[ya.time.format(".%L"),function(n){return n.getMilliseconds()}]],xl=ya.scale.linear(),bl=fa(Ml);yl.year=function(n,t){return xl.domain(n.map(ga)).ticks(t).map(ha)},ya.time.scale=function(){return la(ya.scale.linear(),yl,bl)};var _l=yl.map(function(n){return[n[0].utc,n[1]]}),wl=[[ya.time.format.utc("%Y"),Xt],[ya.time.format.utc("%B"),function(n){return n.getUTCMonth()}],[ya.time.format.utc("%b %d"),function(n){return 1!=n.getUTCDate()}],[ya.time.format.utc("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[ya.time.format.utc("%I %p"),function(n){return n.getUTCHours()}],[ya.time.format.utc("%I:%M"),function(n){return n.getUTCMinutes()}],[ya.time.format.utc(":%S"),function(n){return n.getUTCSeconds()}],[ya.time.format.utc(".%L"),function(n){return n.getUTCMilliseconds()}]],Sl=fa(wl);return _l.year=function(n,t){return xl.domain(n.map(ma)).ticks(t).map(pa)},ya.time.scale.utc=function(){return la(ya.scale.linear(),_l,Sl)},ya.text=dt(function(n){return n.responseText}),ya.json=function(n,t){return vt(n,"application/json",da,t)},ya.html=function(n,t){return vt(n,"text/html",va,t)},ya.xml=dt(function(n){return n.responseXML}),ya}();
\ No newline at end of file
diff --git a/dashboard/lib/assets/jquery.min.js b/dashboard/lib/assets/jquery.min.js
deleted file mode 100644
index 9a85bd3..0000000
--- a/dashboard/lib/assets/jquery.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/
-(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)
-};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)
-},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);
diff --git a/dashboard/lib/assets/moment.min.js b/dashboard/lib/assets/moment.min.js
deleted file mode 100644
index 29e1cef..0000000
--- a/dashboard/lib/assets/moment.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-//! moment.js
-//! version : 2.5.1
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
-//! license : MIT
-//! momentjs.com
-(function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){return function(c){return k(a.call(this,c),b)}}function d(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function e(){}function f(a){w(a),h(this,a)}function g(a){var b=q(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function h(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function i(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&qb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function j(a){return 0>a?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function l(a,b,c,d){var e,f,g=b._milliseconds,h=b._days,i=b._months;g&&a._d.setTime(+a._d+g*c),(h||i)&&(e=a.minute(),f=a.hour()),h&&a.date(a.date()+h*c),i&&a.month(a.month()+i*c),g&&!d&&db.updateOffset(a),(h||i)&&(a.minute(e),a.hour(f))}function m(a){return"[object Array]"===Object.prototype.toString.call(a)}function n(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function o(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f<a.length;){for(e=y(a[f]).split("-"),b=e.length,d=y(a[f+1]),d=d?d.split("-"):null;b>0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&j<i._week.dow&&k++,h=Z(f(g.gg),k,j,i._week.doy,i._week.dow)),a._a[ib]=h.year,a._dayOfYear=h.dayOfYear),a._dayOfYear&&(e=null==a._a[ib]?d[ib]:a._a[ib],a._dayOfYear>u(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b<d.length;b++)e=d[b],c=(h.match(H(e,a))||[])[0],c&&(f=h.substr(0,h.indexOf(c)),f.length>0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(f=0;f<a._f.length;f++)g=0,c=h({},a),c._pf=b(),c._f=a._f[f],N(c),x(c)&&(g+=c._pf.charsLeftOver,g+=10*c._pf.unusedTokens.length,c._pf.score=g,(null==e||e>g)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 0<a.year()&&a.year()<=9999?F(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):F(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return x(this)},isDSTShifted:function(){return this._a?this.isValid()&&o(this._a,(this._isUTC?db.utc(this._a):db(this._a)).toArray())>0:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=V(a,this.lang()),this.add({d:a-b})):b},month:function(a){var b,c=this._isUTC?"UTC":"";return null!=a?"string"==typeof a&&(a=this.lang().monthsParse(a),"number"!=typeof a)?this:(b=this.date(),this.date(1),this._d["set"+c+"Month"](a),this.date(Math.min(b,this.daysInMonth())),db.updateOffset(this),this):this._d["get"+c+"Month"]()},startOf:function(a){switch(a=p(a)){case"year":this.month(0);case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),this},endOf:function(a){return a=p(a),this.startOf(a).add("isoWeek"===a?"week":a,1).subtract("ms",1)},isAfter:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)>+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;eb<Rb.length;eb++)_(Rb[eb].toLowerCase().replace(/s$/,""),Rb[eb]);_("year","FullYear"),db.fn.days=db.fn.day,db.fn.months=db.fn.month,db.fn.weeks=db.fn.week,db.fn.isoWeeks=db.fn.isoWeek,db.fn.toJSON=db.fn.toISOString,h(db.duration.fn=g.prototype,{_bubble:function(){var a,b,c,d,e=this._milliseconds,f=this._days,g=this._months,h=this._data;h.milliseconds=e%1e3,a=j(e/1e3),h.seconds=a%60,b=j(a/60),h.minutes=b%60,c=j(b/60),h.hours=c%24,f+=j(c/24),h.days=f%30,g+=j(f/30),h.months=g%12,d=j(g/12),h.years=d},weeks:function(){return j(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*s(this._months/12)},humanize:function(a){var b=+this,c=X(b,!a,this.lang());return a&&(c=this.lang().pastFuture(b,c)),this.lang().postformat(c)},add:function(a,b){var c=db.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=db.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=p(a),this[a.toLowerCase()+"s"]()},as:function(a){return a=p(a),this["as"+a.charAt(0).toUpperCase()+a.slice(1)+"s"]()},lang:db.fn.lang,toIsoString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}});for(eb in Sb)Sb.hasOwnProperty(eb)&&(bb(eb,Sb[eb]),ab(eb.toLowerCase()));bb("Weeks",6048e5),db.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},db.lang("en",{ordinal:function(a){var b=a%10,c=1===s(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),rb?(module.exports=db,cb(!0)):"function"==typeof define&&define.amd?define("moment",function(b,c,d){return d.config&&d.config()&&d.config().noGlobal!==!0&&cb(d.config().noGlobal===a),db}):cb()}).call(this);
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/codemirror/codemirror.css b/dashboard/lib/assets/packages/codemirror/codemirror.css
deleted file mode 100644
index 2b050e1..0000000
--- a/dashboard/lib/assets/packages/codemirror/codemirror.css
+++ /dev/null
@@ -1,264 +0,0 @@
-/* BASICS */
-
-.CodeMirror {
-  /* Set height, width, borders, and global font properties here */
-  font-family: monospace;
-  height: 300px;
-}
-.CodeMirror-scroll {
-  /* Set scrolling behaviour here */
-  overflow: auto;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
-  padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
-  padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
-  background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
-  border-right: 1px solid #ddd;
-  background-color: #f7f7f7;
-  white-space: nowrap;
-}
-.CodeMirror-linenumbers {}
-.CodeMirror-linenumber {
-  padding: 0 3px 0 5px;
-  min-width: 20px;
-  text-align: right;
-  color: #999;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-/* CURSOR */
-
-.CodeMirror div.CodeMirror-cursor {
-  border-left: 1px solid black;
-  z-index: 3;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
-  border-left: 1px solid silver;
-}
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
-  width: auto;
-  border: 0;
-  background: #7e7;
-  z-index: 1;
-}
-/* Can style cursor different in overwrite (non-insert) mode */
-.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
-
-.cm-tab { display: inline-block; }
-
-.CodeMirror-ruler {
-  border-left: 1px solid #ccc;
-  position: absolute;
-}
-
-/* DEFAULT THEME */
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable {color: black;}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
-.cm-s-default .cm-property {color: black;}
-.cm-s-default .cm-operator {color: black;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-link {text-decoration: underline;}
-
-.cm-s-default .cm-error {color: #f00;}
-.cm-invalidchar {color: #f00;}
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
-.CodeMirror-activeline-background {background: #e8f2ff;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
-   the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
-  line-height: 1;
-  position: relative;
-  overflow: hidden;
-  background: white;
-  color: black;
-}
-
-.CodeMirror-scroll {
-  /* 30px is the magic margin used to hide the element's real scrollbars */
-  /* See overflow: hidden in .CodeMirror */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px;
-  height: 100%;
-  outline: none; /* Prevent dragging from highlighting the element */
-  position: relative;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-.CodeMirror-sizer {
-  position: relative;
-  border-right: 30px solid transparent;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
-   before actuall scrolling happens, thus preventing shaking and
-   flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
-  position: absolute;
-  z-index: 6;
-  display: none;
-}
-.CodeMirror-vscrollbar {
-  right: 0; top: 0;
-  overflow-x: hidden;
-  overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
-  bottom: 0; left: 0;
-  overflow-y: hidden;
-  overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
-  right: 0; bottom: 0;
-}
-.CodeMirror-gutter-filler {
-  left: 0; bottom: 0;
-}
-
-.CodeMirror-gutters {
-  position: absolute; left: 0; top: 0;
-  padding-bottom: 30px;
-  z-index: 3;
-}
-.CodeMirror-gutter {
-  white-space: normal;
-  height: 100%;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  padding-bottom: 30px;
-  margin-bottom: -32px;
-  display: inline-block;
-  /* Hack to make IE7 behave */
-  *zoom:1;
-  *display:inline;
-}
-.CodeMirror-gutter-elt {
-  position: absolute;
-  cursor: default;
-  z-index: 4;
-}
-
-.CodeMirror-lines {
-  cursor: text;
-}
-.CodeMirror pre {
-  /* Reset some styles that the rest of the page might have set */
-  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
-  border-width: 0;
-  background: transparent;
-  font-family: inherit;
-  font-size: inherit;
-  margin: 0;
-  white-space: pre;
-  word-wrap: normal;
-  line-height: inherit;
-  color: inherit;
-  z-index: 2;
-  position: relative;
-  overflow: visible;
-}
-.CodeMirror-wrap pre {
-  word-wrap: break-word;
-  white-space: pre-wrap;
-  word-break: normal;
-}
-
-.CodeMirror-linebackground {
-  position: absolute;
-  left: 0; right: 0; top: 0; bottom: 0;
-  z-index: 0;
-}
-
-.CodeMirror-linewidget {
-  position: relative;
-  z-index: 2;
-  overflow: auto;
-}
-
-.CodeMirror-widget {}
-
-.CodeMirror-wrap .CodeMirror-scroll {
-  overflow-x: hidden;
-}
-
-.CodeMirror-measure {
-  position: absolute;
-  width: 100%;
-  height: 0;
-  overflow: hidden;
-  visibility: hidden;
-}
-.CodeMirror-measure pre { position: static; }
-
-.CodeMirror div.CodeMirror-cursor {
-  position: absolute;
-  visibility: hidden;
-  border-right: none;
-  width: 0;
-}
-.CodeMirror-focused div.CodeMirror-cursor {
-  visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-
-.cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
-}
-
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
-@media print {
-  /* Hide the cursor when printing */
-  .CodeMirror div.CodeMirror-cursor {
-    visibility: hidden;
-  }
-}
diff --git a/dashboard/lib/assets/packages/codemirror/codemirror.min.js b/dashboard/lib/assets/packages/codemirror/codemirror.min.js
deleted file mode 100644
index b89670a..0000000
--- a/dashboard/lib/assets/packages/codemirror/codemirror.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// This is CodeMirror (http://codemirror.net), a code editor
-// implemented in JavaScript on top of the browser's DOM.
-//
-// You can find some technical background for some of the code below
-// at http://marijnhaverbeke.nl/blog/#cm-internals .
-(function(e){if(typeof exports=="object"&&typeof module=="object")module.exports=e();else{if(typeof define=="function"&&define.amd)return define([],e);this.CodeMirror=e()}})(function(){"use strict";function N(e,n){if(!(this instanceof N))return new N(e,n);this.options=n=n||{};for(var r in Qr)n.hasOwnProperty(r)||(n[r]=Qr[r]);F(n);var i=n.value;typeof i=="string"&&(i=new ms(i,n.mode)),this.doc=i;var s=this.display=new C(e,i);s.wrapper.CodeMirror=this,H(this),D(this),n.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),n.autofocus&&!g&&Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new co},t&&setTimeout(xo(Rn,this,!0),20),Xn(this);var o=this;Nn(this,function(){o.curOp.forceUpdate=!0,ws(o,i),n.autofocus&&!g||Po()==s.input?setTimeout(xo(br,o),20):wr(o);for(var e in Gr)Gr.hasOwnProperty(e)&&Gr[e](o,n[e],Zr);for(var t=0;t<ri.length;++t)ri[t](o)})}function C(e,t){var r=this,i=r.input=Ao("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none");u?i.style.width="1000px":i.setAttribute("wrap","off"),m&&(i.style.border="1px solid black"),i.setAttribute("autocorrect","off"),i.setAttribute("autocapitalize","off"),i.setAttribute("spellcheck","false"),r.inputDiv=Ao("div",[i],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),r.scrollbarH=Ao("div",[Ao("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar"),r.scrollbarV=Ao("div",[Ao("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),r.scrollbarFiller=Ao("div",null,"CodeMirror-scrollbar-filler"),r.gutterFiller=Ao("div",null,"CodeMirror-gutter-filler"),r.lineDiv=Ao("div",null,"CodeMirror-code"),r.selectionDiv=Ao("div",null,null,"position: relative; z-index: 1"),r.cursorDiv=Ao("div",null,"CodeMirror-cursors"),r.measure=Ao("div",null,"CodeMirror-measure"),r.lineMeasure=Ao("div",null,"CodeMirror-measure"),r.lineSpace=Ao("div",[r.measure,r.lineMeasure,r.selectionDiv,r.cursorDiv,r.lineDiv],null,"position: relative; outline: none"),r.mover=Ao("div",[Ao("div",[r.lineSpace],"CodeMirror-lines")],null,"position: relative"),r.sizer=Ao("div",[r.mover],"CodeMirror-sizer"),r.heightForcer=Ao("div",null,null,"position: absolute; height: "+oo+"px; width: 1px;"),r.gutters=Ao("div",null,"CodeMirror-gutters"),r.lineGutter=null,r.scroller=Ao("div",[r.sizer,r.heightForcer,r.gutters],"CodeMirror-scroll"),r.scroller.setAttribute("tabIndex","-1"),r.wrapper=Ao("div",[r.inputDiv,r.scrollbarH,r.scrollbarV,r.scrollbarFiller,r.gutterFiller,r.scroller],"CodeMirror"),n&&(r.gutters.style.zIndex=-1,r.scroller.style.paddingRight=0),m&&(i.style.width="0px"),u||(r.scroller.draggable=!0),h&&(r.inputDiv.style.height="1px",r.inputDiv.style.position="absolute"),n&&(r.scrollbarH.style.minHeight=r.scrollbarV.style.minWidth="18px"),e.appendChild?e.appendChild(r.wrapper):e(r.wrapper),r.viewFrom=r.viewTo=t.first,r.view=[],r.externalMeasured=null,r.viewOffset=0,r.lastSizeC=0,r.updateLineNumbers=null,r.lineNumWidth=r.lineNumInnerWidth=r.lineNumChars=null,r.prevInput="",r.alignWidgets=!1,r.pollingFast=!1,r.poll=new co,r.cachedCharWidth=r.cachedTextHeight=r.cachedPaddingH=null,r.inaccurateSelection=!1,r.maxLine=null,r.maxLineLength=0,r.maxLineChanged=!1,r.wheelDX=r.wheelDY=r.wheelStartX=r.wheelStartY=null,r.shift=!1}function k(e){e.doc.mode=N.getMode(e.options,e.doc.modeOption),L(e)}function L(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.frontier=e.doc.first,zt(e,100),e.state.modeGen++,e.curOp&&Mn(e)}function A(e){e.options.lineWrapping?(e.display.wrapper.className+=" CodeMirror-wrap",e.display.sizer.style.minWidth=""):(e.display.wrapper.className=e.display.wrapper.className.replace(" CodeMirror-wrap",""),j(e)),M(e),Mn(e),an(e),setTimeout(function(){q(e)},100)}function O(e){var t=wn(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/En(e.display)-3);return function(i){if(Ui(e.doc,i))return 0;var s=0;if(i.widgets)for(var o=0;o<i.widgets.length;o++)i.widgets[o].height&&(s+=i.widgets[o].height);return n?s+(Math.ceil(i.text.length/r)||1)*t:s+t}}function M(e){var t=e.doc,n=O(e);t.iter(function(e){var t=n(e);t!=e.height&&Ts(e,t)})}function _(e){var t=ai[e.options.keyMap],n=t.style;e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-keymap-\S+/g,"")+(n?" cm-keymap-"+n:"")}function D(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),an(e)}function P(e){H(e),Mn(e),setTimeout(function(){U(e)},20)}function H(e){var t=e.display.gutters,n=e.options.gutters;Mo(t);for(var r=0;r<n.length;++r){var i=n[r],s=t.appendChild(Ao("div",null,"CodeMirror-gutter "+i));i=="CodeMirror-linenumbers"&&(e.display.lineGutter=s,s.style.width=(e.display.lineNumWidth||1)+"px")}t.style.display=r?"":"none";var o=t.offsetWidth;e.display.sizer.style.marginLeft=o+"px",r&&(e.display.scrollbarH.style.left=e.options.fixedGutter?o+"px":0)}function B(e){if(e.height==0)return 0;var t=e.text.length,n,r=e;while(n=Hi(r)){var i=n.find(0,!0);r=i.from.line,t+=i.from.ch-i.to.ch}r=e;while(n=Bi(r)){var i=n.find(0,!0);t-=r.text.length-i.from.ch,r=i.to.line,t+=r.text.length-i.to.ch}return t}function j(e){var t=e.display,n=e.doc;t.maxLine=Es(n,n.first),t.maxLineLength=B(t.maxLine),t.maxLineChanged=!0,n.iter(function(e){var n=B(e);n>t.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)})}function F(e){var t=bo(e.gutters,"CodeMirror-linenumbers");t==-1&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function I(e){var t=e.display.scroller;return{clientHeight:t.clientHeight,barHeight:e.display.scrollbarV.clientHeight,scrollWidth:t.scrollWidth,clientWidth:t.clientWidth,barWidth:e.display.scrollbarH.clientWidth,docHeight:Math.round(e.doc.height+Jt(e.display))}}function q(e,t){t||(t=I(e));var n=e.display,r=t.docHeight+oo,i=t.scrollWidth>t.clientWidth,s=r>t.clientHeight;s?(n.scrollbarV.style.display="block",n.scrollbarV.style.bottom=i?jo(n.measure)+"px":"0",n.scrollbarV.firstChild.style.height=Math.max(0,r-t.clientHeight+(t.barHeight||n.scrollbarV.clientHeight))+"px"):(n.scrollbarV.style.display="",n.scrollbarV.firstChild.style.height="0"),i?(n.scrollbarH.style.display="block",n.scrollbarH.style.right=s?jo(n.measure)+"px":"0",n.scrollbarH.firstChild.style.width=t.scrollWidth-t.clientWidth+(t.barWidth||n.scrollbarH.clientWidth)+"px"):(n.scrollbarH.style.display="",n.scrollbarH.firstChild.style.width="0"),i&&s?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=n.scrollbarFiller.style.width=jo(n.measure)+"px"):n.scrollbarFiller.style.display="",i&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=jo(n.measure)+"px",n.gutterFiller.style.width=n.gutters.offsetWidth+"px"):n.gutterFiller.style.display="";if(p&&jo(n.measure)===0){n.scrollbarV.style.minWidth=n.scrollbarH.style.minHeight=d?"18px":"12px";var o=function(t){Js(t)!=n.scrollbarV&&Js(t)!=n.scrollbarH&&Cn(e,Jn)(t)};Qs(n.scrollbarV,"mousedown",o),Qs(n.scrollbarH,"mousedown",o)}}function R(e,t,n){var r=n&&n.top!=null?n.top:e.scroller.scrollTop;r=Math.floor(r-$t(e));var i=n&&n.bottom!=null?n.bottom:r+e.wrapper.clientHeight,s=Cs(t,r),o=Cs(t,i);if(n&&n.ensure){var u=n.ensure.from.line,a=n.ensure.to.line;if(u<s)return{from:u,to:Cs(t,ks(Es(t,u))+e.wrapper.clientHeight)};if(Math.min(a,t.lastLine())>=o)return{from:Cs(t,ks(Es(t,a))-e.wrapper.clientHeight),to:a}}return{from:s,to:o}}function U(e){var t=e.display,n=t.view;if(!t.alignWidgets&&(!t.gutters.firstChild||!e.options.fixedGutter))return;var r=X(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,s=r+"px";for(var o=0;o<n.length;o++)if(!n[o].hidden){e.options.fixedGutter&&n[o].gutter&&(n[o].gutter.style.left=s);var u=n[o].alignable;if(u)for(var a=0;a<u.length;a++)u[a].style.left=s}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}function z(e){if(!e.options.lineNumbers)return!1;var t=e.doc,n=W(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(Ao("div",[Ao("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),s=i.firstChild.offsetWidth,o=i.offsetWidth-s;r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(s,r.lineGutter.offsetWidth-o),r.lineNumWidth=r.lineNumInnerWidth+o,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px";var u=r.gutters.offsetWidth;return r.scrollbarH.style.left=e.options.fixedGutter?u+"px":0,r.sizer.style.marginLeft=u+"px",!0}return!1}function W(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function X(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function V(e,t,n){var r=e.display.viewFrom,i=e.display.viewTo,s,o=R(e.display,e.doc,t);for(var u=!0;;u=!1){var a=e.display.scroller.clientWidth;if(!$(e,o,n))break;s=!0,e.display.maxLineChanged&&!e.options.lineWrapping&&J(e);var f=I(e);It(e),K(e,f),q(e,f);if(u&&e.options.lineWrapping&&a!=e.display.scroller.clientWidth){n=!0;continue}n=!1,t&&t.top!=null&&(t={top:Math.min(f.docHeight-oo-f.clientHeight,t.top)}),o=R(e.display,e.doc,t);if(o.from>=e.display.viewFrom&&o.to<=e.display.viewTo)break}return e.display.updateLineNumbers=null,s&&(to(e,"update",e),(e.display.viewFrom!=r||e.display.viewTo!=i)&&to(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo)),s}function $(e,t,n){var r=e.display,i=e.doc;if(!r.wrapper.offsetWidth){Dn(e);return}if(!n&&t.from>=r.viewFrom&&t.to<=r.viewTo&&jn(e)==0)return;z(e)&&Dn(e);var s=Y(e),o=i.first+i.size,u=Math.max(t.from-e.options.viewportMargin,i.first),a=Math.min(o,t.to+e.options.viewportMargin);r.viewFrom<u&&u-r.viewFrom<20&&(u=Math.max(i.first,r.viewFrom)),r.viewTo>a&&r.viewTo-a<20&&(a=Math.min(o,r.viewTo)),T&&(u=qi(e.doc,u),a=Ri(e.doc,a));var f=u!=r.viewFrom||a!=r.viewTo||r.lastSizeC!=r.wrapper.clientHeight;Bn(e,u,a),r.viewOffset=ks(Es(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var l=jn(e);if(!f&&l==0&&!n)return;var c=Po();return l>4&&(r.lineDiv.style.display="none"),Z(e,r.updateLineNumbers,s),l>4&&(r.lineDiv.style.display=""),c&&Po()!=c&&c.offsetHeight&&c.focus(),Mo(r.cursorDiv),Mo(r.selectionDiv),f&&(r.lastSizeC=r.wrapper.clientHeight,zt(e,400)),Q(e),!0}function J(e){var t=e.display,n=Zt(e,t.maxLine,t.maxLine.text.length).left;t.maxLineChanged=!1;var r=Math.max(0,n+3),i=Math.max(0,t.sizer.offsetLeft+r+oo-t.scroller.clientWidth);t.sizer.style.minWidth=r+"px",i<e.doc.scrollLeft&&or(e,Math.min(t.scroller.scrollLeft,i),!0)}function K(e,t){e.display.sizer.style.minHeight=e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=Math.max(t.docHeight,t.clientHeight-oo)+"px"}function Q(e){var t=e.display,r=t.lineDiv.offsetTop;for(var i=0;i<t.view.length;i++){var s=t.view[i],o;if(s.hidden)continue;if(n){var u=s.node.offsetTop+s.node.offsetHeight;o=u-r,r=u}else{var a=s.node.getBoundingClientRect();o=a.bottom-a.top}var f=s.line.height-o;o<2&&(o=wn(t));if(f>.001||f<-0.001){Ts(s.line,o),G(s.line);if(s.rest)for(var l=0;l<s.rest.length;l++)G(s.rest[l])}}}function G(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t)e.widgets[t].height=e.widgets[t].node.offsetHeight}function Y(e){var t=e.display,n={},r={};for(var i=t.gutters.firstChild,s=0;i;i=i.nextSibling,++s)n[e.options.gutters[s]]=i.offsetLeft,r[e.options.gutters[s]]=i.offsetWidth;return{fixedPos:X(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Z(e,t,n){function a(t){var n=t.nextSibling;return u&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}var r=e.display,i=e.options.lineNumbers,s=r.lineDiv,o=s.firstChild,f=r.view,l=r.viewFrom;for(var c=0;c<f.length;c++){var h=f[c];if(!h.hidden)if(!h.node){var p=at(e,h,l,n);s.insertBefore(p,o)}else{while(o!=h.node)o=a(o);var d=i&&t!=null&&t<=l&&h.lineNumber;h.changes&&(bo(h.changes,"gutter")>-1&&(d=!1),et(e,h,l,n)),d&&(Mo(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(W(e.options,l)))),o=h.node.nextSibling}l+=h.size}while(o)o=a(o)}function et(e,t,n,r){for(var i=0;i<t.changes.length;i++){var s=t.changes[i];s=="text"?it(e,t):s=="gutter"?ot(e,t,n,r):s=="class"?st(t):s=="widget"&&ut(t,r)}t.changes=null}function tt(e){return e.node==e.text&&(e.node=Ao("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),n&&(e.node.style.zIndex=2)),e.node}function nt(e){var t=e.bgClass?e.bgClass+" "+(e.line.bgClass||""):e.line.bgClass;t&&(t+=" CodeMirror-linebackground");if(e.background)t?e.background.className=t:(e.background.parentNode.removeChild(e.background),e.background=null);else if(t){var n=tt(e);e.background=n.insertBefore(Ao("div",null,t),n.firstChild)}}function rt(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):is(e,t)}function it(e,t){var n=t.text.className,r=rt(e,t);t.text==t.node&&(t.node=r.pre),t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,st(t)):n&&(t.text.className=n)}function st(e){nt(e),e.line.wrapClass?tt(e).className=e.line.wrapClass:e.node!=e.text&&(e.node.className="");var t=e.textClass?e.textClass+" "+(e.line.textClass||""):e.line.textClass;e.text.className=t||""}function ot(e,t,n,r){t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null);var i=t.line.gutterMarkers;if(e.options.lineNumbers||i){var s=tt(t),o=t.gutter=s.insertBefore(Ao("div",null,"CodeMirror-gutter-wrapper","position: absolute; left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px"),t.text);e.options.lineNumbers&&(!i||!i["CodeMirror-linenumbers"])&&(t.lineNumber=o.appendChild(Ao("div",W(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px")));if(i)for(var u=0;u<e.options.gutters.length;++u){var a=e.options.gutters[u],f=i.hasOwnProperty(a)&&i[a];f&&o.appendChild(Ao("div",[f],"CodeMirror-gutter-elt","left: "+r.gutterLeft[a]+"px; width: "+r.gutterWidth[a]+"px"))}}}function ut(e,t){e.alignable&&(e.alignable=null);for(var n=e.node.firstChild,r;n;n=r){var r=n.nextSibling;n.className=="CodeMirror-linewidget"&&e.node.removeChild(n)}ft(e,t)}function at(e,t,n,r){var i=rt(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),st(t),ot(e,t,n,r),ft(t,r),t.node}function ft(e,t){lt(e.line,e,t,!0);if(e.rest)for(var n=0;n<e.rest.length;n++)lt(e.rest[n],e,t,!1)}function lt(e,t,n,r){if(!e.widgets)return;var i=tt(t);for(var s=0,o=e.widgets;s<o.length;++s){var u=o[s],a=Ao("div",[u.node],"CodeMirror-linewidget");u.handleMouseEvents||(a.ignoreEvents=!0),ct(u,a,t,n),r&&u.above?i.insertBefore(a,t.gutter||t.text):i.appendChild(a),to(u,"redraw")}}function ct(e,t,n,r){if(e.noHScroll){(n.alignable||(n.alignable=[])).push(t);var i=r.wrapperWidth;t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}function dt(e){return ht(e.line,e.ch)}function vt(e,t){return pt(e,t)<0?t:e}function mt(e,t){return pt(e,t)<0?e:t}function gt(e,t){this.ranges=e,this.primIndex=t}function yt(e,t){this.anchor=e,this.head=t}function bt(e,t){var n=e[t];e.sort(function(e,t){return pt(e.from(),t.from())}),t=bo(e,n);for(var r=1;r<e.length;r++){var i=e[r],s=e[r-1];if(pt(s.to(),i.from())>=0){var o=mt(s.from(),i.from()),u=vt(s.to(),i.to()),a=s.empty()?i.from()==i.head:s.from()==s.head;r<=t&&--t,e.splice(--r,2,new yt(a?u:o,a?o:u))}}return new gt(e,t)}function wt(e,t){return new gt([new yt(e,t||e)],0)}function Et(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function St(e,t){if(t.line<e.first)return ht(e.first,0);var n=e.first+e.size-1;return t.line>n?ht(n,Es(e,n).text.length):xt(t,Es(e,t.line).text.length)}function xt(e,t){var n=e.ch;return n==null||n>t?ht(e.line,t):n<0?ht(e.line,0):e}function Tt(e,t){return t>=e.first&&t<e.first+e.size}function Nt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=St(e,t[r]);return n}function Ct(e,t,n,r){if(e.cm&&e.cm.display.shift||e.extend){var i=t.anchor;if(r){var s=pt(n,i)<0;s!=pt(r,i)<0?(i=n,n=r):s!=pt(n,r)<0&&(n=r)}return new yt(i,n)}return new yt(r||n,n)}function kt(e,t,n,r){Dt(e,new gt([Ct(e,e.sel.primary(),t,n)],0),r)}function Lt(e,t,n){for(var r=[],i=0;i<e.sel.ranges.length;i++)r[i]=Ct(e,e.sel.ranges[i],t[i],null);var s=bt(r,e.sel.primIndex);Dt(e,s,n)}function At(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Dt(e,bt(i,e.sel.primIndex),r)}function Ot(e,t,n,r){Dt(e,wt(t,n),r)}function Mt(e,t){var n={ranges:t.ranges,update:function(t){this.ranges=[];for(var n=0;n<t.length;n++)this.ranges[n]=new yt(St(e,t[n].anchor),St(e,t[n].head))}};return Ys(e,"beforeSelectionChange",e,n),e.cm&&Ys(e.cm,"beforeSelectionChange",e.cm,n),n.ranges!=t.ranges?bt(n.ranges,n.ranges.length-1):t}function _t(e,t,n){var r=e.history.done,i=go(r);i&&i.ranges?(r[r.length-1]=t,Pt(e,t,n)):Dt(e,t,n)}function Dt(e,t,n){Pt(e,t,n),Hs(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Pt(e,t,n){if(io(e,"beforeSelectionChange")||e.cm&&io(e.cm,"beforeSelectionChange"))t=Mt(e,t);var r=pt(t.primary().head,e.sel.primary().head)<0?-1:1;Ht(e,jt(e,t,r,!0)),(!n||n.scroll!==!1)&&e.cm&&Ur(e.cm)}function Ht(e,t){if(t.equals(e.sel))return;e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=e.cm.curOp.cursorActivity=!0),to(e,"cursorActivity",e)}function Bt(e){Ht(e,jt(e,e.sel,null,!1),ao)}function jt(e,t,n,r){var i;for(var s=0;s<t.ranges.length;s++){var o=t.ranges[s],u=Ft(e,o.anchor,n,r),a=Ft(e,o.head,n,r);if(i||u!=o.anchor||a!=o.head)i||(i=t.ranges.slice(0,s)),i[s]=new yt(u,a)}return i?bt(i,t.primIndex):t}function Ft(e,t,n,r){var i=!1,s=t,o=n||1;e.cantEdit=!1;e:for(;;){var u=Es(e,s.line);if(u.markedSpans)for(var a=0;a<u.markedSpans.length;++a){var f=u.markedSpans[a],l=f.marker;if((f.from==null||(l.inclusiveLeft?f.from<=s.ch:f.from<s.ch))&&(f.to==null||(l.inclusiveRight?f.to>=s.ch:f.to>s.ch))){if(r){Ys(l,"beforeCursorEnter");if(l.explicitlyCleared){if(!u.markedSpans)break;--a;continue}}if(!l.atomic)continue;var c=l.find(o<0?-1:1);if(pt(c,s)==0){c.ch+=o,c.ch<0?c.line>e.first?c=St(e,ht(c.line-1)):c=null:c.ch>u.text.length&&(c.line<e.first+e.size-1?c=ht(c.line+1,0):c=null);if(!c){if(i)return r?(e.cantEdit=!0,ht(e.first,0)):Ft(e,t,n,!0);i=!0,c=t,o=-o}}s=c;continue e}}return s}}function It(e){var t=e.display,n=e.doc,r=document.createDocumentFragment(),i=document.createDocumentFragment();for(var s=0;s<n.sel.ranges.length;s++){var o=n.sel.ranges[s],u=o.empty();(u||e.options.showCursorWhenSelecting)&&qt(e,o,r),u||Rt(e,o,i)}if(e.options.moveInputWithCursor){var a=dn(e,n.sel.primary().head,"div"),f=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect(),c=Math.max(0,Math.min(t.wrapper.clientHeight-10,a.top+l.top-f.top)),h=Math.max(0,Math.min(t.wrapper.clientWidth-10,a.left+l.left-f.left));t.inputDiv.style.top=c+"px",t.inputDiv.style.left=h+"px"}_o(t.cursorDiv,r),_o(t.selectionDiv,i)}function qt(e,t,n){var r=dn(e,t.head,"div"),i=n.appendChild(Ao("div"," ","CodeMirror-cursor"));i.style.left=r.left+"px",i.style.top=r.top+"px",i.style.height=Math.max(0,r.bottom-r.top)*e.options.cursorHeight+"px";if(r.other){var s=n.appendChild(Ao("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));s.style.display="",s.style.left=r.other.left+"px",s.style.top=r.other.top+"px",s.style.height=(r.other.bottom-r.other.top)*.85+"px"}}function Rt(e,t,n){function f(e,t,n,r){t<0&&(t=0),s.appendChild(Ao("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px; top: "+t+"px; width: "+(n==null?a-e:n)+"px; height: "+(r-t)+"px"))}function l(t,n,r){function h(n,r){return pn(e,ht(t,n),"div",s,r)}var s=Es(i,t),o=s.text.length,l,c;return Vo(Ls(s),n||0,r==null?o:r,function(e,t,i){var s=h(e,"left"),p,d,v;if(e==t)p=s,d=v=s.left;else{p=h(t-1,"right");if(i=="rtl"){var m=s;s=p,p=m}d=s.left,v=p.right}n==null&&e==0&&(d=u),p.top-s.top>3&&(f(d,s.top,null,s.bottom),d=u,s.bottom<p.top&&f(d,s.bottom,null,p.top)),r==null&&t==o&&(v=a);if(!l||s.top<l.top||s.top==l.top&&s.left<l.left)l=s;if(!c||p.bottom>c.bottom||p.bottom==c.bottom&&p.right>c.right)c=p;d<u+1&&(d=u),f(d,p.top,v-d,p.bottom)}),{start:l,end:c}}var r=e.display,i=e.doc,s=document.createDocumentFragment(),o=Kt(e.display),u=o.left,a=r.lineSpace.offsetWidth-o.right,c=t.from(),h=t.to();if(c.line==h.line)l(c.line,c.ch,h.ch);else{var p=Es(i,c.line),d=Es(i,h.line),v=Fi(p)==Fi(d),m=l(c.line,c.ch,v?p.text.length+1:null).end,g=l(h.line,v?0:null,h.ch).start;v&&(m.top<g.top-2?(f(m.right,m.top,null,m.bottom),f(u,g.top,g.left,g.bottom)):f(m.right,m.top,g.left-m.right,m.bottom)),m.bottom<g.top&&f(u,m.bottom,null,g.top)}n.appendChild(s)}function Ut(e){if(!e.state.focused)return;var t=e.display;clearInterval(t.blinker);var n=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0&&(t.blinker=setInterval(function(){t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate))}function zt(e,t){e.doc.mode.startState&&e.doc.frontier<e.display.viewTo&&e.state.highlight.set(t,xo(Wt,e))}function Wt(e){var t=e.doc;t.frontier<t.first&&(t.frontier=t.first);if(t.frontier>=e.display.viewTo)return;var n=+(new Date)+e.options.workTime,r=si(t.mode,Vt(e,t.frontier));Nn(e,function(){t.iter(t.frontier,Math.min(t.first+t.size,e.display.viewTo+500),function(i){if(t.frontier>=e.display.viewFrom){var s=i.styles;i.styles=Yi(e,i,r,!0);var o=!s||s.length!=i.styles.length;for(var u=0;!o&&u<s.length;++u)o=s[u]!=i.styles[u];o&&_n(e,t.frontier,"text"),i.stateAfter=si(t.mode,r)}else es(e,i.text,r),i.stateAfter=t.frontier%5==0?si(t.mode,r):null;++t.frontier;if(+(new Date)>n)return zt(e,e.options.workDelay),!0})})}function Xt(e,t,n){var r,i,s=e.doc,o=n?-1:t-(e.doc.mode.innerMode?1e3:100);for(var u=t;u>o;--u){if(u<=s.first)return s.first;var a=Es(s,u-1);if(a.stateAfter&&(!n||u<=s.frontier))return u;var f=ho(a.text,null,e.options.tabSize);if(i==null||r>f)i=u-1,r=f}return i}function Vt(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return!0;var s=Xt(e,t,n),o=s>r.first&&Es(r,s-1).stateAfter;return o?o=si(r.mode,o):o=oi(r.mode),r.iter(s,t,function(n){es(e,n.text,o);var u=s==t-1||s%5==0||s>=i.viewFrom&&s<i.viewTo;n.stateAfter=u?si(r.mode,o):null,++s}),n&&(r.frontier=s),o}function $t(e){return e.lineSpace.offsetTop}function Jt(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Kt(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=_o(e.measure,Ao("pre","x")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle;return e.cachedPaddingH={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)}}function Qt(e,t,n){var r=e.options.lineWrapping,i=r&&e.display.scroller.clientWidth;if(!t.measure.heights||r&&t.measure.width!=i){var s=t.measure.heights=[];if(r){t.measure.width=i;var o=t.text.firstChild.getClientRects();for(var u=0;u<o.length-1;u++){var a=o[u],f=o[u+1];Math.abs(a.bottom-f.bottom)>2&&s.push((a.bottom+f.top)/2-n.top)}}s.push(n.bottom-n.top)}}function Gt(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var r=0;r<e.rest.length;r++)if(Ns(e.rest[r])>n)return{map:e.measure.maps[r],cache:e.measure.caches[r],before:!0}}function Yt(e,t){t=Fi(t);var n=Ns(t),r=e.display.externalMeasured=new An(e.doc,t,n);r.lineN=n;var i=r.built=is(e,r);return r.text=i.pre,_o(e.display.lineMeasure,i.pre),r}function Zt(e,t,n,r){return nn(e,tn(e,t),n,r)}function en(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[Pn(e,t)];var n=e.display.externalMeasured;if(n&&t>=n.lineN&&t<n.lineN+n.size)return n}function tn(e,t){var n=Ns(t),r=en(e,n);r&&!r.text?r=null:r&&r.changes&&et(e,r,n,Y(e)),r||(r=Yt(e,t));var i=Gt(r,t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function nn(e,t,n,r){t.before&&(n=-1);var i=n+(r||""),s;return t.cache.hasOwnProperty(i)?s=t.cache[i]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(Qt(e,t.view,t.rect),t.hasHeights=!0),s=sn(e,t,n,r),s.bogus||(t.cache[i]=s)),{left:s.left,right:s.right,top:s.top,bottom:s.bottom}}function sn(e,t,n,i){var s=t.map,u,a,f,l;for(var c=0;c<s.length;c+=3){var h=s[c],p=s[c+1];if(n<h)a=0,f=1,l="left";else if(n<p)a=n-h,f=a+1;else if(c==s.length-3||n==p&&s[c+3]>n)f=p-h,a=f-1,n>=p&&(l="right");if(a!=null){u=s[c+2],h==p&&i==(u.insertLeft?"left":"right")&&(l=i);if(i=="left"&&a==0)while(c&&s[c-2]==s[c-3]&&s[c-1].insertLeft)u=s[(c-=3)+2],l="left";if(i=="right"&&a==p-h)while(c<s.length-3&&s[c+3]==s[c+4]&&!s[c+5].insertLeft)u=s[(c+=3)+2],l="right";break}}var d;if(u.nodeType==3){while(a&&Lo(t.line.text.charAt(h+a)))--a;while(h+f<p&&Lo(t.line.text.charAt(h+f)))++f;if(r&&a==0&&f==p-h)d=u.parentNode.getBoundingClientRect();else if(o&&e.options.lineWrapping){var v=Oo(u,a,f).getClientRects();v.length?d=v[i=="right"?v.length-1:0]:d=rn}else d=Oo(u,a,f).getBoundingClientRect()}else{a>0&&(l=i="right");var v;e.options.lineWrapping&&(v=u.getClientRects()).length>1?d=v[i=="right"?v.length-1:0]:d=u.getBoundingClientRect()}if(r&&!a&&(!d||!d.left&&!d.right)){var m=u.parentNode.getClientRects()[0];m?d={left:m.left,right:m.left+En(e.display),top:m.top,bottom:m.bottom}:d=rn}var g,y=(d.bottom+d.top)/2-t.rect.top,b=t.view.measure.heights;for(var c=0;c<b.length-1;c++)if(y<b[c])break;g=c?b[c-1]:0,y=b[c];var w={left:(l=="right"?d.right:d.left)-t.rect.left,right:(l=="left"?d.left:d.right)-t.rect.left,top:g,bottom:y};return!d.left&&!d.right&&(w.bogus=!0),w}function on(e){if(e.measure){e.measure.cache={},e.measure.heights=null;if(e.rest)for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}}function un(e){e.display.externalMeasure=null,Mo(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)on(e.display.view[t])}function an(e){un(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function fn(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function ln(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function cn(e,t,n,r){if(t.widgets)for(var i=0;i<t.widgets.length;++i)if(t.widgets[i].above){var s=Vi(t.widgets[i]);n.top+=s,n.bottom+=s}if(r=="line")return n;r||(r="local");var o=ks(t);r=="local"?o+=$t(e.display):o-=e.display.viewOffset;if(r=="page"||r=="window"){var u=e.display.lineSpace.getBoundingClientRect();o+=u.top+(r=="window"?0:ln());var a=u.left+(r=="window"?0:fn());n.left+=a,n.right+=a}return n.top+=o,n.bottom+=o,n}function hn(e,t,n){if(n=="div")return t;var r=t.left,i=t.top;if(n=="page")r-=fn(),i-=ln();else if(n=="local"||!n){var s=e.display.sizer.getBoundingClientRect();r+=s.left,i+=s.top}var o=e.display.lineSpace.getBoundingClientRect();return{left:r-o.left,top:i-o.top}}function pn(e,t,n,r,i){return r||(r=Es(e.doc,t.line)),cn(e,r,Zt(e,r,t.ch,i),n)}function dn(e,t,n,r,i){function s(t,s){var o=nn(e,i,t,s?"right":"left");return s?o.left=o.right:o.right=o.left,cn(e,r,o,n)}function o(e,t){var n=u[t],r=n.level%2;return e==$o(n)&&t&&n.level<u[t-1].level?(n=u[--t],e=Jo(n)-(n.level%2?0:1),r=!0):e==Jo(n)&&t<u.length-1&&n.level<u[t+1].level&&(n=u[++t],e=$o(n)-n.level%2,r=!1),r&&e==n.to&&e>n.from?s(e-1):s(e,r)}r=r||Es(e.doc,t.line),i||(i=tn(e,r));var u=Ls(r),a=t.ch;if(!u)return s(a);var f=tu(u,a),l=o(a,f);return eu!=null&&(l.other=o(a,eu)),l}function vn(e,t){var n=0,t=St(e.doc,t);e.options.lineWrapping||(n=En(e.display)*t.ch);var r=Es(e.doc,t.line),i=ks(r)+$t(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function mn(e,t,n,r){var i=ht(e,t);return i.xRel=r,n&&(i.outside=!0),i}function gn(e,t,n){var r=e.doc;n+=e.display.viewOffset;if(n<0)return mn(r.first,0,!0,-1);var i=Cs(r,n),s=r.first+r.size-1;if(i>s)return mn(r.first+r.size-1,Es(r,s).text.length,!0,1);t<0&&(t=0);var o=Es(r,i);for(;;){var u=yn(e,o,i,t,n),a=Bi(o),f=a&&a.find(0,!0);if(!a||!(u.ch>f.from.ch||u.ch==f.from.ch&&u.xRel>0))return u;i=Ns(o=f.to.line)}}function yn(e,t,n,r,i){function f(r){var i=dn(e,ht(n,r),"line",t,a);return o=!0,s>i.bottom?i.left-u:s<i.top?i.left+u:(o=!1,i.left)}var s=i-ks(t),o=!1,u=2*e.display.wrapper.clientWidth,a=tn(e,t),l=Ls(t),c=t.text.length,h=Ko(t),p=Qo(t),d=f(h),v=o,m=f(p),g=o;if(r>m)return mn(n,p,g,1);for(;;){if(l?p==h||p==ru(t,h,1):p-h<=1){var y=r<d||r-d<=m-r?h:p,b=r-(y==h?d:m);while(Lo(t.text.charAt(y)))++y;var w=mn(n,y,y==h?v:g,b<-1?-1:b>1?1:0);return w}var E=Math.ceil(c/2),S=h+E;if(l){S=h;for(var x=0;x<E;++x)S=ru(t,S,1)}var T=f(S);if(T>r){p=S,m=T;if(g=o)m+=1e3;c=E}else h=S,d=T,v=o,c-=E}}function wn(e){if(e.cachedTextHeight!=null)return e.cachedTextHeight;if(bn==null){bn=Ao("pre");for(var t=0;t<49;++t)bn.appendChild(document.createTextNode("x")),bn.appendChild(Ao("br"));bn.appendChild(document.createTextNode("x"))}_o(e.measure,bn);var n=bn.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),Mo(e.measure),n||1}function En(e){if(e.cachedCharWidth!=null)return e.cachedCharWidth;var t=Ao("span","xxxxxxxxxx"),n=Ao("pre",[t]);_o(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function xn(e){e.curOp={viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivity:!1,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,id:++Sn},eo++||(Zs=[])}function Tn(e){var t=e.curOp,n=e.doc,r=e.display;e.curOp=null,t.updateMaxLine&&j(e);if(t.viewChanged||t.forceUpdate||t.scrollTop!=null||t.scrollToPos&&(t.scrollToPos.from.line<r.viewFrom||t.scrollToPos.to.line>=r.viewTo)||r.maxLineChanged&&e.options.lineWrapping){var i=V(e,{top:t.scrollTop,ensure:t.scrollToPos},t.forceUpdate);e.display.scroller.offsetHeight&&(e.doc.scrollTop=e.display.scroller.scrollTop)}!i&&t.selectionChanged&&It(e),!i&&t.startHeight!=e.doc.height&&q(e);if(t.scrollTop!=null&&r.scroller.scrollTop!=t.scrollTop){var s=Math.max(0,Math.min(r.scroller.scrollHeight-r.scroller.clientHeight,t.scrollTop));r.scroller.scrollTop=r.scrollbarV.scrollTop=n.scrollTop=s}if(t.scrollLeft!=null&&r.scroller.scrollLeft!=t.scrollLeft){var o=Math.max(0,Math.min(r.scroller.scrollWidth-r.scroller.clientWidth,t.scrollLeft));r.scroller.scrollLeft=r.scrollbarH.scrollLeft=n.scrollLeft=o,U(e)}if(t.scrollToPos){var u=Fr(e,St(e.doc,t.scrollToPos.from),St(e.doc,t.scrollToPos.to),t.scrollToPos.margin);t.scrollToPos.isCursor&&e.state.focused&&jr(e,u)}t.selectionChanged&&Ut(e),e.state.focused&&t.updateInput&&Rn(e,t.typing);var a=t.maybeHiddenMarkers,f=t.maybeUnhiddenMarkers;if(a)for(var l=0;l<a.length;++l)a[l].lines.length||Ys(a[l],"hide");if(f)for(var l=0;l<f.length;++l)f[l].lines.length&&Ys(f[l],"unhide");var c;--eo||(c=Zs,Zs=null);if(t.changeObjs){for(var l=0;l<t.changeObjs.length;l++)Ys(e,"change",e,t.changeObjs[l]);Ys(e,"changes",e,t.changeObjs)}t.cursorActivity&&Ys(e,"cursorActivity",e);if(c)for(var l=0;l<c.length;++l)c[l]()}function Nn(e,t){if(e.curOp)return t();xn(e);try{return t()}finally{Tn(e)}}function Cn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);xn(e);try{return t.apply(e,arguments)}finally{Tn(e)}}}function kn(e){return function(){if(this.curOp)return e.apply(this,arguments);xn(this);try{return e.apply(this,arguments)}finally{Tn(this)}}}function Ln(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);xn(t);try{return e.apply(this,arguments)}finally{Tn(t)}}}function An(e,t,n){this.line=t,this.rest=Ii(t),this.size=this.rest?Ns(go(this.rest))-n+1:1,this.node=this.text=null,this.hidden=Ui(e,t)}function On(e,t,n){var r=[],i;for(var s=t;s<n;s=i){var o=new An(e.doc,Es(e.doc,s),s);i=s+o.size,r.push(o)}return r}function Mn(e,t,n,r){t==null&&(t=e.doc.first),n==null&&(n=e.doc.first+e.doc.size),r||(r=0);var i=e.display;r&&n<i.viewTo&&(i.updateLineNumbers==null||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0;if(t>=i.viewTo)T&&qi(e.doc,t)<i.viewTo&&Dn(e);else if(n<=i.viewFrom)T&&Ri(e.doc,n+r)>i.viewFrom?Dn(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)Dn(e);else if(t<=i.viewFrom){var s=Hn(e,n,n+r,1);s?(i.view=i.view.slice(s.index),i.viewFrom=s.lineN,i.viewTo+=r):Dn
-(e)}else if(n>=i.viewTo){var s=Hn(e,t,t,-1);s?(i.view=i.view.slice(0,s.index),i.viewTo=s.lineN):Dn(e)}else{var o=Hn(e,t,t,-1),u=Hn(e,n,n+r,1);o&&u?(i.view=i.view.slice(0,o.index).concat(On(e,o.lineN,u.lineN)).concat(i.view.slice(u.index)),i.viewTo+=r):Dn(e)}var a=i.externalMeasured;a&&(n<a.lineN?a.lineN+=r:t<a.lineN+a.size&&(i.externalMeasured=null))}function _n(e,t,n){e.curOp.viewChanged=!0;var r=e.display,i=e.display.externalMeasured;i&&t>=i.lineN&&t<i.lineN+i.size&&(r.externalMeasured=null);if(t<r.viewFrom||t>=r.viewTo)return;var s=r.view[Pn(e,t)];if(s.node==null)return;var o=s.changes||(s.changes=[]);bo(o,n)==-1&&o.push(n)}function Dn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Pn(e,t){if(t>=e.display.viewTo)return null;t-=e.display.viewFrom;if(t<0)return null;var n=e.display.view;for(var r=0;r<n.length;r++){t-=n[r].size;if(t<0)return r}}function Hn(e,t,n,r){var i=Pn(e,t),s,o=e.display.view;if(!T)return{index:i,lineN:n};for(var u=0,a=e.display.viewFrom;u<i;u++)a+=o[u].size;if(a!=t){if(r>0){if(i==o.length-1)return null;s=a+o[i].size-t,i++}else s=a-t;t+=s,n+=s}while(qi(e.doc,n)!=n){if(i==(r<0?0:o.length-1))return null;n+=r*o[i-(r<0?1:0)].size,i+=r}return{index:i,lineN:n}}function Bn(e,t,n){var r=e.display,i=r.view;i.length==0||t>=r.viewTo||n<=r.viewFrom?(r.view=On(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=On(e,t,r.viewFrom).concat(r.view):r.viewFrom<t&&(r.view=r.view.slice(Pn(e,t))),r.viewFrom=t,r.viewTo<n?r.view=r.view.concat(On(e,r.viewTo,n)):r.viewTo>n&&(r.view=r.view.slice(0,Pn(e,n)))),r.viewTo=n}function jn(e){var t=e.display.view,n=0;for(var r=0;r<t.length;r++){var i=t[r];!i.hidden&&(!i.node||i.changes)&&++n}return n}function Fn(e){if(e.display.pollingFast)return;e.display.poll.set(e.options.pollInterval,function(){qn(e),e.state.focused&&Fn(e)})}function In(e){function n(){var r=qn(e);!r&&!t?(t=!0,e.display.poll.set(60,n)):(e.display.pollingFast=!1,Fn(e))}var t=!1;e.display.pollingFast=!0,e.display.poll.set(20,n)}function qn(e){var t=e.display.input,n=e.display.prevInput,i=e.doc;if(!e.state.focused||zo(t)||Wn(e)||e.options.disableInput)return!1;var s=t.value;if(s==n&&!e.somethingSelected())return!1;if(o&&!r&&e.display.inputHasSelection===s)return Rn(e),!1;var u=!e.curOp;u&&xn(e),e.display.shift=!1;var a=0,f=Math.min(n.length,s.length);while(a<f&&n.charCodeAt(a)==s.charCodeAt(a))++a;var l=s.slice(a),c=Uo(l),h=e.state.pasteIncoming&&c.length>1&&i.sel.ranges.length==c.length;for(var p=i.sel.ranges.length-1;p>=0;p--){var d=i.sel.ranges[p],v=d.from(),m=d.to();a<n.length?v=ht(v.line,v.ch-(n.length-a)):e.state.overwrite&&d.empty()&&!e.state.pasteIncoming&&(m=ht(m.line,Math.min(Es(i,m.line).text.length,m.ch+go(c).length)));var g=e.curOp.updateInput,y={from:v,to:m,text:h?[c[p]]:c,origin:e.state.pasteIncoming?"paste":e.state.cutIncoming?"cut":"+input"};Or(e.doc,y),to(e,"inputRead",e,y);if(l&&!e.state.pasteIncoming&&e.options.electricChars&&e.options.smartIndent&&d.head.ch<100&&(!p||i.sel.ranges[p-1].head.line!=d.head.line)){var b=e.getModeAt(d.head).electricChars;if(b)for(var w=0;w<b.length;w++)if(l.indexOf(b.charAt(w))>-1){Wr(e,d.head.line,"smart");break}}}return Ur(e),e.curOp.updateInput=g,e.curOp.typing=!0,s.length>1e3||s.indexOf("\n")>-1?t.value=e.display.prevInput="":e.display.prevInput=s,u&&Tn(e),e.state.pasteIncoming=e.state.cutIncoming=!1,!0}function Rn(e,t){var n,i,s=e.doc;if(e.somethingSelected()){e.display.prevInput="";var u=s.sel.primary();n=Wo&&(u.to().line-u.from().line>100||(i=e.getSelection()).length>1e3);var a=n?"-":i||e.getSelection();e.display.input.value=a,e.state.focused&&yo(e.display.input),o&&!r&&(e.display.inputHasSelection=a)}else t||(e.display.prevInput=e.display.input.value="",o&&!r&&(e.display.inputHasSelection=null));e.display.inaccurateSelection=n}function Un(e){e.options.readOnly!="nocursor"&&(!g||Po()!=e.display.input)&&e.display.input.focus()}function zn(e){e.state.focused||(Un(e),br(e))}function Wn(e){return e.options.readOnly||e.doc.cantEdit}function Xn(e){function i(){e.state.focused&&setTimeout(xo(Un,e),0)}function u(){s==null&&(s=setTimeout(function(){s=null,n.cachedCharWidth=n.cachedTextHeight=n.cachedPaddingH=Bo=null,e.setSize()},100))}function a(){Do(document.body,n.wrapper)?setTimeout(a,5e3):Gs(window,"resize",u)}function f(t){ro(e,t)||$s(t)}function l(t){n.inaccurateSelection&&(n.prevInput="",n.inaccurateSelection=!1,n.input.value=e.getSelection(),yo(n.input)),t.type=="cut"&&(e.state.cutIncoming=!0)}var n=e.display;Qs(n.scroller,"mousedown",Cn(e,Jn)),t?Qs(n.scroller,"dblclick",Cn(e,function(t){if(ro(e,t))return;var n=$n(e,t);if(!n||tr(e,t)||Vn(e.display,t))return;Ws(t);var r=Kr(e.doc,n);kt(e.doc,r.anchor,r.head)})):Qs(n.scroller,"dblclick",function(t){ro(e,t)||Ws(t)}),Qs(n.lineSpace,"selectstart",function(e){Vn(n,e)||Ws(e)}),S||Qs(n.scroller,"contextmenu",function(t){Sr(e,t)}),Qs(n.scroller,"scroll",function(){n.scroller.clientHeight&&(sr(e,n.scroller.scrollTop),or(e,n.scroller.scrollLeft,!0),Ys(e,"scroll",e))}),Qs(n.scrollbarV,"scroll",function(){n.scroller.clientHeight&&sr(e,n.scrollbarV.scrollTop)}),Qs(n.scrollbarH,"scroll",function(){n.scroller.clientHeight&&or(e,n.scrollbarH.scrollLeft)}),Qs(n.scroller,"mousewheel",function(t){fr(e,t)}),Qs(n.scroller,"DOMMouseScroll",function(t){fr(e,t)}),Qs(n.scrollbarH,"mousedown",i),Qs(n.scrollbarV,"mousedown",i),Qs(n.wrapper,"scroll",function(){n.wrapper.scrollTop=n.wrapper.scrollLeft=0});var s;Qs(window,"resize",u),setTimeout(a,5e3),Qs(n.input,"keyup",Cn(e,gr)),Qs(n.input,"input",function(){o&&!r&&e.display.inputHasSelection&&(e.display.inputHasSelection=null),In(e)}),Qs(n.input,"keydown",Cn(e,mr)),Qs(n.input,"keypress",Cn(e,yr)),Qs(n.input,"focus",xo(br,e)),Qs(n.input,"blur",xo(wr,e)),e.options.dragDrop&&(Qs(n.scroller,"dragstart",function(t){ir(e,t)}),Qs(n.scroller,"dragenter",f),Qs(n.scroller,"dragover",f),Qs(n.scroller,"drop",Cn(e,rr))),Qs(n.scroller,"paste",function(t){if(Vn(n,t))return;e.state.pasteIncoming=!0,Un(e),In(e)}),Qs(n.input,"paste",function(){e.state.pasteIncoming=!0,In(e)}),Qs(n.input,"cut",l),Qs(n.input,"copy",l),h&&Qs(n.sizer,"mouseup",function(){Po()==n.input&&n.input.blur(),Un(e)})}function Vn(e,t){for(var n=Js(t);n!=e.wrapper;n=n.parentNode)if(!n||n.ignoreEvents||n.parentNode==e.sizer&&n!=e.mover)return!0}function $n(e,t,n,r){var i=e.display;if(!n){var s=Js(t);if(s==i.scrollbarH||s==i.scrollbarV||s==i.scrollbarFiller||s==i.gutterFiller)return null}var o,u,a=i.lineSpace.getBoundingClientRect();try{o=t.clientX-a.left,u=t.clientY-a.top}catch(t){return null}var f=gn(e,o,u),l;if(r&&f.xRel==1&&(l=Es(e.doc,f.line).text).length==f.ch){var c=ho(l,l.length,e.options.tabSize)-l.length;f=ht(f.line,Math.round((o-Kt(e.display).left)/En(e.display))-c)}return f}function Jn(e){if(ro(this,e))return;var t=this,n=t.display;n.shift=e.shiftKey;if(Vn(n,e)){u||(n.scroller.draggable=!1,setTimeout(function(){n.scroller.draggable=!0},100));return}if(tr(t,e))return;var r=$n(t,e);window.focus();switch(Ks(e)){case 1:r?Gn(t,e,r):Js(e)==n.scroller&&Ws(e);break;case 2:u&&(t.state.lastMiddleDown=+(new Date)),r&&kt(t.doc,r),setTimeout(xo(Un,t),20),Ws(e);break;case 3:S&&Sr(t,e)}}function Gn(e,t,n){setTimeout(xo(zn,e),0);var r=+(new Date),i;Qn&&Qn.time>r-400&&pt(Qn.pos,n)==0?i="triple":Kn&&Kn.time>r-400&&pt(Kn.pos,n)==0?(i="double",Qn={time:r,pos:n}):(i="single",Kn={time:r,pos:n});var s=e.doc.sel,o=y?t.metaKey:t.ctrlKey;e.options.dragDrop&&Ho&&!o&&!Wn(e)&&i=="single"&&s.contains(n)>-1&&s.somethingSelected()?Yn(e,t,n):Zn(e,t,n,i,o)}function Yn(e,n,i){var s=e.display,o=Cn(e,function(a){u&&(s.scroller.draggable=!1),e.state.draggingText=!1,Gs(document,"mouseup",o),Gs(s.scroller,"drop",o),Math.abs(n.clientX-a.clientX)+Math.abs(n.clientY-a.clientY)<10&&(Ws(a),kt(e.doc,i),Un(e),t&&!r&&setTimeout(function(){document.body.focus(),Un(e)},20))});u&&(s.scroller.draggable=!0),e.state.draggingText=o,s.scroller.dragDrop&&s.scroller.dragDrop(),Qs(document,"mouseup",o),Qs(s.scroller,"drop",o)}function Zn(e,t,n,r,s){function v(t){if(pt(d,t)==0)return;d=t;if(r=="rect"){var i=[],s=e.options.tabSize,o=ho(Es(a,n.line).text,n.ch,s),u=ho(Es(a,t.line).text,t.ch,s),h=Math.min(o,u),p=Math.max(o,u);for(var v=Math.min(n.line,t.line),m=Math.min(e.lastLine(),Math.max(n.line,t.line));v<=m;v++){var g=Es(a,v).text,y=po(g,h,s);h==p?i.push(new yt(ht(v,y),ht(v,y))):g.length>y&&i.push(new yt(ht(v,y),ht(v,po(g,p,s))))}i.length||i.push(new yt(n,n)),Dt(a,bt(c.ranges.slice(0,l).concat(i),l),fo)}else{var b=f,w=b.anchor,E=t;if(r!="single"){if(r=="double")var S=Kr(a,t);else var S=new yt(ht(t.line,0),St(a,ht(t.line+1,0)));pt(S.anchor,w)>0?(E=S.head,w=mt(b.from(),S.anchor)):(E=S.anchor,w=vt(b.to(),S.head))}var i=c.ranges.slice(0);i[l]=new yt(St(a,w),E),Dt(a,bt(i,l),fo)}}function y(t){var n=++g,i=$n(e,t,!0,r=="rect");if(!i)return;if(pt(i,d)!=0){zn(e),v(i);var s=R(u,a);(i.line>=s.to||i.line<s.from)&&setTimeout(Cn(e,function(){g==n&&y(t)}),150)}else{var o=t.clientY<m.top?-20:t.clientY>m.bottom?20:0;o&&setTimeout(Cn(e,function(){if(g!=n)return;u.scroller.scrollTop+=o,y(t)}),50)}}function b(t){g=Infinity,Ws(t),Un(e),Gs(document,"mousemove",w),Gs(document,"mouseup",E),a.history.lastSelOrigin=null}var u=e.display,a=e.doc;Ws(t);var f,l,c=a.sel;s?(l=a.sel.contains(n),l>-1?f=a.sel.ranges[l]:f=new yt(n,n)):f=a.sel.primary();if(t.altKey)r="rect",s||(f=new yt(n,n)),n=$n(e,t,!0,!0),l=-1;else if(r=="double"){var h=Kr(a,n);e.display.shift||a.extend?f=Ct(a,f,h.anchor,h.head):f=h}else if(r=="triple"){var p=new yt(ht(n.line,0),St(a,ht(n.line+1,0)));e.display.shift||a.extend?f=Ct(a,f,p.anchor,p.head):f=p}else f=Ct(a,f,n);s?l>-1?At(a,l,f,fo):(l=a.sel.ranges.length,Dt(a,bt(a.sel.ranges.concat([f]),l),{scroll:!1,origin:"*mouse"})):(l=0,Dt(a,new gt([f],0),fo));var d=n,m=u.wrapper.getBoundingClientRect(),g=0,w=Cn(e,function(e){(o&&!i?!e.buttons:!Ks(e))?b(e):y(e)}),E=Cn(e,b);Qs(document,"mousemove",w),Qs(document,"mouseup",E)}function er(e,t,n,r,i){try{var s=t.clientX,o=t.clientY}catch(t){return!1}if(s>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ws(t);var u=e.display,a=u.lineDiv.getBoundingClientRect();if(o>a.bottom||!io(e,n))return Vs(t);o-=a.top-u.viewOffset;for(var f=0;f<e.options.gutters.length;++f){var l=u.gutters.childNodes[f];if(l&&l.getBoundingClientRect().right>=s){var c=Cs(e.doc,o),h=e.options.gutters[f];return i(e,n,e,c,h,t),Vs(t)}}}function tr(e,t){return er(e,t,"gutterClick",!0,to)}function rr(e){var n=this;if(ro(n,e)||Vn(n.display,e))return;Ws(e),t&&(nr=+(new Date));var r=$n(n,e,!0),i=e.dataTransfer.files;if(!r||Wn(n))return;if(i&&i.length&&window.FileReader&&window.File){var s=i.length,o=Array(s),u=0,a=function(e,t){var i=new FileReader;i.onload=function(){o[t]=i.result;if(++u==s){r=St(n.doc,r);var e={from:r,to:r,text:Uo(o.join("\n")),origin:"paste"};Or(n.doc,e),_t(n.doc,wt(r,Tr(e)))}},i.readAsText(e)};for(var f=0;f<s;++f)a(i[f],f)}else{if(n.state.draggingText&&n.doc.sel.contains(r)>-1){n.state.draggingText(e),setTimeout(xo(Un,n),20);return}try{var o=e.dataTransfer.getData("Text");if(o){var l=n.state.draggingText&&n.listSelections();Pt(n.doc,wt(r,r));if(l)for(var f=0;f<l.length;++f)Br(n.doc,"",l[f].anchor,l[f].head,"drag");n.replaceSelection(o,"around","paste"),Un(n)}}catch(e){}}}function ir(e,n){if(t&&(!e.state.draggingText||+(new Date)-nr<100)){$s(n);return}if(ro(e,n)||Vn(e.display,n))return;n.dataTransfer.setData("Text",e.getSelection());if(n.dataTransfer.setDragImage&&!c){var r=Ao("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",l&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),l&&r.parentNode.removeChild(r)}}function sr(t,n){if(Math.abs(t.doc.scrollTop-n)<2)return;t.doc.scrollTop=n,e||V(t,{top:n}),t.display.scroller.scrollTop!=n&&(t.display.scroller.scrollTop=n),t.display.scrollbarV.scrollTop!=n&&(t.display.scrollbarV.scrollTop=n),e&&V(t),zt(t,100)}function or(e,t,n){if(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)return;t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),e.doc.scrollLeft=t,U(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbarH.scrollLeft!=t&&(e.display.scrollbarH.scrollLeft=t)}function fr(t,n){var r=n.wheelDeltaX,i=n.wheelDeltaY;r==null&&n.detail&&n.axis==n.HORIZONTAL_AXIS&&(r=n.detail),i==null&&n.detail&&n.axis==n.VERTICAL_AXIS?i=n.detail:i==null&&(i=n.wheelDelta);var s=t.display,o=s.scroller;if(!(r&&o.scrollWidth>o.clientWidth||i&&o.scrollHeight>o.clientHeight))return;if(i&&y&&u)e:for(var a=n.target,f=s.view;a!=o;a=a.parentNode)for(var c=0;c<f.length;c++)if(f[c].node==a){t.display.currentWheelTarget=a;break e}if(r&&!e&&!l&&ar!=null){i&&sr(t,Math.max(0,Math.min(o.scrollTop+i*ar,o.scrollHeight-o.clientHeight))),or(t,Math.max(0,Math.min(o.scrollLeft+r*ar,o.scrollWidth-o.clientWidth))),Ws(n),s.wheelStartX=null;return}if(i&&ar!=null){var h=i*ar,p=t.doc.scrollTop,d=p+s.wrapper.clientHeight;h<0?p=Math.max(0,p+h-50):d=Math.min(t.doc.height,d+h+50),V(t,{top:p,bottom:d})}ur<20&&(s.wheelStartX==null?(s.wheelStartX=o.scrollLeft,s.wheelStartY=o.scrollTop,s.wheelDX=r,s.wheelDY=i,setTimeout(function(){if(s.wheelStartX==null)return;var e=o.scrollLeft-s.wheelStartX,t=o.scrollTop-s.wheelStartY,n=t&&s.wheelDY&&t/s.wheelDY||e&&s.wheelDX&&e/s.wheelDX;s.wheelStartX=s.wheelStartY=null;if(!n)return;ar=(ar*ur+n)/(ur+1),++ur},200)):(s.wheelDX+=r,s.wheelDY+=i))}function lr(e,t,n){if(typeof t=="string"){t=ui[t];if(!t)return!1}e.display.pollingFast&&qn(e)&&(e.display.pollingFast=!1);var r=e.display.shift,i=!1;try{Wn(e)&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=uo}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}function cr(e){var t=e.state.keyMaps.slice(0);return e.options.extraKeys&&t.push(e.options.extraKeys),t.push(e.options.keyMap),t}function pr(e,t){var n=fi(e.options.keyMap),r=n.auto;clearTimeout(hr),r&&!ci(t)&&(hr=setTimeout(function(){fi(e.options.keyMap)==n&&(e.options.keyMap=r.call?r.call(null,e):r,_(e))},50));var i=hi(t,!0),s=!1;if(!i)return!1;var o=cr(e);return t.shiftKey?s=li("Shift-"+i,o,function(t){return lr(e,t,!0)})||li(i,o,function(t){if(typeof t=="string"?/^go[A-Z]/.test(t):t.motion)return lr(e,t)}):s=li(i,o,function(t){return lr(e,t)}),s&&(Ws(t),Ut(e),to(e,"keyHandled",e,i,t)),s}function dr(e,t,n){var r=li("'"+n+"'",cr(e),function(t){return lr(e,t,!0)});return r&&(Ws(t),Ut(e),to(e,"keyHandled",e,"'"+n+"'",t)),r}function mr(e){var n=this;zn(n);if(ro(n,e))return;t&&e.keyCode==27&&(e.returnValue=!1);var r=e.keyCode;n.display.shift=r==16||e.shiftKey;var i=pr(n,e);l&&(vr=i?r:null,!i&&r==88&&!Wo&&(y?e.metaKey:e.ctrlKey)&&n.replaceSelection("",null,"cut"))}function gr(e){if(ro(this,e))return;e.keyCode==16&&(this.doc.sel.shift=!1)}function yr(e){var t=this;if(ro(t,e))return;var n=e.keyCode,i=e.charCode;if(l&&n==vr){vr=null,Ws(e);return}if((l&&(!e.which||e.which<10)||h)&&pr(t,e))return;var s=String.fromCharCode(i==null?n:i);if(dr(t,e,s))return;o&&!r&&(t.display.inputHasSelection=null),In(t)}function br(e){if(e.options.readOnly=="nocursor")return;e.state.focused||(Ys(e,"focus",e),e.state.focused=!0,e.display.wrapper.className.search(/\bCodeMirror-focused\b/)==-1&&(e.display.wrapper.className+=" CodeMirror-focused"),e.curOp||(Rn(e),u&&setTimeout(xo(Rn,e,!0),0))),Fn(e),Ut(e)}function wr(e){e.state.focused&&(Ys(e,"blur",e),e.state.focused=!1,e.display.wrapper.className=e.display.wrapper.className.replace(" CodeMirror-focused","")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150)}function Sr(e,t){function f(){if(n.input.selectionStart!=null){var t=n.input.value="​"+(e.somethingSelected()?n.input.value:"");n.prevInput="​",n.input.selectionStart=1,n.input.selectionEnd=t.length}}function c(){n.inputDiv.style.position="relative",n.input.style.cssText=a,r&&(n.scrollbarV.scrollTop=n.scroller.scrollTop=s),Fn(e);if(n.input.selectionStart!=null){(!o||r)&&f(),clearTimeout(Er);var t=0,i=function(){n.prevInput=="​"&&n.input.selectionStart==0?Cn(e,ui.selectAll)(e):t++<10?Er=setTimeout(i,500):Rn(e)};Er=setTimeout(i,200)}}if(ro(e,t,"contextmenu"))return;var n=e.display;if(Vn(n,t)||xr(e,t))return;var i=$n(e,t),s=n.scroller.scrollTop;if(!i||l)return;var u=e.options.resetSelectionOnContextMenu;u&&e.doc.sel.contains(i)==-1&&Cn(e,Dt)(e.doc,wt(i),ao);var a=n.input.style.cssText;n.inputDiv.style.position="absolute",n.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(t.clientY-5)+"px; left: "+(t.clientX-5)+"px; z-index: 1000; background: "+(o?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",Un(e),Rn(e),e.somethingSelected()||(n.input.value=n.prevInput=" "),o&&!r&&f();if(S){$s(t);var h=function(){Gs(window,"mouseup",h),setTimeout(c,20)};Qs(window,"mouseup",h)}else setTimeout(c,50)}function xr(e,t){return io(e,"gutterContextMenu")?er(e,t,"gutterContextMenu",!1,Ys):!1}function Nr(e,t){if(pt(e,t.from)<0)return e;if(pt(e,t.to)<=0)return Tr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=Tr(t).ch-t.to.ch),ht(n,r)}function Cr(e,t){var n=[];for(var r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new yt(Nr(i.anchor,t),Nr(i.head,t)))}return bt(n,e.sel.primIndex)}function kr(e,t,n){return e.line==t.line?ht(n.line,e.ch-t.ch+n.ch):ht(n.line+(e.line-t.line),e.ch)}function Lr(e,t,n){var r=[],i=ht(e.first,0),s=i;for(var o=0;o<t.length;o++){var u=t[o],a=kr(u.from,i,s),f=kr(Tr(u),i,s);i=u.to,s=f;if(n=="around"){var l=e.sel.ranges[o],c=pt(l.head,l.anchor)<0;r[o]=new yt(c?f:a,c?a:f)}else r[o]=new yt(a,a)}return new gt(r,e.sel.primIndex)}function Ar(e,t,n){var r={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){this.canceled=!0}};return n&&(r.update=function(t,n,r,i){t&&(this.from=St(e,t)),n&&(this.to=St(e,n)),r&&(this.text=r),i!==undefined&&(this.origin=i)}),Ys(e,"beforeChange",e,r),e.cm&&Ys(e.cm,"beforeChange",e.cm,r),r.canceled?null:{from:r.from,to:r.to,text:r.text,origin:r.origin}}function Or(e,t,n){if(e.cm){if(!e.cm.curOp)return Cn(e.cm,Or)(e,t,n);if(e.cm.state.suppressEdits)return}if(io(e,"beforeChange")||e.cm&&io(e.cm,"beforeChange")){t=Ar(e,t,!0);if(!t)return}var r=x&&!n&&Li(e,t.from,t.to);if(r)for(var i=r.length-1;i>=0;--i)Mr(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text});else Mr(e,t)}function Mr(e,t){if(t.text.length==1&&t.text[0]==""&&pt(t.from,t.to)==0)return;var n=Cr(e,t);Ds(e,t,n,e.cm?e.cm.curOp.id:NaN),Pr(e,t,n,Ni(e,t));var r=[];bs(e,function(e,n){!n&&bo(r,e.history)==-1&&(zs(e.history,t),r.push(e.history)),Pr(e,t,null,Ni(e,t))})}function _r(e,t,n){if(e.cm&&e.cm.state.suppressEdits)return;var r=e.history,i,s=e.sel,o=t=="undo"?r.done:r.undone,u=t=="undo"?r.undone:r.done;for(var a=0;a<o.length;a++){i=o[a];if(n?i.ranges&&!i.equals(e.sel):!i.ranges)break}if(a==o.length)return;r.lastOrigin=r.lastSelOrigin=null;for(;;){i=o.pop();if(!i.ranges)break;Bs(i,u);if(n&&!i.equals(e.sel)){Dt(e,i,{clearRedo:!1});return}s=i}var f=[];Bs(s,u),u.push({changes:f,generation:r.generation}),r.generation=i.generation||++r.maxGeneration;var l=io(e,"beforeChange")||e.cm&&io(e.cm,"beforeChange");for(var a=i.changes.length-1;a>=0;--a){var c=i.changes[a];c.origin=t;if(l&&!Ar(e,c,!1)){o.length=0;return}f.push(Os(e,c));var h=a?Cr(e,c,null):go(o);Pr(e,c,h,ki(e,c)),e.cm&&Ur(e.cm);var p=[];bs(e,function(e,t){!t&&bo(p,e.history)==-1&&(zs(e.history,c),p.push(e.history)),Pr(e,c,null,ki(e,c))})}}function Dr(e,t){e.first+=t,e.sel=new gt(wo(e.sel.ranges,function(e){return new yt(ht(e.anchor.line+t,e.anchor.ch),ht(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm&&Mn(e.cm,e.first,e.first-t,t)}function Pr(e,t,n,r){if(e.cm&&!e.cm.curOp)return Cn(e.cm,Pr)(e,t,n,r);if(t.to.line<e.first){Dr(e,t.text.length-1-(t.to.line-t.from.line));return}if(t.from.line>e.lastLine())return;if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);Dr(e,i),t={from:ht(e.first,0),to:ht(t.to.line+i,t.to.ch),text:[go(t.text)],origin:t.origin}}var s=e.lastLine();t.to.line>s&&(t={from:t.from,to:ht(s,Es(e,s).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ss(e,t.from,t.to),n||(n=Cr(e,t,null)),e.cm?Hr(e.cm,t,r):hs(e,t,r),Pt(e,n,ao)}function Hr(e,t,n){var r=e.doc,i=e.display,s=t.from,o=t.to,u=!1,a=s.line;e.options.lineWrapping||(a=Ns(Fi(Es(r,s.line))),r.iter(a,o.line+1,function(e){if(e==i.maxLine)return u=!0,!0})),r.sel.contains(t.from,t.to)>-1&&(e.curOp.cursorActivity=!0),hs(r,t,n,O(e)),e.options.lineWrapping||(r.iter(a,s.line+t.text.length,function(e){var t=B(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,u=!1)}),u&&(e.curOp.updateMaxLine=!0)),r.frontier=Math.min(r.frontier,s.line),zt(e,400);var f=t.text.length-(o.line-s.line)-1;s.line==o.line&&t.text.length==1&&!cs(e.doc,t)?_n(e,s.line,"text"):Mn(e,s.line,o.line+1,f),(io(e,"change")||io(e,"changes"))&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push({from:s,to:o,text:t.text,removed:t.removed,origin:t.origin})}function Br(e,t,n,r,i){r||(r=n);if(pt(r,n)<0){var s=r;r=n,n=s}typeof t=="string"&&(t=Uo(t)),Or(e,{from:n,to:r,text:t,origin:i})}function jr(e,t){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null;t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1);if(i!=null&&!v){var s=Ao("div","​",null,"position: absolute; top: "+(t.top-n.viewOffset-$t(e.display))+"px; height: "+(t.bottom-t.top+oo)+"px; left: "+t.left+"px; width: 2px;");e.display.lineSpace.appendChild(s),s.scrollIntoView(i),e.display.lineSpace.removeChild(s)}}function Fr(e,t,n,r){r==null&&(r=0);for(;;){var i=!1,s=dn(e,t),o=!n||n==t?s:dn(e,n),u=qr(e,Math.min(s.left,o.left),Math.min(s.top,o.top)-r,Math.max(s.left,o.left),Math.max(s.bottom,o.bottom)+r),a=e.doc.scrollTop,f=e.doc.scrollLeft;u.scrollTop!=null&&(sr(e,u.scrollTop),Math.abs(e.doc.scrollTop-a)>1&&(i=!0)),u.scrollLeft!=null&&(or(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-f)>1&&(i=!0));if(!i)return s}}function Ir(e,t,n,r,i){var s=qr(e,t,n,r,i);s.scrollTop!=null&&sr(e,s.scrollTop),s.scrollLeft!=null&&or(e,s.scrollLeft)}function qr(e,t,n,r,i){var s=e.display,o=wn(e.display);n<0&&(n=0);var u=e.curOp&&e.curOp.scrollTop!=null?e.curOp.scrollTop:s.scroller.scrollTop,a=s.scroller.clientHeight-oo,f={},l=e.doc.height+Jt(s),c=n<o,h=i>l-o;if(n<u)f.scrollTop=c?0:n;else if(i>u+a){var p=Math.min(n,(h?l:i)-a);p!=u&&(f.scrollTop=p)}var d=e.curOp&&e.curOp.scrollLeft!=null?e.curOp.scrollLeft:s.scroller.scrollLeft,v=s.scroller.clientWidth-oo;t+=s.gutters.offsetWidth,r+=s.gutters.offsetWidth;var m=s.gutters.offsetWidth,g=t<m+10;return t<d+m||g?(g&&(t=0),f.scrollLeft=Math.max(0,t-10-m)):r>v+d-3&&(f.scrollLeft=r+10-v),f}function Rr(e,t,n){(t!=null||n!=null)&&zr(e),t!=null&&(e.curOp.scrollLeft=(e.curOp.scrollLeft==null?e.doc.scrollLeft:e.curOp.scrollLeft)+t),n!=null&&(e.curOp.scrollTop=(e.curOp.scrollTop==null?e.doc.scrollTop:e.curOp.scrollTop)+n)}function Ur(e){zr(e);var t=e.getCursor(),n=t,r=t;e.options.lineWrapping||(n=t.ch?ht(t.line,t.ch-1):t,r=ht(t.line,t.ch+1)),e.curOp.scrollToPos={from:n,to:r,margin:e.options.cursorScrollMargin,isCursor:!0}}function zr(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=vn(e,t.from),r=vn(e,t.to),i=qr(e,Math.min(n.left,r.left),Math.min(n.top,r.top)-t.margin,Math.max(n.right,r.right),Math.max(n.bottom,r.bottom)+t.margin);e.scrollTo(i.scrollLeft,i.scrollTop)}}function Wr(e,t,n,r){var i=e.doc,s;n==null&&(n="add"),n=="smart"&&(e.doc.mode.indent?s=Vt(e,t):n="prev");var o=e.options.tabSize,u=Es(i,t),a=ho(u.text,null,o);u.stateAfter&&(u.stateAfter=null);var f=u.text.match(/^\s*/)[0],l;if(!r&&!/\S/.test(u.text))l=0,n="not";else if(n=="smart"){l=e.doc.mode.indent(s,u.text.slice(f.length),u.text);if(l==uo){if(!r)return;n="prev"}}n=="prev"?t>i.first?l=ho(Es(i,t-1).text,null,o):l=0:n=="add"?l=a+e.options.indentUnit:n=="subtract"?l=a-e.options.indentUnit:typeof n=="number"&&(l=a+n),l=Math.max(0,l);var c="",h=0;if(e.options.indentWithTabs)for(var p=Math.floor(l/o);p;--p)h+=o,c+="	";h<l&&(c+=mo(l-h));if(c!=f)Br(e.doc,c,ht(t,0),ht(t,f.length),"+input");else for(var p=0;p<i.sel.ranges.length;p++){var d=i.sel.ranges[p];if(d.head.line==t&&d.head.ch<f.length){var h=ht(t,f.length);At(i,p,new yt(h,h));break}}u.stateAfter=null}function Xr(e,t,n,r){var i=t,s=t,o=e.doc;return typeof t=="number"?s=Es(o,Et(o,t)):i=Ns(t),i==null?null:r(s,i)?(_n(e,i,n),s):null}function Vr(e,t){var n=e.doc.sel.ranges,r=[];for(var i=0;i<n.length;i++){var s=t(n[i]);while(r.length&&pt(s.from,go(r).to)<=0){var o=r.pop();if(pt(o.from,s.from)<0){s.from=o.from;break}}r.push(s)}Nn(e,function(){for(var t=r.length-1;t>=0;t--)Br(e.doc,"",r[t].from,r[t].to,"+delete");Ur(e)})}function $r(e,t,n,r,i){function l(){var t=s+n;return t<e.first||t>=e.first+e.size?f=!1:(s=t,a=Es(e,t))}function c(e){var t=(i?ru:iu)(a,o,n,!0);if(t==null){if(!!e||!l())return f=!1;i?o=(n<0?Qo:Ko)(a):o=n<0?a.text.length:0}else o=t;return!0}var s=t.line,o=t.ch,u=n,a=Es(e,s),f=!0;if(r=="char")c();else if(r=="column")c(!0);else if(r=="word"||r=="group"){var h=null,p=r=="group";for(var d=!0;;d=!1){if(n<0&&!c(!d))break;var v=a.text.charAt(o)||"\n",m=No(v)?"w":p&&v=="\n"?"n":!p||/\s/.test(v)?null:"p";p&&!d&&!m&&(m="s");if(h&&h!=m){n<0&&(n=1,c());break}m&&(h=m);if(n>0&&!c(!d))break}}var g=Ft(e,ht(s,o),u,!0);return f||(g.hitSide=!0),g}function Jr(e,t,n,r){var i=e.doc,s=t.left,o;if(r=="page"){var u=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);o=t.top+n*(u-(n<0?1.5:.5)*wn(e.display))}else r=="line"&&(o=n>0?t.bottom+3:t.top-3);for(;;){var a=gn(e,s,o);if(!a.outside)break;if(n<0?o<=0:o>=i.height){a.hitSide=!0;break}o+=n*5}return a}function Kr(e,t){var n=Es(e,t.line).text,r=t.ch,i=t.ch;if(n){(t.xRel<0||i==n.length)&&r?--r:++i;var s=n.charAt(r),o=No(s)?No:/\s/.test(s)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!No(e)};while(r>0&&o(n.charAt(r-1)))--r;while(i<n.length&&o(n.charAt(i)))++i}return new yt(ht(t.line,r),ht(t.line,i))}function Yr(e,t,n,r){N.defaults[e]=t,n&&(Gr[e]=r?function(e,t,r){r!=Zr&&n(e,t,r)}:n)}function fi(e){return typeof e=="string"?ai[e]:e}function mi(e,t,n,r,i){if(r&&r.shared)return yi(e,t,n,r,i);if(e.cm&&!e.cm.curOp)return Cn(e.cm,mi)(e,t,n,r,i);var s=new di(e,i),o=pt(t,n);r&&So(r,s);if(o>0||o==0&&s.clearWhenEmpty!==!1)return s;s.replacedWith&&(s.collapsed=!0,s.widgetNode=Ao("span",[s.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||(s.widgetNode.ignoreEvents=!0),r.insertLeft&&(s.widgetNode.insertLeft=!0));if(s.collapsed){if(ji(e,t.line,t,n,s)||t.line!=n.line&&ji(e,n.line,t,n,s))throw new Error("Inserting collapsed marker partially overlapping an existing one");T=!0}s.addToHistory&&Ds(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var u=t.line,a=e.cm,f;e.iter(u,n.line+1,function(e){a&&s.collapsed&&!a.options.lineWrapping&&Fi(e)==a.display.maxLine&&(f=!0),s.collapsed&&u!=t.line&&Ts(e,0),Si(e,new bi(s,u==t.line?t.ch:null,u==n.line?n.ch:null)),++u}),s.collapsed&&e.iter(t.line,n.line+1,function(t){Ui(e,t)&&Ts(t,0)}),s.clearOnEnter&&Qs(s,"beforeCursorEnter",function(){s.clear()}),s.readOnly&&(x=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),s.collapsed&&(s.id=++vi,s.atomic=!0);if(a){f&&(a.curOp.updateMaxLine=!0);if(s.collapsed)Mn(a,t.line,n.line+1);else if(s.className||s.title||s.startStyle||s.endStyle)for(var l=t.line;l<=n.line;l++)_n(a,l,"text");s.atomic&&Bt(a.doc),to(a,"markerAdded",a,s)}return s}function yi(e,t,n,r,i){r=So(r),r.shared=!1;var s=[mi(e,t,n,r,i)],o=s[0],u=r.widgetNode;return bs(e,function(e){u&&(r.widgetNode=u.cloneNode(!0)),s.push(mi(e,St(e,t),St(e,n),r,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;o=go(s)}),new gi(s,o)}function bi(e,t,n){this.marker=e,this.from=t,this.to=n}function wi(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Ei(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n||(n=[])).push(e[r]);return n}function Si(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}function xi(e,t,n){if(e)for(var r=0,i;r<e.length;++r){var s=e[r],o=s.marker,u=s.from==null||(o.inclusiveLeft?s.from<=t:s.from<t);if(u||s.from==t&&o.type=="bookmark"&&(!n||!s.marker.insertLeft)){var a=s.to==null||(o.inclusiveRight?s.to>=t:s.to>t);(i||(i=[])).push(new bi(o,s.from,a?null:s.to))}}return i}function Ti(e,t,n){if(e)for(var r=0,i;r<e.length;++r){var s=e[r],o=s.marker,u=s.to==null||(o.inclusiveRight?s.to>=t:s.to>t);if(u||s.from==t&&o.type=="bookmark"&&(!n||s.marker.insertLeft)){var a=s.from==null||(o.inclusiveLeft?s.from<=t:s.from<t);(i||(i=[])).push(new bi(o,a?null:s.from-t,s.to==null?null:s.to-t))}}return i}function Ni(e,t){var n=Tt(e,t.from.line)&&Es(e,t.from.line).markedSpans,r=Tt(e,t.to.line)&&Es(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,s=t.to.ch,o=pt(t.from,t.to)==0,u=xi(n,i,o),a=Ti(r,s,o),f=t.text.length==1,l=go(t.text).length+(f?i:0);if(u)for(var c=0;c<u.length;++c){var h=u[c];if(h.to==null){var p=wi(a,h.marker);p?f&&(h.to=p.to==null?null:p.to+l):h.to=i}}if(a)for(var c=0;c<a.length;++c){var h=a[c];h.to!=null&&(h.to+=l);if(h.from==null){var p=wi(u,h.marker);p||(h.from=l,f&&(u||(u=[])).push(h))}else h.from+=l,f&&(u||(u=[])).push(h)}u&&(u=Ci(u)),a&&a!=u&&(a=Ci(a));var d=[u];if(!f){var v=t.text.length-2,m;if(v>0&&u)for(var c=0;c<u.length;++c)u[c].to==null&&(m||(m=[])).push(new bi(u[c].marker,null,null));for(var c=0;c<v;++c)d.push(m);d.push(a)}return d}function Ci(e){for(var t=0;t<e.length;++t){var n=e[t];n.from!=null&&n.from==n.to&&n.marker.clearWhenEmpty!==!1&&e.splice(t--,1)}return e.length?e:null}function ki(e,t){var n=Is(e,t),r=Ni(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var s=n[i],o=r[i];if(s&&o)e:for(var u=0;u<o.length;++u){var a=o[u];for(var f=0;f<s.length;++f)if(s[f].marker==a.marker)continue e;s.push(a)}else o&&(n[i]=o)}return n}function Li(e,t,n){var r=null;e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;n.readOnly&&(!r||bo(r,n)==-1)&&(r||(r=[])).push(n)}});if(!r)return null;var i=[{from:t,to:n}];for(var s=0;s<r.length;++s){var o=r[s],u=o.find(0);for(var a=0;a<i.length;++a){var f=i[a];if(pt(f.to,u.from)<0||pt(f.from,u.to)>0)continue;var l=[a,1],c=pt(f.from,u.from),h=pt(f.to,u.to);(c<0||!o.inclusiveLeft&&!c)&&l.push({from:f.from,to:u.from}),(h>0||!o.inclusiveRight&&!h)&&l.push({from:u.to,to:f.to}),i.splice.apply(i,l),a+=l.length-1}}return i}function Ai(e){var t=e.markedSpans;if(!t)return;for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}function Oi(e,t){if(!t)return;for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}function Mi(e){return e.inclusiveLeft?-1:0}function _i(e){return e.inclusiveRight?1:0}function Di(e,t){var n=e.lines.length-t.lines.length;if(n!=0)return n;var r=e.find(),i=t.find(),s=pt(r.from,i.from)||Mi(e)-Mi(t);if(s)return-s;var o=pt(r.to,i.to)||_i(e)-_i(t);return o?o:t.id-e.id}function Pi(e,t){var n=T&&e.markedSpans,r;if(n)for(var i,s=0;s<n.length;++s)i=n[s],i.marker.collapsed&&(t?i.from:i.to)==null&&(!r||Di(r,i.marker)<0)&&(r=i.marker);return r}function Hi(e){return Pi(e,!0)}function Bi(e){return Pi(e,!1)}function ji(e,t,n,r,i){var s=Es(e,t),o=T&&s.markedSpans;if(o)for(var u=0;u<o.length;++u){var a=o[u];if(!a.marker.collapsed)continue;var f=a.marker.find(0),l=pt(f.from,n)||Mi(a.marker)-Mi(i),c=pt(f.to,r)||_i(a.marker)-_i(i);if(l>=0&&c<=0||l<=0&&c>=0)continue;if(l<=0&&(pt(f.to,n)||_i(a.marker)-Mi(i))>0||l>=0&&(pt(f.from,r)||Mi(a.marker)-_i(i))<0)return!0}}function Fi(e){var t;while(t=Hi(e))e=t.find(-1,!0).line;return e}function Ii(e){var t,n;while(t=Bi(e))e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function qi(e,t){var n=Es(e,t),r=Fi(n);return n==r?t:Ns(r)}function Ri(e,t){if(t>e.lastLine())return t;var n=Es(e,t),r;if(!Ui(e,n))return t;while(r=Bi(n))n=r.find(1,!0).line;return Ns(n)+1}function Ui(e,t){var n=T&&t.markedSpans;if(n)for(var r,i=0;i<n.length;++i){r=n[i];if(!r.marker.collapsed)continue;if(r.from==null)return!0;if(r.marker.widgetNode)continue;if(r.from==0&&r.marker.inclusiveLeft&&zi(e,t,r))return!0}}function zi(e,t,n){if(n.to==null){var r=n.marker.find(1,!0);return zi(e,r.line,wi(r.line.markedSpans,n.marker))}if(n.marker.inclusiveRight&&n.to==t.text.length)return!0;for(var i,s=0;s<t.markedSpans.length;++s){i=t.markedSpans[s];if(i.marker.collapsed&&!i.marker.widgetNode&&i.from==n.to&&(i.to==null||i.to!=n.from)&&(i.marker.inclusiveLeft||n.marker.inclusiveRight)&&zi(e,t,i))return!0}}function Xi(e,t,n){ks(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Rr(e,null,n)}function Vi(e){return e.height!=null?e.height:(Do(document.body,e.node)||_o(e.cm.display.measure,Ao("div",[e.node],null,"position: relative")),e.height=e.node.offsetHeight)}function $i
-(e,t,n,r){var i=new Wi(e,n,r);return i.noHScroll&&(e.display.alignWidgets=!0),Xr(e,t,"widget",function(t){var n=t.widgets||(t.widgets=[]);i.insertAt==null?n.push(i):n.splice(Math.min(n.length-1,Math.max(0,i.insertAt)),0,i),i.line=t;if(!Ui(e.doc,t)){var r=ks(t)<e.doc.scrollTop;Ts(t,t.height+Vi(i)),r&&Rr(e,null,i.height),e.curOp.forceUpdate=!0}return!0}),i}function Ki(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),e.order!=null&&(e.order=null),Ai(e),Oi(e,n);var i=r?r(e):1;i!=e.height&&Ts(e,i)}function Qi(e){e.parent=null,Ai(e)}function Gi(e,t,n,r,i,s){var o=n.flattenSpans;o==null&&(o=e.options.flattenSpans);var u=0,a=null,f=new pi(t,e.options.tabSize),l;t==""&&n.blankLine&&n.blankLine(r);while(!f.eol()){f.pos>e.options.maxHighlightLength?(o=!1,s&&es(e,t,r,f.pos),f.pos=t.length,l=null):l=n.token(f,r);if(e.options.addModeClass){var c=N.innerMode(n,r).mode.name;c&&(l="m-"+(l?c+" "+l:c))}if(!o||a!=l)u<f.start&&i(f.start,a),u=f.start,a=l;f.start=f.pos}while(u<f.pos){var h=Math.min(f.pos,u+5e4);i(h,a),u=h}}function Yi(e,t,n,r){var i=[e.state.modeGen];Gi(e,t.text,e.doc.mode,n,function(e,t){i.push(e,t)},r);for(var s=0;s<e.state.overlays.length;++s){var o=e.state.overlays[s],u=1,a=0;Gi(e,t.text,o.mode,!0,function(e,t){var n=u;while(a<e){var r=i[u];r>e&&i.splice(u,1,e,i[u+1],r),u+=2,a=Math.min(e,r)}if(!t)return;if(o.opaque)i.splice(n,u-n,e,t),u=n+2;else for(;n<u;n+=2){var s=i[n+1];i[n+1]=s?s+" "+t:t}})}return i}function Zi(e,t){if(!t.styles||t.styles[0]!=e.state.modeGen)t.styles=Yi(e,t,t.stateAfter=Vt(e,Ns(t)));return t.styles}function es(e,t,n,r){var i=e.doc.mode,s=new pi(t,e.options.tabSize);s.start=s.pos=r||0,t==""&&i.blankLine&&i.blankLine(n);while(!s.eol()&&s.pos<=e.options.maxHighlightLength)i.token(s,n),s.start=s.pos}function rs(e,t){if(!e)return null;for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";t[r]==null?t[r]=n[2]:(new RegExp("(?:^|s)"+n[2]+"(?:$|s)")).test(t[r])||(t[r]+=" "+n[2])}if(/^\s*$/.test(e))return null;var i=t.cm.options.addModeClass?ns:ts;return i[e]||(i[e]=e.replace(/\S+/g,"cm-$&"))}function is(e,t){var n=Ao("span",null,null,u?"padding-right: .1px":null),r={pre:Ao("pre",[n]),content:n,col:0,pos:0,cm:e};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var s=i?t.rest[i-1]:t.line,a;r.pos=0,r.addToken=os,(o||u)&&e.getOption("lineWrapping")&&(r.addToken=us(r.addToken)),Ro(e.display.measure)&&(a=Ls(s))&&(r.addToken=as(r.addToken,a)),r.map=[],ls(s,r,Zi(e,s)),r.map.length==0&&r.map.push(0,0,r.content.appendChild(Io(e.display.measure))),i==0?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return Ys(e,"renderLine",e,t.line,r.pre),r}function ss(e){var t=Ao("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t}function os(e,t,n,i,s,o){if(!t)return;var u=e.cm.options.specialChars,a=!1;if(!u.test(t)){e.col+=t.length;var f=document.createTextNode(t);e.map.push(e.pos,e.pos+t.length,f),r&&(a=!0),e.pos+=t.length}else{var f=document.createDocumentFragment(),l=0;for(;;){u.lastIndex=l;var c=u.exec(t),h=c?c.index-l:t.length-l;if(h){var p=document.createTextNode(t.slice(l,l+h));r?f.appendChild(Ao("span",[p])):f.appendChild(p),e.map.push(e.pos,e.pos+h,p),e.col+=h,e.pos+=h}if(!c)break;l+=h+1;if(c[0]=="	"){var d=e.cm.options.tabSize,v=d-e.col%d,p=f.appendChild(Ao("span",mo(v),"cm-tab"));e.col+=v}else{var p=e.cm.options.specialCharPlaceholder(c[0]);r?f.appendChild(Ao("span",[p])):f.appendChild(p),e.col+=1}e.map.push(e.pos,e.pos+1,p),e.pos++}}if(n||i||s||a){var m=n||"";i&&(m+=i),s&&(m+=s);var g=Ao("span",[f],m);return o&&(g.title=o),e.content.appendChild(g)}e.content.appendChild(f)}function us(e){function t(e){var t=" ";for(var n=0;n<e.length-2;++n)t+=n%2?" ":" ";return t+=" ",t}return function(n,r,i,s,o,u){e(n,r.replace(/ {3,}/g,t),i,s,o,u)}}function as(e,t){return function(n,r,i,s,o,u){i=i?i+" cm-force-border":"cm-force-border";var a=n.pos,f=a+r.length;for(;;){for(var l=0;l<t.length;l++){var c=t[l];if(c.to>a&&c.from<=a)break}if(c.to>=f)return e(n,r,i,s,o,u);e(n,r.slice(0,c.to-a),i,s,null,u),s=null,r=r.slice(c.to-a),a=c.to}}}function fs(e,t,n,r){var i=!r&&n.widgetNode;i&&(e.map.push(e.pos,e.pos+t,i),e.content.appendChild(i)),e.pos+=t}function ls(e,t,n){var r=e.markedSpans,i=e.text,s=0;if(!r){for(var o=1;o<n.length;o+=2)t.addToken(t,i.slice(s,s=n[o]),rs(n[o+1],t));return}var u=i.length,a=0,o=1,f="",l,c=0,h,p,d,v,m;for(;;){if(c==a){h=p=d=v="",m=null,c=Infinity;var g=[];for(var y=0;y<r.length;++y){var b=r[y],w=b.marker;b.from<=a&&(b.to==null||b.to>a)?(b.to!=null&&c>b.to&&(c=b.to,p=""),w.className&&(h+=" "+w.className),w.startStyle&&b.from==a&&(d+=" "+w.startStyle),w.endStyle&&b.to==c&&(p+=" "+w.endStyle),w.title&&!v&&(v=w.title),w.collapsed&&(!m||Di(m.marker,w)<0)&&(m=b)):b.from>a&&c>b.from&&(c=b.from),w.type=="bookmark"&&b.from==a&&w.widgetNode&&g.push(w)}if(m&&(m.from||0)==a){fs(t,(m.to==null?u+1:m.to)-a,m.marker,m.from==null);if(m.to==null)return}if(!m&&g.length)for(var y=0;y<g.length;++y)fs(t,0,g[y])}if(a>=u)break;var E=Math.min(u,c);for(;;){if(f){var S=a+f.length;if(!m){var x=S>E?f.slice(0,E-a):f;t.addToken(t,x,l?l+h:h,d,a+x.length==c?p:"",v)}if(S>=E){f=f.slice(E-a),a=E;break}a=S,d=""}f=i.slice(s,s=n[o++]),l=rs(n[o++],t)}}}function cs(e,t){return t.from.ch==0&&t.to.ch==0&&go(t.text)==""&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function hs(e,t,n,r){function i(e){return n?n[e]:null}function s(e,n,i){Ki(e,n,i,r),to(e,"change",e,t)}var o=t.from,u=t.to,a=t.text,f=Es(e,o.line),l=Es(e,u.line),c=go(a),h=i(a.length-1),p=u.line-o.line;if(cs(e,t)){for(var d=0,v=[];d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));s(l,l.text,h),p&&e.remove(o.line,p),v.length&&e.insert(o.line,v)}else if(f==l)if(a.length==1)s(f,f.text.slice(0,o.ch)+c+f.text.slice(u.ch),h);else{for(var v=[],d=1;d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));v.push(new Ji(c+f.text.slice(u.ch),h,r)),s(f,f.text.slice(0,o.ch)+a[0],i(0)),e.insert(o.line+1,v)}else if(a.length==1)s(f,f.text.slice(0,o.ch)+a[0]+l.text.slice(u.ch),i(0)),e.remove(o.line+1,p);else{s(f,f.text.slice(0,o.ch)+a[0],i(0)),s(l,c+l.text.slice(u.ch),h);for(var d=1,v=[];d<a.length-1;++d)v.push(new Ji(a[d],i(d),r));p>1&&e.remove(o.line+1,p-1),e.insert(o.line+1,v)}to(e,"change",e,t)}function ps(e){this.lines=e,this.parent=null;for(var t=0,n=0;t<e.length;++t)e[t].parent=this,n+=e[t].height;this.height=n}function ds(e){this.children=e;var t=0,n=0;for(var r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}function bs(e,t,n){function r(e,i,s){if(e.linked)for(var o=0;o<e.linked.length;++o){var u=e.linked[o];if(u.doc==i)continue;var a=s&&u.sharedHist;if(n&&!a)continue;t(u.doc,a),r(u.doc,e,a)}}r(e,null,!0)}function ws(e,t){if(t.cm)throw new Error("This document is already in use.");e.doc=t,t.cm=e,M(e),k(e),e.options.lineWrapping||j(e),e.options.mode=t.modeOption,Mn(e)}function Es(e,t){t-=e.first;if(t<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],s=i.chunkSize();if(t<s){n=i;break}t-=s}return n.lines[t]}function Ss(e,t,n){var r=[],i=t.line;return e.iter(t.line,n.line+1,function(e){var s=e.text;i==n.line&&(s=s.slice(0,n.ch)),i==t.line&&(s=s.slice(t.ch)),r.push(s),++i}),r}function xs(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function Ts(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function Ns(e){if(e.parent==null)return null;var t=e.parent,n=bo(t.lines,e);for(var r=t.parent;r;t=r,r=r.parent)for(var i=0;;++i){if(r.children[i]==t)break;n+=r.children[i].chunkSize()}return n+t.first}function Cs(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],s=i.height;if(t<s){e=i;continue e}t-=s,n+=i.chunkSize()}return n}while(!e.lines);for(var r=0;r<e.lines.length;++r){var o=e.lines[r],u=o.height;if(t<u)break;t-=u}return n+r}function ks(e){e=Fi(e);var t=0,n=e.parent;for(var r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var s=n.parent;s;n=s,s=n.parent)for(var r=0;r<s.children.length;++r){var o=s.children[r];if(o==n)break;t+=o.height}return t}function Ls(e){var t=e.order;return t==null&&(t=e.order=su(e.text)),t}function As(e){this.done=[],this.undone=[],this.undoDepth=Infinity,this.lastModTime=this.lastSelTime=0,this.lastOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Os(e,t){var n={from:dt(t.from),to:Tr(t),text:Ss(e,t.from,t.to)};return js(e,n,t.from.line,t.to.line+1),bs(e,function(e){js(e,n,t.from.line,t.to.line+1)},!0),n}function Ms(e){while(e.length){var t=go(e);if(!t.ranges)break;e.pop()}}function _s(e,t){if(t)return Ms(e.done),go(e.done);if(e.done.length&&!go(e.done).ranges)return go(e.done);if(e.done.length>1&&!e.done[e.done.length-2].ranges)return e.done.pop(),go(e.done)}function Ds(e,t,n,r){var i=e.history;i.undone.length=0;var s=+(new Date),o;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&(t.origin.charAt(0)=="+"&&e.cm&&i.lastModTime>s-e.cm.options.historyEventDelay||t.origin.charAt(0)=="*"))&&(o=_s(i,i.lastOp==r))){var u=go(o.changes);pt(t.from,t.to)==0&&pt(t.from,u.to)==0?u.to=Tr(t):o.changes.push(Os(e,t))}else{var a=go(i.done);(!a||!a.ranges)&&Bs(e.sel,i.done),o={changes:[Os(e,t)],generation:i.generation},i.done.push(o);while(i.done.length>i.undoDepth)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,u||Ys(e,"historyAdded")}function Ps(e,t,n,r){var i=t.charAt(0);return i=="*"||i=="+"&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function Hs(e,t,n,r){var i=e.history,s=r&&r.origin;n==i.lastOp||s&&i.lastSelOrigin==s&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==s||Ps(e,s,go(i.done),t))?i.done[i.done.length-1]=t:Bs(t,i.done),i.lastSelTime=+(new Date),i.lastSelOrigin=s,i.lastOp=n,r&&r.clearRedo!==!1&&Ms(i.undone)}function Bs(e,t){var n=go(t);n&&n.ranges&&n.equals(e)||t.push(e)}function js(e,t,n,r){var i=t["spans_"+e.id],s=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[s]=n.markedSpans),++s})}function Fs(e){if(!e)return null;for(var t=0,n;t<e.length;++t)e[t].marker.explicitlyCleared?n||(n=e.slice(0,t)):n&&n.push(e[t]);return n?n.length?n:null:e}function Is(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=0,i=[];r<t.text.length;++r)i.push(Fs(n[r]));return i}function qs(e,t,n){for(var r=0,i=[];r<e.length;++r){var s=e[r];if(s.ranges){i.push(n?gt.prototype.deepCopy.call(s):s);continue}var o=s.changes,u=[];i.push({changes:u});for(var a=0;a<o.length;++a){var f=o[a],l;u.push({from:f.from,to:f.to,text:f.text});if(t)for(var c in f)(l=c.match(/^spans_(\d+)$/))&&bo(t,Number(l[1]))>-1&&(go(u)[c]=f[c],delete f[c])}}return i}function Rs(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function Us(e,t,n,r){for(var i=0;i<e.length;++i){var s=e[i],o=!0;if(s.ranges){s.copied||(s=e[i]=s.deepCopy(),s.copied=!0);for(var u=0;u<s.ranges.length;u++)Rs(s.ranges[u].anchor,t,n,r),Rs(s.ranges[u].head,t,n,r);continue}for(var u=0;u<s.changes.length;++u){var a=s.changes[u];if(n<a.from.line)a.from=ht(a.from.line+r,a.from.ch),a.to=ht(a.to.line+r,a.to.ch);else if(t<=a.to.line){o=!1;break}}o||(e.splice(0,i+1),i=0)}}function zs(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;Us(e.done,n,r,i),Us(e.undone,n,r,i)}function Vs(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==0}function Js(e){return e.target||e.srcElement}function Ks(e){var t=e.which;return t==null&&(e.button&1?t=1:e.button&2?t=3:e.button&4&&(t=2)),y&&e.ctrlKey&&t==1&&(t=3),t}function to(e,t){function i(e){return function(){e.apply(null,r)}}var n=e._handlers&&e._handlers[t];if(!n)return;var r=Array.prototype.slice.call(arguments,2);Zs||(++eo,Zs=[],setTimeout(no,0));for(var s=0;s<n.length;++s)Zs.push(i(n[s]))}function no(){--eo;var e=Zs;Zs=null;for(var t=0;t<e.length;++t)e[t]()}function ro(e,t,n){return Ys(e,n||t.type,e,t),Vs(t)||t.codemirrorIgnore}function io(e,t){var n=e._handlers&&e._handlers[t];return n&&n.length>0}function so(e){e.prototype.on=function(e,t){Qs(this,e,t)},e.prototype.off=function(e,t){Gs(this,e,t)}}function co(){this.id=null}function po(e,t,n){for(var r=0,i=0;;){var s=e.indexOf("	",r);s==-1&&(s=e.length);var o=s-r;if(s==e.length||i+o>=t)return r+Math.min(o,t-i);i+=s-r,i+=n-i%n,r=s+1;if(i>=t)return r}}function mo(e){while(vo.length<=e)vo.push(go(vo)+" ");return vo[e]}function go(e){return e[e.length-1]}function bo(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}function wo(e,t){var n=[];for(var r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Eo(e,t){var n;if(Object.create)n=Object.create(e);else{var r=function(){};r.prototype=e,n=new r}return t&&So(t,n),n}function So(e,t){t||(t={});for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function xo(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function Co(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function Lo(e){return e.charCodeAt(0)>=768&&ko.test(e)}function Ao(e,t,n,r){var i=document.createElement(e);n&&(i.className=n),r&&(i.style.cssText=r);if(typeof t=="string")i.appendChild(document.createTextNode(t));else if(t)for(var s=0;s<t.length;++s)i.appendChild(t[s]);return i}function Mo(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function _o(e,t){return Mo(e).appendChild(t)}function Do(e,t){if(e.contains)return e.contains(t);while(t=t.parentNode)if(t==e)return!0}function Po(){return document.activeElement}function jo(e){if(Bo!=null)return Bo;var t=Ao("div",null,null,"width: 50px; height: 50px; overflow-x: scroll");return _o(e,t),t.offsetWidth&&(Bo=t.offsetHeight-t.clientHeight),Bo||0}function Io(e){if(Fo==null){var t=Ao("span","​");_o(e,Ao("span",[t,document.createTextNode("x")])),e.firstChild.offsetHeight!=0&&(Fo=t.offsetWidth<=1&&t.offsetHeight>2&&!n)}return Fo?Ao("span","​"):Ao("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px")}function Ro(e){if(qo!=null)return qo;var t=_o(e,document.createTextNode("AخA")),n=Oo(t,0,1).getBoundingClientRect();if(n.left==n.right)return!1;var r=Oo(t,1,2).getBoundingClientRect();return qo=r.right-n.right<3}function Vo(e,t,n,r){if(!e)return r(t,n,"ltr");var i=!1;for(var s=0;s<e.length;++s){var o=e[s];if(o.from<n&&o.to>t||t==n&&o.to==t)r(Math.max(o.from,t),Math.min(o.to,n),o.level==1?"rtl":"ltr"),i=!0}i||r(t,n,"ltr")}function $o(e){return e.level%2?e.to:e.from}function Jo(e){return e.level%2?e.from:e.to}function Ko(e){var t=Ls(e);return t?$o(t[0]):0}function Qo(e){var t=Ls(e);return t?Jo(go(t)):e.text.length}function Go(e,t){var n=Es(e.doc,t),r=Fi(n);r!=n&&(t=Ns(r));var i=Ls(r),s=i?i[0].level%2?Qo(r):Ko(r):0;return ht(t,s)}function Yo(e,t){var n,r=Es(e.doc,t);while(n=Bi(r))r=n.find(1,!0).line,t=null;var i=Ls(r),s=i?i[0].level%2?Ko(r):Qo(r):r.text.length;return ht(t==null?Ns(r):t,s)}function Zo(e,t,n){var r=e[0].level;return t==r?!0:n==r?!1:t<n}function tu(e,t){eu=null;for(var n=0,r;n<e.length;++n){var i=e[n];if(i.from<t&&i.to>t)return n;if(i.from==t||i.to==t){if(r!=null)return Zo(e,i.level,e[r].level)?(i.from!=i.to&&(eu=r),n):(i.from!=i.to&&(eu=n),r);r=n}}return r}function nu(e,t,n,r){if(!r)return t+n;do t+=n;while(t>0&&Lo(e.text.charAt(t)));return t}function ru(e,t,n,r){var i=Ls(e);if(!i)return iu(e,t,n,r);var s=tu(i,t),o=i[s],u=nu(e,t,o.level%2?-n:n,r);for(;;){if(u>o.from&&u<o.to)return u;if(u==o.from||u==o.to)return tu(i,u)==s?u:(o=i[s+=n],n>0==o.level%2?o.to:o.from);o=i[s+=n];if(!o)return null;n>0==o.level%2?u=nu(e,o.to,-1,r):u=nu(e,o.from,1,r)}}function iu(e,t,n,r){var i=t+n;if(r)while(i>0&&Lo(e.text.charAt(i)))i+=n;return i<0||i>e.text.length?null:i}var e=/gecko\/\d/i.test(navigator.userAgent),t=/MSIE \d/.test(navigator.userAgent),n=t&&(document.documentMode==null||document.documentMode<8),r=t&&(document.documentMode==null||document.documentMode<9),i=t&&(document.documentMode==null||document.documentMode<10),s=/Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent),o=t||s,u=/WebKit\//.test(navigator.userAgent),a=u&&/Qt\/\d+\.\d+/.test(navigator.userAgent),f=/Chrome\//.test(navigator.userAgent),l=/Opera\//.test(navigator.userAgent),c=/Apple Computer/.test(navigator.vendor),h=/KHTML\//.test(navigator.userAgent),p=/Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),v=/PhantomJS/.test(navigator.userAgent),m=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),g=m||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),y=m||/Mac/.test(navigator.platform),b=/win/i.test(navigator.platform),w=l&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);w&&(w=Number(w[1])),w&&w>=15&&(l=!1,u=!0);var E=y&&(a||l&&(w==null||w<12.11)),S=e||o&&!r,x=!1,T=!1,ht=N.Pos=function(e,t){if(!(this instanceof ht))return new ht(e,t);this.line=e,this.ch=t},pt=N.cmpPos=function(e,t){return e.line-t.line||e.ch-t.ch};gt.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(pt(n.anchor,r.anchor)!=0||pt(n.head,r.head)!=0)return!1}return!0},deepCopy:function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new yt(dt(this.ranges[t].anchor),dt(this.ranges[t].head));return new gt(e,this.primIndex)},somethingSelected:function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},contains:function(e,t){t||(t=e);for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(pt(t,r.from())>=0&&pt(e,r.to())<=0)return n}return-1}},yt.prototype={from:function(){return mt(this.anchor,this.head)},to:function(){return vt(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var rn={left:0,right:0,top:0,bottom:0},bn,Sn=0,Kn,Qn,nr=0,ur=0,ar=null;o?ar=-0.53:e?ar=15:f?ar=-0.7:c&&(ar=-1/3);var hr,vr=null,Er,Tr=N.changeEnd=function(e){return e.text?ht(e.from.line+e.text.length-1,go(e.text).length+(e.text.length==1?e.from.ch:0)):e.to};N.prototype={constructor:N,focus:function(){window.focus(),Un(this),In(this)},setOption:function(e,t){var n=this.options,r=n[e];if(n[e]==t&&e!="mode")return;n[e]=t,Gr.hasOwnProperty(e)&&Cn(this,Gr[e])(this,t,r)},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](e)},removeKeyMap:function(e){var t=this.state.keyMaps;for(var n=0;n<t.length;++n)if(t[n]==e||typeof t[n]!="string"&&t[n].name==e)return t.splice(n,1),!0},addOverlay:kn(function(e,t){var n=e.token?e:N.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:n,modeSpec:e,opaque:t&&t.opaque}),this.state.modeGen++,Mn(this)}),removeOverlay:kn(function(e){var t=this.state.overlays;for(var n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||typeof e=="string"&&r.name==e){t.splice(n,1),this.state.modeGen++,Mn(this);return}}}),indentLine:kn(function(e,t,n){typeof t!="string"&&typeof t!="number"&&(t==null?t=this.options.smartIndent?"smart":"prev":t=t?"add":"subtract"),Tt(this.doc,e)&&Wr(this,e,t,n)}),indentSelection:kn(function(e){var t=this.doc.sel.ranges,n=-1;for(var r=0;r<t.length;r++){var i=t[r];if(!i.empty()){var s=Math.max(n,i.from().line),o=i.to();n=Math.min(this.lastLine(),o.line-(o.ch?0:1))+1;for(var u=s;u<n;++u)Wr(this,u,e)}else i.head.line>n&&(Wr(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Ur(this))}}),getTokenAt:function(e,t){var n=this.doc;e=St(n,e);var r=Vt(this,e.line,t),i=this.doc.mode,s=Es(n,e.line),o=new pi(s.text,this.options.tabSize);while(o.pos<e.ch&&!o.eol()){o.start=o.pos;var u=i.token(o,r)}return{start:o.start,end:o.pos,string:o.current(),type:u||null,state:r}},getTokenTypeAt:function(e){e=St(this.doc,e);var t=Zi(this,Es(this.doc,e.line)),n=0,r=(t.length-1)/2,i=e.ch;if(i==0)return t[2];for(;;){var s=n+r>>1;if((s?t[s*2-1]:0)>=i)r=s;else{if(!(t[s*2+1]<i))return t[s*2+2];n=s+1}}},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?N.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!ii.hasOwnProperty(t))return ii;var r=ii[t],i=this.getModeAt(e);if(typeof i[t]=="string")r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var s=0;s<i[t].length;s++){var o=r[i[t][s]];o&&n.push(o)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var u=r._global[s];u.pred(i,this)&&bo(n,u.val)==-1&&n.push(u.val)}return n},getStateAfter:function(e,t){var n=this.doc;return e=Et(n,e==null?n.first+n.size-1:e),Vt(this,e+1,t)},cursorCoords:function(e,t){var n,r=this.doc.sel.primary();return e==null?n=r.head:typeof e=="object"?n=St(this.doc,e):n=e?r.from():r.to(),dn(this,n,t||"page")},charCoords:function(e,t){return pn(this,St(this.doc,e),t||"page")},coordsChar:function(e,t){return e=hn(this,e,t||"page"),gn(this,e.left,e.top)},lineAtHeight:function(e,t){return e=hn(this,{top:e,left:0},t||"page").top,Cs(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t){var n=!1,r=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>r&&(e=r,n=!0);var i=Es(this.doc,e);return cn(this,i,{top:0,left:0},t||"page").top+(n?this.doc.height-ks(i):0)},defaultTextHeight:function(){return wn(this.display)},defaultCharWidth:function(){return En(this.display)},setGutterMarker:kn(function(e,t,n){return Xr(this,e,"gutter",function(e){var r=e.gutterMarkers||(e.gutterMarkers={});return r[t]=n,!n&&Co(r)&&(e.gutterMarkers=null),!0})}),clearGutter:kn(function(e){var t=this,n=t.doc,r=n.first;n.iter(function(n){n.gutterMarkers&&n.gutterMarkers[e]&&(n.gutterMarkers[e]=null,_n(t,r,"gutter"),Co(n.gutterMarkers)&&(n.gutterMarkers=null)),++r})}),addLineClass:kn(function(e,t,n){return Xr(this,e,"class",function(e){var r=t=="text"?"textClass":t=="background"?"bgClass":"wrapClass";if(!e[r])e[r]=n;else{if((new RegExp("(?:^|\\s)"+n+"(?:$|\\s)")).test(e[r]))return!1;e[r]+=" "+n}return!0})}),removeLineClass:kn(function(e,t,n){return Xr(this,e,"class",function(e){var r=t=="text"?"textClass":t=="background"?"bgClass":"wrapClass",i=e[r];if(!i)return!1;if(n==null)e[r]=null;else{var s=i.match(new RegExp("(?:^|\\s+)"+n+"(?:$|\\s+)"));if(!s)return!1;var o=s.index+s[0].length;e[r]=i.slice(0,s.index)+(!s.index||o==i.length?"":" ")+i.slice(o)||null}return!0})}),addLineWidget:kn(function(e,t,n){return $i(this,e,t,n)}),removeLineWidget:function(e){e.clear()},lineInfo:function(e){if(typeof e=="number"){if(!Tt(this.doc,e))return null;var t=e;e=Es(this.doc,e);if(!e)return null}else{var t=Ns(e);if(t==null)return null}return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var s=this.display;e=dn(this,St(this.doc,e));var o=e.bottom,u=e.left;t.style.position="absolute",s.sizer.appendChild(t);if(r=="over")o=e.top;else if(r=="above"||r=="near"){var a=Math.max(s.wrapper.clientHeight,this.doc.height),f=Math.max(s.sizer.clientWidth,s.lineSpace.clientWidth);(r=="above"||e.bottom+t.offsetHeight>a)&&e.top>t.offsetHeight?o=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=a&&(o=e.bottom),u+t.offsetWidth>f&&(u=f-t.offsetWidth)}t.style.top=o+"px",t.style.left=t.style.right="",i=="right"?(u=s.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):(i=="left"?u=0:i=="middle"&&(u=(s.sizer.clientWidth-t.offsetWidth)/2),t.style.left=u+"px"),n&&Ir(this,u,o,u+t.offsetWidth,o+t.offsetHeight)},triggerOnKeyDown:kn(mr),triggerOnKeyPress:kn(yr),triggerOnKeyUp:kn(gr),execCommand:function(e){if(ui.hasOwnProperty(e))return ui[e](this)},findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var s=0,o=St(this.doc,e);s<t;++s){o=$r(this.doc,o,i,n,r);if(o.hitSide)break}return o},moveH:kn(function(e,t){var n=this;n.extendSelectionsBy(function(r){return n.display.shift||n.doc.extend||r.empty()?$r(n.doc,r.head,e,t,n.options.rtlMoveVisually):e<0?r.from():r.to()},lo)}),deleteH:kn(function(e,t){var n=this.doc.sel,r=this.doc;n.somethingSelected()?r.replaceSelection("",null,"+delete"):Vr(this,function(n){var i=$r(r,n.head,e,t,!1);return e<0?{from:i,to:n.head}:{from:n.head,to:i}})}),findPosV:function(e,t,n,r){var i=1,s=r;t<0&&(i=-1,t=-t);for(var o=0,u=St(this.doc,e);o<t;++o){var a=dn(this,u,"div");s==null?s=a.left:a.left=s,u=Jr(this,a,i,n);if(u.hitSide)break}return u},moveV:kn(function(e,t){var n=this,r=this.doc,i=[],s=!n.display.shift&&!r.extend&&r.sel.somethingSelected();r.extendSelectionsBy(function(o){if(s)return e<0?o.from():o.to();var u=dn(n,o.head,"div");o.goalColumn!=null&&(u.left=o.goalColumn),i.push(u.left);var a=Jr(n,u,e,t);return t=="page"&&o==r.sel.primary()&&Rr(n,null,pn(n,a,"div").top-u.top),a},lo);if(i.length)for(var o=0;o<r.sel.ranges.length;o++)r.sel.ranges[o].goalColumn=i[o]}),toggleOverwrite:function(e){if(e!=null&&e==this.state.overwrite)return;(this.state.overwrite=!this.state.overwrite)?this.display.cursorDiv.className+=" CodeMirror-overwrite":this.display.cursorDiv.className=this.display.cursorDiv.className.replace(" CodeMirror-overwrite",""),Ys(this,"overwriteToggle",this,this.state.overwrite)},hasFocus:function(){return Po()==this.display.input},scrollTo:kn(function(e,t){(e!=null||t!=null)&&zr(this),e!=null&&(this.curOp.scrollLeft=e),t!=null&&(this.curOp.scrollTop=t)}),getScrollInfo:function(){var e=this.display.scroller,t=oo;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-t,width:e.scrollWidth-t,clientHeight:e.clientHeight-t,clientWidth:e.clientWidth-t}},scrollIntoView:kn(function(e,t){e==null?(e={from:this.doc.sel.primary().head,to:null},t==null&&(t=this.options.cursorScrollMargin)):typeof e=="number"?e={from:ht(e,0),to:null}:e.from==null&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0;if(e.from.line!=null)zr(this),this.curOp.scrollToPos=e;else{var n=qr(this,Math.min(e.from.left,e.to.left),Math.min(e.from.top,e.to.top)-e.margin,Math.max(e.from.right,e.to.right),Math.max(e.from.bottom,e.to.bottom)+e.margin);this.scrollTo(n.scrollLeft,n.scrollTop)}}),setSize:kn(function(e,t){function n(e){return typeof e=="number"||/^\d+$/.test(String(e))?e+"px":e}e!=null&&(this.display.wrapper.style.width=n(e)),t!=null&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&un(this),this.curOp.forceUpdate=!0,Ys(this,"refresh",this)}),operation:function(e){return Nn(this,e)},refresh:kn(function(){var e=this.display.cachedTextHeight;Mn(this),an(this),this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop),(e==null||Math.abs(e-wn(this.display))>.5)&&M(this),Ys(this,"refresh",this)}),swapDoc:kn(function(e){var t=this.doc;return t.cm=null,ws(this,e),an(this),Rn(this),this.scrollTo(e.scrollLeft,e.scrollTop),to(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},so(N);var Qr=N.defaults={},Gr=N.optionHandlers={},Zr=N.Init={toString:function(){return"CodeMirror.Init"}};Yr("value","",function(e,t){e.setValue(t)},!0),Yr("mode",null,function(e,t){e.doc.modeOption=t,k(e)},!0),Yr("indentUnit",2,k,!0),Yr("indentWithTabs",!1),Yr("smartIndent",!0),Yr("tabSize",4,function(e){L(e),an(e),Mn(e)},!0),Yr("specialChars",/[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g,function(e,t){e.options.specialChars=new RegExp(t.source+(t.test("	")?"":"|	"),"g"),e.refresh()},!0),Yr("specialCharPlaceholder",ss,function(e){e.refresh()},!0),Yr("electricChars",!0),Yr("rtlMoveVisually",!b),Yr("wholeLineUpdateBefore",!0),Yr("theme","default",function(e){D(e),P(e)},!0),Yr("keyMap","default",_),Yr("extraKeys",null),Yr("lineWrapping",!1,A,!0),Yr("gutters",[],function(e){F(e.options),P(e)},!0),Yr("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?X(e.display)+"px":"0",e.refresh()},!0),Yr("coverGutterNextToScrollbar",!1,q,!0),Yr("lineNumbers",!1,function(e){F(e.options),P(e)},!0),Yr("firstLineNumber",1,P,!0),Yr("lineNumberFormatter",function(e){return e},P,!0),Yr("showCursorWhenSelecting",!1,It,!0),Yr("resetSelectionOnContextMenu",!0),Yr("readOnly",!1,function(e,t){t=="nocursor"?(wr(e),e.display.input.blur(),e.display.disabled=!0):(e.display.disabled=!1,t||Rn(e))}),Yr("disableInput",!1,function(e,t){t||Rn(e)},!0),Yr("dragDrop",!0),Yr("cursorBlinkRate",530),Yr("cursorScrollMargin",0),Yr("cursorHeight",1),Yr("workTime",100),Yr("workDelay",100),Yr("flattenSpans",!0,L,!0),Yr("addModeClass",!1,L,!0),Yr("pollInterval",100),Yr("undoDepth",200,function(e,t){e.doc.history.undoDepth=t}),Yr("historyEventDelay",1250),Yr("viewportMargin",10,function(e){e.refresh()},!0),Yr("maxHighlightLength",1e4,L,!0),Yr("moveInputWithCursor",!0,function(e,t){t||(e.display.inputDiv.style.top=e.display.inputDiv.style.left=0)}),Yr("tabindex",null,function(e,t){e.display.input.tabIndex=t||""}),Yr("autofocus",null);var ei=N.modes={},ti=N.mimeModes={};N.defineMode=function(e,t){!N.defaults.mode&&e!="null"&&(N.defaults.mode=e);if(arguments.length>2){t.dependencies=[];for(var n=2;n<arguments.length;++n)t.dependencies.push(arguments[n])}ei[e]=t},N.defineMIME=function(e,t){ti[e]=t},N.resolveMode=function(e){if(typeof e=="string"&&ti.hasOwnProperty(e))e=ti[e];else if(e&&typeof e.name=="string"&&ti.hasOwnProperty(e.name)){var t=ti[e.name];typeof t=="string"&&(t={name:t}),e=Eo(t,e),e.name=t.name}else if(typeof e=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return N.resolveMode("application/xml");return typeof e=="string"?{name:e}:e||{name:"null"}},N.getMode=function(e,t){var t=N.resolveMode(t),n=ei[t.name];if(!n)return N.getMode(e,"text/plain");var r=n(e,t);if(ni.hasOwnProperty(t.name)){var i=ni[t.name];for(var s in i){if(!i.hasOwnProperty(s))continue;r.hasOwnProperty(s)&&(r["_"+s]=r[s]),r[s]=i[s]}}r.name=t.name,t.helperType&&(r.helperType=t.helperType);if(t.modeProps)for(var s in t.modeProps)r[s]=t.modeProps[s];return r},N.defineMode("null",function(){return{token:function(e){e.skipToEnd()}}}),N.defineMIME("text/plain","null");var ni=N.modeExtensions={};N.extendMode=function(e,t){var n=ni.hasOwnProperty(e)?ni[e]:ni[e]={};So(t,n)},N.defineExtension=function(e,t){N.prototype[e]=t},N.defineDocExtension=function(e,t){ms.prototype[e]=t},N.defineOption=Yr;var ri=[];N.defineInitHook=function(e){ri.push(e)};var ii=N.helpers={};N.registerHelper=function(e,t,n){ii.hasOwnProperty(e)||(ii[e]=N[e]={_global:[]}),ii[e][t]=n},N.registerGlobalHelper=function(e,t,n,r){N.registerHelper(e,t,r),ii[e]._global.push({pred:n,val:r})};var si=N.copyState=function(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n},oi=N.startState=function(e,t,n){return e.startState?e.startState(t,n):!0};N.innerMode=function(e,t){while(e.innerMode){var n=e.innerMode(t);if(!n||n.mode==e)break;t=n.state,e=n.mode}return n||{mode:e,state:t}};var ui=N.commands={selectAll:function(e){e.setSelection(ht(e.firstLine(),0),ht(e.lastLine()),ao)},singleSelection:function(e){e.setSelection(e.getCursor("anchor"),e.getCursor("head"),ao)},killLine:function(e){Vr(e,function(t){if(t.empty()){var n=Es(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line<e.lastLine()?{from:t.head,to:ht(t.head.line+1,0)}:{from:t.head,to:ht(t.head.line,n)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){Vr(e,function(t){return{from:ht(t.from().line,0),to:St(e.doc,ht(t.to().line+1,0))}})},delLineLeft:function(e){Vr(e,function(e){return{from:ht(e.from().line,0),to:e.from()}})},undo:function(e){e.undo()},redo:function(e){e.redo()},undoSelection:function(e){e.undoSelection()},redoSelection:function(e){e.redoSelection()},goDocStart:function(e){e.extendSelection(ht(e.firstLine(),0))},goDocEnd:function(e){e.extendSelection(ht(e.lastLine()))},goLineStart:function(e){e.extendSelectionsBy(function(t){return Go(e,t.head.line)},lo)},goLineStartSmart:function(e){e.extendSelectionsBy(function(t){var n=Go(e,t.head.line),r=e.getLineHandle(n.line),i=Ls(r);if(!i||i[0].level==0){var s=Math.max(0,r.text.search(/\S/)),o=t.head.line==n.line&&t.head.ch<=s&&t.head.ch;return ht(n.line,o?0:s)}return n},lo)},goLineEnd:function(e){e.extendSelectionsBy(function(
-t){return Yo(e,t.head.line)},lo)},goLineRight:function(e){e.extendSelectionsBy(function(t){var n=e.charCoords(t.head,"div").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:n},"div")},lo)},goLineLeft:function(e){e.extendSelectionsBy(function(t){var n=e.charCoords(t.head,"div").top+5;return e.coordsChar({left:0,top:n},"div")},lo)},goLineUp:function(e){e.moveV(-1,"line")},goLineDown:function(e){e.moveV(1,"line")},goPageUp:function(e){e.moveV(-1,"page")},goPageDown:function(e){e.moveV(1,"page")},goCharLeft:function(e){e.moveH(-1,"char")},goCharRight:function(e){e.moveH(1,"char")},goColumnLeft:function(e){e.moveH(-1,"column")},goColumnRight:function(e){e.moveH(1,"column")},goWordLeft:function(e){e.moveH(-1,"word")},goGroupRight:function(e){e.moveH(1,"group")},goGroupLeft:function(e){e.moveH(-1,"group")},goWordRight:function(e){e.moveH(1,"word")},delCharBefore:function(e){e.deleteH(-1,"char")},delCharAfter:function(e){e.deleteH(1,"char")},delWordBefore:function(e){e.deleteH(-1,"word")},delWordAfter:function(e){e.deleteH(1,"word")},delGroupBefore:function(e){e.deleteH(-1,"group")},delGroupAfter:function(e){e.deleteH(1,"group")},indentAuto:function(e){e.indentSelection("smart")},indentMore:function(e){e.indentSelection("add")},indentLess:function(e){e.indentSelection("subtract")},insertTab:function(e){e.replaceSelection("	")},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(e){Nn(e,function(){var t=e.listSelections();for(var n=0;n<t.length;n++){var r=t[n].head,i=Es(e.doc,r.line).text;r.ch>0&&r.ch<i.length-1&&e.replaceRange(i.charAt(r.ch)+i.charAt(r.ch-1),ht(r.line,r.ch-1),ht(r.line,r.ch+1))}})},newlineAndIndent:function(e){Nn(e,function(){var t=e.listSelections().length;for(var n=0;n<t;n++){var r=e.listSelections()[n];e.replaceRange("\n",r.anchor,r.head,"+input"),e.indentLine(r.from().line+1,null,!0),Ur(e)}})},toggleOverwrite:function(e){e.toggleOverwrite()}},ai=N.keyMap={};ai.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},ai.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},ai.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineStart","Cmd-Right":"goLineEnd","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delLineLeft","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection",fallthrough:["basic","emacsy"]},ai.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},ai["default"]=y?ai.macDefault:ai.pcDefault;var li=N.lookupKey=function(e,t,n){function r(t){t=fi(t);var i=t[e];if(i===!1)return"stop";if(i!=null&&n(i))return!0;if(t.nofallthrough)return"stop";var s=t.fallthrough;if(s==null)return!1;if(Object.prototype.toString.call(s)!="[object Array]")return r(s);for(var o=0;o<s.length;++o){var u=r(s[o]);if(u)return u}return!1}for(var i=0;i<t.length;++i){var s=r(t[i]);if(s)return s!="stop"}},ci=N.isModifierKey=function(e){var t=Xo[e.keyCode];return t=="Ctrl"||t=="Alt"||t=="Shift"||t=="Mod"},hi=N.keyName=function(e,t){if(l&&e.keyCode==34&&e["char"])return!1;var n=Xo[e.keyCode];if(n==null||e.altGraphKey)return!1;e.altKey&&(n="Alt-"+n);if(E?e.metaKey:e.ctrlKey)n="Ctrl-"+n;if(E?e.ctrlKey:e.metaKey)n="Cmd-"+n;return!t&&e.shiftKey&&(n="Shift-"+n),n};N.fromTextArea=function(e,t){function r(){e.value=a.getValue()}t||(t={}),t.value=e.value,!t.tabindex&&e.tabindex&&(t.tabindex=e.tabindex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder);if(t.autofocus==null){var n=Po();t.autofocus=n==e||e.getAttribute("autofocus")!=null&&n==document.body}if(e.form){Qs(e.form,"submit",r);if(!t.leaveSubmitMethodAlone){var i=e.form,s=i.submit;try{var o=i.submit=function(){r(),i.submit=s,i.submit(),i.submit=o}}catch(u){}}}e.style.display="none";var a=N(function(t){e.parentNode.insertBefore(t,e.nextSibling)},t);return a.save=r,a.getTextArea=function(){return e},a.toTextArea=function(){r(),e.parentNode.removeChild(a.getWrapperElement()),e.style.display="",e.form&&(Gs(e.form,"submit",r),typeof e.form.submit=="function"&&(e.form.submit=s))},a};var pi=N.StringStream=function(e,t){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};pi.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(e){var t=this.string.charAt(this.pos);if(typeof e=="string")var n=t==e;else var n=t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},eatWhile:function(e){var t=this.pos;while(this.eat(e));return this.pos>t},eatSpace:function(){var e=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos)))++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},backUp:function(e){this.pos-=e},column:function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=ho(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?ho(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return ho(this.string,null,this.tabSize)-(this.lineStart?ho(this.string,this.lineStart,this.tabSize):0)},match:function(e,t,n){if(typeof e!="string"){var s=this.string.slice(this.pos).match(e);return s&&s.index>0?null:(s&&t!==!1&&(this.pos+=s[0].length),s)}var r=function(e){return n?e.toLowerCase():e},i=this.string.substr(this.pos,e.length);if(r(i)==r(e))return t!==!1&&(this.pos+=e.length),!0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}};var di=N.TextMarker=function(e,t){this.lines=[],this.type=t,this.doc=e};so(di),di.prototype.clear=function(){if(this.explicitlyCleared)return;var e=this.doc.cm,t=e&&!e.curOp;t&&xn(e);if(io(this,"clear")){var n=this.find();n&&to(this,"clear",n.from,n.to)}var r=null,i=null;for(var s=0;s<this.lines.length;++s){var o=this.lines[s],u=wi(o.markedSpans,this);e&&!this.collapsed?_n(e,Ns(o),"text"):e&&(u.to!=null&&(i=Ns(o)),u.from!=null&&(r=Ns(o))),o.markedSpans=Ei(o.markedSpans,u),u.from==null&&this.collapsed&&!Ui(this.doc,o)&&e&&Ts(o,wn(e.display))}if(e&&this.collapsed&&!e.options.lineWrapping)for(var s=0;s<this.lines.length;++s){var a=Fi(this.lines[s]),f=B(a);f>e.display.maxLineLength&&(e.display.maxLine=a,e.display.maxLineLength=f,e.display.maxLineChanged=!0)}r!=null&&e&&this.collapsed&&Mn(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Bt(e.doc)),e&&to(e,"markerCleared",e,this),t&&Tn(e)},di.prototype.find=function(e,t){e==null&&this.type=="bookmark"&&(e=1);var n,r;for(var i=0;i<this.lines.length;++i){var s=this.lines[i],o=wi(s.markedSpans,this);if(o.from!=null){n=ht(t?s:Ns(s),o.from);if(e==-1)return n}if(o.to!=null){r=ht(t?s:Ns(s),o.to);if(e==1)return r}}return n&&{from:n,to:r}},di.prototype.changed=function(){var e=this.find(-1,!0),t=this,n=this.doc.cm;if(!e||!n)return;Nn(n,function(){var r=e.line,i=Ns(e.line),s=en(n,i);s&&(on(s),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0;if(!Ui(t.doc,r)&&t.height!=null){var o=t.height;t.height=null;var u=Vi(t)-o;u&&Ts(r,r.height+u)}})},di.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(!t.maybeHiddenMarkers||bo(t.maybeHiddenMarkers,this)==-1)&&(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},di.prototype.detachLine=function(e){this.lines.splice(bo(this.lines,e),1);if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}};var vi=0,gi=N.SharedTextMarker=function(e,t){this.markers=e,this.primary=t;for(var n=0,r=this;n<e.length;++n)e[n].parent=this,Qs(e[n],"clear",function(){r.clear()})};so(gi),gi.prototype.clear=function(){if(this.explicitlyCleared)return;this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();to(this,"clear")},gi.prototype.find=function(e,t){return this.primary.find(e,t)};var Wi=N.LineWidget=function(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.cm=e,this.node=t};so(Wi),Wi.prototype.clear=function(){var e=this.cm,t=this.line.widgets,n=this.line,r=Ns(n);if(r==null||!t)return;for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var s=Vi(this);Nn(e,function(){Xi(e,n,-s),_n(e,r,"widget"),Ts(n,Math.max(0,n.height-s))})},Wi.prototype.changed=function(){var e=this.height,t=this.cm,n=this.line;this.height=null;var r=Vi(this)-e;if(!r)return;Nn(t,function(){t.curOp.forceUpdate=!0,Xi(t,n,r),Ts(n,n.height+r)})};var Ji=N.Line=function(e,t,n){this.text=e,Oi(this,t),this.height=n?n(this):1};so(Ji),Ji.prototype.lineNo=function(){return Ns(this)};var ts={},ns={};ps.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n=e,r=e+t;n<r;++n){var i=this.lines[n];this.height-=i.height,Qi(i),to(i,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},ds.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n=0;n<this.children.length;++n){var r=this.children[n],i=r.chunkSize();if(e<i){var s=Math.min(t,i-e),o=r.height;r.removeInner(e,s),this.height-=o-r.height,i==s&&(this.children.splice(n--,1),r.parent=null);if((t-=s)==0)break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ps))){var u=[];this.collapse(u),this.children=[new ps(u)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],s=i.chunkSize();if(e<=s){i.insertInner(e,t,n);if(i.lines&&i.lines.length>50){while(i.lines.length>50){var o=i.lines.splice(i.lines.length-25,25),u=new ps(o);i.height-=u.height,this.children.splice(r+1,0,u),u.parent=this}this.maybeSpill()}break}e-=s}},maybeSpill:function(){if(this.children.length<=10)return;var e=this;do{var t=e.children.splice(e.children.length-5,5),n=new ds(t);if(!e.parent){var r=new ds(e.children);r.parent=e,e.children=[r,n],e=r}else{e.size-=n.size,e.height-=n.height;var i=bo(e.parent.children,e);e.parent.children.splice(i+1,0,n)}n.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],s=i.chunkSize();if(e<s){var o=Math.min(t,s-e);if(i.iterN(e,o,n))return!0;if((t-=o)==0)break;e=0}else e-=s}}};var vs=0,ms=N.Doc=function(e,t,n){if(!(this instanceof ms))return new ms(e,t,n);n==null&&(n=0),ds.call(this,[new ps([new Ji("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=n;var r=ht(n,0);this.sel=wt(r),this.history=new As(null),this.id=++vs,this.modeOption=t,typeof e=="string"&&(e=Uo(e)),hs(this,{from:r,to:r,text:e}),Dt(this,wt(r),ao)};ms.prototype=Eo(ds.prototype,{constructor:ms,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){var n=0;for(var r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=xs(this,this.first,this.first+this.size);return e===!1?t:t.join(e||"\n")},setValue:Ln(function(e){var t=ht(this.first,0),n=this.first+this.size-1;Or(this,{from:t,to:ht(n,Es(this,n).text.length),text:Uo(e),origin:"setValue"},!0),Dt(this,wt(t))}),replaceRange:function(e,t,n,r){t=St(this,t),n=n?St(this,n):t,Br(this,e,t,n,r)},getRange:function(e,t,n){var r=Ss(this,St(this,e),St(this,t));return n===!1?r:r.join(n||"\n")},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(Tt(this,e))return Es(this,e)},getLineNumber:function(e){return Ns(e)},getLineHandleVisualStart:function(e){return typeof e=="number"&&(e=Es(this,e)),Fi(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return St(this,e)},getCursor:function(e){var t=this.sel.primary(),n;return e==null||e=="head"?n=t.head:e=="anchor"?n=t.anchor:e=="end"||e=="to"||e===!1?n=t.to():n=t.from(),n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Ln(function(e,t,n){Ot(this,St(this,typeof e=="number"?ht(e,t||0):e),null,n)}),setSelection:Ln(function(e,t,n){Ot(this,St(this,e),St(this,t||e),n)}),extendSelection:Ln(function(e,t,n){kt(this,St(this,e),t&&St(this,t),n)}),extendSelections:Ln(function(e,t){Lt(this,Nt(this,e,t))}),extendSelectionsBy:Ln(function(e,t){Lt(this,wo(this.sel.ranges,e),t)}),setSelections:Ln(function(e,t,n){if(!e.length)return;for(var r=0,i=[];r<e.length;r++)i[r]=new yt(St(this,e[r].anchor),St(this,e[r].head));t==null&&(t=Math.min(e.length-1,this.sel.primIndex)),Dt(this,bt(i,t),n)}),addSelection:Ln(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new yt(St(this,e),St(this,t||e))),Dt(this,bt(r,r.length-1),n)}),getSelection:function(e){var t=this.sel.ranges,n;for(var r=0;r<t.length;r++){var i=Ss(this,t[r].from(),t[r].to());n=n?n.concat(i):i}return e===!1?n:n.join(e||"\n")},getSelections:function(e){var t=[],n=this.sel.ranges;for(var r=0;r<n.length;r++){var i=Ss(this,n[r].from(),n[r].to());e!==!1&&(i=i.join(e||"\n")),t[r]=i}return t},replaceSelection:Ln(function(e,t,n){var r=[];for(var i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")}),replaceSelections:function(e,t,n){var r=[],i=this.sel;for(var s=0;s<i.ranges.length;s++){var o=i.ranges[s];r[s]={from:o.from(),to:o.to(),text:Uo(e[s]),origin:n}}var u=t&&t!="end"&&Lr(this,r,t);for(var s=r.length-1;s>=0;s--)Or(this,r[s]);u?_t(this,u):this.cm&&Ur(this.cm)},undo:Ln(function(){_r(this,"undo")}),redo:Ln(function(){_r(this,"redo")}),undoSelection:Ln(function(){_r(this,"undo",!0)}),redoSelection:Ln(function(){_r(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){var e=this.history,t=0,n=0;for(var r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var r=0;r<e.undone.length;r++)e.undone[r].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){this.history=new As(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:qs(this.history.done),undone:qs(this.history.undone)}},setHistory:function(e){var t=this.history=new As(this.history.maxGeneration);t.done=qs(e.done.slice(0),null,!0),t.undone=qs(e.undone.slice(0),null,!0)},markText:function(e,t,n){return mi(this,St(this,e),St(this,t),n,"range")},setBookmark:function(e,t){var n={replacedWith:t&&(t.nodeType==null?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared};return e=St(this,e),mi(this,e,e,n,"bookmark")},findMarksAt:function(e){e=St(this,e);var t=[],n=Es(this,e.line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(i.from==null||i.from<=e.ch)&&(i.to==null||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t){e=St(this,e),t=St(this,t);var n=[],r=e.line;return this.iter(e.line,t.line+1,function(i){var s=i.markedSpans;if(s)for(var o=0;o<s.length;o++){var u=s[o];r==e.line&&e.ch>u.to||u.from==null&&r!=e.line||r==t.line&&u.from>t.ch||n.push(u.marker.parent||u.marker)}++r}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;r<n.length;++r)n[r].from!=null&&e.push(n[r].marker)}),e},posFromIndex:function(e){var t,n=this.first;return this.iter(function(r){var i=r.text.length+1;if(i>e)return t=e,!0;e-=i,++n}),St(this,ht(n,t))},indexFromPos:function(e){e=St(this,e);var t=e.ch;return e.line<this.first||e.ch<0?0:(this.iter(this.first,e.line,function(e){t+=e.text.length+1}),t)},copy:function(e){var t=new ms(xs(this,this.first,this.first+this.size),this.modeOption,this.first);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,n=this.first+this.size;e.from!=null&&e.from>t&&(t=e.from),e.to!=null&&e.to<n&&(n=e.to);var r=new ms(xs(this,t,n),e.mode||this.modeOption,t);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],r},unlinkDoc:function(e){e instanceof N&&(e=e.doc);if(this.linked)for(var t=0;t<this.linked.length;++t){var n=this.linked[t];if(n.doc!=e)continue;this.linked.splice(t,1),e.unlinkDoc(this);break}if(e.history==this.history){var r=[e.id];bs(e,function(e){r.push(e.id)},!0),e.history=new As(null),e.history.done=qs(this.history.done,r),e.history.undone=qs(this.history.undone,r)}},iterLinkedDocs:function(e){bs(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm}}),ms.prototype.eachLine=ms.prototype.iter;var gs="iter insert remove copy getEditor".split(" ");for(var ys in ms.prototype)ms.prototype.hasOwnProperty(ys)&&bo(gs,ys)<0&&(N.prototype[ys]=function(e){return function(){return e.apply(this.doc,arguments)}}(ms.prototype[ys]));so(ms);var Ws=N.e_preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},Xs=N.e_stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},$s=N.e_stop=function(e){Ws(e),Xs(e)},Qs=N.on=function(e,t,n){if(e.addEventListener)e.addEventListener(t,n,!1);else if(e.attachEvent)e.attachEvent("on"+t,n);else{var r=e._handlers||(e._handlers={}),i=r[t]||(r[t]=[]);i.push(n)}},Gs=N.off=function(e,t,n){if(e.removeEventListener)e.removeEventListener(t,n,!1);else if(e.detachEvent)e.detachEvent("on"+t,n);else{var r=e._handlers&&e._handlers[t];if(!r)return;for(var i=0;i<r.length;++i)if(r[i]==n){r.splice(i,1);break}}},Ys=N.signal=function(e,t){var n=e._handlers&&e._handlers[t];if(!n)return;var r=Array.prototype.slice.call(arguments,2);for(var i=0;i<n.length;++i)n[i].apply(null,r)},Zs,eo=0,oo=30,uo=N.Pass={toString:function(){return"CodeMirror.Pass"}},ao={scroll:!1},fo={origin:"*mouse"},lo={origin:"+move"};co.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var ho=N.countColumn=function(e,t,n,r,i){t==null&&(t=e.search(/[^\s\u00a0]/),t==-1&&(t=e.length));for(var s=r||0,o=i||0;;){var u=e.indexOf("	",s);if(u<0||u>=t)return o+(t-s);o+=u-s,o+=n-o%n,s=u+1}},vo=[""],yo=function(e){e.select()};m?yo=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:o&&(yo=function(e){try{e.select()}catch(t){}}),[].indexOf&&(bo=function(e,t){return e.indexOf(t)}),[].map&&(wo=function(e,t){return e.map(t)});var To=/[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,No=N.isWordChar=function(e){return/\w/.test(e)||e>""&&(e.toUpperCase()!=e.toLowerCase()||To.test(e))},ko=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,Oo;document.createRange?Oo=function(e,t,n){var r=document.createRange();return r.setEnd(e,n),r.setStart(e,t),r}:Oo=function(e,t,n){var r=document.body.createTextRange();return r.moveToElementText(e.parentNode),r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r},t&&(Po=function(){try{return document.activeElement}catch(e){return document.body}});var Ho=function(){if(r)return!1;var e=Ao("div");return"draggable"in e||"dragDrop"in e}(),Bo,Fo,qo,Uo=N.splitLines="\n\nb".split(/\n/).length!=3?function(e){var t=0,n=[],r=e.length;while(t<=r){var i=e.indexOf("\n",t);i==-1&&(i=e.length);var s=e.slice(t,e.charAt(i-1)=="\r"?i-1:i),o=s.indexOf("\r");o!=-1?(n.push(s.slice(0,o)),t+=o+1):(n.push(s),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},zo=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(t){return!1}}:function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!t||t.parentElement()!=e?!1:t.compareEndPoints("StartToEnd",t)!=0},Wo=function(){var e=Ao("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),typeof e.oncopy=="function")}(),Xo={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};N.keyNames=Xo,function(){for(var e=0;e<10;e++)Xo[e+48]=Xo[e+96]=String(e);for(var e=65;e<=90;e++)Xo[e]=String.fromCharCode(e);for(var e=1;e<=12;e++)Xo[e+111]=Xo[e+63235]="F"+e}();var eu,su=function(){function n(n){return n<=247?e.charAt(n):1424<=n&&n<=1524?"R":1536<=n&&n<=1773?t.charAt(n-1536):1774<=n&&n<=2220?"r":8192<=n&&n<=8203?"w":n==8204?"b":"L"}function f(e,t,n){this.level=e,this.from=t,this.to=n}var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,i=/[stwN]/,s=/[LRr]/,o=/[Lb1n]/,u=/[1n]/,a="L";return function(e){if(!r.test(e))return!1;var t=e.length,l=[];for(var c=0,h;c<t;++c)l.push(h=n(e.charCodeAt(c)));for(var c=0,p=a;c<t;++c){var h=l[c];h=="m"?l[c]=p:p=h}for(var c=0,d=a;c<t;++c){var h=l[c];h=="1"&&d=="r"?l[c]="n":s.test(h)&&(d=h,h=="r"&&(l[c]="R"))}for(var c=1,p=l[0];c<t-1;++c){var h=l[c];h=="+"&&p=="1"&&l[c+1]=="1"?l[c]="1":h==","&&p==l[c+1]&&(p=="1"||p=="n")&&(l[c]=p),p=h}for(var c=0;c<t;++c){var h=l[c];if(h==",")l[c]="N";else if(h=="%"){for(var v=c+1;v<t&&l[v]=="%";++v);var m=c&&l[c-1]=="!"||v<t&&l[v]=="1"?"1":"N";for(var g=c;g<v;++g)l[g]=m;c=v-1}}for(var c=0,d=a;c<t;++c){var h=l[c];d=="L"&&h=="1"?l[c]="L":s.test(h)&&(d=h)}for(var c=0;c<t;++c)if(i.test(l[c])){for(var v=c+1;v<t&&i.test(l[v]);++v);var y=(c?l[c-1]:a)=="L",b=(v<t?l[v]:a)=="L",m=y||b?"L":"R";for(var g=c;g<v;++g)l[g]=m;c=v-1}var w=[],E;for(var c=0;c<t;)if(o.test(l[c])){var S=c;for(++c;c<t&&o.test(l[c]);++c);w.push(new f(0,S,c))}else{var x=c,T=w.length;for(++c;c<t&&l[c]!="L";++c);for(var g=x;g<c;)if(u.test(l[g])){x<g&&w.splice(T,0,new f(1,x,g));var N=g;for(++g;g<c&&u.test(l[g]);++g);w.splice(T,0,new f(2,N,g)),x=g}else++g;x<c&&w.splice(T,0,new f(1,x,c))}return w[0].level==1&&(E=e.match(/^\s+/))&&(w[0].from=E[0].length,w.unshift(new f(0,0,E[0].length))),go(w).level==1&&(E=e.match(/\s+$/))&&(go(w).to-=E[0].length,w.push(new f(0,t-E[0].length,t))),w[0].level!=go(w).level&&w.push(new f(w[0].level,t,t)),w}}();return N.version="4.0.3",N});
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/codemirror/javascript.min.js b/dashboard/lib/assets/packages/codemirror/javascript.min.js
deleted file mode 100644
index 6c02c3a..0000000
--- a/dashboard/lib/assets/packages/codemirror/javascript.min.js
+++ /dev/null
@@ -1 +0,0 @@
-CodeMirror.defineMode("javascript",function(e,r){function t(e){for(var r,t=!1,n=!1;null!=(r=e.next());){if(!t){if("/"==r&&!n)return;"["==r?n=!0:n&&"]"==r&&(n=!1)}t=!t&&"\\"==r}}function n(e,r,t){return dr=e,pr=t,r}function a(e,r){var a=e.next();if('"'==a||"'"==a)return r.tokenize=i(a),r.tokenize(e,r);if("."==a&&e.match(/^\d+(?:[eE][+\-]?\d+)?/))return n("number","number");if("."==a&&e.match(".."))return n("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(a))return n(a);if("="==a&&e.eat(">"))return n("=>","operator");if("0"==a&&e.eat(/x/i))return e.eatWhile(/[\da-f]/i),n("number","number");if(/\d/.test(a))return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),n("number","number");if("/"==a)return e.eat("*")?(r.tokenize=o,o(e,r)):e.eat("/")?(e.skipToEnd(),n("comment","comment")):"operator"==r.lastType||"keyword c"==r.lastType||"sof"==r.lastType||/^[\[{}\(,;:]$/.test(r.lastType)?(t(e),e.eatWhile(/[gimy]/),n("regexp","string-2")):(e.eatWhile(hr),n("operator","operator",e.current()));if("`"==a)return r.tokenize=u,u(e,r);if("#"==a)return e.skipToEnd(),n("error","error");if(hr.test(a))return e.eatWhile(hr),n("operator","operator",e.current());e.eatWhile(/[\w\$_]/);var c=e.current(),l=xr.propertyIsEnumerable(c)&&xr[c];return l&&"."!=r.lastType?n(l.type,l.style,c):n("variable","variable",c)}function i(e){return function(r,t){var i,o=!1;if(yr&&"@"==r.peek()&&r.match(gr))return t.tokenize=a,n("jsonld-keyword","meta");for(;null!=(i=r.next())&&(i!=e||o);)o=!o&&"\\"==i;return o||(t.tokenize=a),n("string","string")}}function o(e,r){for(var t,i=!1;t=e.next();){if("/"==t&&i){r.tokenize=a;break}i="*"==t}return n("comment","comment")}function u(e,r){for(var t,i=!1;null!=(t=e.next());){if(!i&&("`"==t||"$"==t&&e.eat("{"))){r.tokenize=a;break}i=!i&&"\\"==t}return n("quasi","string-2",e.current())}function c(e,r){r.fatArrowAt&&(r.fatArrowAt=null);var t=e.string.indexOf("=>",e.start);if(!(0>t)){for(var n=0,a=!1,i=t-1;i>=0;--i){var o=e.string.charAt(i),u=wr.indexOf(o);if(u>=0&&3>u){if(!n){++i;break}if(0==--n)break}else if(u>=3&&6>u)++n;else if(/[$\w]/.test(o))a=!0;else if(a&&!n){++i;break}}a&&!n&&(r.fatArrowAt=i)}}function l(e,r,t,n,a,i){this.indented=e,this.column=r,this.type=t,this.prev=a,this.info=i,null!=n&&(this.align=n)}function s(e,r){for(var t=e.localVars;t;t=t.next)if(t.name==r)return!0;for(var n=e.context;n;n=n.prev)for(var t=n.vars;t;t=t.next)if(t.name==r)return!0}function f(e,r,t,n,a){var i=e.cc;for(jr.state=e,jr.stream=a,jr.marked=null,jr.cc=i,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;){var o=i.length?i.pop():kr?g:h;if(o(t,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return jr.marked?jr.marked:"variable"==t&&s(e,n)?"variable-2":r}}}function d(){for(var e=arguments.length-1;e>=0;e--)jr.cc.push(arguments[e])}function p(){return d.apply(null,arguments),!0}function v(e){function t(r){for(var t=r;t;t=t.next)if(t.name==e)return!0;return!1}var n=jr.state;if(n.context){if(jr.marked="def",t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;r.globalVars&&(n.globalVars={name:e,next:n.globalVars})}}function m(){jr.state.context={prev:jr.state.context,vars:jr.state.localVars},jr.state.localVars=Vr}function y(){jr.state.localVars=jr.state.context.vars,jr.state.context=jr.state.context.prev}function k(e,r){var t=function(){var t=jr.state,n=t.indented;"stat"==t.lexical.type&&(n=t.lexical.indented),t.lexical=new l(n,jr.stream.column(),e,null,t.lexical,r)};return t.lex=!0,t}function b(){var e=jr.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function x(e){return function(r){return r==e?p():";"==e?d():p(arguments.callee)}}function h(e,r){return"var"==e?p(k("vardef",r.length),D,x(";"),b):"keyword a"==e?p(k("form"),g,h,b):"keyword b"==e?p(k("form"),h,b):"{"==e?p(k("}"),U,b):";"==e?p():"if"==e?p(k("form"),g,h,b,K):"function"==e?p(Z):"for"==e?p(k("form"),L,h,b):"variable"==e?p(k("stat"),O):"switch"==e?p(k("form"),g,k("}","switch"),x("{"),U,b,b):"case"==e?p(g,x(":")):"default"==e?p(x(":")):"catch"==e?p(k("form"),m,x("("),er,x(")"),h,b,y):"module"==e?p(k("form"),m,ar,y,b):"class"==e?p(k("form"),rr,nr,b):"export"==e?p(k("form"),ir,b):"import"==e?p(k("form"),or,b):d(k("stat"),g,x(";"),b)}function g(e){return M(e,!1)}function w(e){return M(e,!0)}function M(e,r){if(jr.state.fatArrowAt==jr.stream.start){var t=r?A:I;if("("==e)return p(m,k(")"),q(F,")"),b,x("=>"),t,y);if("variable"==e)return d(m,F,x("=>"),t,y)}var n=r?E:C;return Mr.hasOwnProperty(e)?p(n):"function"==e?p(Z):"keyword c"==e?p(r?V:j):"("==e?p(k(")"),j,fr,x(")"),b,n):"operator"==e||"spread"==e?p(r?w:g):"["==e?p(k("]"),lr,b,n):"{"==e?N(W,"}",null,n):p()}function j(e){return e.match(/[;\}\)\],]/)?d():d(g)}function V(e){return e.match(/[;\}\)\],]/)?d():d(w)}function C(e,r){return","==e?p(g):E(e,r,!1)}function E(e,r,t){var n=0==t?C:E,a=0==t?g:w;return"=>"==r?p(m,t?A:I,y):"operator"==e?/\+\+|--/.test(r)?p(n):"?"==r?p(g,x(":"),a):p(a):"quasi"==e?(jr.cc.push(n),z(r)):";"!=e?"("==e?N(w,")","call",n):"."==e?p(P,n):"["==e?p(k("]"),j,x("]"),b,n):void 0:void 0}function z(e){return"${"!=e.slice(e.length-2)?p():p(g,T)}function T(e){return"}"==e?(jr.marked="string-2",jr.state.tokenize=u,p()):void 0}function I(e){return c(jr.stream,jr.state),d("{"==e?h:g)}function A(e){return c(jr.stream,jr.state),d("{"==e?h:w)}function O(e){return":"==e?p(b,h):d(C,x(";"),b)}function P(e){return"variable"==e?(jr.marked="property",p()):void 0}function W(e,r){if("variable"==e){if(jr.marked="property","get"==r||"set"==r)return p($)}else if("number"==e||"string"==e)jr.marked=yr?"property":e+" property";else if("["==e)return p(g,x("]"),S);return Mr.hasOwnProperty(e)?p(S):void 0}function $(e){return"variable"!=e?d(S):(jr.marked="property",p(Z))}function S(e){return":"==e?p(w):"("==e?d(Z):void 0}function q(e,r){function t(n){if(","==n){var a=jr.state.lexical;return"call"==a.info&&(a.pos=(a.pos||0)+1),p(e,t)}return n==r?p():p(x(r))}return function(n){return n==r?p():d(e,t)}}function N(e,r,t){for(var n=3;n<arguments.length;n++)jr.cc.push(arguments[n]);return p(k(r,t),q(e,r),b)}function U(e){return"}"==e?p():d(h,U)}function _(e){return br&&":"==e?p(B):void 0}function B(e){return"variable"==e?(jr.marked="variable-3",p()):void 0}function D(){return d(F,_,H,J)}function F(e,r){return"variable"==e?(v(r),p()):"["==e?N(F,"]"):"{"==e?N(G,"}"):void 0}function G(e,r){return"variable"!=e||jr.stream.match(/^\s*:/,!1)?("variable"==e&&(jr.marked="property"),p(x(":"),F,H)):(v(r),p(H))}function H(e,r){return"="==r?p(w):void 0}function J(e){return","==e?p(D):void 0}function K(e,r){return"keyword b"==e&&"else"==r?p(k("form"),h,b):void 0}function L(e){return"("==e?p(k(")"),Q,x(")"),b):void 0}function Q(e){return"var"==e?p(D,x(";"),X):";"==e?p(X):"variable"==e?p(R):d(g,x(";"),X)}function R(e,r){return"in"==r||"of"==r?(jr.marked="keyword",p(g)):p(C,X)}function X(e,r){return";"==e?p(Y):"in"==r||"of"==r?(jr.marked="keyword",p(g)):d(g,x(";"),Y)}function Y(e){")"!=e&&p(g)}function Z(e,r){return"*"==r?(jr.marked="keyword",p(Z)):"variable"==e?(v(r),p(Z)):"("==e?p(m,k(")"),q(er,")"),b,h,y):void 0}function er(e){return"spread"==e?p(er):d(F,_)}function rr(e,r){return"variable"==e?(v(r),p(tr)):void 0}function tr(e,r){return"extends"==r?p(g):void 0}function nr(e){return"{"==e?N(W,"}"):void 0}function ar(e,r){return"string"==e?p(h):"variable"==e?(v(r),p(cr)):void 0}function ir(e,r){return"*"==r?(jr.marked="keyword",p(cr,x(";"))):"default"==r?(jr.marked="keyword",p(g,x(";"))):d(h)}function or(e){return"string"==e?p():d(ur,cr)}function ur(e,r){return"{"==e?N(ur,"}"):("variable"==e&&v(r),p())}function cr(e,r){return"from"==r?(jr.marked="keyword",p(g)):void 0}function lr(e){return"]"==e?p():d(w,sr)}function sr(e){return"for"==e?d(fr,x("]")):","==e?p(q(w,"]")):d(q(w,"]"))}function fr(e){return"for"==e?p(L,fr):"if"==e?p(g,fr):void 0}var dr,pr,vr=e.indentUnit,mr=r.statementIndent,yr=r.jsonld,kr=r.json||yr,br=r.typescript,xr=function(){function e(e){return{type:e,style:"keyword"}}var r=e("keyword a"),t=e("keyword b"),n=e("keyword c"),a=e("operator"),i={type:"atom",style:"atom"},o={"if":e("if"),"while":r,"with":r,"else":t,"do":t,"try":t,"finally":t,"return":n,"break":n,"continue":n,"new":n,"delete":n,"throw":n,"debugger":n,"var":e("var"),"const":e("var"),let:e("var"),"function":e("function"),"catch":e("catch"),"for":e("for"),"switch":e("switch"),"case":e("case"),"default":e("default"),"in":a,"typeof":a,"instanceof":a,"true":i,"false":i,"null":i,undefined:i,NaN:i,Infinity:i,"this":e("this"),module:e("module"),"class":e("class"),"super":e("atom"),"yield":n,"export":e("export"),"import":e("import"),"extends":n};if(br){var u={type:"variable",style:"variable-3"},c={"interface":e("interface"),"extends":e("extends"),constructor:e("constructor"),"public":e("public"),"private":e("private"),"protected":e("protected"),"static":e("static"),string:u,number:u,bool:u,any:u};for(var l in c)o[l]=c[l]}return o}(),hr=/[+\-*&%=<>!?|~^]/,gr=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,wr="([{}])",Mr={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},jr={state:null,column:null,marked:null,cc:null},Vr={name:"this",next:{name:"arguments"}};return b.lex=!0,{startState:function(e){var t={tokenize:a,lastType:"sof",cc:[],lexical:new l((e||0)-vr,0,"block",!1),localVars:r.localVars,context:r.localVars&&{vars:r.localVars},indented:0};return r.globalVars&&(t.globalVars=r.globalVars),t},token:function(e,r){if(e.sol()&&(r.lexical.hasOwnProperty("align")||(r.lexical.align=!1),r.indented=e.indentation(),c(e,r)),r.tokenize!=o&&e.eatSpace())return null;var t=r.tokenize(e,r);return"comment"==dr?t:(r.lastType="operator"!=dr||"++"!=pr&&"--"!=pr?dr:"incdec",f(r,t,dr,pr,e))},indent:function(e,t){if(e.tokenize==o)return CodeMirror.Pass;if(e.tokenize!=a)return 0;for(var n=t&&t.charAt(0),i=e.lexical,u=e.cc.length-1;u>=0;--u){var c=e.cc[u];if(c==b)i=i.prev;else if(c!=K)break}"stat"==i.type&&"}"==n&&(i=i.prev),mr&&")"==i.type&&"stat"==i.prev.type&&(i=i.prev);var l=i.type,s=n==l;return"vardef"==l?i.indented+("operator"==e.lastType||","==e.lastType?i.info+1:0):"form"==l&&"{"==n?i.indented:"form"==l?i.indented+vr:"stat"==l?i.indented+("operator"==e.lastType||","==e.lastType?mr||vr:0):"switch"!=i.info||s||0==r.doubleIndentSwitch?i.align?i.column+(s?0:1):i.indented+(s?0:vr):i.indented+(/^(?:case|default)\b/.test(t)?vr:2*vr)},electricChars:":{}",blockCommentStart:kr?null:"/*",blockCommentEnd:kr?null:"*/",lineComment:kr?null:"//",fold:"brace",helperType:kr?"json":"javascript",jsonldMode:yr,jsonMode:kr}}),CodeMirror.defineMIME("text/javascript","javascript"),CodeMirror.defineMIME("text/ecmascript","javascript"),CodeMirror.defineMIME("application/javascript","javascript"),CodeMirror.defineMIME("application/ecmascript","javascript"),CodeMirror.defineMIME("application/json",{name:"javascript",json:!0}),CodeMirror.defineMIME("application/x-json",{name:"javascript",json:!0}),CodeMirror.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),CodeMirror.defineMIME("text/typescript",{name:"javascript",typescript:!0}),CodeMirror.defineMIME("application/typescript",{name:"javascript",typescript:!0});
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/codemirror/solarized.min.css b/dashboard/lib/assets/packages/codemirror/solarized.min.css
deleted file mode 100644
index 7d9a82e..0000000
--- a/dashboard/lib/assets/packages/codemirror/solarized.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.solarized.base03{color:#002b36}.solarized.base02{color:#073642}.solarized.base01{color:#586e75}.solarized.base00{color:#657b83}.solarized.base0{color:#839496}.solarized.base1{color:#93a1a1}.solarized.base2{color:#eee8d5}.solarized.base3{color:#fdf6e3}.solarized.solar-yellow{color:#b58900}.solarized.solar-orange{color:#cb4b16}.solarized.solar-red{color:#dc322f}.solarized.solar-magenta{color:#d33682}.solarized.solar-violet{color:#6c71c4}.solarized.solar-blue{color:#268bd2}.solarized.solar-cyan{color:#2aa198}.solarized.solar-green{color:#859900}.cm-s-solarized{line-height:1.45em;font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace!important;color-profile:sRGB;rendering-intent:auto}.cm-s-solarized.cm-s-dark{color:#839496;background-color:#002b36;text-shadow:#002b36 0 1px}.cm-s-solarized.cm-s-light{background-color:#fdf6e3;color:#657b83;text-shadow:#eee8d5 0 1px}.cm-s-solarized .CodeMirror-widget{text-shadow:none}.cm-s-solarized .cm-keyword{color:#cb4b16}.cm-s-solarized .cm-atom{color:#d33682}.cm-s-solarized .cm-number{color:#d33682}.cm-s-solarized .cm-def{color:#2aa198}.cm-s-solarized .cm-variable{color:#268bd2}.cm-s-solarized .cm-variable-2{color:#b58900}.cm-s-solarized .cm-variable-3{color:#6c71c4}.cm-s-solarized .cm-property{color:#2aa198}.cm-s-solarized .cm-operator{color:#6c71c4}.cm-s-solarized .cm-comment{color:#586e75;font-style:italic}.cm-s-solarized .cm-string{color:#859900}.cm-s-solarized .cm-string-2{color:#b58900}.cm-s-solarized .cm-meta{color:#859900}.cm-s-solarized .cm-qualifier{color:#b58900}.cm-s-solarized .cm-builtin{color:#d33682}.cm-s-solarized .cm-bracket{color:#cb4b16}.cm-s-solarized .CodeMirror-matchingbracket{color:#859900}.cm-s-solarized .CodeMirror-nonmatchingbracket{color:#dc322f}.cm-s-solarized .cm-tag{color:#93a1a1}.cm-s-solarized .cm-attribute{color:#2aa198}.cm-s-solarized .cm-header{color:#586e75}.cm-s-solarized .cm-quote{color:#93a1a1}.cm-s-solarized .cm-hr{color:transparent;border-top:1px solid #586e75;display:block}.cm-s-solarized .cm-link{color:#93a1a1;cursor:pointer}.cm-s-solarized .cm-special{color:#6c71c4}.cm-s-solarized .cm-em{color:#999;text-decoration:underline;text-decoration-style:dotted}.cm-s-solarized .cm-strong{color:#eee}.cm-s-solarized .cm-tab:before{content:"➤";color:#586e75;position:absolute}.cm-s-solarized .cm-error,.cm-s-solarized .cm-invalidchar{color:#586e75;border-bottom:1px dotted #dc322f}.cm-s-solarized.cm-s-dark .CodeMirror-selected{background:#073642}.cm-s-solarized.cm-s-light .CodeMirror-selected{background:#eee8d5}.cm-s-solarized.CodeMirror{-moz-box-shadow:inset 7px 0 12px -6px #000;-webkit-box-shadow:inset 7px 0 12px -6px #000;box-shadow:inset 7px 0 12px -6px #000}.cm-s-solarized .CodeMirror-gutters{padding:0 15px 0 10px;box-shadow:0 10px 20px black;border-right:1px solid}.cm-s-solarized.cm-s-dark .CodeMirror-gutters{background-color:#073642;border-color:#00232c}.cm-s-solarized.cm-s-dark .CodeMirror-linenumber{text-shadow:#021014 0 -1px}.cm-s-solarized.cm-s-light .CodeMirror-gutters{background-color:#eee8d5;border-color:#eee8d5}.cm-s-solarized .CodeMirror-linenumber{color:#586e75}.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text{color:#586e75}.cm-s-solarized .CodeMirror-lines{padding-left:5px}.cm-s-solarized .CodeMirror-lines .CodeMirror-cursor{border-left:1px solid #819090}.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background{background:rgba(255,255,255,0.10)}.cm-s-solarized.cm-s-light .CodeMirror-activeline-background{background:rgba(0,0,0,0.10)}.cm-s-solarized.CodeMirror,.cm-s-solarized .CodeMirror-gutters{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC")}
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/highlightjs/default.min.css b/dashboard/lib/assets/packages/highlightjs/default.min.css
deleted file mode 100644
index c6975d8..0000000
--- a/dashboard/lib/assets/packages/highlightjs/default.min.css
+++ /dev/null
@@ -1 +0,0 @@
-pre code{display:block;padding:.5em;background:#f0f0f0}pre code,pre .subst,pre .tag .title,pre .lisp .title,pre .clojure .built_in,pre .nginx .title{color:black}pre .string,pre .title,pre .constant,pre .parent,pre .tag .value,pre .rules .value,pre .rules .value .number,pre .preprocessor,pre .pragma,pre .haml .symbol,pre .ruby .symbol,pre .ruby .symbol .string,pre .aggregate,pre .template_tag,pre .django .variable,pre .smalltalk .class,pre .addition,pre .flow,pre .stream,pre .bash .variable,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .tex .special,pre .erlang_repl .function_or_atom,pre .asciidoc .header,pre .markdown .header,pre .coffeescript .attribute{color:#800}pre .smartquote,pre .comment,pre .annotation,pre .template_comment,pre .diff .header,pre .chunk,pre .asciidoc .blockquote,pre .markdown .blockquote{color:#888}pre .number,pre .date,pre .regexp,pre .literal,pre .hexcolor,pre .smalltalk .symbol,pre .smalltalk .char,pre .go .constant,pre .change,pre .lasso .variable,pre .makefile .variable,pre .asciidoc .bullet,pre .markdown .bullet,pre .asciidoc .link_url,pre .markdown .link_url{color:#080}pre .label,pre .javadoc,pre .ruby .string,pre .decorator,pre .filter .argument,pre .localvars,pre .array,pre .attr_selector,pre .important,pre .pseudo,pre .pi,pre .haml .bullet,pre .doctype,pre .deletion,pre .envvar,pre .shebang,pre .apache .sqbracket,pre .nginx .built_in,pre .tex .formula,pre .erlang_repl .reserved,pre .prompt,pre .asciidoc .link_label,pre .markdown .link_label,pre .vhdl .attribute,pre .clojure .attribute,pre .asciidoc .attribute,pre .lasso .attribute,pre .coffeescript .property,pre .makefile .phony{color:#88F}pre .keyword,pre .id,pre .title,pre .built_in,pre .aggregate,pre .css .tag,pre .javadoctag,pre .phpdoc,pre .yardoctag,pre .smalltalk .class,pre .winutils,pre .bash .variable,pre .apache .tag,pre .go .typename,pre .tex .command,pre .asciidoc .strong,pre .markdown .strong,pre .request,pre .status{font-weight:bold}pre .asciidoc .emphasis,pre .markdown .emphasis{font-style:italic}pre .nginx .built_in{font-weight:normal}pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:.5}
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/highlightjs/highlight.min.js b/dashboard/lib/assets/packages/highlightjs/highlight.min.js
deleted file mode 100644
index 4a9444e..0000000
--- a/dashboard/lib/assets/packages/highlightjs/highlight.min.js
+++ /dev/null
@@ -1 +0,0 @@
-var hljs=new function(){function k(v){return v.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event=="start"?w:y}function A(H){function G(I){return" "+I.nodeName+'="'+k(I.value)+'"'}F+="<"+t(H)+Array.prototype.map.call(H.attributes,G).join("")+">"}function E(G){F+="</"+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?"":b.classPrefix,U='<span class="'+T,Y=W?"":"</span>";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+="</span>"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"<unnamed>")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+="</span>"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"<br>")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("ruleslanguage",function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("haml",function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(!=#|=#|-#|/).*$",r:0},{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+"},{cN:"value",b:"[#\\.]\\w+"},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,c:[{cN:"symbol",b:":\\w+"},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]},]}]},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("haskell",function(f){var g={cN:"comment",v:[{b:"--",e:"$"},{b:"{-",e:"-}",c:["self"]}]};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f.inherit(f.TM,{b:"[_a-z][\\w']*"})]};var a={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule\\b",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport\\b",e:"$",k:"import|0 qualified as hiding",c:[c,g],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[e,g,d,c,a]},{cN:"default",bK:"default",e:"$",c:[d,c,g]},{cN:"infix",bK:"infix infixl infixr",e:"$",c:[f.CNM,g]},{cN:"foreign",b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:"^[_a-z][\\w']*"}),{b:"->|<-"}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/</,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("django",function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/\{%\s*comment\s*%}/,e:/\{%\s*endcomment\s*%}/},{cN:"template_comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/\{\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{k:d,l:c,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("scss",function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("mel",function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",v:[{b:"\\$\\d"},{b:"[\\$\\%\\@](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},{b:"\\*(\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)",r:0}]},a.CLCM,a.CBLCLM]}});hljs.registerLanguage("dos",function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,i:/[:"<>]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("tex",function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}});hljs.registerLanguage("glsl",function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}});hljs.registerLanguage("brainfuck",function(b){var a={cN:"literal",b:"[\\+\\-]",r:0};return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",rE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:true,c:[a]},a]}});hljs.registerLanguage("mathematica",function(a){return{aliases:["mma"],l:"(\\$|\\b)"+a.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},a.ASM,a.QSM,a.CNM,{cN:"list",b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("rust",function(b){var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bK:"fn",e:"(\\(|<)",c:[b.UTM]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bK:"type",e:"(=|<)",c:[b.UTM],i:"\\S"},{bK:"trait enum",e:"({|<)",c:[b.UTM],i:"\\S"}]}});hljs.registerLanguage("handlebars",function(b){var a="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z- .]+",k:a},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z- .]+",k:a},{cN:"variable",b:"[a-zA-Z-.]+",k:a}]}]}});hljs.registerLanguage("cmake",function(a){return{cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage("lisp",function(h){var k="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var l="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var j={cN:"shebang",b:"^#!",e:"$"};var b={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d={cN:"number",v:[{b:l,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{b:"#c\\("+l+" +"+l,e:"\\)"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:"comment",b:";",e:"$"};var f={cN:"variable",b:"\\*",e:"\\*"};var n={cN:"keyword",b:"[:&]"+k};var c={b:"\\(",e:"\\)",c:["self",b,g,d]};var a={cN:"quoted",c:[d,g,f,n,c],v:[{b:"['`]\\(",e:"\\)",},{b:"\\(quote ",e:"\\)",k:{title:"quote"},}]};var i={cN:"list",b:"\\(",e:"\\)"};var e={eW:true,r:0};i.c=[{cN:"title",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage("rib",function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("avrasm",function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$",r:0},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:"</?",e:">"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("1c",function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a]};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[b.inherit(b.TM,{b:f}),{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("vbnet",function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}});hljs.registerLanguage("fsharp",function(a){return{k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},{cN:"attribute",b:"\\B('[A-Za-z])\\b",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("matlab",function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b,r:0},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b,i:/:/},{cN:"comment",b:"\\%",e:"$"}].concat(b)}});hljs.registerLanguage("applescript",function(a){var b=a.inherit(a.QSM,{i:""});var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bK:"on",i:"[${=;\\n]",c:[a.UTM,d]}].concat(c),i:"//"}});hljs.registerLanguage("delphi",function(b){var a="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure";var e={cN:"comment",v:[{b:/\{/,e:/\}/,r:0},{b:/\(\*/,e:/\*\)/,r:10}]};var c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:"string",b:/(#\d+)+/};var f={b:b.IR+"\\s*=\\s*class\\s*\\(",rB:true,c:[b.TM]};var g={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[b.TM,{cN:"params",b:/\(/,e:/\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/("|\$[G-Zg-z]|\/\*|<\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"include\\s*<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("ocaml",function(a){return{k:{keyword:"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value",built_in:"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string",},i:/\/\//,c:[{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self"]},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("d",function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?'};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("lua",function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bK:"function",e:"\\)",c:[b.inherit(b.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage("rsl",function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bK:"surface displacement light volume imager",e:"\\("},{cN:"shading",bK:"illuminate illuminance gather",e:"\\("}]}});hljs.registerLanguage("vbscript",function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'"},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}});hljs.registerLanguage("axapta",function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",i:":",c:[{cN:"inheritance",bK:"extends implements",r:10},a.UTM]}]}});hljs.registerLanguage("vala",function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bK:"class interface delegate namespace",e:"{",i:"[^,:\\n\\s\\.]",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}});hljs.registerLanguage("erlang",function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#"+i.UIR,r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",e:"}",r:0}]};var k={bK:"fun receive if try case",e:"end",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:|;",c:[d,i.inherit(i.TM,{b:c})],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("mizar",function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}});hljs.registerLanguage("lasso",function(d){var b="[a-zA-Z_][a-zA-Z0-9_.]*";var i="<\\?(lasso(script)?|=)";var c="\\]|\\?>";var g={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"};var a={cN:"comment",b:"<!--",e:"-->",r:0};var j={cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true,c:[a]}};var e={cN:"preprocessor",b:"\\[/noprocess|"+i};var h={cN:"variable",b:"'"+b+"'"};var f=[d.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+"|-?(infinity|nan)\\b"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",v:[{b:"[#$]"+b},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"tag",b:"::\\s*",e:b,i:"\\W"},{cN:"attribute",b:"\\.\\.\\.|-"+d.UIR},{cN:"subst",v:[{b:"->\\s*",c:[h]},{b:":=|/(?!\\w)=?|[-+*%=<>&|!?\\\\]+",r:0}]},{cN:"built_in",b:"\\.\\.?",r:0,c:[h]},{cN:"class",bK:"define",rE:true,e:"\\(|=>",c:[d.inherit(d.TM,{b:d.UIR+"(=(?!>))?"})]}];return{aliases:["ls","lassoscript"],cI:true,l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:"\\[|"+i,rE:true,r:0,c:[a]}},j,e,{cN:"preprocessor",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10}].concat(f)}});hljs.registerLanguage("r",function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[a.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("scala",function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bK:"extends with",r:10},a.UTM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage("livecodeserver",function(a){var e={cN:"variable",b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0};var b={cN:"comment",e:"$",v:[a.CBLCLM,a.HCM,{b:"--",},{b:"[^:]//",}]};var d=a.inherit(a.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]});var c=a.inherit(a.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:false,k:{keyword:"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if",constant:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",operator:"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write"},c:[e,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"function",bK:"end",e:"$",c:[c,d]},{cN:"command",bK:"command on",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"command",bK:"end",e:"$",c:[c,d]},{cN:"preprocessor",b:"<\\?rev|<\\?lc|<\\?livecode",r:10},{cN:"preprocessor",b:"<\\?"},{cN:"preprocessor",b:"\\?>"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:";$|^\\[|^="}});hljs.registerLanguage("profile",function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[a.UTM],r:0}]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("parser3",function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}});hljs.registerLanguage("actionscript",function(a){var c="[a-zA-Z_$][a-zA-Z0-9_$]*";var b="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var d={cN:"rest_arg",b:"[.]{3}",e:c,r:10};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bK:"package",e:"{",c:[a.TM]},{cN:"class",bK:"class interface",e:"{",c:[{bK:"extends implements"},a.TM]},{cN:"preprocessor",bK:"import include",e:";"},{cN:"function",bK:"function",e:"[{;]",i:"\\S",c:[a.TM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,d]},{cN:"type",b:":",e:b,r:10}]}]}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("vhdl",function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}});hljs.registerLanguage("fix",function(a){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:true,rB:false,cN:"attribute"},{b:/=/,e:/([\u2401\u0001])/,eE:true,eB:true,cN:"string"}]}],cI:true}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("smalltalk",function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"'},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":",r:0},a.CNM,c,d,{cN:"localvars",b:"\\|[ ]*"+b+"([ ]+"+b+")*[ ]*\\|",rB:true,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+b}]},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage("clojure",function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\S/,c:[o,m,{cN:"prompt",b:/^=> /,starts:{e:/\n\n|\Z/}}]}});hljs.registerLanguage("oxygene",function(b){var g="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained";var a={cN:"comment",b:"{",e:"}",r:0};var e={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}]};var d={cN:"string",b:"(#\\d+)+"};var f={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[b.TM,{cN:"params",b:"\\(",e:"\\)",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,e,b.CLCM,c,d,b.NM,f,{cN:"class",b:"=\\bclass\\b",e:"end;",k:g,c:[c,d,a,e,b.CLCM,f]}]}});hljs.registerLanguage("asciidoc",function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"smartquote",b:"``.+?''",r:10},{cN:"smartquote",b:"`.+?'",r:10},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage("erlang-repl",function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("autohotkey",function(b){var d={cN:"escape",b:"`[\\s\\S]"};var c={cN:"comment",b:";",e:"$",r:0};var a=[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},{cN:"built_in",bK:"ComSpec Clipboard ClipboardAll ErrorLevel"}];return{cI:true,k:{keyword:"Break Continue Else Gosub If Loop Return While",literal:"A true false NOT AND OR"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:"number",b:b.NR,r:0},{cN:"var_expand",b:"%",e:"%",i:"\\n",c:[d]},{cN:"label",c:[d],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,",r:10}])}});hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/jqtree/.gitignore b/dashboard/lib/assets/packages/jqtree/.gitignore
deleted file mode 100644
index e39040f..0000000
--- a/dashboard/lib/assets/packages/jqtree/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-build/dist
-docs
-.project
-*~
-*.diff
-*.patch
-.DS_Store
diff --git a/dashboard/lib/assets/packages/jqtree/jqtree.css b/dashboard/lib/assets/packages/jqtree/jqtree.css
deleted file mode 100644
index 2e96a33..0000000
--- a/dashboard/lib/assets/packages/jqtree/jqtree.css
+++ /dev/null
@@ -1,144 +0,0 @@
-ul.jqtree-tree {
-    margin-left: 12px;
-}
-
-ul.jqtree-tree,
-ul.jqtree-tree ul.jqtree_common {
-    list-style: none outside;
-    margin-bottom: 0;
-    padding: 0;
-}
-
-ul.jqtree-tree ul.jqtree_common {
-    display: block;
-    margin-left: 12px;
-    margin-right: 0;
-}
-ul.jqtree-tree li.jqtree-closed > ul.jqtree_common {
-    display: none;
-}
-
-ul.jqtree-tree li.jqtree_common {
-    clear: both;
-    list-style-type: none;
-}
-ul.jqtree-tree .jqtree-toggler {
-    display: block;
-    position: absolute;
-    left: -1.5em;
-    top: 30%;
-    *top: 0;  /* fix for ie7 */
-    font-size: 12px;
-    line-height: 12px;
-    font-family: arial;  /* fix for ie9 */
-    border-bottom: none;
-    color: #333;
-    text-decoration: none;
-}
-
-ul.jqtree-tree .jqtree-toggler:hover {
-    color: #000;
-    text-decoration: none;
-}
-
-ul.jqtree-tree .jqtree-element {
-    cursor: pointer;
-}
-
-ul.jqtree-tree .jqtree-title {
-    color: #1C4257;
-    vertical-align: middle;
-}
-
-ul.jqtree-tree li.jqtree-folder {
-    margin-bottom: 4px;
-}
-
-ul.jqtree-tree li.jqtree-folder.jqtree-closed {
-    margin-bottom: 1px;
-}
-
-ul.jqtree-tree li.jqtree-folder .jqtree-title {
-    margin-left: 0;
-}
-
-ul.jqtree-tree .jqtree-toggler.jqtree-closed {
-    background-position: 0 0;
-}
-
-span.jqtree-dragging {
-    color: #fff;
-    background: #000;
-    opacity: 0.6;
-    cursor: pointer;
-    padding: 2px 8px;
-}
-
-ul.jqtree-tree li.jqtree-ghost {
-    position: relative;
-    z-index: 10;
-    margin-right: 10px;
-}
-
-ul.jqtree-tree li.jqtree-ghost span {
-    display: block;
-}
-
-ul.jqtree-tree li.jqtree-ghost span.jqtree-circle {
-    background-image: url(jqtree-circle.png);
-    background-repeat: no-repeat;
-    height: 8px;
-    width: 8px;
-    position: absolute;
-    top: -4px;
-    left: 2px;
-}
-
-ul.jqtree-tree li.jqtree-ghost span.jqtree-line {
-    background-color: #0000ff;
-    height: 2px;
-    padding: 0;
-    position: absolute;
-    top: -1px;
-    left: 10px;
-    width: 100%;
-}
-
-ul.jqtree-tree li.jqtree-ghost.jqtree-inside {
-    margin-left: 48px;
-}
-
-ul.jqtree-tree span.jqtree-border {
-    position: absolute;
-    display: block;
-    left: -2px;
-    top: 0;
-    border: solid 2px #0000ff;
-    -webkit-border-radius: 6px;
-    -moz-border-radius: 6px;
-    border-radius: 6px;
-    margin: 0;
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-ul.jqtree-tree .jqtree-element {
-    width: 100%; /* todo: why is this in here? */
-    *width: auto; /* ie7 fix; issue 41 */
-    position: relative;
-}
-
-ul.jqtree-tree li.jqtree-selected > .jqtree-element,
-ul.jqtree-tree li.jqtree-selected > .jqtree-element:hover {
-    background-color: #97BDD6;
-    background: -webkit-gradient(linear, left top, left bottom, from(#BEE0F5), to(#89AFCA));
-    background: -moz-linear-gradient(top, #BEE0F5, #89AFCA);
-    background: -ms-linear-gradient(top, #BEE0F5, #89AFCA);
-    background: -o-linear-gradient(top, #BEE0F5, #89AFCA);
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
-}
-
-ul.jqtree-tree .jqtree-moving > .jqtree-element .jqtree-title {
-    outline: dashed 1px #0000ff;
-}
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/jqtree/tree.jquery.js b/dashboard/lib/assets/packages/jqtree/tree.jquery.js
deleted file mode 100644
index e081e9e..0000000
--- a/dashboard/lib/assets/packages/jqtree/tree.jquery.js
+++ /dev/null
@@ -1,2947 +0,0 @@
-// Generated by CoffeeScript 1.7.1
-
-/*
-Copyright 2013 Marco Braak
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- */
-
-(function() {
-  var $, BorderDropHint, DragAndDropHandler, DragElement, ElementsRenderer, FolderElement, GhostDropHint, HitAreasGenerator, JqTreeWidget, KeyHandler, MouseWidget, Node, NodeElement, Position, SaveStateHandler, ScrollHandler, SelectNodeHandler, SimpleWidget, VisibleNodeIterator, html_escape, indexOf, json_escapable, json_meta, json_quote, json_str, _indexOf,
-    __slice = [].slice,
-    __hasProp = {}.hasOwnProperty,
-    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
-
-  $ = this.jQuery;
-
-  SimpleWidget = (function() {
-    SimpleWidget.prototype.defaults = {};
-
-    function SimpleWidget(el, options) {
-      this.$el = $(el);
-      this.options = $.extend({}, this.defaults, options);
-    }
-
-    SimpleWidget.prototype.destroy = function() {
-      return this._deinit();
-    };
-
-    SimpleWidget.prototype._init = function() {
-      return null;
-    };
-
-    SimpleWidget.prototype._deinit = function() {
-      return null;
-    };
-
-    SimpleWidget.register = function(widget_class, widget_name) {
-      var callFunction, createWidget, destroyWidget, getDataKey, getWidgetData;
-      getDataKey = function() {
-        return "simple_widget_" + widget_name;
-      };
-      getWidgetData = function(el, data_key) {
-        var widget;
-        widget = $.data(el, data_key);
-        if (widget && (widget instanceof SimpleWidget)) {
-          return widget;
-        } else {
-          return null;
-        }
-      };
-      createWidget = function($el, options) {
-        var data_key, el, existing_widget, widget, _i, _len;
-        data_key = getDataKey();
-        for (_i = 0, _len = $el.length; _i < _len; _i++) {
-          el = $el[_i];
-          existing_widget = getWidgetData(el, data_key);
-          if (!existing_widget) {
-            widget = new widget_class(el, options);
-            if (!$.data(el, data_key)) {
-              $.data(el, data_key, widget);
-            }
-            widget._init();
-          }
-        }
-        return $el;
-      };
-      destroyWidget = function($el) {
-        var data_key, el, widget, _i, _len, _results;
-        data_key = getDataKey();
-        _results = [];
-        for (_i = 0, _len = $el.length; _i < _len; _i++) {
-          el = $el[_i];
-          widget = getWidgetData(el, data_key);
-          if (widget) {
-            widget.destroy();
-          }
-          _results.push($.removeData(el, data_key));
-        }
-        return _results;
-      };
-      callFunction = function($el, function_name, args) {
-        var el, result, widget, widget_function, _i, _len;
-        result = null;
-        for (_i = 0, _len = $el.length; _i < _len; _i++) {
-          el = $el[_i];
-          widget = $.data(el, getDataKey());
-          if (widget && (widget instanceof SimpleWidget)) {
-            widget_function = widget[function_name];
-            if (widget_function && (typeof widget_function === 'function')) {
-              result = widget_function.apply(widget, args);
-            }
-          }
-        }
-        return result;
-      };
-      return $.fn[widget_name] = function() {
-        var $el, args, argument1, function_name, options;
-        argument1 = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
-        $el = this;
-        if (argument1 === void 0 || typeof argument1 === 'object') {
-          options = argument1;
-          return createWidget($el, options);
-        } else if (typeof argument1 === 'string' && argument1[0] !== '_') {
-          function_name = argument1;
-          if (function_name === 'destroy') {
-            return destroyWidget($el);
-          } else {
-            return callFunction($el, function_name, args);
-          }
-        }
-      };
-    };
-
-    return SimpleWidget;
-
-  })();
-
-  this.SimpleWidget = SimpleWidget;
-
-
-  /*
-  This widget does the same a the mouse widget in jqueryui.
-   */
-
-  MouseWidget = (function(_super) {
-    __extends(MouseWidget, _super);
-
-    function MouseWidget() {
-      return MouseWidget.__super__.constructor.apply(this, arguments);
-    }
-
-    MouseWidget.is_mouse_handled = false;
-
-    MouseWidget.prototype._init = function() {
-      this.$el.bind('mousedown.mousewidget', $.proxy(this._mouseDown, this));
-      this.$el.bind('touchstart.mousewidget', $.proxy(this._touchStart, this));
-      this.is_mouse_started = false;
-      this.mouse_delay = 0;
-      this._mouse_delay_timer = null;
-      this._is_mouse_delay_met = true;
-      return this.mouse_down_info = null;
-    };
-
-    MouseWidget.prototype._deinit = function() {
-      var $document;
-      this.$el.unbind('mousedown.mousewidget');
-      this.$el.unbind('touchstart.mousewidget');
-      $document = $(document);
-      $document.unbind('mousemove.mousewidget');
-      return $document.unbind('mouseup.mousewidget');
-    };
-
-    MouseWidget.prototype._mouseDown = function(e) {
-      var result;
-      if (e.which !== 1) {
-        return;
-      }
-      result = this._handleMouseDown(e, this._getPositionInfo(e));
-      if (result) {
-        e.preventDefault();
-      }
-      return result;
-    };
-
-    MouseWidget.prototype._handleMouseDown = function(e, position_info) {
-      if (MouseWidget.is_mouse_handled) {
-        return;
-      }
-      if (this.is_mouse_started) {
-        this._handleMouseUp(position_info);
-      }
-      this.mouse_down_info = position_info;
-      if (!this._mouseCapture(position_info)) {
-        return;
-      }
-      this._handleStartMouse();
-      this.is_mouse_handled = true;
-      return true;
-    };
-
-    MouseWidget.prototype._handleStartMouse = function() {
-      var $document;
-      $document = $(document);
-      $document.bind('mousemove.mousewidget', $.proxy(this._mouseMove, this));
-      $document.bind('touchmove.mousewidget', $.proxy(this._touchMove, this));
-      $document.bind('mouseup.mousewidget', $.proxy(this._mouseUp, this));
-      $document.bind('touchend.mousewidget', $.proxy(this._touchEnd, this));
-      if (this.mouse_delay) {
-        return this._startMouseDelayTimer();
-      }
-    };
-
-    MouseWidget.prototype._startMouseDelayTimer = function() {
-      if (this._mouse_delay_timer) {
-        clearTimeout(this._mouse_delay_timer);
-      }
-      this._mouse_delay_timer = setTimeout((function(_this) {
-        return function() {
-          return _this._is_mouse_delay_met = true;
-        };
-      })(this), this.mouse_delay);
-      return this._is_mouse_delay_met = false;
-    };
-
-    MouseWidget.prototype._mouseMove = function(e) {
-      return this._handleMouseMove(e, this._getPositionInfo(e));
-    };
-
-    MouseWidget.prototype._handleMouseMove = function(e, position_info) {
-      if (this.is_mouse_started) {
-        this._mouseDrag(position_info);
-        return e.preventDefault();
-      }
-      if (this.mouse_delay && !this._is_mouse_delay_met) {
-        return true;
-      }
-      this.is_mouse_started = this._mouseStart(this.mouse_down_info) !== false;
-      if (this.is_mouse_started) {
-        this._mouseDrag(position_info);
-      } else {
-        this._handleMouseUp(position_info);
-      }
-      return !this.is_mouse_started;
-    };
-
-    MouseWidget.prototype._getPositionInfo = function(e) {
-      return {
-        page_x: e.pageX,
-        page_y: e.pageY,
-        target: e.target,
-        original_event: e
-      };
-    };
-
-    MouseWidget.prototype._mouseUp = function(e) {
-      return this._handleMouseUp(this._getPositionInfo(e));
-    };
-
-    MouseWidget.prototype._handleMouseUp = function(position_info) {
-      var $document;
-      $document = $(document);
-      $document.unbind('mousemove.mousewidget');
-      $document.unbind('touchmove.mousewidget');
-      $document.unbind('mouseup.mousewidget');
-      $document.unbind('touchend.mousewidget');
-      if (this.is_mouse_started) {
-        this.is_mouse_started = false;
-        this._mouseStop(position_info);
-      }
-    };
-
-    MouseWidget.prototype._mouseCapture = function(position_info) {
-      return true;
-    };
-
-    MouseWidget.prototype._mouseStart = function(position_info) {
-      return null;
-    };
-
-    MouseWidget.prototype._mouseDrag = function(position_info) {
-      return null;
-    };
-
-    MouseWidget.prototype._mouseStop = function(position_info) {
-      return null;
-    };
-
-    MouseWidget.prototype.setMouseDelay = function(mouse_delay) {
-      return this.mouse_delay = mouse_delay;
-    };
-
-    MouseWidget.prototype._touchStart = function(e) {
-      var touch;
-      if (e.originalEvent.touches.length > 1) {
-        return;
-      }
-      touch = e.originalEvent.changedTouches[0];
-      return this._handleMouseDown(e, this._getPositionInfo(touch));
-    };
-
-    MouseWidget.prototype._touchMove = function(e) {
-      var touch;
-      if (e.originalEvent.touches.length > 1) {
-        return;
-      }
-      touch = e.originalEvent.changedTouches[0];
-      return this._handleMouseMove(e, this._getPositionInfo(touch));
-    };
-
-    MouseWidget.prototype._touchEnd = function(e) {
-      var touch;
-      if (e.originalEvent.touches.length > 1) {
-        return;
-      }
-      touch = e.originalEvent.changedTouches[0];
-      return this._handleMouseUp(this._getPositionInfo(touch));
-    };
-
-    return MouseWidget;
-
-  })(SimpleWidget);
-
-  this.Tree = {};
-
-  $ = this.jQuery;
-
-  Position = {
-    getName: function(position) {
-      return Position.strings[position - 1];
-    },
-    nameToIndex: function(name) {
-      var i, _i, _ref;
-      for (i = _i = 1, _ref = Position.strings.length; 1 <= _ref ? _i <= _ref : _i >= _ref; i = 1 <= _ref ? ++_i : --_i) {
-        if (Position.strings[i - 1] === name) {
-          return i;
-        }
-      }
-      return 0;
-    }
-  };
-
-  Position.BEFORE = 1;
-
-  Position.AFTER = 2;
-
-  Position.INSIDE = 3;
-
-  Position.NONE = 4;
-
-  Position.strings = ['before', 'after', 'inside', 'none'];
-
-  this.Tree.Position = Position;
-
-  Node = (function() {
-    function Node(o, is_root, node_class) {
-      if (is_root == null) {
-        is_root = false;
-      }
-      if (node_class == null) {
-        node_class = Node;
-      }
-      this.setData(o);
-      this.children = [];
-      this.parent = null;
-      if (is_root) {
-        this.id_mapping = {};
-        this.tree = this;
-        this.node_class = node_class;
-      }
-    }
-
-    Node.prototype.setData = function(o) {
-      var key, value, _results;
-      if (typeof o !== 'object') {
-        return this.name = o;
-      } else {
-        _results = [];
-        for (key in o) {
-          value = o[key];
-          if (key === 'label') {
-            _results.push(this.name = value);
-          } else {
-            _results.push(this[key] = value);
-          }
-        }
-        return _results;
-      }
-    };
-
-    Node.prototype.initFromData = function(data) {
-      var addChildren, addNode;
-      addNode = (function(_this) {
-        return function(node_data) {
-          _this.setData(node_data);
-          if (node_data.children) {
-            return addChildren(node_data.children);
-          }
-        };
-      })(this);
-      addChildren = (function(_this) {
-        return function(children_data) {
-          var child, node, _i, _len;
-          for (_i = 0, _len = children_data.length; _i < _len; _i++) {
-            child = children_data[_i];
-            node = new _this.tree.node_class('');
-            node.initFromData(child);
-            _this.addChild(node);
-          }
-          return null;
-        };
-      })(this);
-      addNode(data);
-      return null;
-    };
-
-
-    /*
-    Create tree from data.
-    
-    Structure of data is:
-    [
-        {
-            label: 'node1',
-            children: [
-                { label: 'child1' },
-                { label: 'child2' }
-            ]
-        },
-        {
-            label: 'node2'
-        }
-    ]
-     */
-
-    Node.prototype.loadFromData = function(data) {
-      var node, o, _i, _len;
-      this.removeChildren();
-      for (_i = 0, _len = data.length; _i < _len; _i++) {
-        o = data[_i];
-        node = new this.tree.node_class(o);
-        this.addChild(node);
-        if (typeof o === 'object' && o.children) {
-          node.loadFromData(o.children);
-        }
-      }
-      return null;
-    };
-
-
-    /*
-    Add child.
-    
-    tree.addChild(
-        new Node('child1')
-    );
-     */
-
-    Node.prototype.addChild = function(node) {
-      this.children.push(node);
-      return node._setParent(this);
-    };
-
-
-    /*
-    Add child at position. Index starts at 0.
-    
-    tree.addChildAtPosition(
-        new Node('abc'),
-        1
-    );
-     */
-
-    Node.prototype.addChildAtPosition = function(node, index) {
-      this.children.splice(index, 0, node);
-      return node._setParent(this);
-    };
-
-    Node.prototype._setParent = function(parent) {
-      this.parent = parent;
-      this.tree = parent.tree;
-      return this.tree.addNodeToIndex(this);
-    };
-
-
-    /*
-    Remove child. This also removes the children of the node.
-    
-    tree.removeChild(tree.children[0]);
-     */
-
-    Node.prototype.removeChild = function(node) {
-      node.removeChildren();
-      return this._removeChild(node);
-    };
-
-    Node.prototype._removeChild = function(node) {
-      this.children.splice(this.getChildIndex(node), 1);
-      return this.tree.removeNodeFromIndex(node);
-    };
-
-
-    /*
-    Get child index.
-    
-    var index = getChildIndex(node);
-     */
-
-    Node.prototype.getChildIndex = function(node) {
-      return $.inArray(node, this.children);
-    };
-
-
-    /*
-    Does the tree have children?
-    
-    if (tree.hasChildren()) {
-        //
-    }
-     */
-
-    Node.prototype.hasChildren = function() {
-      return this.children.length !== 0;
-    };
-
-    Node.prototype.isFolder = function() {
-      return this.hasChildren() || this.load_on_demand;
-    };
-
-
-    /*
-    Iterate over all the nodes in the tree.
-    
-    Calls callback with (node, level).
-    
-    The callback must return true to continue the iteration on current node.
-    
-    tree.iterate(
-        function(node, level) {
-           console.log(node.name);
-    
-           // stop iteration after level 2
-           return (level <= 2);
-        }
-    );
-     */
-
-    Node.prototype.iterate = function(callback) {
-      var _iterate;
-      _iterate = (function(_this) {
-        return function(node, level) {
-          var child, result, _i, _len, _ref;
-          if (node.children) {
-            _ref = node.children;
-            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-              child = _ref[_i];
-              result = callback(child, level);
-              if (_this.hasChildren() && result) {
-                _iterate(child, level + 1);
-              }
-            }
-            return null;
-          }
-        };
-      })(this);
-      _iterate(this, 0);
-      return null;
-    };
-
-
-    /*
-    Move node relative to another node.
-    
-    Argument position: Position.BEFORE, Position.AFTER or Position.Inside
-    
-    // move node1 after node2
-    tree.moveNode(node1, node2, Position.AFTER);
-     */
-
-    Node.prototype.moveNode = function(moved_node, target_node, position) {
-      if (moved_node.isParentOf(target_node)) {
-        return;
-      }
-      moved_node.parent._removeChild(moved_node);
-      if (position === Position.AFTER) {
-        return target_node.parent.addChildAtPosition(moved_node, target_node.parent.getChildIndex(target_node) + 1);
-      } else if (position === Position.BEFORE) {
-        return target_node.parent.addChildAtPosition(moved_node, target_node.parent.getChildIndex(target_node));
-      } else if (position === Position.INSIDE) {
-        return target_node.addChildAtPosition(moved_node, 0);
-      }
-    };
-
-
-    /*
-    Get the tree as data.
-     */
-
-    Node.prototype.getData = function() {
-      var getDataFromNodes;
-      getDataFromNodes = (function(_this) {
-        return function(nodes) {
-          var data, k, node, tmp_node, v, _i, _len;
-          data = [];
-          for (_i = 0, _len = nodes.length; _i < _len; _i++) {
-            node = nodes[_i];
-            tmp_node = {};
-            for (k in node) {
-              v = node[k];
-              if ((k !== 'parent' && k !== 'children' && k !== 'element' && k !== 'tree') && Object.prototype.hasOwnProperty.call(node, k)) {
-                tmp_node[k] = v;
-              }
-            }
-            if (node.hasChildren()) {
-              tmp_node.children = getDataFromNodes(node.children);
-            }
-            data.push(tmp_node);
-          }
-          return data;
-        };
-      })(this);
-      return getDataFromNodes(this.children);
-    };
-
-    Node.prototype.getNodeByName = function(name) {
-      var result;
-      result = null;
-      this.iterate(function(node) {
-        if (node.name === name) {
-          result = node;
-          return false;
-        } else {
-          return true;
-        }
-      });
-      return result;
-    };
-
-    Node.prototype.addAfter = function(node_info) {
-      var child_index, node;
-      if (!this.parent) {
-        return null;
-      } else {
-        node = new this.tree.node_class(node_info);
-        child_index = this.parent.getChildIndex(this);
-        this.parent.addChildAtPosition(node, child_index + 1);
-        return node;
-      }
-    };
-
-    Node.prototype.addBefore = function(node_info) {
-      var child_index, node;
-      if (!this.parent) {
-        return null;
-      } else {
-        node = new this.tree.node_class(node_info);
-        child_index = this.parent.getChildIndex(this);
-        this.parent.addChildAtPosition(node, child_index);
-        return node;
-      }
-    };
-
-    Node.prototype.addParent = function(node_info) {
-      var child, new_parent, original_parent, _i, _len, _ref;
-      if (!this.parent) {
-        return null;
-      } else {
-        new_parent = new this.tree.node_class(node_info);
-        new_parent._setParent(this.tree);
-        original_parent = this.parent;
-        _ref = original_parent.children;
-        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-          child = _ref[_i];
-          new_parent.addChild(child);
-        }
-        original_parent.children = [];
-        original_parent.addChild(new_parent);
-        return new_parent;
-      }
-    };
-
-    Node.prototype.remove = function() {
-      if (this.parent) {
-        this.parent.removeChild(this);
-        return this.parent = null;
-      }
-    };
-
-    Node.prototype.append = function(node_info) {
-      var node;
-      node = new this.tree.node_class(node_info);
-      this.addChild(node);
-      return node;
-    };
-
-    Node.prototype.prepend = function(node_info) {
-      var node;
-      node = new this.tree.node_class(node_info);
-      this.addChildAtPosition(node, 0);
-      return node;
-    };
-
-    Node.prototype.isParentOf = function(node) {
-      var parent;
-      parent = node.parent;
-      while (parent) {
-        if (parent === this) {
-          return true;
-        }
-        parent = parent.parent;
-      }
-      return false;
-    };
-
-    Node.prototype.getLevel = function() {
-      var level, node;
-      level = 0;
-      node = this;
-      while (node.parent) {
-        level += 1;
-        node = node.parent;
-      }
-      return level;
-    };
-
-    Node.prototype.getNodeById = function(node_id) {
-      return this.id_mapping[node_id];
-    };
-
-    Node.prototype.addNodeToIndex = function(node) {
-      if (node.id != null) {
-        return this.id_mapping[node.id] = node;
-      }
-    };
-
-    Node.prototype.removeNodeFromIndex = function(node) {
-      if (node.id != null) {
-        return delete this.id_mapping[node.id];
-      }
-    };
-
-    Node.prototype.removeChildren = function() {
-      this.iterate((function(_this) {
-        return function(child) {
-          _this.tree.removeNodeFromIndex(child);
-          return true;
-        };
-      })(this));
-      return this.children = [];
-    };
-
-    Node.prototype.getPreviousSibling = function() {
-      var previous_index;
-      if (!this.parent) {
-        return null;
-      } else {
-        previous_index = this.parent.getChildIndex(this) - 1;
-        if (previous_index >= 0) {
-          return this.parent.children[previous_index];
-        } else {
-          return null;
-        }
-      }
-    };
-
-    Node.prototype.getNextSibling = function() {
-      var next_index;
-      if (!this.parent) {
-        return null;
-      } else {
-        next_index = this.parent.getChildIndex(this) + 1;
-        if (next_index < this.parent.children.length) {
-          return this.parent.children[next_index];
-        } else {
-          return null;
-        }
-      }
-    };
-
-    return Node;
-
-  })();
-
-  this.Tree.Node = Node;
-
-  ElementsRenderer = (function() {
-    function ElementsRenderer(tree_widget) {
-      this.tree_widget = tree_widget;
-      this.opened_icon_text = this.getHtmlText(tree_widget.options.openedIcon);
-      this.closed_icon_text = this.getHtmlText(tree_widget.options.closedIcon);
-    }
-
-    ElementsRenderer.prototype.render = function(from_node) {
-      if (from_node && from_node.parent) {
-        return this.renderFromNode(from_node);
-      } else {
-        return this.renderFromRoot();
-      }
-    };
-
-    ElementsRenderer.prototype.renderNode = function(node) {
-      var $li, $parent_ul, parent_node_element, previous_node;
-      $(node.element).remove();
-      parent_node_element = new NodeElement(node.parent, this.tree_widget);
-      $parent_ul = parent_node_element.getUl();
-      $li = this.createLi(node);
-      this.attachNodeData(node, $li);
-      previous_node = node.getPreviousSibling();
-      if (previous_node) {
-        $(previous_node.element).after($li);
-      } else {
-        parent_node_element.getUl().prepend($li);
-      }
-      if (node.children) {
-        return this.renderFromNode(node);
-      }
-    };
-
-    ElementsRenderer.prototype.renderFromRoot = function() {
-      var $element;
-      $element = this.tree_widget.element;
-      $element.empty();
-      return this.createDomElements($element[0], this.tree_widget.tree.children, true, true);
-    };
-
-    ElementsRenderer.prototype.renderFromNode = function(from_node) {
-      var node_element;
-      node_element = this.tree_widget._getNodeElementForNode(from_node);
-      node_element.getUl().remove();
-      return this.createDomElements(node_element.$element[0], from_node.children, false, false);
-    };
-
-    ElementsRenderer.prototype.createDomElements = function(element, children, is_root_node, is_open) {
-      var child, li, ul, _i, _len;
-      ul = this.createUl(is_root_node);
-      element.appendChild(ul);
-      for (_i = 0, _len = children.length; _i < _len; _i++) {
-        child = children[_i];
-        li = this.createLi(child);
-        ul.appendChild(li);
-        this.attachNodeData(child, li);
-        if (child.hasChildren()) {
-          this.createDomElements(li, child.children, false, child.is_open);
-        }
-      }
-      return null;
-    };
-
-    ElementsRenderer.prototype.attachNodeData = function(node, li) {
-      node.element = li;
-      return $(li).data('node', node);
-    };
-
-    ElementsRenderer.prototype.createUl = function(is_root_node) {
-      var class_string, ul;
-      if (is_root_node) {
-        class_string = 'jqtree-tree';
-      } else {
-        class_string = '';
-      }
-      ul = document.createElement('ul');
-      ul.className = "jqtree_common " + class_string;
-      return ul;
-    };
-
-    ElementsRenderer.prototype.createLi = function(node) {
-      var li;
-      if (node.isFolder()) {
-        li = this.createFolderLi(node);
-      } else {
-        li = this.createNodeLi(node);
-      }
-      if (this.tree_widget.options.onCreateLi) {
-        this.tree_widget.options.onCreateLi(node, $(li));
-      }
-      return li;
-    };
-
-    ElementsRenderer.prototype.createFolderLi = function(node) {
-      var button_char, button_classes, button_link, div, escaped_name, folder_classes, li, title_span;
-      button_classes = this.getButtonClasses(node);
-      folder_classes = this.getFolderClasses(node);
-      escaped_name = this.escapeIfNecessary(node.name);
-      if (node.is_open) {
-        button_char = this.opened_icon_text;
-      } else {
-        button_char = this.closed_icon_text;
-      }
-      li = document.createElement('li');
-      li.className = "jqtree_common " + folder_classes;
-      div = document.createElement('div');
-      div.className = "jqtree-element jqtree_common";
-      li.appendChild(div);
-      button_link = document.createElement('a');
-      button_link.className = "jqtree_common " + button_classes;
-      button_link.appendChild(document.createTextNode(button_char));
-      div.appendChild(button_link);
-      title_span = document.createElement('span');
-      title_span.className = "jqtree_common jqtree-title";
-      div.appendChild(title_span);
-      title_span.innerHTML = escaped_name;
-      return li;
-    };
-
-    ElementsRenderer.prototype.createNodeLi = function(node) {
-      var class_string, div, escaped_name, li, li_classes, title_span;
-      li_classes = ['jqtree_common'];
-      if (this.tree_widget.select_node_handler && this.tree_widget.select_node_handler.isNodeSelected(node)) {
-        li_classes.push('jqtree-selected');
-      }
-      class_string = li_classes.join(' ');
-      escaped_name = this.escapeIfNecessary(node.name);
-      li = document.createElement('li');
-      li.className = class_string;
-      div = document.createElement('div');
-      div.className = "jqtree-element jqtree_common";
-      li.appendChild(div);
-      title_span = document.createElement('span');
-      title_span.className = "jqtree-title jqtree_common";
-      title_span.innerHTML = escaped_name;
-      div.appendChild(title_span);
-      return li;
-    };
-
-    ElementsRenderer.prototype.getButtonClasses = function(node) {
-      var classes;
-      classes = ['jqtree-toggler'];
-      if (!node.is_open) {
-        classes.push('jqtree-closed');
-      }
-      return classes.join(' ');
-    };
-
-    ElementsRenderer.prototype.getFolderClasses = function(node) {
-      var classes;
-      classes = ['jqtree-folder'];
-      if (!node.is_open) {
-        classes.push('jqtree-closed');
-      }
-      if (this.tree_widget.select_node_handler && this.tree_widget.select_node_handler.isNodeSelected(node)) {
-        classes.push('jqtree-selected');
-      }
-      return classes.join(' ');
-    };
-
-    ElementsRenderer.prototype.escapeIfNecessary = function(value) {
-      if (this.tree_widget.options.autoEscape) {
-        return html_escape(value);
-      } else {
-        return value;
-      }
-    };
-
-    ElementsRenderer.prototype.getHtmlText = function(entity_text) {
-      return $(document.createElement('div')).html(entity_text).text();
-    };
-
-    return ElementsRenderer;
-
-  })();
-
-
-  /*
-  Copyright 2013 Marco Braak
-  
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-  
-      http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-   */
-
-  JqTreeWidget = (function(_super) {
-    __extends(JqTreeWidget, _super);
-
-    function JqTreeWidget() {
-      return JqTreeWidget.__super__.constructor.apply(this, arguments);
-    }
-
-    JqTreeWidget.prototype.defaults = {
-      autoOpen: false,
-      saveState: false,
-      dragAndDrop: false,
-      selectable: true,
-      useContextMenu: true,
-      onCanSelectNode: null,
-      onSetStateFromStorage: null,
-      onGetStateFromStorage: null,
-      onCreateLi: null,
-      onIsMoveHandle: null,
-      onCanMove: null,
-      onCanMoveTo: null,
-      onLoadFailed: null,
-      autoEscape: true,
-      dataUrl: null,
-      closedIcon: '&#x25ba;',
-      openedIcon: '&#x25bc;',
-      slide: true,
-      nodeClass: Node,
-      dataFilter: null,
-      keyboardSupport: true,
-      openFolderDelay: 500
-    };
-
-    JqTreeWidget.prototype.toggle = function(node, slide) {
-      if (slide == null) {
-        slide = true;
-      }
-      if (node.is_open) {
-        return this.closeNode(node, slide);
-      } else {
-        return this.openNode(node, slide);
-      }
-    };
-
-    JqTreeWidget.prototype.getTree = function() {
-      return this.tree;
-    };
-
-    JqTreeWidget.prototype.selectNode = function(node) {
-      return this._selectNode(node, false);
-    };
-
-    JqTreeWidget.prototype._selectNode = function(node, must_toggle) {
-      var canSelect, deselected_node, openParents, saveState;
-      if (must_toggle == null) {
-        must_toggle = false;
-      }
-      if (!this.select_node_handler) {
-        return;
-      }
-      canSelect = (function(_this) {
-        return function() {
-          if (_this.options.onCanSelectNode) {
-            return _this.options.selectable && _this.options.onCanSelectNode(node);
-          } else {
-            return _this.options.selectable;
-          }
-        };
-      })(this);
-      openParents = (function(_this) {
-        return function() {
-          var parent;
-          parent = node.parent;
-          if (parent && parent.parent && !parent.is_open) {
-            return _this.openNode(parent, false);
-          }
-        };
-      })(this);
-      saveState = (function(_this) {
-        return function() {
-          if (_this.options.saveState) {
-            return _this.save_state_handler.saveState();
-          }
-        };
-      })(this);
-      if (!node) {
-        this._deselectCurrentNode();
-        saveState();
-        return;
-      }
-      if (!canSelect()) {
-        return;
-      }
-      if (this.select_node_handler.isNodeSelected(node)) {
-        if (must_toggle) {
-          this._deselectCurrentNode();
-          this._triggerEvent('tree.select', {
-            node: null,
-            previous_node: node
-          });
-        }
-      } else {
-        deselected_node = this.getSelectedNode();
-        this._deselectCurrentNode();
-        this.addToSelection(node);
-        this._triggerEvent('tree.select', {
-          node: node,
-          deselected_node: deselected_node
-        });
-        openParents();
-      }
-      return saveState();
-    };
-
-    JqTreeWidget.prototype.getSelectedNode = function() {
-      return this.select_node_handler.getSelectedNode();
-    };
-
-    JqTreeWidget.prototype.toJson = function() {
-      return JSON.stringify(this.tree.getData());
-    };
-
-    JqTreeWidget.prototype.loadData = function(data, parent_node) {
-      return this._loadData(data, parent_node);
-    };
-
-    JqTreeWidget.prototype.loadDataFromUrl = function(url, parent_node, on_finished) {
-      if ($.type(url) !== 'string') {
-        on_finished = parent_node;
-        parent_node = url;
-        url = null;
-      }
-      return this._loadDataFromUrl(url, parent_node, on_finished);
-    };
-
-    JqTreeWidget.prototype.reload = function() {
-      return this.loadDataFromUrl();
-    };
-
-    JqTreeWidget.prototype._loadDataFromUrl = function(url_info, parent_node, on_finished) {
-      var $el, addLoadingClass, parseUrlInfo, removeLoadingClass;
-      $el = null;
-      addLoadingClass = (function(_this) {
-        return function() {
-          var folder_element;
-          if (!parent_node) {
-            $el = _this.element;
-          } else {
-            folder_element = new FolderElement(parent_node, _this);
-            $el = folder_element.getLi();
-          }
-          return $el.addClass('jqtree-loading');
-        };
-      })(this);
-      removeLoadingClass = (function(_this) {
-        return function() {
-          if ($el) {
-            return $el.removeClass('jqtree-loading');
-          }
-        };
-      })(this);
-      parseUrlInfo = (function(_this) {
-        return function() {
-          if ($.type(url_info) === 'string') {
-            url_info = {
-              url: url_info
-            };
-          }
-          if (!url_info.method) {
-            return url_info.method = 'get';
-          }
-        };
-      })(this);
-      addLoadingClass();
-      if (!url_info) {
-        url_info = this._getDataUrlInfo(parent_node);
-      }
-      parseUrlInfo();
-      return $.ajax({
-        url: url_info.url,
-        data: url_info.data,
-        type: url_info.method.toUpperCase(),
-        cache: false,
-        dataType: 'json',
-        success: (function(_this) {
-          return function(response) {
-            var data;
-            if ($.isArray(response) || typeof response === 'object') {
-              data = response;
-            } else {
-              data = $.parseJSON(response);
-            }
-            if (_this.options.dataFilter) {
-              data = _this.options.dataFilter(data);
-            }
-            removeLoadingClass();
-            _this._loadData(data, parent_node);
-            if (on_finished && $.isFunction(on_finished)) {
-              return on_finished();
-            }
-          };
-        })(this),
-        error: (function(_this) {
-          return function(response) {
-            removeLoadingClass();
-            if (_this.options.onLoadFailed) {
-              return _this.options.onLoadFailed(response);
-            }
-          };
-        })(this)
-      });
-    };
-
-    JqTreeWidget.prototype._loadData = function(data, parent_node) {
-      var n, selected_nodes_under_parent, _i, _len;
-      if (!data) {
-        return;
-      }
-      this._triggerEvent('tree.load_data', {
-        tree_data: data
-      });
-      if (!parent_node) {
-        this._initTree(data);
-      } else {
-        selected_nodes_under_parent = this.select_node_handler.getSelectedNodesUnder(parent_node);
-        for (_i = 0, _len = selected_nodes_under_parent.length; _i < _len; _i++) {
-          n = selected_nodes_under_parent[_i];
-          this.select_node_handler.removeFromSelection(n);
-        }
-        parent_node.loadFromData(data);
-        parent_node.load_on_demand = false;
-        this._refreshElements(parent_node.parent);
-      }
-      if (this.is_dragging) {
-        return this.dnd_handler.refreshHitAreas();
-      }
-    };
-
-    JqTreeWidget.prototype.getNodeById = function(node_id) {
-      return this.tree.getNodeById(node_id);
-    };
-
-    JqTreeWidget.prototype.getNodeByName = function(name) {
-      return this.tree.getNodeByName(name);
-    };
-
-    JqTreeWidget.prototype.openNode = function(node, slide) {
-      if (slide == null) {
-        slide = true;
-      }
-      return this._openNode(node, slide);
-    };
-
-    JqTreeWidget.prototype._openNode = function(node, slide, on_finished) {
-      var doOpenNode, parent;
-      if (slide == null) {
-        slide = true;
-      }
-      doOpenNode = (function(_this) {
-        return function(_node, _slide, _on_finished) {
-          var folder_element;
-          folder_element = new FolderElement(_node, _this);
-          return folder_element.open(_on_finished, _slide);
-        };
-      })(this);
-      if (node.isFolder()) {
-        if (node.load_on_demand) {
-          return this._loadFolderOnDemand(node, slide, on_finished);
-        } else {
-          parent = node.parent;
-          while (parent && !parent.is_open) {
-            if (parent.parent) {
-              doOpenNode(parent, false, null);
-            }
-            parent = parent.parent;
-          }
-          doOpenNode(node, slide, on_finished);
-          return this._saveState();
-        }
-      }
-    };
-
-    JqTreeWidget.prototype._loadFolderOnDemand = function(node, slide, on_finished) {
-      if (slide == null) {
-        slide = true;
-      }
-      return this._loadDataFromUrl(null, node, (function(_this) {
-        return function() {
-          return _this._openNode(node, slide, on_finished);
-        };
-      })(this));
-    };
-
-    JqTreeWidget.prototype.closeNode = function(node, slide) {
-      if (slide == null) {
-        slide = true;
-      }
-      if (node.isFolder()) {
-        new FolderElement(node, this).close(slide);
-        return this._saveState();
-      }
-    };
-
-    JqTreeWidget.prototype.isDragging = function() {
-      return this.is_dragging;
-    };
-
-    JqTreeWidget.prototype.refreshHitAreas = function() {
-      return this.dnd_handler.refreshHitAreas();
-    };
-
-    JqTreeWidget.prototype.addNodeAfter = function(new_node_info, existing_node) {
-      var new_node;
-      new_node = existing_node.addAfter(new_node_info);
-      this._refreshElements(existing_node.parent);
-      return new_node;
-    };
-
-    JqTreeWidget.prototype.addNodeBefore = function(new_node_info, existing_node) {
-      var new_node;
-      new_node = existing_node.addBefore(new_node_info);
-      this._refreshElements(existing_node.parent);
-      return new_node;
-    };
-
-    JqTreeWidget.prototype.addParentNode = function(new_node_info, existing_node) {
-      var new_node;
-      new_node = existing_node.addParent(new_node_info);
-      this._refreshElements(new_node.parent);
-      return new_node;
-    };
-
-    JqTreeWidget.prototype.removeNode = function(node) {
-      var parent;
-      parent = node.parent;
-      if (parent) {
-        this.select_node_handler.removeFromSelection(node, true);
-        node.remove();
-        return this._refreshElements(parent.parent);
-      }
-    };
-
-    JqTreeWidget.prototype.appendNode = function(new_node_info, parent_node) {
-      var is_already_folder_node, node;
-      if (!parent_node) {
-        parent_node = this.tree;
-      }
-      is_already_folder_node = parent_node.isFolder();
-      node = parent_node.append(new_node_info);
-      if (is_already_folder_node) {
-        this._refreshElements(parent_node);
-      } else {
-        this._refreshElements(parent_node.parent);
-      }
-      return node;
-    };
-
-    JqTreeWidget.prototype.prependNode = function(new_node_info, parent_node) {
-      var node;
-      if (!parent_node) {
-        parent_node = this.tree;
-      }
-      node = parent_node.prepend(new_node_info);
-      this._refreshElements(parent_node);
-      return node;
-    };
-
-    JqTreeWidget.prototype.updateNode = function(node, data) {
-      var id_is_changed;
-      id_is_changed = data.id && data.id !== node.id;
-      if (id_is_changed) {
-        this.tree.removeNodeFromIndex(node);
-      }
-      node.setData(data);
-      if (id_is_changed) {
-        this.tree.addNodeToIndex(node);
-      }
-      this.renderer.renderNode(node);
-      return this._selectCurrentNode();
-    };
-
-    JqTreeWidget.prototype.moveNode = function(node, target_node, position) {
-      var position_index;
-      position_index = Position.nameToIndex(position);
-      this.tree.moveNode(node, target_node, position_index);
-      return this._refreshElements();
-    };
-
-    JqTreeWidget.prototype.getStateFromStorage = function() {
-      return this.save_state_handler.getStateFromStorage();
-    };
-
-    JqTreeWidget.prototype.addToSelection = function(node) {
-      this.select_node_handler.addToSelection(node);
-      return this._getNodeElementForNode(node).select();
-    };
-
-    JqTreeWidget.prototype.getSelectedNodes = function() {
-      return this.select_node_handler.getSelectedNodes();
-    };
-
-    JqTreeWidget.prototype.isNodeSelected = function(node) {
-      return this.select_node_handler.isNodeSelected(node);
-    };
-
-    JqTreeWidget.prototype.removeFromSelection = function(node) {
-      this.select_node_handler.removeFromSelection(node);
-      return this._getNodeElementForNode(node).deselect();
-    };
-
-    JqTreeWidget.prototype.scrollToNode = function(node) {
-      var $element, top;
-      $element = $(node.element);
-      top = $element.offset().top - this.$el.offset().top;
-      return this.scroll_handler.scrollTo(top);
-    };
-
-    JqTreeWidget.prototype.getState = function() {
-      return this.save_state_handler.getState();
-    };
-
-    JqTreeWidget.prototype.setState = function(state) {
-      this.save_state_handler.setState(state);
-      return this._refreshElements();
-    };
-
-    JqTreeWidget.prototype.setOption = function(option, value) {
-      return this.options[option] = value;
-    };
-
-    JqTreeWidget.prototype._init = function() {
-      JqTreeWidget.__super__._init.call(this);
-      this.element = this.$el;
-      this.mouse_delay = 300;
-      this.is_initialized = false;
-      this.renderer = new ElementsRenderer(this);
-      if (typeof SaveStateHandler !== "undefined" && SaveStateHandler !== null) {
-        this.save_state_handler = new SaveStateHandler(this);
-      } else {
-        this.options.saveState = false;
-      }
-      if (typeof SelectNodeHandler !== "undefined" && SelectNodeHandler !== null) {
-        this.select_node_handler = new SelectNodeHandler(this);
-      }
-      if (typeof DragAndDropHandler !== "undefined" && DragAndDropHandler !== null) {
-        this.dnd_handler = new DragAndDropHandler(this);
-      } else {
-        this.options.dragAndDrop = false;
-      }
-      if (typeof ScrollHandler !== "undefined" && ScrollHandler !== null) {
-        this.scroll_handler = new ScrollHandler(this);
-      }
-      if ((typeof KeyHandler !== "undefined" && KeyHandler !== null) && (typeof SelectNodeHandler !== "undefined" && SelectNodeHandler !== null)) {
-        this.key_handler = new KeyHandler(this);
-      }
-      this._initData();
-      this.element.click($.proxy(this._click, this));
-      this.element.dblclick($.proxy(this._dblclick, this));
-      if (this.options.useContextMenu) {
-        return this.element.bind('contextmenu', $.proxy(this._contextmenu, this));
-      }
-    };
-
-    JqTreeWidget.prototype._deinit = function() {
-      this.element.empty();
-      this.element.unbind();
-      this.key_handler.deinit();
-      this.tree = null;
-      return JqTreeWidget.__super__._deinit.call(this);
-    };
-
-    JqTreeWidget.prototype._initData = function() {
-      if (this.options.data) {
-        return this._loadData(this.options.data);
-      } else {
-        return this._loadDataFromUrl(this._getDataUrlInfo());
-      }
-    };
-
-    JqTreeWidget.prototype._getDataUrlInfo = function(node) {
-      var data_url, getUrlFromString;
-      data_url = this.options.dataUrl || this.element.data('url');
-      getUrlFromString = (function(_this) {
-        return function() {
-          var data, selected_node_id, url_info;
-          url_info = {
-            url: data_url
-          };
-          if (node && node.id) {
-            data = {
-              node: node.id
-            };
-            url_info['data'] = data;
-          } else {
-            selected_node_id = _this._getNodeIdToBeSelected();
-            if (selected_node_id) {
-              data = {
-                selected_node: selected_node_id
-              };
-              url_info['data'] = data;
-            }
-          }
-          return url_info;
-        };
-      })(this);
-      if ($.isFunction(data_url)) {
-        return data_url(node);
-      } else if ($.type(data_url) === 'string') {
-        return getUrlFromString();
-      } else {
-        return data_url;
-      }
-    };
-
-    JqTreeWidget.prototype._getNodeIdToBeSelected = function() {
-      if (this.options.saveState) {
-        return this.save_state_handler.getNodeIdToBeSelected();
-      } else {
-        return null;
-      }
-    };
-
-    JqTreeWidget.prototype._initTree = function(data) {
-      this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);
-      if (this.select_node_handler) {
-        this.select_node_handler.clear();
-      }
-      this.tree.loadFromData(data);
-      this._openNodes();
-      this._refreshElements();
-      if (!this.is_initialized) {
-        this.is_initialized = true;
-        return this._triggerEvent('tree.init');
-      }
-    };
-
-    JqTreeWidget.prototype._openNodes = function() {
-      var max_level;
-      if (this.options.saveState) {
-        if (this.save_state_handler.restoreState()) {
-          return;
-        }
-      }
-      if (this.options.autoOpen === false) {
-        return;
-      } else if (this.options.autoOpen === true) {
-        max_level = -1;
-      } else {
-        max_level = parseInt(this.options.autoOpen);
-      }
-      return this.tree.iterate(function(node, level) {
-        if (node.hasChildren()) {
-          node.is_open = true;
-        }
-        return level !== max_level;
-      });
-    };
-
-    JqTreeWidget.prototype._refreshElements = function(from_node) {
-      if (from_node == null) {
-        from_node = null;
-      }
-      this.renderer.render(from_node);
-      return this._triggerEvent('tree.refresh');
-    };
-
-    JqTreeWidget.prototype._click = function(e) {
-      var click_target, event, node;
-      click_target = this._getClickTarget(e.target);
-      if (click_target) {
-        if (click_target.type === 'button') {
-          this.toggle(click_target.node, this.options.slide);
-          e.preventDefault();
-          return e.stopPropagation();
-        } else if (click_target.type === 'label') {
-          node = click_target.node;
-          event = this._triggerEvent('tree.click', {
-            node: node,
-            click_event: e
-          });
-          if (!event.isDefaultPrevented()) {
-            return this._selectNode(node, true);
-          }
-        }
-      }
-    };
-
-    JqTreeWidget.prototype._dblclick = function(e) {
-      var click_target;
-      click_target = this._getClickTarget(e.target);
-      if (click_target && click_target.type === 'label') {
-        return this._triggerEvent('tree.dblclick', {
-          node: click_target.node,
-          click_event: e
-        });
-      }
-    };
-
-    JqTreeWidget.prototype._getClickTarget = function(element) {
-      var $button, $el, $target, node;
-      $target = $(element);
-      $button = $target.closest('.jqtree-toggler');
-      if ($button.length) {
-        node = this._getNode($button);
-        if (node) {
-          return {
-            type: 'button',
-            node: node
-          };
-        }
-      } else {
-        $el = $target.closest('.jqtree-element');
-        if ($el.length) {
-          node = this._getNode($el);
-          if (node) {
-            return {
-              type: 'label',
-              node: node
-            };
-          }
-        }
-      }
-      return null;
-    };
-
-    JqTreeWidget.prototype._getNode = function($element) {
-      var $li;
-      $li = $element.closest('li');
-      if ($li.length === 0) {
-        return null;
-      } else {
-        return $li.data('node');
-      }
-    };
-
-    JqTreeWidget.prototype._getNodeElementForNode = function(node) {
-      if (node.isFolder()) {
-        return new FolderElement(node, this);
-      } else {
-        return new NodeElement(node, this);
-      }
-    };
-
-    JqTreeWidget.prototype._getNodeElement = function($element) {
-      var node;
-      node = this._getNode($element);
-      if (node) {
-        return this._getNodeElementForNode(node);
-      } else {
-        return null;
-      }
-    };
-
-    JqTreeWidget.prototype._contextmenu = function(e) {
-      var $div, node;
-      $div = $(e.target).closest('ul.jqtree-tree .jqtree-element');
-      if ($div.length) {
-        node = this._getNode($div);
-        if (node) {
-          e.preventDefault();
-          e.stopPropagation();
-          this._triggerEvent('tree.contextmenu', {
-            node: node,
-            click_event: e
-          });
-          return false;
-        }
-      }
-    };
-
-    JqTreeWidget.prototype._saveState = function() {
-      if (this.options.saveState) {
-        return this.save_state_handler.saveState();
-      }
-    };
-
-    JqTreeWidget.prototype._mouseCapture = function(position_info) {
-      if (this.options.dragAndDrop) {
-        return this.dnd_handler.mouseCapture(position_info);
-      } else {
-        return false;
-      }
-    };
-
-    JqTreeWidget.prototype._mouseStart = function(position_info) {
-      if (this.options.dragAndDrop) {
-        return this.dnd_handler.mouseStart(position_info);
-      } else {
-        return false;
-      }
-    };
-
-    JqTreeWidget.prototype._mouseDrag = function(position_info) {
-      var result;
-      if (this.options.dragAndDrop) {
-        result = this.dnd_handler.mouseDrag(position_info);
-        if (this.scroll_handler) {
-          this.scroll_handler.checkScrolling();
-        }
-        return result;
-      } else {
-        return false;
-      }
-    };
-
-    JqTreeWidget.prototype._mouseStop = function(position_info) {
-      if (this.options.dragAndDrop) {
-        return this.dnd_handler.mouseStop(position_info);
-      } else {
-        return false;
-      }
-    };
-
-    JqTreeWidget.prototype._triggerEvent = function(event_name, values) {
-      var event;
-      event = $.Event(event_name);
-      $.extend(event, values);
-      this.element.trigger(event);
-      return event;
-    };
-
-    JqTreeWidget.prototype.testGenerateHitAreas = function(moving_node) {
-      this.dnd_handler.current_item = this._getNodeElementForNode(moving_node);
-      this.dnd_handler.generateHitAreas();
-      return this.dnd_handler.hit_areas;
-    };
-
-    JqTreeWidget.prototype._selectCurrentNode = function() {
-      var node, node_element;
-      node = this.getSelectedNode();
-      if (node) {
-        node_element = this._getNodeElementForNode(node);
-        if (node_element) {
-          return node_element.select();
-        }
-      }
-    };
-
-    JqTreeWidget.prototype._deselectCurrentNode = function() {
-      var node;
-      node = this.getSelectedNode();
-      if (node) {
-        return this.removeFromSelection(node);
-      }
-    };
-
-    return JqTreeWidget;
-
-  })(MouseWidget);
-
-  SimpleWidget.register(JqTreeWidget, 'tree');
-
-  NodeElement = (function() {
-    function NodeElement(node, tree_widget) {
-      this.init(node, tree_widget);
-    }
-
-    NodeElement.prototype.init = function(node, tree_widget) {
-      this.node = node;
-      this.tree_widget = tree_widget;
-      return this.$element = $(node.element);
-    };
-
-    NodeElement.prototype.getUl = function() {
-      return this.$element.children('ul:first');
-    };
-
-    NodeElement.prototype.getSpan = function() {
-      return this.$element.children('.jqtree-element').find('span.jqtree-title');
-    };
-
-    NodeElement.prototype.getLi = function() {
-      return this.$element;
-    };
-
-    NodeElement.prototype.addDropHint = function(position) {
-      if (position === Position.INSIDE) {
-        return new BorderDropHint(this.$element);
-      } else {
-        return new GhostDropHint(this.node, this.$element, position);
-      }
-    };
-
-    NodeElement.prototype.select = function() {
-      return this.getLi().addClass('jqtree-selected');
-    };
-
-    NodeElement.prototype.deselect = function() {
-      return this.getLi().removeClass('jqtree-selected');
-    };
-
-    return NodeElement;
-
-  })();
-
-  FolderElement = (function(_super) {
-    __extends(FolderElement, _super);
-
-    function FolderElement() {
-      return FolderElement.__super__.constructor.apply(this, arguments);
-    }
-
-    FolderElement.prototype.open = function(on_finished, slide) {
-      var $button, doOpen;
-      if (slide == null) {
-        slide = true;
-      }
-      if (!this.node.is_open) {
-        this.node.is_open = true;
-        $button = this.getButton();
-        $button.removeClass('jqtree-closed');
-        $button.html(this.tree_widget.options.openedIcon);
-        doOpen = (function(_this) {
-          return function() {
-            _this.getLi().removeClass('jqtree-closed');
-            if (on_finished) {
-              on_finished();
-            }
-            return _this.tree_widget._triggerEvent('tree.open', {
-              node: _this.node
-            });
-          };
-        })(this);
-        if (slide) {
-          return this.getUl().slideDown('fast', doOpen);
-        } else {
-          this.getUl().show();
-          return doOpen();
-        }
-      }
-    };
-
-    FolderElement.prototype.close = function(slide) {
-      var $button, doClose;
-      if (slide == null) {
-        slide = true;
-      }
-      if (this.node.is_open) {
-        this.node.is_open = false;
-        $button = this.getButton();
-        $button.addClass('jqtree-closed');
-        $button.html(this.tree_widget.options.closedIcon);
-        doClose = (function(_this) {
-          return function() {
-            _this.getLi().addClass('jqtree-closed');
-            return _this.tree_widget._triggerEvent('tree.close', {
-              node: _this.node
-            });
-          };
-        })(this);
-        if (slide) {
-          return this.getUl().slideUp('fast', doClose);
-        } else {
-          this.getUl().hide();
-          return doClose();
-        }
-      }
-    };
-
-    FolderElement.prototype.getButton = function() {
-      return this.$element.children('.jqtree-element').find('a.jqtree-toggler');
-    };
-
-    FolderElement.prototype.addDropHint = function(position) {
-      if (!this.node.is_open && position === Position.INSIDE) {
-        return new BorderDropHint(this.$element);
-      } else {
-        return new GhostDropHint(this.node, this.$element, position);
-      }
-    };
-
-    return FolderElement;
-
-  })(NodeElement);
-
-  html_escape = function(string) {
-    return ('' + string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g, '&#x2F;');
-  };
-
-  _indexOf = function(array, item) {
-    var i, value, _i, _len;
-    for (i = _i = 0, _len = array.length; _i < _len; i = ++_i) {
-      value = array[i];
-      if (value === item) {
-        return i;
-      }
-    }
-    return -1;
-  };
-
-  indexOf = function(array, item) {
-    if (array.indexOf) {
-      return array.indexOf(item);
-    } else {
-      return _indexOf(array, item);
-    }
-  };
-
-  this.Tree.indexOf = indexOf;
-
-  this.Tree._indexOf = _indexOf;
-
-  if (!((this.JSON != null) && (this.JSON.stringify != null) && typeof this.JSON.stringify === 'function')) {
-    json_escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-    json_meta = {
-      '\b': '\\b',
-      '\t': '\\t',
-      '\n': '\\n',
-      '\f': '\\f',
-      '\r': '\\r',
-      '"': '\\"',
-      '\\': '\\\\'
-    };
-    json_quote = function(string) {
-      json_escapable.lastIndex = 0;
-      if (json_escapable.test(string)) {
-        return '"' + string.replace(json_escapable, function(a) {
-          var c;
-          c = json_meta[a];
-          return (typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4));
-        }) + '"';
-      } else {
-        return '"' + string + '"';
-      }
-    };
-    json_str = function(key, holder) {
-      var i, k, partial, v, value, _i, _len;
-      value = holder[key];
-      switch (typeof value) {
-        case 'string':
-          return json_quote(value);
-        case 'number':
-          if (isFinite(value)) {
-            return String(value);
-          } else {
-            return 'null';
-          }
-        case 'boolean':
-        case 'null':
-          return String(value);
-        case 'object':
-          if (!value) {
-            return 'null';
-          }
-          partial = [];
-          if (Object.prototype.toString.apply(value) === '[object Array]') {
-            for (i = _i = 0, _len = value.length; _i < _len; i = ++_i) {
-              v = value[i];
-              partial[i] = json_str(i, value) || 'null';
-            }
-            return (partial.length === 0 ? '[]' : '[' + partial.join(',') + ']');
-          }
-          for (k in value) {
-            if (Object.prototype.hasOwnProperty.call(value, k)) {
-              v = json_str(k, value);
-              if (v) {
-                partial.push(json_quote(k) + ':' + v);
-              }
-            }
-          }
-          return (partial.length === 0 ? '{}' : '{' + partial.join(',') + '}');
-      }
-    };
-    if (this.JSON == null) {
-      this.JSON = {};
-    }
-    this.JSON.stringify = function(value) {
-      return json_str('', {
-        '': value
-      });
-    };
-  }
-
-  SaveStateHandler = (function() {
-    function SaveStateHandler(tree_widget) {
-      this.tree_widget = tree_widget;
-    }
-
-    SaveStateHandler.prototype.saveState = function() {
-      var state;
-      state = JSON.stringify(this.getState());
-      if (this.tree_widget.options.onSetStateFromStorage) {
-        return this.tree_widget.options.onSetStateFromStorage(state);
-      } else if (this.supportsLocalStorage()) {
-        return localStorage.setItem(this.getCookieName(), state);
-      } else if ($.cookie) {
-        $.cookie.raw = true;
-        return $.cookie(this.getCookieName(), state, {
-          path: '/'
-        });
-      }
-    };
-
-    SaveStateHandler.prototype.restoreState = function() {
-      var state;
-      state = this.getStateFromStorage();
-      if (state) {
-        this.setState($.parseJSON(state));
-        return true;
-      } else {
-        return false;
-      }
-    };
-
-    SaveStateHandler.prototype.getStateFromStorage = function() {
-      if (this.tree_widget.options.onGetStateFromStorage) {
-        return this.tree_widget.options.onGetStateFromStorage();
-      } else if (this.supportsLocalStorage()) {
-        return localStorage.getItem(this.getCookieName());
-      } else if ($.cookie) {
-        $.cookie.raw = true;
-        return $.cookie(this.getCookieName());
-      } else {
-        return null;
-      }
-    };
-
-    SaveStateHandler.prototype.getState = function() {
-      var open_nodes, selected_node, selected_node_id;
-      open_nodes = [];
-      this.tree_widget.tree.iterate((function(_this) {
-        return function(node) {
-          if (node.is_open && node.id && node.hasChildren()) {
-            open_nodes.push(node.id);
-          }
-          return true;
-        };
-      })(this));
-      selected_node = this.tree_widget.getSelectedNode();
-      if (selected_node) {
-        selected_node_id = selected_node.id;
-      } else {
-        selected_node_id = '';
-      }
-      return {
-        open_nodes: open_nodes,
-        selected_node: selected_node_id
-      };
-    };
-
-    SaveStateHandler.prototype.setState = function(state) {
-      var open_nodes, selected_node, selected_node_id;
-      if (state) {
-        open_nodes = state.open_nodes;
-        selected_node_id = state.selected_node;
-        this.tree_widget.tree.iterate((function(_this) {
-          return function(node) {
-            node.is_open = node.id && node.hasChildren() && (indexOf(open_nodes, node.id) >= 0);
-            return true;
-          };
-        })(this));
-        if (selected_node_id && this.tree_widget.select_node_handler) {
-          this.tree_widget.select_node_handler.clear();
-          selected_node = this.tree_widget.getNodeById(selected_node_id);
-          if (selected_node) {
-            return this.tree_widget.select_node_handler.addToSelection(selected_node);
-          }
-        }
-      }
-    };
-
-    SaveStateHandler.prototype.getCookieName = function() {
-      if (typeof this.tree_widget.options.saveState === 'string') {
-        return this.tree_widget.options.saveState;
-      } else {
-        return 'tree';
-      }
-    };
-
-    SaveStateHandler.prototype.supportsLocalStorage = function() {
-      var testSupport;
-      testSupport = function() {
-        var error, key;
-        if (typeof localStorage === "undefined" || localStorage === null) {
-          return false;
-        } else {
-          try {
-            key = '_storage_test';
-            sessionStorage.setItem(key, true);
-            sessionStorage.removeItem(key);
-          } catch (_error) {
-            error = _error;
-            return false;
-          }
-          return true;
-        }
-      };
-      if (this._supportsLocalStorage == null) {
-        this._supportsLocalStorage = testSupport();
-      }
-      return this._supportsLocalStorage;
-    };
-
-    SaveStateHandler.prototype.getNodeIdToBeSelected = function() {
-      var state, state_json;
-      state_json = this.getStateFromStorage();
-      if (state_json) {
-        state = $.parseJSON(state_json);
-        return state.selected_node;
-      } else {
-        return null;
-      }
-    };
-
-    return SaveStateHandler;
-
-  })();
-
-  SelectNodeHandler = (function() {
-    function SelectNodeHandler(tree_widget) {
-      this.tree_widget = tree_widget;
-      this.clear();
-    }
-
-    SelectNodeHandler.prototype.getSelectedNode = function() {
-      var selected_nodes;
-      selected_nodes = this.getSelectedNodes();
-      if (selected_nodes.length) {
-        return selected_nodes[0];
-      } else {
-        return false;
-      }
-    };
-
-    SelectNodeHandler.prototype.getSelectedNodes = function() {
-      var id, node, selected_nodes;
-      if (this.selected_single_node) {
-        return [this.selected_single_node];
-      } else {
-        selected_nodes = [];
-        for (id in this.selected_nodes) {
-          node = this.tree_widget.getNodeById(id);
-          if (node) {
-            selected_nodes.push(node);
-          }
-        }
-        return selected_nodes;
-      }
-    };
-
-    SelectNodeHandler.prototype.getSelectedNodesUnder = function(parent) {
-      var id, node, selected_nodes;
-      if (this.selected_single_node) {
-        if (parent.isParentOf(selected_single_node)) {
-          return this.selected_single_node;
-        } else {
-          return null;
-        }
-      } else {
-        selected_nodes = [];
-        for (id in this.selected_nodes) {
-          node = this.tree_widget.getNodeById(id);
-          if (node && parent.isParentOf(node)) {
-            selected_nodes.push(node);
-          }
-        }
-        return selected_nodes;
-      }
-    };
-
-    SelectNodeHandler.prototype.isNodeSelected = function(node) {
-      if (node.id) {
-        return this.selected_nodes[node.id];
-      } else if (this.selected_single_node) {
-        return this.selected_single_node.element === node.element;
-      } else {
-        return false;
-      }
-    };
-
-    SelectNodeHandler.prototype.clear = function() {
-      this.selected_nodes = {};
-      return this.selected_single_node = null;
-    };
-
-    SelectNodeHandler.prototype.removeFromSelection = function(node, include_children) {
-      if (include_children == null) {
-        include_children = false;
-      }
-      if (!node.id) {
-        if (this.selected_single_node && node.element === this.selected_single_node.element) {
-          return this.selected_single_node = null;
-        }
-      } else {
-        delete this.selected_nodes[node.id];
-        if (include_children) {
-          return node.iterate((function(_this) {
-            return function(n) {
-              delete _this.selected_nodes[node.id];
-              return true;
-            };
-          })(this));
-        }
-      }
-    };
-
-    SelectNodeHandler.prototype.addToSelection = function(node) {
-      if (node.id) {
-        return this.selected_nodes[node.id] = true;
-      } else {
-        return this.selected_single_node = node;
-      }
-    };
-
-    return SelectNodeHandler;
-
-  })();
-
-  DragAndDropHandler = (function() {
-    function DragAndDropHandler(tree_widget) {
-      this.tree_widget = tree_widget;
-      this.hovered_area = null;
-      this.$ghost = null;
-      this.hit_areas = [];
-      this.is_dragging = false;
-    }
-
-    DragAndDropHandler.prototype.mouseCapture = function(position_info) {
-      var $element, node_element;
-      $element = $(position_info.target);
-      if (this.tree_widget.options.onIsMoveHandle && !this.tree_widget.options.onIsMoveHandle($element)) {
-        return null;
-      }
-      node_element = this.tree_widget._getNodeElement($element);
-      if (node_element && this.tree_widget.options.onCanMove) {
-        if (!this.tree_widget.options.onCanMove(node_element.node)) {
-          node_element = null;
-        }
-      }
-      this.current_item = node_element;
-      return this.current_item !== null;
-    };
-
-    DragAndDropHandler.prototype.mouseStart = function(position_info) {
-      var offset;
-      this.refreshHitAreas();
-      offset = $(position_info.target).offset();
-      this.drag_element = new DragElement(this.current_item.node, position_info.page_x - offset.left, position_info.page_y - offset.top, this.tree_widget.element);
-      this.is_dragging = true;
-      this.current_item.$element.addClass('jqtree-moving');
-      return true;
-    };
-
-    DragAndDropHandler.prototype.mouseDrag = function(position_info) {
-      var area, can_move_to;
-      this.drag_element.move(position_info.page_x, position_info.page_y);
-      area = this.findHoveredArea(position_info.page_x, position_info.page_y);
-      can_move_to = this.canMoveToArea(area);
-      if (can_move_to && area) {
-        if (this.hovered_area !== area) {
-          this.hovered_area = area;
-          if (this.mustOpenFolderTimer(area)) {
-            this.startOpenFolderTimer(area.node);
-          }
-          this.updateDropHint();
-        }
-      } else {
-        this.removeHover();
-        this.removeDropHint();
-        this.stopOpenFolderTimer();
-      }
-      return true;
-    };
-
-    DragAndDropHandler.prototype.canMoveToArea = function(area) {
-      var position_name;
-      if (!area) {
-        return false;
-      } else if (this.tree_widget.options.onCanMoveTo) {
-        position_name = Position.getName(area.position);
-        return this.tree_widget.options.onCanMoveTo(this.current_item.node, area.node, position_name);
-      } else {
-        return true;
-      }
-    };
-
-    DragAndDropHandler.prototype.mouseStop = function(position_info) {
-      this.moveItem(position_info);
-      this.clear();
-      this.removeHover();
-      this.removeDropHint();
-      this.removeHitAreas();
-      if (this.current_item) {
-        this.current_item.$element.removeClass('jqtree-moving');
-      }
-      this.is_dragging = false;
-      return false;
-    };
-
-    DragAndDropHandler.prototype.refreshHitAreas = function() {
-      this.removeHitAreas();
-      return this.generateHitAreas();
-    };
-
-    DragAndDropHandler.prototype.removeHitAreas = function() {
-      return this.hit_areas = [];
-    };
-
-    DragAndDropHandler.prototype.clear = function() {
-      this.drag_element.remove();
-      return this.drag_element = null;
-    };
-
-    DragAndDropHandler.prototype.removeDropHint = function() {
-      if (this.previous_ghost) {
-        return this.previous_ghost.remove();
-      }
-    };
-
-    DragAndDropHandler.prototype.removeHover = function() {
-      return this.hovered_area = null;
-    };
-
-    DragAndDropHandler.prototype.generateHitAreas = function() {
-      var hit_areas_generator;
-      hit_areas_generator = new HitAreasGenerator(this.tree_widget.tree, this.current_item.node, this.getTreeDimensions().bottom);
-      return this.hit_areas = hit_areas_generator.generate();
-    };
-
-    DragAndDropHandler.prototype.findHoveredArea = function(x, y) {
-      var area, dimensions, high, low, mid;
-      dimensions = this.getTreeDimensions();
-      if (x < dimensions.left || y < dimensions.top || x > dimensions.right || y > dimensions.bottom) {
-        return null;
-      }
-      low = 0;
-      high = this.hit_areas.length;
-      while (low < high) {
-        mid = (low + high) >> 1;
-        area = this.hit_areas[mid];
-        if (y < area.top) {
-          high = mid;
-        } else if (y > area.bottom) {
-          low = mid + 1;
-        } else {
-          return area;
-        }
-      }
-      return null;
-    };
-
-    DragAndDropHandler.prototype.mustOpenFolderTimer = function(area) {
-      var node;
-      node = area.node;
-      return node.isFolder() && !node.is_open && area.position === Position.INSIDE;
-    };
-
-    DragAndDropHandler.prototype.updateDropHint = function() {
-      var node_element;
-      if (!this.hovered_area) {
-        return;
-      }
-      this.removeDropHint();
-      node_element = this.tree_widget._getNodeElementForNode(this.hovered_area.node);
-      return this.previous_ghost = node_element.addDropHint(this.hovered_area.position);
-    };
-
-    DragAndDropHandler.prototype.startOpenFolderTimer = function(folder) {
-      var openFolder;
-      openFolder = (function(_this) {
-        return function() {
-          return _this.tree_widget._openNode(folder, _this.tree_widget.options.slide, function() {
-            _this.refreshHitAreas();
-            return _this.updateDropHint();
-          });
-        };
-      })(this);
-      this.stopOpenFolderTimer();
-      return this.open_folder_timer = setTimeout(openFolder, this.tree_widget.options.openFolderDelay);
-    };
-
-    DragAndDropHandler.prototype.stopOpenFolderTimer = function() {
-      if (this.open_folder_timer) {
-        clearTimeout(this.open_folder_timer);
-        return this.open_folder_timer = null;
-      }
-    };
-
-    DragAndDropHandler.prototype.moveItem = function(position_info) {
-      var doMove, event, moved_node, position, previous_parent, target_node;
-      if (this.hovered_area && this.hovered_area.position !== Position.NONE && this.canMoveToArea(this.hovered_area)) {
-        moved_node = this.current_item.node;
-        target_node = this.hovered_area.node;
-        position = this.hovered_area.position;
-        previous_parent = moved_node.parent;
-        if (position === Position.INSIDE) {
-          this.hovered_area.node.is_open = true;
-        }
-        doMove = (function(_this) {
-          return function() {
-            _this.tree_widget.tree.moveNode(moved_node, target_node, position);
-            _this.tree_widget.element.empty();
-            return _this.tree_widget._refreshElements();
-          };
-        })(this);
-        event = this.tree_widget._triggerEvent('tree.move', {
-          move_info: {
-            moved_node: moved_node,
-            target_node: target_node,
-            position: Position.getName(position),
-            previous_parent: previous_parent,
-            do_move: doMove,
-            original_event: position_info.original_event
-          }
-        });
-        if (!event.isDefaultPrevented()) {
-          return doMove();
-        }
-      }
-    };
-
-    DragAndDropHandler.prototype.getTreeDimensions = function() {
-      var offset;
-      offset = this.tree_widget.element.offset();
-      return {
-        left: offset.left,
-        top: offset.top,
-        right: offset.left + this.tree_widget.element.width(),
-        bottom: offset.top + this.tree_widget.element.height() + 16
-      };
-    };
-
-    return DragAndDropHandler;
-
-  })();
-
-  VisibleNodeIterator = (function() {
-    function VisibleNodeIterator(tree) {
-      this.tree = tree;
-    }
-
-    VisibleNodeIterator.prototype.iterate = function() {
-      var is_first_node, _iterateNode;
-      is_first_node = true;
-      _iterateNode = (function(_this) {
-        return function(node, next_node) {
-          var $element, child, children_length, i, must_iterate_inside, _i, _len, _ref;
-          must_iterate_inside = (node.is_open || !node.element) && node.hasChildren();
-          if (node.element) {
-            $element = $(node.element);
-            if (!$element.is(':visible')) {
-              return;
-            }
-            if (is_first_node) {
-              _this.handleFirstNode(node, $element);
-              is_first_node = false;
-            }
-            if (!node.hasChildren()) {
-              _this.handleNode(node, next_node, $element);
-            } else if (node.is_open) {
-              if (!_this.handleOpenFolder(node, $element)) {
-                must_iterate_inside = false;
-              }
-            } else {
-              _this.handleClosedFolder(node, next_node, $element);
-            }
-          }
-          if (must_iterate_inside) {
-            children_length = node.children.length;
-            _ref = node.children;
-            for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
-              child = _ref[i];
-              if (i === (children_length - 1)) {
-                _iterateNode(node.children[i], null);
-              } else {
-                _iterateNode(node.children[i], node.children[i + 1]);
-              }
-            }
-            if (node.is_open) {
-              return _this.handleAfterOpenFolder(node, next_node, $element);
-            }
-          }
-        };
-      })(this);
-      return _iterateNode(this.tree, null);
-    };
-
-    VisibleNodeIterator.prototype.handleNode = function(node, next_node, $element) {};
-
-    VisibleNodeIterator.prototype.handleOpenFolder = function(node, $element) {};
-
-    VisibleNodeIterator.prototype.handleClosedFolder = function(node, next_node, $element) {};
-
-    VisibleNodeIterator.prototype.handleAfterOpenFolder = function(node, next_node, $element) {};
-
-    VisibleNodeIterator.prototype.handleFirstNode = function(node, $element) {};
-
-    return VisibleNodeIterator;
-
-  })();
-
-  HitAreasGenerator = (function(_super) {
-    __extends(HitAreasGenerator, _super);
-
-    function HitAreasGenerator(tree, current_node, tree_bottom) {
-      HitAreasGenerator.__super__.constructor.call(this, tree);
-      this.current_node = current_node;
-      this.tree_bottom = tree_bottom;
-    }
-
-    HitAreasGenerator.prototype.generate = function() {
-      this.positions = [];
-      this.last_top = 0;
-      this.iterate();
-      return this.generateHitAreas(this.positions);
-    };
-
-    HitAreasGenerator.prototype.getTop = function($element) {
-      return $element.offset().top;
-    };
-
-    HitAreasGenerator.prototype.addPosition = function(node, position, top) {
-      var area;
-      area = {
-        top: top,
-        node: node,
-        position: position
-      };
-      this.positions.push(area);
-      return this.last_top = top;
-    };
-
-    HitAreasGenerator.prototype.handleNode = function(node, next_node, $element) {
-      var top;
-      top = this.getTop($element);
-      if (node === this.current_node) {
-        this.addPosition(node, Position.NONE, top);
-      } else {
-        this.addPosition(node, Position.INSIDE, top);
-      }
-      if (next_node === this.current_node || node === this.current_node) {
-        return this.addPosition(node, Position.NONE, top);
-      } else {
-        return this.addPosition(node, Position.AFTER, top);
-      }
-    };
-
-    HitAreasGenerator.prototype.handleOpenFolder = function(node, $element) {
-      if (node === this.current_node) {
-        return false;
-      }
-      if (node.children[0] !== this.current_node) {
-        this.addPosition(node, Position.INSIDE, this.getTop($element));
-      }
-      return true;
-    };
-
-    HitAreasGenerator.prototype.handleClosedFolder = function(node, next_node, $element) {
-      var top;
-      top = this.getTop($element);
-      if (node === this.current_node) {
-        return this.addPosition(node, Position.NONE, top);
-      } else {
-        this.addPosition(node, Position.INSIDE, top);
-        if (next_node !== this.current_node) {
-          return this.addPosition(node, Position.AFTER, top);
-        }
-      }
-    };
-
-    HitAreasGenerator.prototype.handleFirstNode = function(node, $element) {
-      if (node !== this.current_node) {
-        return this.addPosition(node, Position.BEFORE, this.getTop($(node.element)));
-      }
-    };
-
-    HitAreasGenerator.prototype.handleAfterOpenFolder = function(node, next_node, $element) {
-      if (node === this.current_node.node || next_node === this.current_node.node) {
-        return this.addPosition(node, Position.NONE, this.last_top);
-      } else {
-        return this.addPosition(node, Position.AFTER, this.last_top);
-      }
-    };
-
-    HitAreasGenerator.prototype.generateHitAreas = function(positions) {
-      var group, hit_areas, position, previous_top, _i, _len;
-      previous_top = -1;
-      group = [];
-      hit_areas = [];
-      for (_i = 0, _len = positions.length; _i < _len; _i++) {
-        position = positions[_i];
-        if (position.top !== previous_top && group.length) {
-          if (group.length) {
-            this.generateHitAreasForGroup(hit_areas, group, previous_top, position.top);
-          }
-          previous_top = position.top;
-          group = [];
-        }
-        group.push(position);
-      }
-      this.generateHitAreasForGroup(hit_areas, group, previous_top, this.tree_bottom);
-      return hit_areas;
-    };
-
-    HitAreasGenerator.prototype.generateHitAreasForGroup = function(hit_areas, positions_in_group, top, bottom) {
-      var area_height, area_top, i, position, position_count;
-      position_count = Math.min(positions_in_group.length, 4);
-      area_height = Math.round((bottom - top) / position_count);
-      area_top = top;
-      i = 0;
-      while (i < position_count) {
-        position = positions_in_group[i];
-        hit_areas.push({
-          top: area_top,
-          bottom: area_top + area_height,
-          node: position.node,
-          position: position.position
-        });
-        area_top += area_height;
-        i += 1;
-      }
-      return null;
-    };
-
-    return HitAreasGenerator;
-
-  })(VisibleNodeIterator);
-
-  DragElement = (function() {
-    function DragElement(node, offset_x, offset_y, $tree) {
-      this.offset_x = offset_x;
-      this.offset_y = offset_y;
-      this.$element = $("<span class=\"jqtree-title jqtree-dragging\">" + node.name + "</span>");
-      this.$element.css("position", "absolute");
-      $tree.append(this.$element);
-    }
-
-    DragElement.prototype.move = function(page_x, page_y) {
-      return this.$element.offset({
-        left: page_x - this.offset_x,
-        top: page_y - this.offset_y
-      });
-    };
-
-    DragElement.prototype.remove = function() {
-      return this.$element.remove();
-    };
-
-    return DragElement;
-
-  })();
-
-  GhostDropHint = (function() {
-    function GhostDropHint(node, $element, position) {
-      this.$element = $element;
-      this.node = node;
-      this.$ghost = $('<li class="jqtree_common jqtree-ghost"><span class="jqtree_common jqtree-circle"></span><span class="jqtree_common jqtree-line"></span></li>');
-      if (position === Position.AFTER) {
-        this.moveAfter();
-      } else if (position === Position.BEFORE) {
-        this.moveBefore();
-      } else if (position === Position.INSIDE) {
-        if (node.isFolder() && node.is_open) {
-          this.moveInsideOpenFolder();
-        } else {
-          this.moveInside();
-        }
-      }
-    }
-
-    GhostDropHint.prototype.remove = function() {
-      return this.$ghost.remove();
-    };
-
-    GhostDropHint.prototype.moveAfter = function() {
-      return this.$element.after(this.$ghost);
-    };
-
-    GhostDropHint.prototype.moveBefore = function() {
-      return this.$element.before(this.$ghost);
-    };
-
-    GhostDropHint.prototype.moveInsideOpenFolder = function() {
-      return $(this.node.children[0].element).before(this.$ghost);
-    };
-
-    GhostDropHint.prototype.moveInside = function() {
-      this.$element.after(this.$ghost);
-      return this.$ghost.addClass('jqtree-inside');
-    };
-
-    return GhostDropHint;
-
-  })();
-
-  BorderDropHint = (function() {
-    function BorderDropHint($element) {
-      var $div, width;
-      $div = $element.children('.jqtree-element');
-      width = $element.width() - 4;
-      this.$hint = $('<span class="jqtree-border"></span>');
-      $div.append(this.$hint);
-      this.$hint.css({
-        width: width,
-        height: $div.height() - 4
-      });
-    }
-
-    BorderDropHint.prototype.remove = function() {
-      return this.$hint.remove();
-    };
-
-    return BorderDropHint;
-
-  })();
-
-  ScrollHandler = (function() {
-    function ScrollHandler(tree_widget) {
-      this.tree_widget = tree_widget;
-      this.previous_top = -1;
-      this._initScrollParent();
-    }
-
-    ScrollHandler.prototype._initScrollParent = function() {
-      var $scroll_parent, getParentWithOverflow, setDocumentAsScrollParent;
-      getParentWithOverflow = (function(_this) {
-        return function() {
-          var css_values, el, hasOverFlow, _i, _len, _ref;
-          css_values = ['overflow', 'overflow-y'];
-          hasOverFlow = function(el) {
-            var css_value, _i, _len, _ref;
-            for (_i = 0, _len = css_values.length; _i < _len; _i++) {
-              css_value = css_values[_i];
-              if ((_ref = $.css(el, css_value)) === 'auto' || _ref === 'scroll') {
-                return true;
-              }
-            }
-            return false;
-          };
-          if (hasOverFlow(_this.tree_widget.$el[0])) {
-            return _this.tree_widget.$el;
-          }
-          _ref = _this.tree_widget.$el.parents();
-          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-            el = _ref[_i];
-            if (hasOverFlow(el)) {
-              return $(el);
-            }
-          }
-          return null;
-        };
-      })(this);
-      setDocumentAsScrollParent = (function(_this) {
-        return function() {
-          _this.scroll_parent_top = 0;
-          return _this.$scroll_parent = null;
-        };
-      })(this);
-      if (this.tree_widget.$el.css('position') === 'fixed') {
-        setDocumentAsScrollParent();
-      }
-      $scroll_parent = getParentWithOverflow();
-      if ($scroll_parent && $scroll_parent.length && $scroll_parent[0].tagName !== 'HTML') {
-        this.$scroll_parent = $scroll_parent;
-        return this.scroll_parent_top = this.$scroll_parent.offset().top;
-      } else {
-        return setDocumentAsScrollParent();
-      }
-    };
-
-    ScrollHandler.prototype.checkScrolling = function() {
-      var hovered_area;
-      hovered_area = this.tree_widget.dnd_handler.hovered_area;
-      if (hovered_area && hovered_area.top !== this.previous_top) {
-        this.previous_top = hovered_area.top;
-        if (this.$scroll_parent) {
-          return this._handleScrollingWithScrollParent(hovered_area);
-        } else {
-          return this._handleScrollingWithDocument(hovered_area);
-        }
-      }
-    };
-
-    ScrollHandler.prototype._handleScrollingWithScrollParent = function(area) {
-      var distance_bottom;
-      distance_bottom = this.scroll_parent_top + this.$scroll_parent[0].offsetHeight - area.bottom;
-      if (distance_bottom < 20) {
-        this.$scroll_parent[0].scrollTop += 20;
-        this.tree_widget.refreshHitAreas();
-        return this.previous_top = -1;
-      } else if ((area.top - this.scroll_parent_top) < 20) {
-        this.$scroll_parent[0].scrollTop -= 20;
-        this.tree_widget.refreshHitAreas();
-        return this.previous_top = -1;
-      }
-    };
-
-    ScrollHandler.prototype._handleScrollingWithDocument = function(area) {
-      var distance_top;
-      distance_top = area.top - $(document).scrollTop();
-      if (distance_top < 20) {
-        return $(document).scrollTop($(document).scrollTop() - 20);
-      } else if ($(window).height() - (area.bottom - $(document).scrollTop()) < 20) {
-        return $(document).scrollTop($(document).scrollTop() + 20);
-      }
-    };
-
-    ScrollHandler.prototype.scrollTo = function(top) {
-      var tree_top;
-      if (this.$scroll_parent) {
-        return this.$scroll_parent[0].scrollTop = top;
-      } else {
-        tree_top = this.tree_widget.$el.offset().top;
-        return $(document).scrollTop(top + tree_top);
-      }
-    };
-
-    ScrollHandler.prototype.isScrolledIntoView = function(element) {
-      var $element, element_bottom, element_top, view_bottom, view_top;
-      $element = $(element);
-      if (this.$scroll_parent) {
-        view_top = 0;
-        view_bottom = this.$scroll_parent.height();
-        element_top = $element.offset().top - this.scroll_parent_top;
-        element_bottom = element_top + $element.height();
-      } else {
-        view_top = $(window).scrollTop();
-        view_bottom = view_top + $(window).height();
-        element_top = $element.offset().top;
-        element_bottom = element_top + $element.height();
-      }
-      return (element_bottom <= view_bottom) && (element_top >= view_top);
-    };
-
-    return ScrollHandler;
-
-  })();
-
-  KeyHandler = (function() {
-    var DOWN, LEFT, RIGHT, UP;
-
-    LEFT = 37;
-
-    UP = 38;
-
-    RIGHT = 39;
-
-    DOWN = 40;
-
-    function KeyHandler(tree_widget) {
-      this.tree_widget = tree_widget;
-      if (tree_widget.options.keyboardSupport) {
-        $(document).bind('keydown.jqtree', $.proxy(this.handleKeyDown, this));
-      }
-    }
-
-    KeyHandler.prototype.deinit = function() {
-      return $(document).unbind('keydown.jqtree');
-    };
-
-    KeyHandler.prototype.handleKeyDown = function(e) {
-      var current_node, key, moveDown, moveLeft, moveRight, moveUp, selectNode;
-      if (!this.tree_widget.options.keyboardSupport) {
-        return;
-      }
-      if ($(document.activeElement).is('textarea,input')) {
-        return true;
-      }
-      current_node = this.tree_widget.getSelectedNode();
-      selectNode = (function(_this) {
-        return function(node) {
-          if (node) {
-            _this.tree_widget.selectNode(node);
-            if (_this.tree_widget.scroll_handler && (!_this.tree_widget.scroll_handler.isScrolledIntoView($(node.element).find('.jqtree-element')))) {
-              _this.tree_widget.scrollToNode(node);
-            }
-            return false;
-          } else {
-            return true;
-          }
-        };
-      })(this);
-      moveDown = (function(_this) {
-        return function() {
-          return selectNode(_this.getNextNode(current_node));
-        };
-      })(this);
-      moveUp = (function(_this) {
-        return function() {
-          return selectNode(_this.getPreviousNode(current_node));
-        };
-      })(this);
-      moveRight = (function(_this) {
-        return function() {
-          if (current_node.isFolder() && !current_node.is_open) {
-            _this.tree_widget.openNode(current_node);
-            return false;
-          } else {
-            return true;
-          }
-        };
-      })(this);
-      moveLeft = (function(_this) {
-        return function() {
-          if (current_node.isFolder() && current_node.is_open) {
-            _this.tree_widget.closeNode(current_node);
-            return false;
-          } else {
-            return true;
-          }
-        };
-      })(this);
-      if (!current_node) {
-        return true;
-      } else {
-        key = e.which;
-        switch (key) {
-          case DOWN:
-            return moveDown();
-          case UP:
-            return moveUp();
-          case RIGHT:
-            return moveRight();
-          case LEFT:
-            return moveLeft();
-        }
-      }
-    };
-
-    KeyHandler.prototype.getNextNode = function(node, include_children) {
-      var next_sibling;
-      if (include_children == null) {
-        include_children = true;
-      }
-      if (include_children && node.hasChildren() && node.is_open) {
-        return node.children[0];
-      } else {
-        if (!node.parent) {
-          return null;
-        } else {
-          next_sibling = node.getNextSibling();
-          if (next_sibling) {
-            return next_sibling;
-          } else {
-            return this.getNextNode(node.parent, false);
-          }
-        }
-      }
-    };
-
-    KeyHandler.prototype.getPreviousNode = function(node) {
-      var previous_sibling;
-      if (!node.parent) {
-        return null;
-      } else {
-        previous_sibling = node.getPreviousSibling();
-        if (previous_sibling) {
-          if (!previous_sibling.hasChildren() || !previous_sibling.is_open) {
-            return previous_sibling;
-          } else {
-            return this.getLastChild(previous_sibling);
-          }
-        } else {
-          if (node.parent.parent) {
-            return node.parent;
-          } else {
-            return null;
-          }
-        }
-      }
-    };
-
-    KeyHandler.prototype.getLastChild = function(node) {
-      var last_child;
-      if (!node.hasChildren()) {
-        return null;
-      } else {
-        last_child = node.children[node.children.length - 1];
-        if (!last_child.hasChildren() || !last_child.is_open) {
-          return last_child;
-        } else {
-          return this.getLastChild(last_child);
-        }
-      }
-    };
-
-    return KeyHandler;
-
-  })();
-
-}).call(this);
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers-2x.png b/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers-2x.png
deleted file mode 100644
index a2cf7f9..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers-2x.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers.png b/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers.png
deleted file mode 100644
index bca0a0e..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/images/layers.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon-2x.png b/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon-2x.png
deleted file mode 100644
index 0015b64..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon-2x.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon.png b/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon.png
deleted file mode 100644
index e2e9f75..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-icon.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-shadow.png b/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-shadow.png
deleted file mode 100644
index d1e773c..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/images/marker-shadow.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet-src.js b/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet-src.js
deleted file mode 100644
index c04a7c1..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet-src.js
+++ /dev/null
@@ -1,9169 +0,0 @@
-/*
- Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
- (c) 2010-2013, Vladimir Agafonkin
- (c) 2010-2011, CloudMade
-*/
-(function (window, document, undefined) {
-var oldL = window.L,
-    L = {};
-
-L.version = '0.7.2';
-
-// define Leaflet for Node module pattern loaders, including Browserify
-if (typeof module === 'object' && typeof module.exports === 'object') {
-	module.exports = L;
-
-// define Leaflet as an AMD module
-} else if (typeof define === 'function' && define.amd) {
-	define(L);
-}
-
-// define Leaflet as a global L variable, saving the original L to restore later if needed
-
-L.noConflict = function () {
-	window.L = oldL;
-	return this;
-};
-
-window.L = L;
-
-
-/*
- * L.Util contains various utility functions used throughout Leaflet code.
- */
-
-L.Util = {
-	extend: function (dest) { // (Object[, Object, ...]) ->
-		var sources = Array.prototype.slice.call(arguments, 1),
-		    i, j, len, src;
-
-		for (j = 0, len = sources.length; j < len; j++) {
-			src = sources[j] || {};
-			for (i in src) {
-				if (src.hasOwnProperty(i)) {
-					dest[i] = src[i];
-				}
-			}
-		}
-		return dest;
-	},
-
-	bind: function (fn, obj) { // (Function, Object) -> Function
-		var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;
-		return function () {
-			return fn.apply(obj, args || arguments);
-		};
-	},
-
-	stamp: (function () {
-		var lastId = 0,
-		    key = '_leaflet_id';
-		return function (obj) {
-			obj[key] = obj[key] || ++lastId;
-			return obj[key];
-		};
-	}()),
-
-	invokeEach: function (obj, method, context) {
-		var i, args;
-
-		if (typeof obj === 'object') {
-			args = Array.prototype.slice.call(arguments, 3);
-
-			for (i in obj) {
-				method.apply(context, [i, obj[i]].concat(args));
-			}
-			return true;
-		}
-
-		return false;
-	},
-
-	limitExecByInterval: function (fn, time, context) {
-		var lock, execOnUnlock;
-
-		return function wrapperFn() {
-			var args = arguments;
-
-			if (lock) {
-				execOnUnlock = true;
-				return;
-			}
-
-			lock = true;
-
-			setTimeout(function () {
-				lock = false;
-
-				if (execOnUnlock) {
-					wrapperFn.apply(context, args);
-					execOnUnlock = false;
-				}
-			}, time);
-
-			fn.apply(context, args);
-		};
-	},
-
-	falseFn: function () {
-		return false;
-	},
-
-	formatNum: function (num, digits) {
-		var pow = Math.pow(10, digits || 5);
-		return Math.round(num * pow) / pow;
-	},
-
-	trim: function (str) {
-		return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
-	},
-
-	splitWords: function (str) {
-		return L.Util.trim(str).split(/\s+/);
-	},
-
-	setOptions: function (obj, options) {
-		obj.options = L.extend({}, obj.options, options);
-		return obj.options;
-	},
-
-	getParamString: function (obj, existingUrl, uppercase) {
-		var params = [];
-		for (var i in obj) {
-			params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
-		}
-		return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
-	},
-	template: function (str, data) {
-		return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) {
-			var value = data[key];
-			if (value === undefined) {
-				throw new Error('No value provided for variable ' + str);
-			} else if (typeof value === 'function') {
-				value = value(data);
-			}
-			return value;
-		});
-	},
-
-	isArray: Array.isArray || function (obj) {
-		return (Object.prototype.toString.call(obj) === '[object Array]');
-	},
-
-	emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
-};
-
-(function () {
-
-	// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-
-	function getPrefixed(name) {
-		var i, fn,
-		    prefixes = ['webkit', 'moz', 'o', 'ms'];
-
-		for (i = 0; i < prefixes.length && !fn; i++) {
-			fn = window[prefixes[i] + name];
-		}
-
-		return fn;
-	}
-
-	var lastTime = 0;
-
-	function timeoutDefer(fn) {
-		var time = +new Date(),
-		    timeToCall = Math.max(0, 16 - (time - lastTime));
-
-		lastTime = time + timeToCall;
-		return window.setTimeout(fn, timeToCall);
-	}
-
-	var requestFn = window.requestAnimationFrame ||
-	        getPrefixed('RequestAnimationFrame') || timeoutDefer;
-
-	var cancelFn = window.cancelAnimationFrame ||
-	        getPrefixed('CancelAnimationFrame') ||
-	        getPrefixed('CancelRequestAnimationFrame') ||
-	        function (id) { window.clearTimeout(id); };
-
-
-	L.Util.requestAnimFrame = function (fn, context, immediate, element) {
-		fn = L.bind(fn, context);
-
-		if (immediate && requestFn === timeoutDefer) {
-			fn();
-		} else {
-			return requestFn.call(window, fn, element);
-		}
-	};
-
-	L.Util.cancelAnimFrame = function (id) {
-		if (id) {
-			cancelFn.call(window, id);
-		}
-	};
-
-}());
-
-// shortcuts for most used utility functions
-L.extend = L.Util.extend;
-L.bind = L.Util.bind;
-L.stamp = L.Util.stamp;
-L.setOptions = L.Util.setOptions;
-
-
-/*
- * L.Class powers the OOP facilities of the library.
- * Thanks to John Resig and Dean Edwards for inspiration!
- */
-
-L.Class = function () {};
-
-L.Class.extend = function (props) {
-
-	// extended class with the new prototype
-	var NewClass = function () {
-
-		// call the constructor
-		if (this.initialize) {
-			this.initialize.apply(this, arguments);
-		}
-
-		// call all constructor hooks
-		if (this._initHooks) {
-			this.callInitHooks();
-		}
-	};
-
-	// instantiate class without calling constructor
-	var F = function () {};
-	F.prototype = this.prototype;
-
-	var proto = new F();
-	proto.constructor = NewClass;
-
-	NewClass.prototype = proto;
-
-	//inherit parent's statics
-	for (var i in this) {
-		if (this.hasOwnProperty(i) && i !== 'prototype') {
-			NewClass[i] = this[i];
-		}
-	}
-
-	// mix static properties into the class
-	if (props.statics) {
-		L.extend(NewClass, props.statics);
-		delete props.statics;
-	}
-
-	// mix includes into the prototype
-	if (props.includes) {
-		L.Util.extend.apply(null, [proto].concat(props.includes));
-		delete props.includes;
-	}
-
-	// merge options
-	if (props.options && proto.options) {
-		props.options = L.extend({}, proto.options, props.options);
-	}
-
-	// mix given properties into the prototype
-	L.extend(proto, props);
-
-	proto._initHooks = [];
-
-	var parent = this;
-	// jshint camelcase: false
-	NewClass.__super__ = parent.prototype;
-
-	// add method for calling all hooks
-	proto.callInitHooks = function () {
-
-		if (this._initHooksCalled) { return; }
-
-		if (parent.prototype.callInitHooks) {
-			parent.prototype.callInitHooks.call(this);
-		}
-
-		this._initHooksCalled = true;
-
-		for (var i = 0, len = proto._initHooks.length; i < len; i++) {
-			proto._initHooks[i].call(this);
-		}
-	};
-
-	return NewClass;
-};
-
-
-// method for adding properties to prototype
-L.Class.include = function (props) {
-	L.extend(this.prototype, props);
-};
-
-// merge new default options to the Class
-L.Class.mergeOptions = function (options) {
-	L.extend(this.prototype.options, options);
-};
-
-// add a constructor hook
-L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
-	var args = Array.prototype.slice.call(arguments, 1);
-
-	var init = typeof fn === 'function' ? fn : function () {
-		this[fn].apply(this, args);
-	};
-
-	this.prototype._initHooks = this.prototype._initHooks || [];
-	this.prototype._initHooks.push(init);
-};
-
-
-/*
- * L.Mixin.Events is used to add custom events functionality to Leaflet classes.
- */
-
-var eventsKey = '_leaflet_events';
-
-L.Mixin = {};
-
-L.Mixin.Events = {
-
-	addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])
-
-		// types can be a map of types/handlers
-		if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }
-
-		var events = this[eventsKey] = this[eventsKey] || {},
-		    contextId = context && context !== this && L.stamp(context),
-		    i, len, event, type, indexKey, indexLenKey, typeIndex;
-
-		// types can be a string of space-separated words
-		types = L.Util.splitWords(types);
-
-		for (i = 0, len = types.length; i < len; i++) {
-			event = {
-				action: fn,
-				context: context || this
-			};
-			type = types[i];
-
-			if (contextId) {
-				// store listeners of a particular context in a separate hash (if it has an id)
-				// gives a major performance boost when removing thousands of map layers
-
-				indexKey = type + '_idx';
-				indexLenKey = indexKey + '_len';
-
-				typeIndex = events[indexKey] = events[indexKey] || {};
-
-				if (!typeIndex[contextId]) {
-					typeIndex[contextId] = [];
-
-					// keep track of the number of keys in the index to quickly check if it's empty
-					events[indexLenKey] = (events[indexLenKey] || 0) + 1;
-				}
-
-				typeIndex[contextId].push(event);
-
-
-			} else {
-				events[type] = events[type] || [];
-				events[type].push(event);
-			}
-		}
-
-		return this;
-	},
-
-	hasEventListeners: function (type) { // (String) -> Boolean
-		var events = this[eventsKey];
-		return !!events && ((type in events && events[type].length > 0) ||
-		                    (type + '_idx' in events && events[type + '_idx_len'] > 0));
-	},
-
-	removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])
-
-		if (!this[eventsKey]) {
-			return this;
-		}
-
-		if (!types) {
-			return this.clearAllEventListeners();
-		}
-
-		if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }
-
-		var events = this[eventsKey],
-		    contextId = context && context !== this && L.stamp(context),
-		    i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;
-
-		types = L.Util.splitWords(types);
-
-		for (i = 0, len = types.length; i < len; i++) {
-			type = types[i];
-			indexKey = type + '_idx';
-			indexLenKey = indexKey + '_len';
-
-			typeIndex = events[indexKey];
-
-			if (!fn) {
-				// clear all listeners for a type if function isn't specified
-				delete events[type];
-				delete events[indexKey];
-				delete events[indexLenKey];
-
-			} else {
-				listeners = contextId && typeIndex ? typeIndex[contextId] : events[type];
-
-				if (listeners) {
-					for (j = listeners.length - 1; j >= 0; j--) {
-						if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {
-							removed = listeners.splice(j, 1);
-							// set the old action to a no-op, because it is possible
-							// that the listener is being iterated over as part of a dispatch
-							removed[0].action = L.Util.falseFn;
-						}
-					}
-
-					if (context && typeIndex && (listeners.length === 0)) {
-						delete typeIndex[contextId];
-						events[indexLenKey]--;
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	clearAllEventListeners: function () {
-		delete this[eventsKey];
-		return this;
-	},
-
-	fireEvent: function (type, data) { // (String[, Object])
-		if (!this.hasEventListeners(type)) {
-			return this;
-		}
-
-		var event = L.Util.extend({}, data, { type: type, target: this });
-
-		var events = this[eventsKey],
-		    listeners, i, len, typeIndex, contextId;
-
-		if (events[type]) {
-			// make sure adding/removing listeners inside other listeners won't cause infinite loop
-			listeners = events[type].slice();
-
-			for (i = 0, len = listeners.length; i < len; i++) {
-				listeners[i].action.call(listeners[i].context, event);
-			}
-		}
-
-		// fire event for the context-indexed listeners as well
-		typeIndex = events[type + '_idx'];
-
-		for (contextId in typeIndex) {
-			listeners = typeIndex[contextId].slice();
-
-			if (listeners) {
-				for (i = 0, len = listeners.length; i < len; i++) {
-					listeners[i].action.call(listeners[i].context, event);
-				}
-			}
-		}
-
-		return this;
-	},
-
-	addOneTimeEventListener: function (types, fn, context) {
-
-		if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }
-
-		var handler = L.bind(function () {
-			this
-			    .removeEventListener(types, fn, context)
-			    .removeEventListener(types, handler, context);
-		}, this);
-
-		return this
-		    .addEventListener(types, fn, context)
-		    .addEventListener(types, handler, context);
-	}
-};
-
-L.Mixin.Events.on = L.Mixin.Events.addEventListener;
-L.Mixin.Events.off = L.Mixin.Events.removeEventListener;
-L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;
-L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
-
-
-/*
- * L.Browser handles different browser and feature detections for internal Leaflet use.
- */
-
-(function () {
-
-	var ie = 'ActiveXObject' in window,
-		ielt9 = ie && !document.addEventListener,
-
-	    // terrible browser detection to work around Safari / iOS / Android browser bugs
-	    ua = navigator.userAgent.toLowerCase(),
-	    webkit = ua.indexOf('webkit') !== -1,
-	    chrome = ua.indexOf('chrome') !== -1,
-	    phantomjs = ua.indexOf('phantom') !== -1,
-	    android = ua.indexOf('android') !== -1,
-	    android23 = ua.search('android [23]') !== -1,
-		gecko = ua.indexOf('gecko') !== -1,
-
-	    mobile = typeof orientation !== undefined + '',
-	    msPointer = window.navigator && window.navigator.msPointerEnabled &&
-	              window.navigator.msMaxTouchPoints && !window.PointerEvent,
-		pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) ||
-				  msPointer,
-	    retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||
-	             ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&
-	              window.matchMedia('(min-resolution:144dpi)').matches),
-
-	    doc = document.documentElement,
-	    ie3d = ie && ('transition' in doc.style),
-	    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,
-	    gecko3d = 'MozPerspective' in doc.style,
-	    opera3d = 'OTransition' in doc.style,
-	    any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;
-
-
-	// PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch.
-	// https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151
-
-	var touch = !window.L_NO_TOUCH && !phantomjs && (function () {
-
-		var startName = 'ontouchstart';
-
-		// IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc.
-		if (pointer || (startName in doc)) {
-			return true;
-		}
-
-		// Firefox/Gecko
-		var div = document.createElement('div'),
-		    supported = false;
-
-		if (!div.setAttribute) {
-			return false;
-		}
-		div.setAttribute(startName, 'return;');
-
-		if (typeof div[startName] === 'function') {
-			supported = true;
-		}
-
-		div.removeAttribute(startName);
-		div = null;
-
-		return supported;
-	}());
-
-
-	L.Browser = {
-		ie: ie,
-		ielt9: ielt9,
-		webkit: webkit,
-		gecko: gecko && !webkit && !window.opera && !ie,
-
-		android: android,
-		android23: android23,
-
-		chrome: chrome,
-
-		ie3d: ie3d,
-		webkit3d: webkit3d,
-		gecko3d: gecko3d,
-		opera3d: opera3d,
-		any3d: any3d,
-
-		mobile: mobile,
-		mobileWebkit: mobile && webkit,
-		mobileWebkit3d: mobile && webkit3d,
-		mobileOpera: mobile && window.opera,
-
-		touch: touch,
-		msPointer: msPointer,
-		pointer: pointer,
-
-		retina: retina
-	};
-
-}());
-
-
-/*
- * L.Point represents a point with x and y coordinates.
- */
-
-L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
-	this.x = (round ? Math.round(x) : x);
-	this.y = (round ? Math.round(y) : y);
-};
-
-L.Point.prototype = {
-
-	clone: function () {
-		return new L.Point(this.x, this.y);
-	},
-
-	// non-destructive, returns a new point
-	add: function (point) {
-		return this.clone()._add(L.point(point));
-	},
-
-	// destructive, used directly for performance in situations where it's safe to modify existing point
-	_add: function (point) {
-		this.x += point.x;
-		this.y += point.y;
-		return this;
-	},
-
-	subtract: function (point) {
-		return this.clone()._subtract(L.point(point));
-	},
-
-	_subtract: function (point) {
-		this.x -= point.x;
-		this.y -= point.y;
-		return this;
-	},
-
-	divideBy: function (num) {
-		return this.clone()._divideBy(num);
-	},
-
-	_divideBy: function (num) {
-		this.x /= num;
-		this.y /= num;
-		return this;
-	},
-
-	multiplyBy: function (num) {
-		return this.clone()._multiplyBy(num);
-	},
-
-	_multiplyBy: function (num) {
-		this.x *= num;
-		this.y *= num;
-		return this;
-	},
-
-	round: function () {
-		return this.clone()._round();
-	},
-
-	_round: function () {
-		this.x = Math.round(this.x);
-		this.y = Math.round(this.y);
-		return this;
-	},
-
-	floor: function () {
-		return this.clone()._floor();
-	},
-
-	_floor: function () {
-		this.x = Math.floor(this.x);
-		this.y = Math.floor(this.y);
-		return this;
-	},
-
-	distanceTo: function (point) {
-		point = L.point(point);
-
-		var x = point.x - this.x,
-		    y = point.y - this.y;
-
-		return Math.sqrt(x * x + y * y);
-	},
-
-	equals: function (point) {
-		point = L.point(point);
-
-		return point.x === this.x &&
-		       point.y === this.y;
-	},
-
-	contains: function (point) {
-		point = L.point(point);
-
-		return Math.abs(point.x) <= Math.abs(this.x) &&
-		       Math.abs(point.y) <= Math.abs(this.y);
-	},
-
-	toString: function () {
-		return 'Point(' +
-		        L.Util.formatNum(this.x) + ', ' +
-		        L.Util.formatNum(this.y) + ')';
-	}
-};
-
-L.point = function (x, y, round) {
-	if (x instanceof L.Point) {
-		return x;
-	}
-	if (L.Util.isArray(x)) {
-		return new L.Point(x[0], x[1]);
-	}
-	if (x === undefined || x === null) {
-		return x;
-	}
-	return new L.Point(x, y, round);
-};
-
-
-/*
- * L.Bounds represents a rectangular area on the screen in pixel coordinates.
- */
-
-L.Bounds = function (a, b) { //(Point, Point) or Point[]
-	if (!a) { return; }
-
-	var points = b ? [a, b] : a;
-
-	for (var i = 0, len = points.length; i < len; i++) {
-		this.extend(points[i]);
-	}
-};
-
-L.Bounds.prototype = {
-	// extend the bounds to contain the given point
-	extend: function (point) { // (Point)
-		point = L.point(point);
-
-		if (!this.min && !this.max) {
-			this.min = point.clone();
-			this.max = point.clone();
-		} else {
-			this.min.x = Math.min(point.x, this.min.x);
-			this.max.x = Math.max(point.x, this.max.x);
-			this.min.y = Math.min(point.y, this.min.y);
-			this.max.y = Math.max(point.y, this.max.y);
-		}
-		return this;
-	},
-
-	getCenter: function (round) { // (Boolean) -> Point
-		return new L.Point(
-		        (this.min.x + this.max.x) / 2,
-		        (this.min.y + this.max.y) / 2, round);
-	},
-
-	getBottomLeft: function () { // -> Point
-		return new L.Point(this.min.x, this.max.y);
-	},
-
-	getTopRight: function () { // -> Point
-		return new L.Point(this.max.x, this.min.y);
-	},
-
-	getSize: function () {
-		return this.max.subtract(this.min);
-	},
-
-	contains: function (obj) { // (Bounds) or (Point) -> Boolean
-		var min, max;
-
-		if (typeof obj[0] === 'number' || obj instanceof L.Point) {
-			obj = L.point(obj);
-		} else {
-			obj = L.bounds(obj);
-		}
-
-		if (obj instanceof L.Bounds) {
-			min = obj.min;
-			max = obj.max;
-		} else {
-			min = max = obj;
-		}
-
-		return (min.x >= this.min.x) &&
-		       (max.x <= this.max.x) &&
-		       (min.y >= this.min.y) &&
-		       (max.y <= this.max.y);
-	},
-
-	intersects: function (bounds) { // (Bounds) -> Boolean
-		bounds = L.bounds(bounds);
-
-		var min = this.min,
-		    max = this.max,
-		    min2 = bounds.min,
-		    max2 = bounds.max,
-		    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
-		    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
-
-		return xIntersects && yIntersects;
-	},
-
-	isValid: function () {
-		return !!(this.min && this.max);
-	}
-};
-
-L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])
-	if (!a || a instanceof L.Bounds) {
-		return a;
-	}
-	return new L.Bounds(a, b);
-};
-
-
-/*
- * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.
- */
-
-L.Transformation = function (a, b, c, d) {
-	this._a = a;
-	this._b = b;
-	this._c = c;
-	this._d = d;
-};
-
-L.Transformation.prototype = {
-	transform: function (point, scale) { // (Point, Number) -> Point
-		return this._transform(point.clone(), scale);
-	},
-
-	// destructive transform (faster)
-	_transform: function (point, scale) {
-		scale = scale || 1;
-		point.x = scale * (this._a * point.x + this._b);
-		point.y = scale * (this._c * point.y + this._d);
-		return point;
-	},
-
-	untransform: function (point, scale) {
-		scale = scale || 1;
-		return new L.Point(
-		        (point.x / scale - this._b) / this._a,
-		        (point.y / scale - this._d) / this._c);
-	}
-};
-
-
-/*
- * L.DomUtil contains various utility functions for working with DOM.
- */
-
-L.DomUtil = {
-	get: function (id) {
-		return (typeof id === 'string' ? document.getElementById(id) : id);
-	},
-
-	getStyle: function (el, style) {
-
-		var value = el.style[style];
-
-		if (!value && el.currentStyle) {
-			value = el.currentStyle[style];
-		}
-
-		if ((!value || value === 'auto') && document.defaultView) {
-			var css = document.defaultView.getComputedStyle(el, null);
-			value = css ? css[style] : null;
-		}
-
-		return value === 'auto' ? null : value;
-	},
-
-	getViewportOffset: function (element) {
-
-		var top = 0,
-		    left = 0,
-		    el = element,
-		    docBody = document.body,
-		    docEl = document.documentElement,
-		    pos;
-
-		do {
-			top  += el.offsetTop  || 0;
-			left += el.offsetLeft || 0;
-
-			//add borders
-			top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;
-			left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;
-
-			pos = L.DomUtil.getStyle(el, 'position');
-
-			if (el.offsetParent === docBody && pos === 'absolute') { break; }
-
-			if (pos === 'fixed') {
-				top  += docBody.scrollTop  || docEl.scrollTop  || 0;
-				left += docBody.scrollLeft || docEl.scrollLeft || 0;
-				break;
-			}
-
-			if (pos === 'relative' && !el.offsetLeft) {
-				var width = L.DomUtil.getStyle(el, 'width'),
-				    maxWidth = L.DomUtil.getStyle(el, 'max-width'),
-				    r = el.getBoundingClientRect();
-
-				if (width !== 'none' || maxWidth !== 'none') {
-					left += r.left + el.clientLeft;
-				}
-
-				//calculate full y offset since we're breaking out of the loop
-				top += r.top + (docBody.scrollTop  || docEl.scrollTop  || 0);
-
-				break;
-			}
-
-			el = el.offsetParent;
-
-		} while (el);
-
-		el = element;
-
-		do {
-			if (el === docBody) { break; }
-
-			top  -= el.scrollTop  || 0;
-			left -= el.scrollLeft || 0;
-
-			el = el.parentNode;
-		} while (el);
-
-		return new L.Point(left, top);
-	},
-
-	documentIsLtr: function () {
-		if (!L.DomUtil._docIsLtrCached) {
-			L.DomUtil._docIsLtrCached = true;
-			L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';
-		}
-		return L.DomUtil._docIsLtr;
-	},
-
-	create: function (tagName, className, container) {
-
-		var el = document.createElement(tagName);
-		el.className = className;
-
-		if (container) {
-			container.appendChild(el);
-		}
-
-		return el;
-	},
-
-	hasClass: function (el, name) {
-		if (el.classList !== undefined) {
-			return el.classList.contains(name);
-		}
-		var className = L.DomUtil._getClass(el);
-		return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
-	},
-
-	addClass: function (el, name) {
-		if (el.classList !== undefined) {
-			var classes = L.Util.splitWords(name);
-			for (var i = 0, len = classes.length; i < len; i++) {
-				el.classList.add(classes[i]);
-			}
-		} else if (!L.DomUtil.hasClass(el, name)) {
-			var className = L.DomUtil._getClass(el);
-			L.DomUtil._setClass(el, (className ? className + ' ' : '') + name);
-		}
-	},
-
-	removeClass: function (el, name) {
-		if (el.classList !== undefined) {
-			el.classList.remove(name);
-		} else {
-			L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
-		}
-	},
-
-	_setClass: function (el, name) {
-		if (el.className.baseVal === undefined) {
-			el.className = name;
-		} else {
-			// in case of SVG element
-			el.className.baseVal = name;
-		}
-	},
-
-	_getClass: function (el) {
-		return el.className.baseVal === undefined ? el.className : el.className.baseVal;
-	},
-
-	setOpacity: function (el, value) {
-
-		if ('opacity' in el.style) {
-			el.style.opacity = value;
-
-		} else if ('filter' in el.style) {
-
-			var filter = false,
-			    filterName = 'DXImageTransform.Microsoft.Alpha';
-
-			// filters collection throws an error if we try to retrieve a filter that doesn't exist
-			try {
-				filter = el.filters.item(filterName);
-			} catch (e) {
-				// don't set opacity to 1 if we haven't already set an opacity,
-				// it isn't needed and breaks transparent pngs.
-				if (value === 1) { return; }
-			}
-
-			value = Math.round(value * 100);
-
-			if (filter) {
-				filter.Enabled = (value !== 100);
-				filter.Opacity = value;
-			} else {
-				el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
-			}
-		}
-	},
-
-	testProp: function (props) {
-
-		var style = document.documentElement.style;
-
-		for (var i = 0; i < props.length; i++) {
-			if (props[i] in style) {
-				return props[i];
-			}
-		}
-		return false;
-	},
-
-	getTranslateString: function (point) {
-		// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate
-		// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care
-		// (same speed either way), Opera 12 doesn't support translate3d
-
-		var is3d = L.Browser.webkit3d,
-		    open = 'translate' + (is3d ? '3d' : '') + '(',
-		    close = (is3d ? ',0' : '') + ')';
-
-		return open + point.x + 'px,' + point.y + 'px' + close;
-	},
-
-	getScaleString: function (scale, origin) {
-
-		var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),
-		    scaleStr = ' scale(' + scale + ') ';
-
-		return preTranslateStr + scaleStr;
-	},
-
-	setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])
-
-		// jshint camelcase: false
-		el._leaflet_pos = point;
-
-		if (!disable3D && L.Browser.any3d) {
-			el.style[L.DomUtil.TRANSFORM] =  L.DomUtil.getTranslateString(point);
-		} else {
-			el.style.left = point.x + 'px';
-			el.style.top = point.y + 'px';
-		}
-	},
-
-	getPosition: function (el) {
-		// this method is only used for elements previously positioned using setPosition,
-		// so it's safe to cache the position for performance
-
-		// jshint camelcase: false
-		return el._leaflet_pos;
-	}
-};
-
-
-// prefix style property names
-
-L.DomUtil.TRANSFORM = L.DomUtil.testProp(
-        ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
-
-// webkitTransition comes first because some browser versions that drop vendor prefix don't do
-// the same for the transitionend event, in particular the Android 4.1 stock browser
-
-L.DomUtil.TRANSITION = L.DomUtil.testProp(
-        ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
-
-L.DomUtil.TRANSITION_END =
-        L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?
-        L.DomUtil.TRANSITION + 'End' : 'transitionend';
-
-(function () {
-    if ('onselectstart' in document) {
-        L.extend(L.DomUtil, {
-            disableTextSelection: function () {
-                L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
-            },
-
-            enableTextSelection: function () {
-                L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
-            }
-        });
-    } else {
-        var userSelectProperty = L.DomUtil.testProp(
-            ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
-
-        L.extend(L.DomUtil, {
-            disableTextSelection: function () {
-                if (userSelectProperty) {
-                    var style = document.documentElement.style;
-                    this._userSelect = style[userSelectProperty];
-                    style[userSelectProperty] = 'none';
-                }
-            },
-
-            enableTextSelection: function () {
-                if (userSelectProperty) {
-                    document.documentElement.style[userSelectProperty] = this._userSelect;
-                    delete this._userSelect;
-                }
-            }
-        });
-    }
-
-	L.extend(L.DomUtil, {
-		disableImageDrag: function () {
-			L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
-		},
-
-		enableImageDrag: function () {
-			L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
-		}
-	});
-})();
-
-
-/*
- * L.LatLng represents a geographical point with latitude and longitude coordinates.
- */
-
-L.LatLng = function (lat, lng, alt) { // (Number, Number, Number)
-	lat = parseFloat(lat);
-	lng = parseFloat(lng);
-
-	if (isNaN(lat) || isNaN(lng)) {
-		throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
-	}
-
-	this.lat = lat;
-	this.lng = lng;
-
-	if (alt !== undefined) {
-		this.alt = parseFloat(alt);
-	}
-};
-
-L.extend(L.LatLng, {
-	DEG_TO_RAD: Math.PI / 180,
-	RAD_TO_DEG: 180 / Math.PI,
-	MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check
-});
-
-L.LatLng.prototype = {
-	equals: function (obj) { // (LatLng) -> Boolean
-		if (!obj) { return false; }
-
-		obj = L.latLng(obj);
-
-		var margin = Math.max(
-		        Math.abs(this.lat - obj.lat),
-		        Math.abs(this.lng - obj.lng));
-
-		return margin <= L.LatLng.MAX_MARGIN;
-	},
-
-	toString: function (precision) { // (Number) -> String
-		return 'LatLng(' +
-		        L.Util.formatNum(this.lat, precision) + ', ' +
-		        L.Util.formatNum(this.lng, precision) + ')';
-	},
-
-	// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
-	// TODO move to projection code, LatLng shouldn't know about Earth
-	distanceTo: function (other) { // (LatLng) -> Number
-		other = L.latLng(other);
-
-		var R = 6378137, // earth radius in meters
-		    d2r = L.LatLng.DEG_TO_RAD,
-		    dLat = (other.lat - this.lat) * d2r,
-		    dLon = (other.lng - this.lng) * d2r,
-		    lat1 = this.lat * d2r,
-		    lat2 = other.lat * d2r,
-		    sin1 = Math.sin(dLat / 2),
-		    sin2 = Math.sin(dLon / 2);
-
-		var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);
-
-		return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
-	},
-
-	wrap: function (a, b) { // (Number, Number) -> LatLng
-		var lng = this.lng;
-
-		a = a || -180;
-		b = b ||  180;
-
-		lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);
-
-		return new L.LatLng(this.lat, lng);
-	}
-};
-
-L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)
-	if (a instanceof L.LatLng) {
-		return a;
-	}
-	if (L.Util.isArray(a)) {
-		if (typeof a[0] === 'number' || typeof a[0] === 'string') {
-			return new L.LatLng(a[0], a[1], a[2]);
-		} else {
-			return null;
-		}
-	}
-	if (a === undefined || a === null) {
-		return a;
-	}
-	if (typeof a === 'object' && 'lat' in a) {
-		return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);
-	}
-	if (b === undefined) {
-		return null;
-	}
-	return new L.LatLng(a, b);
-};
-
-
-
-/*
- * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.
- */
-
-L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])
-	if (!southWest) { return; }
-
-	var latlngs = northEast ? [southWest, northEast] : southWest;
-
-	for (var i = 0, len = latlngs.length; i < len; i++) {
-		this.extend(latlngs[i]);
-	}
-};
-
-L.LatLngBounds.prototype = {
-	// extend the bounds to contain the given point or bounds
-	extend: function (obj) { // (LatLng) or (LatLngBounds)
-		if (!obj) { return this; }
-
-		var latLng = L.latLng(obj);
-		if (latLng !== null) {
-			obj = latLng;
-		} else {
-			obj = L.latLngBounds(obj);
-		}
-
-		if (obj instanceof L.LatLng) {
-			if (!this._southWest && !this._northEast) {
-				this._southWest = new L.LatLng(obj.lat, obj.lng);
-				this._northEast = new L.LatLng(obj.lat, obj.lng);
-			} else {
-				this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
-				this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
-
-				this._northEast.lat = Math.max(obj.lat, this._northEast.lat);
-				this._northEast.lng = Math.max(obj.lng, this._northEast.lng);
-			}
-		} else if (obj instanceof L.LatLngBounds) {
-			this.extend(obj._southWest);
-			this.extend(obj._northEast);
-		}
-		return this;
-	},
-
-	// extend the bounds by a percentage
-	pad: function (bufferRatio) { // (Number) -> LatLngBounds
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
-		    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
-
-		return new L.LatLngBounds(
-		        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
-		        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
-	},
-
-	getCenter: function () { // -> LatLng
-		return new L.LatLng(
-		        (this._southWest.lat + this._northEast.lat) / 2,
-		        (this._southWest.lng + this._northEast.lng) / 2);
-	},
-
-	getSouthWest: function () {
-		return this._southWest;
-	},
-
-	getNorthEast: function () {
-		return this._northEast;
-	},
-
-	getNorthWest: function () {
-		return new L.LatLng(this.getNorth(), this.getWest());
-	},
-
-	getSouthEast: function () {
-		return new L.LatLng(this.getSouth(), this.getEast());
-	},
-
-	getWest: function () {
-		return this._southWest.lng;
-	},
-
-	getSouth: function () {
-		return this._southWest.lat;
-	},
-
-	getEast: function () {
-		return this._northEast.lng;
-	},
-
-	getNorth: function () {
-		return this._northEast.lat;
-	},
-
-	contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
-		if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
-			obj = L.latLng(obj);
-		} else {
-			obj = L.latLngBounds(obj);
-		}
-
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2, ne2;
-
-		if (obj instanceof L.LatLngBounds) {
-			sw2 = obj.getSouthWest();
-			ne2 = obj.getNorthEast();
-		} else {
-			sw2 = ne2 = obj;
-		}
-
-		return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
-		       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
-	},
-
-	intersects: function (bounds) { // (LatLngBounds)
-		bounds = L.latLngBounds(bounds);
-
-		var sw = this._southWest,
-		    ne = this._northEast,
-		    sw2 = bounds.getSouthWest(),
-		    ne2 = bounds.getNorthEast(),
-
-		    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
-		    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
-
-		return latIntersects && lngIntersects;
-	},
-
-	toBBoxString: function () {
-		return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
-	},
-
-	equals: function (bounds) { // (LatLngBounds)
-		if (!bounds) { return false; }
-
-		bounds = L.latLngBounds(bounds);
-
-		return this._southWest.equals(bounds.getSouthWest()) &&
-		       this._northEast.equals(bounds.getNorthEast());
-	},
-
-	isValid: function () {
-		return !!(this._southWest && this._northEast);
-	}
-};
-
-//TODO International date line?
-
-L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)
-	if (!a || a instanceof L.LatLngBounds) {
-		return a;
-	}
-	return new L.LatLngBounds(a, b);
-};
-
-
-/*
- * L.Projection contains various geographical projections used by CRS classes.
- */
-
-L.Projection = {};
-
-
-/*
- * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.
- */
-
-L.Projection.SphericalMercator = {
-	MAX_LATITUDE: 85.0511287798,
-
-	project: function (latlng) { // (LatLng) -> Point
-		var d = L.LatLng.DEG_TO_RAD,
-		    max = this.MAX_LATITUDE,
-		    lat = Math.max(Math.min(max, latlng.lat), -max),
-		    x = latlng.lng * d,
-		    y = lat * d;
-
-		y = Math.log(Math.tan((Math.PI / 4) + (y / 2)));
-
-		return new L.Point(x, y);
-	},
-
-	unproject: function (point) { // (Point, Boolean) -> LatLng
-		var d = L.LatLng.RAD_TO_DEG,
-		    lng = point.x * d,
-		    lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
-
-		return new L.LatLng(lat, lng);
-	}
-};
-
-
-/*
- * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.
- */
-
-L.Projection.LonLat = {
-	project: function (latlng) {
-		return new L.Point(latlng.lng, latlng.lat);
-	},
-
-	unproject: function (point) {
-		return new L.LatLng(point.y, point.x);
-	}
-};
-
-
-/*
- * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.
- */
-
-L.CRS = {
-	latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point
-		var projectedPoint = this.projection.project(latlng),
-		    scale = this.scale(zoom);
-
-		return this.transformation._transform(projectedPoint, scale);
-	},
-
-	pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng
-		var scale = this.scale(zoom),
-		    untransformedPoint = this.transformation.untransform(point, scale);
-
-		return this.projection.unproject(untransformedPoint);
-	},
-
-	project: function (latlng) {
-		return this.projection.project(latlng);
-	},
-
-	scale: function (zoom) {
-		return 256 * Math.pow(2, zoom);
-	},
-
-	getSize: function (zoom) {
-		var s = this.scale(zoom);
-		return L.point(s, s);
-	}
-};
-
-
-/*
- * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.
- */
-
-L.CRS.Simple = L.extend({}, L.CRS, {
-	projection: L.Projection.LonLat,
-	transformation: new L.Transformation(1, 0, -1, 0),
-
-	scale: function (zoom) {
-		return Math.pow(2, zoom);
-	}
-});
-
-
-/*
- * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping
- * and is used by Leaflet by default.
- */
-
-L.CRS.EPSG3857 = L.extend({}, L.CRS, {
-	code: 'EPSG:3857',
-
-	projection: L.Projection.SphericalMercator,
-	transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),
-
-	project: function (latlng) { // (LatLng) -> Point
-		var projectedPoint = this.projection.project(latlng),
-		    earthRadius = 6378137;
-		return projectedPoint.multiplyBy(earthRadius);
-	}
-});
-
-L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
-	code: 'EPSG:900913'
-});
-
-
-/*
- * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.
- */
-
-L.CRS.EPSG4326 = L.extend({}, L.CRS, {
-	code: 'EPSG:4326',
-
-	projection: L.Projection.LonLat,
-	transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)
-});
-
-
-/*
- * L.Map is the central class of the API - it is used to create a map.
- */
-
-L.Map = L.Class.extend({
-
-	includes: L.Mixin.Events,
-
-	options: {
-		crs: L.CRS.EPSG3857,
-
-		/*
-		center: LatLng,
-		zoom: Number,
-		layers: Array,
-		*/
-
-		fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
-		trackResize: true,
-		markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
-	},
-
-	initialize: function (id, options) { // (HTMLElement or String, Object)
-		options = L.setOptions(this, options);
-
-
-		this._initContainer(id);
-		this._initLayout();
-
-		// hack for https://github.com/Leaflet/Leaflet/issues/1980
-		this._onResize = L.bind(this._onResize, this);
-
-		this._initEvents();
-
-		if (options.maxBounds) {
-			this.setMaxBounds(options.maxBounds);
-		}
-
-		if (options.center && options.zoom !== undefined) {
-			this.setView(L.latLng(options.center), options.zoom, {reset: true});
-		}
-
-		this._handlers = [];
-
-		this._layers = {};
-		this._zoomBoundLayers = {};
-		this._tileLayersNum = 0;
-
-		this.callInitHooks();
-
-		this._addLayers(options.layers);
-	},
-
-
-	// public methods that modify map state
-
-	// replaced by animation-powered implementation in Map.PanAnimation.js
-	setView: function (center, zoom) {
-		zoom = zoom === undefined ? this.getZoom() : zoom;
-		this._resetView(L.latLng(center), this._limitZoom(zoom));
-		return this;
-	},
-
-	setZoom: function (zoom, options) {
-		if (!this._loaded) {
-			this._zoom = this._limitZoom(zoom);
-			return this;
-		}
-		return this.setView(this.getCenter(), zoom, {zoom: options});
-	},
-
-	zoomIn: function (delta, options) {
-		return this.setZoom(this._zoom + (delta || 1), options);
-	},
-
-	zoomOut: function (delta, options) {
-		return this.setZoom(this._zoom - (delta || 1), options);
-	},
-
-	setZoomAround: function (latlng, zoom, options) {
-		var scale = this.getZoomScale(zoom),
-		    viewHalf = this.getSize().divideBy(2),
-		    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
-
-		    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
-		    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
-
-		return this.setView(newCenter, zoom, {zoom: options});
-	},
-
-	fitBounds: function (bounds, options) {
-
-		options = options || {};
-		bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
-
-		var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
-		    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
-
-		    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)),
-		    paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
-
-		    swPoint = this.project(bounds.getSouthWest(), zoom),
-		    nePoint = this.project(bounds.getNorthEast(), zoom),
-		    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
-
-		zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom;
-
-		return this.setView(center, zoom, options);
-	},
-
-	fitWorld: function (options) {
-		return this.fitBounds([[-90, -180], [90, 180]], options);
-	},
-
-	panTo: function (center, options) { // (LatLng)
-		return this.setView(center, this._zoom, {pan: options});
-	},
-
-	panBy: function (offset) { // (Point)
-		// replaced with animated panBy in Map.PanAnimation.js
-		this.fire('movestart');
-
-		this._rawPanBy(L.point(offset));
-
-		this.fire('move');
-		return this.fire('moveend');
-	},
-
-	setMaxBounds: function (bounds) {
-		bounds = L.latLngBounds(bounds);
-
-		this.options.maxBounds = bounds;
-
-		if (!bounds) {
-			return this.off('moveend', this._panInsideMaxBounds, this);
-		}
-
-		if (this._loaded) {
-			this._panInsideMaxBounds();
-		}
-
-		return this.on('moveend', this._panInsideMaxBounds, this);
-	},
-
-	panInsideBounds: function (bounds, options) {
-		var center = this.getCenter(),
-			newCenter = this._limitCenter(center, this._zoom, bounds);
-
-		if (center.equals(newCenter)) { return this; }
-
-		return this.panTo(newCenter, options);
-	},
-
-	addLayer: function (layer) {
-		// TODO method is too big, refactor
-
-		var id = L.stamp(layer);
-
-		if (this._layers[id]) { return this; }
-
-		this._layers[id] = layer;
-
-		// TODO getMaxZoom, getMinZoom in ILayer (instead of options)
-		if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {
-			this._zoomBoundLayers[id] = layer;
-			this._updateZoomLevels();
-		}
-
-		// TODO looks ugly, refactor!!!
-		if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
-			this._tileLayersNum++;
-			this._tileLayersToLoad++;
-			layer.on('load', this._onTileLayerLoad, this);
-		}
-
-		if (this._loaded) {
-			this._layerAdd(layer);
-		}
-
-		return this;
-	},
-
-	removeLayer: function (layer) {
-		var id = L.stamp(layer);
-
-		if (!this._layers[id]) { return this; }
-
-		if (this._loaded) {
-			layer.onRemove(this);
-		}
-
-		delete this._layers[id];
-
-		if (this._loaded) {
-			this.fire('layerremove', {layer: layer});
-		}
-
-		if (this._zoomBoundLayers[id]) {
-			delete this._zoomBoundLayers[id];
-			this._updateZoomLevels();
-		}
-
-		// TODO looks ugly, refactor
-		if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
-			this._tileLayersNum--;
-			this._tileLayersToLoad--;
-			layer.off('load', this._onTileLayerLoad, this);
-		}
-
-		return this;
-	},
-
-	hasLayer: function (layer) {
-		if (!layer) { return false; }
-
-		return (L.stamp(layer) in this._layers);
-	},
-
-	eachLayer: function (method, context) {
-		for (var i in this._layers) {
-			method.call(context, this._layers[i]);
-		}
-		return this;
-	},
-
-	invalidateSize: function (options) {
-		if (!this._loaded) { return this; }
-
-		options = L.extend({
-			animate: false,
-			pan: true
-		}, options === true ? {animate: true} : options);
-
-		var oldSize = this.getSize();
-		this._sizeChanged = true;
-		this._initialCenter = null;
-
-		var newSize = this.getSize(),
-		    oldCenter = oldSize.divideBy(2).round(),
-		    newCenter = newSize.divideBy(2).round(),
-		    offset = oldCenter.subtract(newCenter);
-
-		if (!offset.x && !offset.y) { return this; }
-
-		if (options.animate && options.pan) {
-			this.panBy(offset);
-
-		} else {
-			if (options.pan) {
-				this._rawPanBy(offset);
-			}
-
-			this.fire('move');
-
-			if (options.debounceMoveend) {
-				clearTimeout(this._sizeTimer);
-				this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
-			} else {
-				this.fire('moveend');
-			}
-		}
-
-		return this.fire('resize', {
-			oldSize: oldSize,
-			newSize: newSize
-		});
-	},
-
-	// TODO handler.addTo
-	addHandler: function (name, HandlerClass) {
-		if (!HandlerClass) { return this; }
-
-		var handler = this[name] = new HandlerClass(this);
-
-		this._handlers.push(handler);
-
-		if (this.options[name]) {
-			handler.enable();
-		}
-
-		return this;
-	},
-
-	remove: function () {
-		if (this._loaded) {
-			this.fire('unload');
-		}
-
-		this._initEvents('off');
-
-		try {
-			// throws error in IE6-8
-			delete this._container._leaflet;
-		} catch (e) {
-			this._container._leaflet = undefined;
-		}
-
-		this._clearPanes();
-		if (this._clearControlPos) {
-			this._clearControlPos();
-		}
-
-		this._clearHandlers();
-
-		return this;
-	},
-
-
-	// public methods for getting map state
-
-	getCenter: function () { // (Boolean) -> LatLng
-		this._checkIfLoaded();
-
-		if (this._initialCenter && !this._moved()) {
-			return this._initialCenter;
-		}
-		return this.layerPointToLatLng(this._getCenterLayerPoint());
-	},
-
-	getZoom: function () {
-		return this._zoom;
-	},
-
-	getBounds: function () {
-		var bounds = this.getPixelBounds(),
-		    sw = this.unproject(bounds.getBottomLeft()),
-		    ne = this.unproject(bounds.getTopRight());
-
-		return new L.LatLngBounds(sw, ne);
-	},
-
-	getMinZoom: function () {
-		return this.options.minZoom === undefined ?
-			(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :
-			this.options.minZoom;
-	},
-
-	getMaxZoom: function () {
-		return this.options.maxZoom === undefined ?
-			(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
-			this.options.maxZoom;
-	},
-
-	getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
-		bounds = L.latLngBounds(bounds);
-
-		var zoom = this.getMinZoom() - (inside ? 1 : 0),
-		    maxZoom = this.getMaxZoom(),
-		    size = this.getSize(),
-
-		    nw = bounds.getNorthWest(),
-		    se = bounds.getSouthEast(),
-
-		    zoomNotFound = true,
-		    boundsSize;
-
-		padding = L.point(padding || [0, 0]);
-
-		do {
-			zoom++;
-			boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);
-			zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;
-
-		} while (zoomNotFound && zoom <= maxZoom);
-
-		if (zoomNotFound && inside) {
-			return null;
-		}
-
-		return inside ? zoom : zoom - 1;
-	},
-
-	getSize: function () {
-		if (!this._size || this._sizeChanged) {
-			this._size = new L.Point(
-				this._container.clientWidth,
-				this._container.clientHeight);
-
-			this._sizeChanged = false;
-		}
-		return this._size.clone();
-	},
-
-	getPixelBounds: function () {
-		var topLeftPoint = this._getTopLeftPoint();
-		return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
-	},
-
-	getPixelOrigin: function () {
-		this._checkIfLoaded();
-		return this._initialTopLeftPoint;
-	},
-
-	getPanes: function () {
-		return this._panes;
-	},
-
-	getContainer: function () {
-		return this._container;
-	},
-
-
-	// TODO replace with universal implementation after refactoring projections
-
-	getZoomScale: function (toZoom) {
-		var crs = this.options.crs;
-		return crs.scale(toZoom) / crs.scale(this._zoom);
-	},
-
-	getScaleZoom: function (scale) {
-		return this._zoom + (Math.log(scale) / Math.LN2);
-	},
-
-
-	// conversion methods
-
-	project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
-		zoom = zoom === undefined ? this._zoom : zoom;
-		return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
-	},
-
-	unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
-		zoom = zoom === undefined ? this._zoom : zoom;
-		return this.options.crs.pointToLatLng(L.point(point), zoom);
-	},
-
-	layerPointToLatLng: function (point) { // (Point)
-		var projectedPoint = L.point(point).add(this.getPixelOrigin());
-		return this.unproject(projectedPoint);
-	},
-
-	latLngToLayerPoint: function (latlng) { // (LatLng)
-		var projectedPoint = this.project(L.latLng(latlng))._round();
-		return projectedPoint._subtract(this.getPixelOrigin());
-	},
-
-	containerPointToLayerPoint: function (point) { // (Point)
-		return L.point(point).subtract(this._getMapPanePos());
-	},
-
-	layerPointToContainerPoint: function (point) { // (Point)
-		return L.point(point).add(this._getMapPanePos());
-	},
-
-	containerPointToLatLng: function (point) {
-		var layerPoint = this.containerPointToLayerPoint(L.point(point));
-		return this.layerPointToLatLng(layerPoint);
-	},
-
-	latLngToContainerPoint: function (latlng) {
-		return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
-	},
-
-	mouseEventToContainerPoint: function (e) { // (MouseEvent)
-		return L.DomEvent.getMousePosition(e, this._container);
-	},
-
-	mouseEventToLayerPoint: function (e) { // (MouseEvent)
-		return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
-	},
-
-	mouseEventToLatLng: function (e) { // (MouseEvent)
-		return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
-	},
-
-
-	// map initialization methods
-
-	_initContainer: function (id) {
-		var container = this._container = L.DomUtil.get(id);
-
-		if (!container) {
-			throw new Error('Map container not found.');
-		} else if (container._leaflet) {
-			throw new Error('Map container is already initialized.');
-		}
-
-		container._leaflet = true;
-	},
-
-	_initLayout: function () {
-		var container = this._container;
-
-		L.DomUtil.addClass(container, 'leaflet-container' +
-			(L.Browser.touch ? ' leaflet-touch' : '') +
-			(L.Browser.retina ? ' leaflet-retina' : '') +
-			(L.Browser.ielt9 ? ' leaflet-oldie' : '') +
-			(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));
-
-		var position = L.DomUtil.getStyle(container, 'position');
-
-		if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
-			container.style.position = 'relative';
-		}
-
-		this._initPanes();
-
-		if (this._initControlPos) {
-			this._initControlPos();
-		}
-	},
-
-	_initPanes: function () {
-		var panes = this._panes = {};
-
-		this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);
-
-		this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);
-		panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);
-		panes.shadowPane = this._createPane('leaflet-shadow-pane');
-		panes.overlayPane = this._createPane('leaflet-overlay-pane');
-		panes.markerPane = this._createPane('leaflet-marker-pane');
-		panes.popupPane = this._createPane('leaflet-popup-pane');
-
-		var zoomHide = ' leaflet-zoom-hide';
-
-		if (!this.options.markerZoomAnimation) {
-			L.DomUtil.addClass(panes.markerPane, zoomHide);
-			L.DomUtil.addClass(panes.shadowPane, zoomHide);
-			L.DomUtil.addClass(panes.popupPane, zoomHide);
-		}
-	},
-
-	_createPane: function (className, container) {
-		return L.DomUtil.create('div', className, container || this._panes.objectsPane);
-	},
-
-	_clearPanes: function () {
-		this._container.removeChild(this._mapPane);
-	},
-
-	_addLayers: function (layers) {
-		layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
-
-		for (var i = 0, len = layers.length; i < len; i++) {
-			this.addLayer(layers[i]);
-		}
-	},
-
-
-	// private methods that modify map state
-
-	_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
-
-		var zoomChanged = (this._zoom !== zoom);
-
-		if (!afterZoomAnim) {
-			this.fire('movestart');
-
-			if (zoomChanged) {
-				this.fire('zoomstart');
-			}
-		}
-
-		this._zoom = zoom;
-		this._initialCenter = center;
-
-		this._initialTopLeftPoint = this._getNewTopLeftPoint(center);
-
-		if (!preserveMapOffset) {
-			L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
-		} else {
-			this._initialTopLeftPoint._add(this._getMapPanePos());
-		}
-
-		this._tileLayersToLoad = this._tileLayersNum;
-
-		var loading = !this._loaded;
-		this._loaded = true;
-
-		if (loading) {
-			this.fire('load');
-			this.eachLayer(this._layerAdd, this);
-		}
-
-		this.fire('viewreset', {hard: !preserveMapOffset});
-
-		this.fire('move');
-
-		if (zoomChanged || afterZoomAnim) {
-			this.fire('zoomend');
-		}
-
-		this.fire('moveend', {hard: !preserveMapOffset});
-	},
-
-	_rawPanBy: function (offset) {
-		L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
-	},
-
-	_getZoomSpan: function () {
-		return this.getMaxZoom() - this.getMinZoom();
-	},
-
-	_updateZoomLevels: function () {
-		var i,
-			minZoom = Infinity,
-			maxZoom = -Infinity,
-			oldZoomSpan = this._getZoomSpan();
-
-		for (i in this._zoomBoundLayers) {
-			var layer = this._zoomBoundLayers[i];
-			if (!isNaN(layer.options.minZoom)) {
-				minZoom = Math.min(minZoom, layer.options.minZoom);
-			}
-			if (!isNaN(layer.options.maxZoom)) {
-				maxZoom = Math.max(maxZoom, layer.options.maxZoom);
-			}
-		}
-
-		if (i === undefined) { // we have no tilelayers
-			this._layersMaxZoom = this._layersMinZoom = undefined;
-		} else {
-			this._layersMaxZoom = maxZoom;
-			this._layersMinZoom = minZoom;
-		}
-
-		if (oldZoomSpan !== this._getZoomSpan()) {
-			this.fire('zoomlevelschange');
-		}
-	},
-
-	_panInsideMaxBounds: function () {
-		this.panInsideBounds(this.options.maxBounds);
-	},
-
-	_checkIfLoaded: function () {
-		if (!this._loaded) {
-			throw new Error('Set map center and zoom first.');
-		}
-	},
-
-	// map events
-
-	_initEvents: function (onOff) {
-		if (!L.DomEvent) { return; }
-
-		onOff = onOff || 'on';
-
-		L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);
-
-		var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',
-		              'mouseleave', 'mousemove', 'contextmenu'],
-		    i, len;
-
-		for (i = 0, len = events.length; i < len; i++) {
-			L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);
-		}
-
-		if (this.options.trackResize) {
-			L.DomEvent[onOff](window, 'resize', this._onResize, this);
-		}
-	},
-
-	_onResize: function () {
-		L.Util.cancelAnimFrame(this._resizeRequest);
-		this._resizeRequest = L.Util.requestAnimFrame(
-		        function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);
-	},
-
-	_onMouseClick: function (e) {
-		if (!this._loaded || (!e._simulated &&
-		        ((this.dragging && this.dragging.moved()) ||
-		         (this.boxZoom  && this.boxZoom.moved()))) ||
-		            L.DomEvent._skipped(e)) { return; }
-
-		this.fire('preclick');
-		this._fireMouseEvent(e);
-	},
-
-	_fireMouseEvent: function (e) {
-		if (!this._loaded || L.DomEvent._skipped(e)) { return; }
-
-		var type = e.type;
-
-		type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));
-
-		if (!this.hasEventListeners(type)) { return; }
-
-		if (type === 'contextmenu') {
-			L.DomEvent.preventDefault(e);
-		}
-
-		var containerPoint = this.mouseEventToContainerPoint(e),
-		    layerPoint = this.containerPointToLayerPoint(containerPoint),
-		    latlng = this.layerPointToLatLng(layerPoint);
-
-		this.fire(type, {
-			latlng: latlng,
-			layerPoint: layerPoint,
-			containerPoint: containerPoint,
-			originalEvent: e
-		});
-	},
-
-	_onTileLayerLoad: function () {
-		this._tileLayersToLoad--;
-		if (this._tileLayersNum && !this._tileLayersToLoad) {
-			this.fire('tilelayersload');
-		}
-	},
-
-	_clearHandlers: function () {
-		for (var i = 0, len = this._handlers.length; i < len; i++) {
-			this._handlers[i].disable();
-		}
-	},
-
-	whenReady: function (callback, context) {
-		if (this._loaded) {
-			callback.call(context || this, this);
-		} else {
-			this.on('load', callback, context);
-		}
-		return this;
-	},
-
-	_layerAdd: function (layer) {
-		layer.onAdd(this);
-		this.fire('layeradd', {layer: layer});
-	},
-
-
-	// private methods for getting map state
-
-	_getMapPanePos: function () {
-		return L.DomUtil.getPosition(this._mapPane);
-	},
-
-	_moved: function () {
-		var pos = this._getMapPanePos();
-		return pos && !pos.equals([0, 0]);
-	},
-
-	_getTopLeftPoint: function () {
-		return this.getPixelOrigin().subtract(this._getMapPanePos());
-	},
-
-	_getNewTopLeftPoint: function (center, zoom) {
-		var viewHalf = this.getSize()._divideBy(2);
-		// TODO round on display, not calculation to increase precision?
-		return this.project(center, zoom)._subtract(viewHalf)._round();
-	},
-
-	_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
-		var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
-		return this.project(latlng, newZoom)._subtract(topLeft);
-	},
-
-	// layer point of the current center
-	_getCenterLayerPoint: function () {
-		return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
-	},
-
-	// offset of the specified place to the current center in pixels
-	_getCenterOffset: function (latlng) {
-		return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
-	},
-
-	// adjust center for view to get inside bounds
-	_limitCenter: function (center, zoom, bounds) {
-
-		if (!bounds) { return center; }
-
-		var centerPoint = this.project(center, zoom),
-		    viewHalf = this.getSize().divideBy(2),
-		    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
-		    offset = this._getBoundsOffset(viewBounds, bounds, zoom);
-
-		return this.unproject(centerPoint.add(offset), zoom);
-	},
-
-	// adjust offset for view to get inside bounds
-	_limitOffset: function (offset, bounds) {
-		if (!bounds) { return offset; }
-
-		var viewBounds = this.getPixelBounds(),
-		    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
-
-		return offset.add(this._getBoundsOffset(newBounds, bounds));
-	},
-
-	// returns offset needed for pxBounds to get inside maxBounds at a specified zoom
-	_getBoundsOffset: function (pxBounds, maxBounds, zoom) {
-		var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),
-		    seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),
-
-		    dx = this._rebound(nwOffset.x, -seOffset.x),
-		    dy = this._rebound(nwOffset.y, -seOffset.y);
-
-		return new L.Point(dx, dy);
-	},
-
-	_rebound: function (left, right) {
-		return left + right > 0 ?
-			Math.round(left - right) / 2 :
-			Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
-	},
-
-	_limitZoom: function (zoom) {
-		var min = this.getMinZoom(),
-		    max = this.getMaxZoom();
-
-		return Math.max(min, Math.min(max, zoom));
-	}
-});
-
-L.map = function (id, options) {
-	return new L.Map(id, options);
-};
-
-
-/*
- * Mercator projection that takes into account that the Earth is not a perfect sphere.
- * Less popular than spherical mercator; used by projections like EPSG:3395.
- */
-
-L.Projection.Mercator = {
-	MAX_LATITUDE: 85.0840591556,
-
-	R_MINOR: 6356752.314245179,
-	R_MAJOR: 6378137,
-
-	project: function (latlng) { // (LatLng) -> Point
-		var d = L.LatLng.DEG_TO_RAD,
-		    max = this.MAX_LATITUDE,
-		    lat = Math.max(Math.min(max, latlng.lat), -max),
-		    r = this.R_MAJOR,
-		    r2 = this.R_MINOR,
-		    x = latlng.lng * d * r,
-		    y = lat * d,
-		    tmp = r2 / r,
-		    eccent = Math.sqrt(1.0 - tmp * tmp),
-		    con = eccent * Math.sin(y);
-
-		con = Math.pow((1 - con) / (1 + con), eccent * 0.5);
-
-		var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
-		y = -r * Math.log(ts);
-
-		return new L.Point(x, y);
-	},
-
-	unproject: function (point) { // (Point, Boolean) -> LatLng
-		var d = L.LatLng.RAD_TO_DEG,
-		    r = this.R_MAJOR,
-		    r2 = this.R_MINOR,
-		    lng = point.x * d / r,
-		    tmp = r2 / r,
-		    eccent = Math.sqrt(1 - (tmp * tmp)),
-		    ts = Math.exp(- point.y / r),
-		    phi = (Math.PI / 2) - 2 * Math.atan(ts),
-		    numIter = 15,
-		    tol = 1e-7,
-		    i = numIter,
-		    dphi = 0.1,
-		    con;
-
-		while ((Math.abs(dphi) > tol) && (--i > 0)) {
-			con = eccent * Math.sin(phi);
-			dphi = (Math.PI / 2) - 2 * Math.atan(ts *
-			            Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;
-			phi += dphi;
-		}
-
-		return new L.LatLng(phi * d, lng);
-	}
-};
-
-
-
-L.CRS.EPSG3395 = L.extend({}, L.CRS, {
-	code: 'EPSG:3395',
-
-	projection: L.Projection.Mercator,
-
-	transformation: (function () {
-		var m = L.Projection.Mercator,
-		    r = m.R_MAJOR,
-		    scale = 0.5 / (Math.PI * r);
-
-		return new L.Transformation(scale, 0.5, -scale, 0.5);
-	}())
-});
-
-
-/*
- * L.TileLayer is used for standard xyz-numbered tile layers.
- */
-
-L.TileLayer = L.Class.extend({
-	includes: L.Mixin.Events,
-
-	options: {
-		minZoom: 0,
-		maxZoom: 18,
-		tileSize: 256,
-		subdomains: 'abc',
-		errorTileUrl: '',
-		attribution: '',
-		zoomOffset: 0,
-		opacity: 1,
-		/*
-		maxNativeZoom: null,
-		zIndex: null,
-		tms: false,
-		continuousWorld: false,
-		noWrap: false,
-		zoomReverse: false,
-		detectRetina: false,
-		reuseTiles: false,
-		bounds: false,
-		*/
-		unloadInvisibleTiles: L.Browser.mobile,
-		updateWhenIdle: L.Browser.mobile
-	},
-
-	initialize: function (url, options) {
-		options = L.setOptions(this, options);
-
-		// detecting retina displays, adjusting tileSize and zoom levels
-		if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
-
-			options.tileSize = Math.floor(options.tileSize / 2);
-			options.zoomOffset++;
-
-			if (options.minZoom > 0) {
-				options.minZoom--;
-			}
-			this.options.maxZoom--;
-		}
-
-		if (options.bounds) {
-			options.bounds = L.latLngBounds(options.bounds);
-		}
-
-		this._url = url;
-
-		var subdomains = this.options.subdomains;
-
-		if (typeof subdomains === 'string') {
-			this.options.subdomains = subdomains.split('');
-		}
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-		this._animated = map._zoomAnimated;
-
-		// create a container div for tiles
-		this._initContainer();
-
-		// set up events
-		map.on({
-			'viewreset': this._reset,
-			'moveend': this._update
-		}, this);
-
-		if (this._animated) {
-			map.on({
-				'zoomanim': this._animateZoom,
-				'zoomend': this._endZoomAnim
-			}, this);
-		}
-
-		if (!this.options.updateWhenIdle) {
-			this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);
-			map.on('move', this._limitedUpdate, this);
-		}
-
-		this._reset();
-		this._update();
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	onRemove: function (map) {
-		this._container.parentNode.removeChild(this._container);
-
-		map.off({
-			'viewreset': this._reset,
-			'moveend': this._update
-		}, this);
-
-		if (this._animated) {
-			map.off({
-				'zoomanim': this._animateZoom,
-				'zoomend': this._endZoomAnim
-			}, this);
-		}
-
-		if (!this.options.updateWhenIdle) {
-			map.off('move', this._limitedUpdate, this);
-		}
-
-		this._container = null;
-		this._map = null;
-	},
-
-	bringToFront: function () {
-		var pane = this._map._panes.tilePane;
-
-		if (this._container) {
-			pane.appendChild(this._container);
-			this._setAutoZIndex(pane, Math.max);
-		}
-
-		return this;
-	},
-
-	bringToBack: function () {
-		var pane = this._map._panes.tilePane;
-
-		if (this._container) {
-			pane.insertBefore(this._container, pane.firstChild);
-			this._setAutoZIndex(pane, Math.min);
-		}
-
-		return this;
-	},
-
-	getAttribution: function () {
-		return this.options.attribution;
-	},
-
-	getContainer: function () {
-		return this._container;
-	},
-
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-
-		if (this._map) {
-			this._updateOpacity();
-		}
-
-		return this;
-	},
-
-	setZIndex: function (zIndex) {
-		this.options.zIndex = zIndex;
-		this._updateZIndex();
-
-		return this;
-	},
-
-	setUrl: function (url, noRedraw) {
-		this._url = url;
-
-		if (!noRedraw) {
-			this.redraw();
-		}
-
-		return this;
-	},
-
-	redraw: function () {
-		if (this._map) {
-			this._reset({hard: true});
-			this._update();
-		}
-		return this;
-	},
-
-	_updateZIndex: function () {
-		if (this._container && this.options.zIndex !== undefined) {
-			this._container.style.zIndex = this.options.zIndex;
-		}
-	},
-
-	_setAutoZIndex: function (pane, compare) {
-
-		var layers = pane.children,
-		    edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min
-		    zIndex, i, len;
-
-		for (i = 0, len = layers.length; i < len; i++) {
-
-			if (layers[i] !== this._container) {
-				zIndex = parseInt(layers[i].style.zIndex, 10);
-
-				if (!isNaN(zIndex)) {
-					edgeZIndex = compare(edgeZIndex, zIndex);
-				}
-			}
-		}
-
-		this.options.zIndex = this._container.style.zIndex =
-		        (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);
-	},
-
-	_updateOpacity: function () {
-		var i,
-		    tiles = this._tiles;
-
-		if (L.Browser.ielt9) {
-			for (i in tiles) {
-				L.DomUtil.setOpacity(tiles[i], this.options.opacity);
-			}
-		} else {
-			L.DomUtil.setOpacity(this._container, this.options.opacity);
-		}
-	},
-
-	_initContainer: function () {
-		var tilePane = this._map._panes.tilePane;
-
-		if (!this._container) {
-			this._container = L.DomUtil.create('div', 'leaflet-layer');
-
-			this._updateZIndex();
-
-			if (this._animated) {
-				var className = 'leaflet-tile-container';
-
-				this._bgBuffer = L.DomUtil.create('div', className, this._container);
-				this._tileContainer = L.DomUtil.create('div', className, this._container);
-
-			} else {
-				this._tileContainer = this._container;
-			}
-
-			tilePane.appendChild(this._container);
-
-			if (this.options.opacity < 1) {
-				this._updateOpacity();
-			}
-		}
-	},
-
-	_reset: function (e) {
-		for (var key in this._tiles) {
-			this.fire('tileunload', {tile: this._tiles[key]});
-		}
-
-		this._tiles = {};
-		this._tilesToLoad = 0;
-
-		if (this.options.reuseTiles) {
-			this._unusedTiles = [];
-		}
-
-		this._tileContainer.innerHTML = '';
-
-		if (this._animated && e && e.hard) {
-			this._clearBgBuffer();
-		}
-
-		this._initContainer();
-	},
-
-	_getTileSize: function () {
-		var map = this._map,
-		    zoom = map.getZoom() + this.options.zoomOffset,
-		    zoomN = this.options.maxNativeZoom,
-		    tileSize = this.options.tileSize;
-
-		if (zoomN && zoom > zoomN) {
-			tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);
-		}
-
-		return tileSize;
-	},
-
-	_update: function () {
-
-		if (!this._map) { return; }
-
-		var map = this._map,
-		    bounds = map.getPixelBounds(),
-		    zoom = map.getZoom(),
-		    tileSize = this._getTileSize();
-
-		if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
-			return;
-		}
-
-		var tileBounds = L.bounds(
-		        bounds.min.divideBy(tileSize)._floor(),
-		        bounds.max.divideBy(tileSize)._floor());
-
-		this._addTilesFromCenterOut(tileBounds);
-
-		if (this.options.unloadInvisibleTiles || this.options.reuseTiles) {
-			this._removeOtherTiles(tileBounds);
-		}
-	},
-
-	_addTilesFromCenterOut: function (bounds) {
-		var queue = [],
-		    center = bounds.getCenter();
-
-		var j, i, point;
-
-		for (j = bounds.min.y; j <= bounds.max.y; j++) {
-			for (i = bounds.min.x; i <= bounds.max.x; i++) {
-				point = new L.Point(i, j);
-
-				if (this._tileShouldBeLoaded(point)) {
-					queue.push(point);
-				}
-			}
-		}
-
-		var tilesToLoad = queue.length;
-
-		if (tilesToLoad === 0) { return; }
-
-		// load tiles in order of their distance to center
-		queue.sort(function (a, b) {
-			return a.distanceTo(center) - b.distanceTo(center);
-		});
-
-		var fragment = document.createDocumentFragment();
-
-		// if its the first batch of tiles to load
-		if (!this._tilesToLoad) {
-			this.fire('loading');
-		}
-
-		this._tilesToLoad += tilesToLoad;
-
-		for (i = 0; i < tilesToLoad; i++) {
-			this._addTile(queue[i], fragment);
-		}
-
-		this._tileContainer.appendChild(fragment);
-	},
-
-	_tileShouldBeLoaded: function (tilePoint) {
-		if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {
-			return false; // already loaded
-		}
-
-		var options = this.options;
-
-		if (!options.continuousWorld) {
-			var limit = this._getWrapTileNum();
-
-			// don't load if exceeds world bounds
-			if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||
-				tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }
-		}
-
-		if (options.bounds) {
-			var tileSize = options.tileSize,
-			    nwPoint = tilePoint.multiplyBy(tileSize),
-			    sePoint = nwPoint.add([tileSize, tileSize]),
-			    nw = this._map.unproject(nwPoint),
-			    se = this._map.unproject(sePoint);
-
-			// TODO temporary hack, will be removed after refactoring projections
-			// https://github.com/Leaflet/Leaflet/issues/1618
-			if (!options.continuousWorld && !options.noWrap) {
-				nw = nw.wrap();
-				se = se.wrap();
-			}
-
-			if (!options.bounds.intersects([nw, se])) { return false; }
-		}
-
-		return true;
-	},
-
-	_removeOtherTiles: function (bounds) {
-		var kArr, x, y, key;
-
-		for (key in this._tiles) {
-			kArr = key.split(':');
-			x = parseInt(kArr[0], 10);
-			y = parseInt(kArr[1], 10);
-
-			// remove tile if it's out of bounds
-			if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {
-				this._removeTile(key);
-			}
-		}
-	},
-
-	_removeTile: function (key) {
-		var tile = this._tiles[key];
-
-		this.fire('tileunload', {tile: tile, url: tile.src});
-
-		if (this.options.reuseTiles) {
-			L.DomUtil.removeClass(tile, 'leaflet-tile-loaded');
-			this._unusedTiles.push(tile);
-
-		} else if (tile.parentNode === this._tileContainer) {
-			this._tileContainer.removeChild(tile);
-		}
-
-		// for https://github.com/CloudMade/Leaflet/issues/137
-		if (!L.Browser.android) {
-			tile.onload = null;
-			tile.src = L.Util.emptyImageUrl;
-		}
-
-		delete this._tiles[key];
-	},
-
-	_addTile: function (tilePoint, container) {
-		var tilePos = this._getTilePos(tilePoint);
-
-		// get unused tile - or create a new tile
-		var tile = this._getTile();
-
-		/*
-		Chrome 20 layouts much faster with top/left (verify with timeline, frames)
-		Android 4 browser has display issues with top/left and requires transform instead
-		(other browsers don't currently care) - see debug/hacks/jitter.html for an example
-		*/
-		L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);
-
-		this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
-
-		this._loadTile(tile, tilePoint);
-
-		if (tile.parentNode !== this._tileContainer) {
-			container.appendChild(tile);
-		}
-	},
-
-	_getZoomForUrl: function () {
-
-		var options = this.options,
-		    zoom = this._map.getZoom();
-
-		if (options.zoomReverse) {
-			zoom = options.maxZoom - zoom;
-		}
-
-		zoom += options.zoomOffset;
-
-		return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;
-	},
-
-	_getTilePos: function (tilePoint) {
-		var origin = this._map.getPixelOrigin(),
-		    tileSize = this._getTileSize();
-
-		return tilePoint.multiplyBy(tileSize).subtract(origin);
-	},
-
-	// image-specific code (override to implement e.g. Canvas or SVG tile layer)
-
-	getTileUrl: function (tilePoint) {
-		return L.Util.template(this._url, L.extend({
-			s: this._getSubdomain(tilePoint),
-			z: tilePoint.z,
-			x: tilePoint.x,
-			y: tilePoint.y
-		}, this.options));
-	},
-
-	_getWrapTileNum: function () {
-		var crs = this._map.options.crs,
-		    size = crs.getSize(this._map.getZoom());
-		return size.divideBy(this._getTileSize())._floor();
-	},
-
-	_adjustTilePoint: function (tilePoint) {
-
-		var limit = this._getWrapTileNum();
-
-		// wrap tile coordinates
-		if (!this.options.continuousWorld && !this.options.noWrap) {
-			tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;
-		}
-
-		if (this.options.tms) {
-			tilePoint.y = limit.y - tilePoint.y - 1;
-		}
-
-		tilePoint.z = this._getZoomForUrl();
-	},
-
-	_getSubdomain: function (tilePoint) {
-		var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
-		return this.options.subdomains[index];
-	},
-
-	_getTile: function () {
-		if (this.options.reuseTiles && this._unusedTiles.length > 0) {
-			var tile = this._unusedTiles.pop();
-			this._resetTile(tile);
-			return tile;
-		}
-		return this._createTile();
-	},
-
-	// Override if data stored on a tile needs to be cleaned up before reuse
-	_resetTile: function (/*tile*/) {},
-
-	_createTile: function () {
-		var tile = L.DomUtil.create('img', 'leaflet-tile');
-		tile.style.width = tile.style.height = this._getTileSize() + 'px';
-		tile.galleryimg = 'no';
-
-		tile.onselectstart = tile.onmousemove = L.Util.falseFn;
-
-		if (L.Browser.ielt9 && this.options.opacity !== undefined) {
-			L.DomUtil.setOpacity(tile, this.options.opacity);
-		}
-		// without this hack, tiles disappear after zoom on Chrome for Android
-		// https://github.com/Leaflet/Leaflet/issues/2078
-		if (L.Browser.mobileWebkit3d) {
-			tile.style.WebkitBackfaceVisibility = 'hidden';
-		}
-		return tile;
-	},
-
-	_loadTile: function (tile, tilePoint) {
-		tile._layer  = this;
-		tile.onload  = this._tileOnLoad;
-		tile.onerror = this._tileOnError;
-
-		this._adjustTilePoint(tilePoint);
-		tile.src     = this.getTileUrl(tilePoint);
-
-		this.fire('tileloadstart', {
-			tile: tile,
-			url: tile.src
-		});
-	},
-
-	_tileLoaded: function () {
-		this._tilesToLoad--;
-
-		if (this._animated) {
-			L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');
-		}
-
-		if (!this._tilesToLoad) {
-			this.fire('load');
-
-			if (this._animated) {
-				// clear scaled tiles after all new tiles are loaded (for performance)
-				clearTimeout(this._clearBgBufferTimer);
-				this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);
-			}
-		}
-	},
-
-	_tileOnLoad: function () {
-		var layer = this._layer;
-
-		//Only if we are loading an actual image
-		if (this.src !== L.Util.emptyImageUrl) {
-			L.DomUtil.addClass(this, 'leaflet-tile-loaded');
-
-			layer.fire('tileload', {
-				tile: this,
-				url: this.src
-			});
-		}
-
-		layer._tileLoaded();
-	},
-
-	_tileOnError: function () {
-		var layer = this._layer;
-
-		layer.fire('tileerror', {
-			tile: this,
-			url: this.src
-		});
-
-		var newUrl = layer.options.errorTileUrl;
-		if (newUrl) {
-			this.src = newUrl;
-		}
-
-		layer._tileLoaded();
-	}
-});
-
-L.tileLayer = function (url, options) {
-	return new L.TileLayer(url, options);
-};
-
-
-/*
- * L.TileLayer.WMS is used for putting WMS tile layers on the map.
- */
-
-L.TileLayer.WMS = L.TileLayer.extend({
-
-	defaultWmsParams: {
-		service: 'WMS',
-		request: 'GetMap',
-		version: '1.1.1',
-		layers: '',
-		styles: '',
-		format: 'image/jpeg',
-		transparent: false
-	},
-
-	initialize: function (url, options) { // (String, Object)
-
-		this._url = url;
-
-		var wmsParams = L.extend({}, this.defaultWmsParams),
-		    tileSize = options.tileSize || this.options.tileSize;
-
-		if (options.detectRetina && L.Browser.retina) {
-			wmsParams.width = wmsParams.height = tileSize * 2;
-		} else {
-			wmsParams.width = wmsParams.height = tileSize;
-		}
-
-		for (var i in options) {
-			// all keys that are not TileLayer options go to WMS params
-			if (!this.options.hasOwnProperty(i) && i !== 'crs') {
-				wmsParams[i] = options[i];
-			}
-		}
-
-		this.wmsParams = wmsParams;
-
-		L.setOptions(this, options);
-	},
-
-	onAdd: function (map) {
-
-		this._crs = this.options.crs || map.options.crs;
-
-		this._wmsVersion = parseFloat(this.wmsParams.version);
-
-		var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
-		this.wmsParams[projectionKey] = this._crs.code;
-
-		L.TileLayer.prototype.onAdd.call(this, map);
-	},
-
-	getTileUrl: function (tilePoint) { // (Point, Number) -> String
-
-		var map = this._map,
-		    tileSize = this.options.tileSize,
-
-		    nwPoint = tilePoint.multiplyBy(tileSize),
-		    sePoint = nwPoint.add([tileSize, tileSize]),
-
-		    nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),
-		    se = this._crs.project(map.unproject(sePoint, tilePoint.z)),
-		    bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
-		        [se.y, nw.x, nw.y, se.x].join(',') :
-		        [nw.x, se.y, se.x, nw.y].join(','),
-
-		    url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});
-
-		return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;
-	},
-
-	setParams: function (params, noRedraw) {
-
-		L.extend(this.wmsParams, params);
-
-		if (!noRedraw) {
-			this.redraw();
-		}
-
-		return this;
-	}
-});
-
-L.tileLayer.wms = function (url, options) {
-	return new L.TileLayer.WMS(url, options);
-};
-
-
-/*
- * L.TileLayer.Canvas is a class that you can use as a base for creating
- * dynamically drawn Canvas-based tile layers.
- */
-
-L.TileLayer.Canvas = L.TileLayer.extend({
-	options: {
-		async: false
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	redraw: function () {
-		if (this._map) {
-			this._reset({hard: true});
-			this._update();
-		}
-
-		for (var i in this._tiles) {
-			this._redrawTile(this._tiles[i]);
-		}
-		return this;
-	},
-
-	_redrawTile: function (tile) {
-		this.drawTile(tile, tile._tilePoint, this._map._zoom);
-	},
-
-	_createTile: function () {
-		var tile = L.DomUtil.create('canvas', 'leaflet-tile');
-		tile.width = tile.height = this.options.tileSize;
-		tile.onselectstart = tile.onmousemove = L.Util.falseFn;
-		return tile;
-	},
-
-	_loadTile: function (tile, tilePoint) {
-		tile._layer = this;
-		tile._tilePoint = tilePoint;
-
-		this._redrawTile(tile);
-
-		if (!this.options.async) {
-			this.tileDrawn(tile);
-		}
-	},
-
-	drawTile: function (/*tile, tilePoint*/) {
-		// override with rendering code
-	},
-
-	tileDrawn: function (tile) {
-		this._tileOnLoad.call(tile);
-	}
-});
-
-
-L.tileLayer.canvas = function (options) {
-	return new L.TileLayer.Canvas(options);
-};
-
-
-/*
- * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).
- */
-
-L.ImageOverlay = L.Class.extend({
-	includes: L.Mixin.Events,
-
-	options: {
-		opacity: 1
-	},
-
-	initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
-		this._url = url;
-		this._bounds = L.latLngBounds(bounds);
-
-		L.setOptions(this, options);
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-
-		if (!this._image) {
-			this._initImage();
-		}
-
-		map._panes.overlayPane.appendChild(this._image);
-
-		map.on('viewreset', this._reset, this);
-
-		if (map.options.zoomAnimation && L.Browser.any3d) {
-			map.on('zoomanim', this._animateZoom, this);
-		}
-
-		this._reset();
-	},
-
-	onRemove: function (map) {
-		map.getPanes().overlayPane.removeChild(this._image);
-
-		map.off('viewreset', this._reset, this);
-
-		if (map.options.zoomAnimation) {
-			map.off('zoomanim', this._animateZoom, this);
-		}
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-		this._updateOpacity();
-		return this;
-	},
-
-	// TODO remove bringToFront/bringToBack duplication from TileLayer/Path
-	bringToFront: function () {
-		if (this._image) {
-			this._map._panes.overlayPane.appendChild(this._image);
-		}
-		return this;
-	},
-
-	bringToBack: function () {
-		var pane = this._map._panes.overlayPane;
-		if (this._image) {
-			pane.insertBefore(this._image, pane.firstChild);
-		}
-		return this;
-	},
-
-	setUrl: function (url) {
-		this._url = url;
-		this._image.src = this._url;
-	},
-
-	getAttribution: function () {
-		return this.options.attribution;
-	},
-
-	_initImage: function () {
-		this._image = L.DomUtil.create('img', 'leaflet-image-layer');
-
-		if (this._map.options.zoomAnimation && L.Browser.any3d) {
-			L.DomUtil.addClass(this._image, 'leaflet-zoom-animated');
-		} else {
-			L.DomUtil.addClass(this._image, 'leaflet-zoom-hide');
-		}
-
-		this._updateOpacity();
-
-		//TODO createImage util method to remove duplication
-		L.extend(this._image, {
-			galleryimg: 'no',
-			onselectstart: L.Util.falseFn,
-			onmousemove: L.Util.falseFn,
-			onload: L.bind(this._onImageLoad, this),
-			src: this._url
-		});
-	},
-
-	_animateZoom: function (e) {
-		var map = this._map,
-		    image = this._image,
-		    scale = map.getZoomScale(e.zoom),
-		    nw = this._bounds.getNorthWest(),
-		    se = this._bounds.getSouthEast(),
-
-		    topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),
-		    size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),
-		    origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));
-
-		image.style[L.DomUtil.TRANSFORM] =
-		        L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';
-	},
-
-	_reset: function () {
-		var image   = this._image,
-		    topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
-		    size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);
-
-		L.DomUtil.setPosition(image, topLeft);
-
-		image.style.width  = size.x + 'px';
-		image.style.height = size.y + 'px';
-	},
-
-	_onImageLoad: function () {
-		this.fire('load');
-	},
-
-	_updateOpacity: function () {
-		L.DomUtil.setOpacity(this._image, this.options.opacity);
-	}
-});
-
-L.imageOverlay = function (url, bounds, options) {
-	return new L.ImageOverlay(url, bounds, options);
-};
-
-
-/*
- * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.
- */
-
-L.Icon = L.Class.extend({
-	options: {
-		/*
-		iconUrl: (String) (required)
-		iconRetinaUrl: (String) (optional, used for retina devices if detected)
-		iconSize: (Point) (can be set through CSS)
-		iconAnchor: (Point) (centered by default, can be set in CSS with negative margins)
-		popupAnchor: (Point) (if not specified, popup opens in the anchor point)
-		shadowUrl: (String) (no shadow by default)
-		shadowRetinaUrl: (String) (optional, used for retina devices if detected)
-		shadowSize: (Point)
-		shadowAnchor: (Point)
-		*/
-		className: ''
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	createIcon: function (oldIcon) {
-		return this._createIcon('icon', oldIcon);
-	},
-
-	createShadow: function (oldIcon) {
-		return this._createIcon('shadow', oldIcon);
-	},
-
-	_createIcon: function (name, oldIcon) {
-		var src = this._getIconUrl(name);
-
-		if (!src) {
-			if (name === 'icon') {
-				throw new Error('iconUrl not set in Icon options (see the docs).');
-			}
-			return null;
-		}
-
-		var img;
-		if (!oldIcon || oldIcon.tagName !== 'IMG') {
-			img = this._createImg(src);
-		} else {
-			img = this._createImg(src, oldIcon);
-		}
-		this._setIconStyles(img, name);
-
-		return img;
-	},
-
-	_setIconStyles: function (img, name) {
-		var options = this.options,
-		    size = L.point(options[name + 'Size']),
-		    anchor;
-
-		if (name === 'shadow') {
-			anchor = L.point(options.shadowAnchor || options.iconAnchor);
-		} else {
-			anchor = L.point(options.iconAnchor);
-		}
-
-		if (!anchor && size) {
-			anchor = size.divideBy(2, true);
-		}
-
-		img.className = 'leaflet-marker-' + name + ' ' + options.className;
-
-		if (anchor) {
-			img.style.marginLeft = (-anchor.x) + 'px';
-			img.style.marginTop  = (-anchor.y) + 'px';
-		}
-
-		if (size) {
-			img.style.width  = size.x + 'px';
-			img.style.height = size.y + 'px';
-		}
-	},
-
-	_createImg: function (src, el) {
-		el = el || document.createElement('img');
-		el.src = src;
-		return el;
-	},
-
-	_getIconUrl: function (name) {
-		if (L.Browser.retina && this.options[name + 'RetinaUrl']) {
-			return this.options[name + 'RetinaUrl'];
-		}
-		return this.options[name + 'Url'];
-	}
-});
-
-L.icon = function (options) {
-	return new L.Icon(options);
-};
-
-
-/*
- * L.Icon.Default is the blue marker icon used by default in Leaflet.
- */
-
-L.Icon.Default = L.Icon.extend({
-
-	options: {
-		iconSize: [25, 41],
-		iconAnchor: [12, 41],
-		popupAnchor: [1, -34],
-
-		shadowSize: [41, 41]
-	},
-
-	_getIconUrl: function (name) {
-		var key = name + 'Url';
-
-		if (this.options[key]) {
-			return this.options[key];
-		}
-
-		if (L.Browser.retina && name === 'icon') {
-			name += '-2x';
-		}
-
-		var path = L.Icon.Default.imagePath;
-
-		if (!path) {
-			throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.');
-		}
-
-		return path + '/marker-' + name + '.png';
-	}
-});
-
-L.Icon.Default.imagePath = (function () {
-	var scripts = document.getElementsByTagName('script'),
-	    leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;
-
-	var i, len, src, matches, path;
-
-	for (i = 0, len = scripts.length; i < len; i++) {
-		src = scripts[i].src;
-		matches = src.match(leafletRe);
-
-		if (matches) {
-			path = src.split(leafletRe)[0];
-			return (path ? path + '/' : '') + 'images';
-		}
-	}
-}());
-
-
-/*
- * L.Marker is used to display clickable/draggable icons on the map.
- */
-
-L.Marker = L.Class.extend({
-
-	includes: L.Mixin.Events,
-
-	options: {
-		icon: new L.Icon.Default(),
-		title: '',
-		alt: '',
-		clickable: true,
-		draggable: false,
-		keyboard: true,
-		zIndexOffset: 0,
-		opacity: 1,
-		riseOnHover: false,
-		riseOffset: 250
-	},
-
-	initialize: function (latlng, options) {
-		L.setOptions(this, options);
-		this._latlng = L.latLng(latlng);
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-
-		map.on('viewreset', this.update, this);
-
-		this._initIcon();
-		this.update();
-		this.fire('add');
-
-		if (map.options.zoomAnimation && map.options.markerZoomAnimation) {
-			map.on('zoomanim', this._animateZoom, this);
-		}
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	onRemove: function (map) {
-		if (this.dragging) {
-			this.dragging.disable();
-		}
-
-		this._removeIcon();
-		this._removeShadow();
-
-		this.fire('remove');
-
-		map.off({
-			'viewreset': this.update,
-			'zoomanim': this._animateZoom
-		}, this);
-
-		this._map = null;
-	},
-
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	setLatLng: function (latlng) {
-		this._latlng = L.latLng(latlng);
-
-		this.update();
-
-		return this.fire('move', { latlng: this._latlng });
-	},
-
-	setZIndexOffset: function (offset) {
-		this.options.zIndexOffset = offset;
-		this.update();
-
-		return this;
-	},
-
-	setIcon: function (icon) {
-
-		this.options.icon = icon;
-
-		if (this._map) {
-			this._initIcon();
-			this.update();
-		}
-
-		if (this._popup) {
-			this.bindPopup(this._popup);
-		}
-
-		return this;
-	},
-
-	update: function () {
-		if (this._icon) {
-			var pos = this._map.latLngToLayerPoint(this._latlng).round();
-			this._setPos(pos);
-		}
-
-		return this;
-	},
-
-	_initIcon: function () {
-		var options = this.options,
-		    map = this._map,
-		    animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),
-		    classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';
-
-		var icon = options.icon.createIcon(this._icon),
-			addIcon = false;
-
-		// if we're not reusing the icon, remove the old one and init new one
-		if (icon !== this._icon) {
-			if (this._icon) {
-				this._removeIcon();
-			}
-			addIcon = true;
-
-			if (options.title) {
-				icon.title = options.title;
-			}
-			
-			if (options.alt) {
-				icon.alt = options.alt;
-			}
-		}
-
-		L.DomUtil.addClass(icon, classToAdd);
-
-		if (options.keyboard) {
-			icon.tabIndex = '0';
-		}
-
-		this._icon = icon;
-
-		this._initInteraction();
-
-		if (options.riseOnHover) {
-			L.DomEvent
-				.on(icon, 'mouseover', this._bringToFront, this)
-				.on(icon, 'mouseout', this._resetZIndex, this);
-		}
-
-		var newShadow = options.icon.createShadow(this._shadow),
-			addShadow = false;
-
-		if (newShadow !== this._shadow) {
-			this._removeShadow();
-			addShadow = true;
-		}
-
-		if (newShadow) {
-			L.DomUtil.addClass(newShadow, classToAdd);
-		}
-		this._shadow = newShadow;
-
-
-		if (options.opacity < 1) {
-			this._updateOpacity();
-		}
-
-
-		var panes = this._map._panes;
-
-		if (addIcon) {
-			panes.markerPane.appendChild(this._icon);
-		}
-
-		if (newShadow && addShadow) {
-			panes.shadowPane.appendChild(this._shadow);
-		}
-	},
-
-	_removeIcon: function () {
-		if (this.options.riseOnHover) {
-			L.DomEvent
-			    .off(this._icon, 'mouseover', this._bringToFront)
-			    .off(this._icon, 'mouseout', this._resetZIndex);
-		}
-
-		this._map._panes.markerPane.removeChild(this._icon);
-
-		this._icon = null;
-	},
-
-	_removeShadow: function () {
-		if (this._shadow) {
-			this._map._panes.shadowPane.removeChild(this._shadow);
-		}
-		this._shadow = null;
-	},
-
-	_setPos: function (pos) {
-		L.DomUtil.setPosition(this._icon, pos);
-
-		if (this._shadow) {
-			L.DomUtil.setPosition(this._shadow, pos);
-		}
-
-		this._zIndex = pos.y + this.options.zIndexOffset;
-
-		this._resetZIndex();
-	},
-
-	_updateZIndex: function (offset) {
-		this._icon.style.zIndex = this._zIndex + offset;
-	},
-
-	_animateZoom: function (opt) {
-		var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
-
-		this._setPos(pos);
-	},
-
-	_initInteraction: function () {
-
-		if (!this.options.clickable) { return; }
-
-		// TODO refactor into something shared with Map/Path/etc. to DRY it up
-
-		var icon = this._icon,
-		    events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];
-
-		L.DomUtil.addClass(icon, 'leaflet-clickable');
-		L.DomEvent.on(icon, 'click', this._onMouseClick, this);
-		L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
-
-		for (var i = 0; i < events.length; i++) {
-			L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
-		}
-
-		if (L.Handler.MarkerDrag) {
-			this.dragging = new L.Handler.MarkerDrag(this);
-
-			if (this.options.draggable) {
-				this.dragging.enable();
-			}
-		}
-	},
-
-	_onMouseClick: function (e) {
-		var wasDragged = this.dragging && this.dragging.moved();
-
-		if (this.hasEventListeners(e.type) || wasDragged) {
-			L.DomEvent.stopPropagation(e);
-		}
-
-		if (wasDragged) { return; }
-
-		if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }
-
-		this.fire(e.type, {
-			originalEvent: e,
-			latlng: this._latlng
-		});
-	},
-
-	_onKeyPress: function (e) {
-		if (e.keyCode === 13) {
-			this.fire('click', {
-				originalEvent: e,
-				latlng: this._latlng
-			});
-		}
-	},
-
-	_fireMouseEvent: function (e) {
-
-		this.fire(e.type, {
-			originalEvent: e,
-			latlng: this._latlng
-		});
-
-		// TODO proper custom event propagation
-		// this line will always be called if marker is in a FeatureGroup
-		if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {
-			L.DomEvent.preventDefault(e);
-		}
-		if (e.type !== 'mousedown') {
-			L.DomEvent.stopPropagation(e);
-		} else {
-			L.DomEvent.preventDefault(e);
-		}
-	},
-
-	setOpacity: function (opacity) {
-		this.options.opacity = opacity;
-		if (this._map) {
-			this._updateOpacity();
-		}
-
-		return this;
-	},
-
-	_updateOpacity: function () {
-		L.DomUtil.setOpacity(this._icon, this.options.opacity);
-		if (this._shadow) {
-			L.DomUtil.setOpacity(this._shadow, this.options.opacity);
-		}
-	},
-
-	_bringToFront: function () {
-		this._updateZIndex(this.options.riseOffset);
-	},
-
-	_resetZIndex: function () {
-		this._updateZIndex(0);
-	}
-});
-
-L.marker = function (latlng, options) {
-	return new L.Marker(latlng, options);
-};
-
-
-/*
- * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)
- * to use with L.Marker.
- */
-
-L.DivIcon = L.Icon.extend({
-	options: {
-		iconSize: [12, 12], // also can be set through CSS
-		/*
-		iconAnchor: (Point)
-		popupAnchor: (Point)
-		html: (String)
-		bgPos: (Point)
-		*/
-		className: 'leaflet-div-icon',
-		html: false
-	},
-
-	createIcon: function (oldIcon) {
-		var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
-		    options = this.options;
-
-		if (options.html !== false) {
-			div.innerHTML = options.html;
-		} else {
-			div.innerHTML = '';
-		}
-
-		if (options.bgPos) {
-			div.style.backgroundPosition =
-			        (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
-		}
-
-		this._setIconStyles(div, 'icon');
-		return div;
-	},
-
-	createShadow: function () {
-		return null;
-	}
-});
-
-L.divIcon = function (options) {
-	return new L.DivIcon(options);
-};
-
-
-/*
- * L.Popup is used for displaying popups on the map.
- */
-
-L.Map.mergeOptions({
-	closePopupOnClick: true
-});
-
-L.Popup = L.Class.extend({
-	includes: L.Mixin.Events,
-
-	options: {
-		minWidth: 50,
-		maxWidth: 300,
-		// maxHeight: null,
-		autoPan: true,
-		closeButton: true,
-		offset: [0, 7],
-		autoPanPadding: [5, 5],
-		// autoPanPaddingTopLeft: null,
-		// autoPanPaddingBottomRight: null,
-		keepInView: false,
-		className: '',
-		zoomAnimation: true
-	},
-
-	initialize: function (options, source) {
-		L.setOptions(this, options);
-
-		this._source = source;
-		this._animated = L.Browser.any3d && this.options.zoomAnimation;
-		this._isOpen = false;
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-
-		if (!this._container) {
-			this._initLayout();
-		}
-
-		var animFade = map.options.fadeAnimation;
-
-		if (animFade) {
-			L.DomUtil.setOpacity(this._container, 0);
-		}
-		map._panes.popupPane.appendChild(this._container);
-
-		map.on(this._getEvents(), this);
-
-		this.update();
-
-		if (animFade) {
-			L.DomUtil.setOpacity(this._container, 1);
-		}
-
-		this.fire('open');
-
-		map.fire('popupopen', {popup: this});
-
-		if (this._source) {
-			this._source.fire('popupopen', {popup: this});
-		}
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	openOn: function (map) {
-		map.openPopup(this);
-		return this;
-	},
-
-	onRemove: function (map) {
-		map._panes.popupPane.removeChild(this._container);
-
-		L.Util.falseFn(this._container.offsetWidth); // force reflow
-
-		map.off(this._getEvents(), this);
-
-		if (map.options.fadeAnimation) {
-			L.DomUtil.setOpacity(this._container, 0);
-		}
-
-		this._map = null;
-
-		this.fire('close');
-
-		map.fire('popupclose', {popup: this});
-
-		if (this._source) {
-			this._source.fire('popupclose', {popup: this});
-		}
-	},
-
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	setLatLng: function (latlng) {
-		this._latlng = L.latLng(latlng);
-		if (this._map) {
-			this._updatePosition();
-			this._adjustPan();
-		}
-		return this;
-	},
-
-	getContent: function () {
-		return this._content;
-	},
-
-	setContent: function (content) {
-		this._content = content;
-		this.update();
-		return this;
-	},
-
-	update: function () {
-		if (!this._map) { return; }
-
-		this._container.style.visibility = 'hidden';
-
-		this._updateContent();
-		this._updateLayout();
-		this._updatePosition();
-
-		this._container.style.visibility = '';
-
-		this._adjustPan();
-	},
-
-	_getEvents: function () {
-		var events = {
-			viewreset: this._updatePosition
-		};
-
-		if (this._animated) {
-			events.zoomanim = this._zoomAnimation;
-		}
-		if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
-			events.preclick = this._close;
-		}
-		if (this.options.keepInView) {
-			events.moveend = this._adjustPan;
-		}
-
-		return events;
-	},
-
-	_close: function () {
-		if (this._map) {
-			this._map.closePopup(this);
-		}
-	},
-
-	_initLayout: function () {
-		var prefix = 'leaflet-popup',
-			containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +
-			        (this._animated ? 'animated' : 'hide'),
-			container = this._container = L.DomUtil.create('div', containerClass),
-			closeButton;
-
-		if (this.options.closeButton) {
-			closeButton = this._closeButton =
-			        L.DomUtil.create('a', prefix + '-close-button', container);
-			closeButton.href = '#close';
-			closeButton.innerHTML = '&#215;';
-			L.DomEvent.disableClickPropagation(closeButton);
-
-			L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
-		}
-
-		var wrapper = this._wrapper =
-		        L.DomUtil.create('div', prefix + '-content-wrapper', container);
-		L.DomEvent.disableClickPropagation(wrapper);
-
-		this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
-
-		L.DomEvent.disableScrollPropagation(this._contentNode);
-		L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
-
-		this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
-		this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
-	},
-
-	_updateContent: function () {
-		if (!this._content) { return; }
-
-		if (typeof this._content === 'string') {
-			this._contentNode.innerHTML = this._content;
-		} else {
-			while (this._contentNode.hasChildNodes()) {
-				this._contentNode.removeChild(this._contentNode.firstChild);
-			}
-			this._contentNode.appendChild(this._content);
-		}
-		this.fire('contentupdate');
-	},
-
-	_updateLayout: function () {
-		var container = this._contentNode,
-		    style = container.style;
-
-		style.width = '';
-		style.whiteSpace = 'nowrap';
-
-		var width = container.offsetWidth;
-		width = Math.min(width, this.options.maxWidth);
-		width = Math.max(width, this.options.minWidth);
-
-		style.width = (width + 1) + 'px';
-		style.whiteSpace = '';
-
-		style.height = '';
-
-		var height = container.offsetHeight,
-		    maxHeight = this.options.maxHeight,
-		    scrolledClass = 'leaflet-popup-scrolled';
-
-		if (maxHeight && height > maxHeight) {
-			style.height = maxHeight + 'px';
-			L.DomUtil.addClass(container, scrolledClass);
-		} else {
-			L.DomUtil.removeClass(container, scrolledClass);
-		}
-
-		this._containerWidth = this._container.offsetWidth;
-	},
-
-	_updatePosition: function () {
-		if (!this._map) { return; }
-
-		var pos = this._map.latLngToLayerPoint(this._latlng),
-		    animated = this._animated,
-		    offset = L.point(this.options.offset);
-
-		if (animated) {
-			L.DomUtil.setPosition(this._container, pos);
-		}
-
-		this._containerBottom = -offset.y - (animated ? 0 : pos.y);
-		this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);
-
-		// bottom position the popup in case the height of the popup changes (images loading etc)
-		this._container.style.bottom = this._containerBottom + 'px';
-		this._container.style.left = this._containerLeft + 'px';
-	},
-
-	_zoomAnimation: function (opt) {
-		var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
-
-		L.DomUtil.setPosition(this._container, pos);
-	},
-
-	_adjustPan: function () {
-		if (!this.options.autoPan) { return; }
-
-		var map = this._map,
-		    containerHeight = this._container.offsetHeight,
-		    containerWidth = this._containerWidth,
-
-		    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);
-
-		if (this._animated) {
-			layerPos._add(L.DomUtil.getPosition(this._container));
-		}
-
-		var containerPos = map.layerPointToContainerPoint(layerPos),
-		    padding = L.point(this.options.autoPanPadding),
-		    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
-		    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
-		    size = map.getSize(),
-		    dx = 0,
-		    dy = 0;
-
-		if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
-			dx = containerPos.x + containerWidth - size.x + paddingBR.x;
-		}
-		if (containerPos.x - dx - paddingTL.x < 0) { // left
-			dx = containerPos.x - paddingTL.x;
-		}
-		if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
-			dy = containerPos.y + containerHeight - size.y + paddingBR.y;
-		}
-		if (containerPos.y - dy - paddingTL.y < 0) { // top
-			dy = containerPos.y - paddingTL.y;
-		}
-
-		if (dx || dy) {
-			map
-			    .fire('autopanstart')
-			    .panBy([dx, dy]);
-		}
-	},
-
-	_onCloseButtonClick: function (e) {
-		this._close();
-		L.DomEvent.stop(e);
-	}
-});
-
-L.popup = function (options, source) {
-	return new L.Popup(options, source);
-};
-
-
-L.Map.include({
-	openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])
-		this.closePopup();
-
-		if (!(popup instanceof L.Popup)) {
-			var content = popup;
-
-			popup = new L.Popup(options)
-			    .setLatLng(latlng)
-			    .setContent(content);
-		}
-		popup._isOpen = true;
-
-		this._popup = popup;
-		return this.addLayer(popup);
-	},
-
-	closePopup: function (popup) {
-		if (!popup || popup === this._popup) {
-			popup = this._popup;
-			this._popup = null;
-		}
-		if (popup) {
-			this.removeLayer(popup);
-			popup._isOpen = false;
-		}
-		return this;
-	}
-});
-
-
-/*
- * Popup extension to L.Marker, adding popup-related methods.
- */
-
-L.Marker.include({
-	openPopup: function () {
-		if (this._popup && this._map && !this._map.hasLayer(this._popup)) {
-			this._popup.setLatLng(this._latlng);
-			this._map.openPopup(this._popup);
-		}
-
-		return this;
-	},
-
-	closePopup: function () {
-		if (this._popup) {
-			this._popup._close();
-		}
-		return this;
-	},
-
-	togglePopup: function () {
-		if (this._popup) {
-			if (this._popup._isOpen) {
-				this.closePopup();
-			} else {
-				this.openPopup();
-			}
-		}
-		return this;
-	},
-
-	bindPopup: function (content, options) {
-		var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);
-
-		anchor = anchor.add(L.Popup.prototype.options.offset);
-
-		if (options && options.offset) {
-			anchor = anchor.add(options.offset);
-		}
-
-		options = L.extend({offset: anchor}, options);
-
-		if (!this._popupHandlersAdded) {
-			this
-			    .on('click', this.togglePopup, this)
-			    .on('remove', this.closePopup, this)
-			    .on('move', this._movePopup, this);
-			this._popupHandlersAdded = true;
-		}
-
-		if (content instanceof L.Popup) {
-			L.setOptions(content, options);
-			this._popup = content;
-		} else {
-			this._popup = new L.Popup(options, this)
-				.setContent(content);
-		}
-
-		return this;
-	},
-
-	setPopupContent: function (content) {
-		if (this._popup) {
-			this._popup.setContent(content);
-		}
-		return this;
-	},
-
-	unbindPopup: function () {
-		if (this._popup) {
-			this._popup = null;
-			this
-			    .off('click', this.togglePopup, this)
-			    .off('remove', this.closePopup, this)
-			    .off('move', this._movePopup, this);
-			this._popupHandlersAdded = false;
-		}
-		return this;
-	},
-
-	getPopup: function () {
-		return this._popup;
-	},
-
-	_movePopup: function (e) {
-		this._popup.setLatLng(e.latlng);
-	}
-});
-
-
-/*
- * L.LayerGroup is a class to combine several layers into one so that
- * you can manipulate the group (e.g. add/remove it) as one layer.
- */
-
-L.LayerGroup = L.Class.extend({
-	initialize: function (layers) {
-		this._layers = {};
-
-		var i, len;
-
-		if (layers) {
-			for (i = 0, len = layers.length; i < len; i++) {
-				this.addLayer(layers[i]);
-			}
-		}
-	},
-
-	addLayer: function (layer) {
-		var id = this.getLayerId(layer);
-
-		this._layers[id] = layer;
-
-		if (this._map) {
-			this._map.addLayer(layer);
-		}
-
-		return this;
-	},
-
-	removeLayer: function (layer) {
-		var id = layer in this._layers ? layer : this.getLayerId(layer);
-
-		if (this._map && this._layers[id]) {
-			this._map.removeLayer(this._layers[id]);
-		}
-
-		delete this._layers[id];
-
-		return this;
-	},
-
-	hasLayer: function (layer) {
-		if (!layer) { return false; }
-
-		return (layer in this._layers || this.getLayerId(layer) in this._layers);
-	},
-
-	clearLayers: function () {
-		this.eachLayer(this.removeLayer, this);
-		return this;
-	},
-
-	invoke: function (methodName) {
-		var args = Array.prototype.slice.call(arguments, 1),
-		    i, layer;
-
-		for (i in this._layers) {
-			layer = this._layers[i];
-
-			if (layer[methodName]) {
-				layer[methodName].apply(layer, args);
-			}
-		}
-
-		return this;
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-		this.eachLayer(map.addLayer, map);
-	},
-
-	onRemove: function (map) {
-		this.eachLayer(map.removeLayer, map);
-		this._map = null;
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	eachLayer: function (method, context) {
-		for (var i in this._layers) {
-			method.call(context, this._layers[i]);
-		}
-		return this;
-	},
-
-	getLayer: function (id) {
-		return this._layers[id];
-	},
-
-	getLayers: function () {
-		var layers = [];
-
-		for (var i in this._layers) {
-			layers.push(this._layers[i]);
-		}
-		return layers;
-	},
-
-	setZIndex: function (zIndex) {
-		return this.invoke('setZIndex', zIndex);
-	},
-
-	getLayerId: function (layer) {
-		return L.stamp(layer);
-	}
-});
-
-L.layerGroup = function (layers) {
-	return new L.LayerGroup(layers);
-};
-
-
-/*
- * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods
- * shared between a group of interactive layers (like vectors or markers).
- */
-
-L.FeatureGroup = L.LayerGroup.extend({
-	includes: L.Mixin.Events,
-
-	statics: {
-		EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'
-	},
-
-	addLayer: function (layer) {
-		if (this.hasLayer(layer)) {
-			return this;
-		}
-
-		if ('on' in layer) {
-			layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
-		}
-
-		L.LayerGroup.prototype.addLayer.call(this, layer);
-
-		if (this._popupContent && layer.bindPopup) {
-			layer.bindPopup(this._popupContent, this._popupOptions);
-		}
-
-		return this.fire('layeradd', {layer: layer});
-	},
-
-	removeLayer: function (layer) {
-		if (!this.hasLayer(layer)) {
-			return this;
-		}
-		if (layer in this._layers) {
-			layer = this._layers[layer];
-		}
-
-		layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);
-
-		L.LayerGroup.prototype.removeLayer.call(this, layer);
-
-		if (this._popupContent) {
-			this.invoke('unbindPopup');
-		}
-
-		return this.fire('layerremove', {layer: layer});
-	},
-
-	bindPopup: function (content, options) {
-		this._popupContent = content;
-		this._popupOptions = options;
-		return this.invoke('bindPopup', content, options);
-	},
-
-	openPopup: function (latlng) {
-		// open popup on the first layer
-		for (var id in this._layers) {
-			this._layers[id].openPopup(latlng);
-			break;
-		}
-		return this;
-	},
-
-	setStyle: function (style) {
-		return this.invoke('setStyle', style);
-	},
-
-	bringToFront: function () {
-		return this.invoke('bringToFront');
-	},
-
-	bringToBack: function () {
-		return this.invoke('bringToBack');
-	},
-
-	getBounds: function () {
-		var bounds = new L.LatLngBounds();
-
-		this.eachLayer(function (layer) {
-			bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());
-		});
-
-		return bounds;
-	},
-
-	_propagateEvent: function (e) {
-		e = L.extend({
-			layer: e.target,
-			target: this
-		}, e);
-		this.fire(e.type, e);
-	}
-});
-
-L.featureGroup = function (layers) {
-	return new L.FeatureGroup(layers);
-};
-
-
-/*
- * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.
- */
-
-L.Path = L.Class.extend({
-	includes: [L.Mixin.Events],
-
-	statics: {
-		// how much to extend the clip area around the map view
-		// (relative to its size, e.g. 0.5 is half the screen in each direction)
-		// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)
-		CLIP_PADDING: (function () {
-			var max = L.Browser.mobile ? 1280 : 2000,
-			    target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;
-			return Math.max(0, Math.min(0.5, target));
-		})()
-	},
-
-	options: {
-		stroke: true,
-		color: '#0033ff',
-		dashArray: null,
-		lineCap: null,
-		lineJoin: null,
-		weight: 5,
-		opacity: 0.5,
-
-		fill: false,
-		fillColor: null, //same as color by default
-		fillOpacity: 0.2,
-
-		clickable: true
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-
-		if (!this._container) {
-			this._initElements();
-			this._initEvents();
-		}
-
-		this.projectLatlngs();
-		this._updatePath();
-
-		if (this._container) {
-			this._map._pathRoot.appendChild(this._container);
-		}
-
-		this.fire('add');
-
-		map.on({
-			'viewreset': this.projectLatlngs,
-			'moveend': this._updatePath
-		}, this);
-	},
-
-	addTo: function (map) {
-		map.addLayer(this);
-		return this;
-	},
-
-	onRemove: function (map) {
-		map._pathRoot.removeChild(this._container);
-
-		// Need to fire remove event before we set _map to null as the event hooks might need the object
-		this.fire('remove');
-		this._map = null;
-
-		if (L.Browser.vml) {
-			this._container = null;
-			this._stroke = null;
-			this._fill = null;
-		}
-
-		map.off({
-			'viewreset': this.projectLatlngs,
-			'moveend': this._updatePath
-		}, this);
-	},
-
-	projectLatlngs: function () {
-		// do all projection stuff here
-	},
-
-	setStyle: function (style) {
-		L.setOptions(this, style);
-
-		if (this._container) {
-			this._updateStyle();
-		}
-
-		return this;
-	},
-
-	redraw: function () {
-		if (this._map) {
-			this.projectLatlngs();
-			this._updatePath();
-		}
-		return this;
-	}
-});
-
-L.Map.include({
-	_updatePathViewport: function () {
-		var p = L.Path.CLIP_PADDING,
-		    size = this.getSize(),
-		    panePos = L.DomUtil.getPosition(this._mapPane),
-		    min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),
-		    max = min.add(size.multiplyBy(1 + p * 2)._round());
-
-		this._pathViewport = new L.Bounds(min, max);
-	}
-});
-
-
-/*
- * Extends L.Path with SVG-specific rendering code.
- */
-
-L.Path.SVG_NS = 'http://www.w3.org/2000/svg';
-
-L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);
-
-L.Path = L.Path.extend({
-	statics: {
-		SVG: L.Browser.svg
-	},
-
-	bringToFront: function () {
-		var root = this._map._pathRoot,
-		    path = this._container;
-
-		if (path && root.lastChild !== path) {
-			root.appendChild(path);
-		}
-		return this;
-	},
-
-	bringToBack: function () {
-		var root = this._map._pathRoot,
-		    path = this._container,
-		    first = root.firstChild;
-
-		if (path && first !== path) {
-			root.insertBefore(path, first);
-		}
-		return this;
-	},
-
-	getPathString: function () {
-		// form path string here
-	},
-
-	_createElement: function (name) {
-		return document.createElementNS(L.Path.SVG_NS, name);
-	},
-
-	_initElements: function () {
-		this._map._initPathRoot();
-		this._initPath();
-		this._initStyle();
-	},
-
-	_initPath: function () {
-		this._container = this._createElement('g');
-
-		this._path = this._createElement('path');
-
-		if (this.options.className) {
-			L.DomUtil.addClass(this._path, this.options.className);
-		}
-
-		this._container.appendChild(this._path);
-	},
-
-	_initStyle: function () {
-		if (this.options.stroke) {
-			this._path.setAttribute('stroke-linejoin', 'round');
-			this._path.setAttribute('stroke-linecap', 'round');
-		}
-		if (this.options.fill) {
-			this._path.setAttribute('fill-rule', 'evenodd');
-		}
-		if (this.options.pointerEvents) {
-			this._path.setAttribute('pointer-events', this.options.pointerEvents);
-		}
-		if (!this.options.clickable && !this.options.pointerEvents) {
-			this._path.setAttribute('pointer-events', 'none');
-		}
-		this._updateStyle();
-	},
-
-	_updateStyle: function () {
-		if (this.options.stroke) {
-			this._path.setAttribute('stroke', this.options.color);
-			this._path.setAttribute('stroke-opacity', this.options.opacity);
-			this._path.setAttribute('stroke-width', this.options.weight);
-			if (this.options.dashArray) {
-				this._path.setAttribute('stroke-dasharray', this.options.dashArray);
-			} else {
-				this._path.removeAttribute('stroke-dasharray');
-			}
-			if (this.options.lineCap) {
-				this._path.setAttribute('stroke-linecap', this.options.lineCap);
-			}
-			if (this.options.lineJoin) {
-				this._path.setAttribute('stroke-linejoin', this.options.lineJoin);
-			}
-		} else {
-			this._path.setAttribute('stroke', 'none');
-		}
-		if (this.options.fill) {
-			this._path.setAttribute('fill', this.options.fillColor || this.options.color);
-			this._path.setAttribute('fill-opacity', this.options.fillOpacity);
-		} else {
-			this._path.setAttribute('fill', 'none');
-		}
-	},
-
-	_updatePath: function () {
-		var str = this.getPathString();
-		if (!str) {
-			// fix webkit empty string parsing bug
-			str = 'M0 0';
-		}
-		this._path.setAttribute('d', str);
-	},
-
-	// TODO remove duplication with L.Map
-	_initEvents: function () {
-		if (this.options.clickable) {
-			if (L.Browser.svg || !L.Browser.vml) {
-				L.DomUtil.addClass(this._path, 'leaflet-clickable');
-			}
-
-			L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
-
-			var events = ['dblclick', 'mousedown', 'mouseover',
-			              'mouseout', 'mousemove', 'contextmenu'];
-			for (var i = 0; i < events.length; i++) {
-				L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);
-			}
-		}
-	},
-
-	_onMouseClick: function (e) {
-		if (this._map.dragging && this._map.dragging.moved()) { return; }
-
-		this._fireMouseEvent(e);
-	},
-
-	_fireMouseEvent: function (e) {
-		if (!this.hasEventListeners(e.type)) { return; }
-
-		var map = this._map,
-		    containerPoint = map.mouseEventToContainerPoint(e),
-		    layerPoint = map.containerPointToLayerPoint(containerPoint),
-		    latlng = map.layerPointToLatLng(layerPoint);
-
-		this.fire(e.type, {
-			latlng: latlng,
-			layerPoint: layerPoint,
-			containerPoint: containerPoint,
-			originalEvent: e
-		});
-
-		if (e.type === 'contextmenu') {
-			L.DomEvent.preventDefault(e);
-		}
-		if (e.type !== 'mousemove') {
-			L.DomEvent.stopPropagation(e);
-		}
-	}
-});
-
-L.Map.include({
-	_initPathRoot: function () {
-		if (!this._pathRoot) {
-			this._pathRoot = L.Path.prototype._createElement('svg');
-			this._panes.overlayPane.appendChild(this._pathRoot);
-
-			if (this.options.zoomAnimation && L.Browser.any3d) {
-				L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');
-
-				this.on({
-					'zoomanim': this._animatePathZoom,
-					'zoomend': this._endPathZoom
-				});
-			} else {
-				L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');
-			}
-
-			this.on('moveend', this._updateSvgViewport);
-			this._updateSvgViewport();
-		}
-	},
-
-	_animatePathZoom: function (e) {
-		var scale = this.getZoomScale(e.zoom),
-		    offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);
-
-		this._pathRoot.style[L.DomUtil.TRANSFORM] =
-		        L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';
-
-		this._pathZooming = true;
-	},
-
-	_endPathZoom: function () {
-		this._pathZooming = false;
-	},
-
-	_updateSvgViewport: function () {
-
-		if (this._pathZooming) {
-			// Do not update SVGs while a zoom animation is going on otherwise the animation will break.
-			// When the zoom animation ends we will be updated again anyway
-			// This fixes the case where you do a momentum move and zoom while the move is still ongoing.
-			return;
-		}
-
-		this._updatePathViewport();
-
-		var vp = this._pathViewport,
-		    min = vp.min,
-		    max = vp.max,
-		    width = max.x - min.x,
-		    height = max.y - min.y,
-		    root = this._pathRoot,
-		    pane = this._panes.overlayPane;
-
-		// Hack to make flicker on drag end on mobile webkit less irritating
-		if (L.Browser.mobileWebkit) {
-			pane.removeChild(root);
-		}
-
-		L.DomUtil.setPosition(root, min);
-		root.setAttribute('width', width);
-		root.setAttribute('height', height);
-		root.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));
-
-		if (L.Browser.mobileWebkit) {
-			pane.appendChild(root);
-		}
-	}
-});
-
-
-/*
- * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.
- */
-
-L.Path.include({
-
-	bindPopup: function (content, options) {
-
-		if (content instanceof L.Popup) {
-			this._popup = content;
-		} else {
-			if (!this._popup || options) {
-				this._popup = new L.Popup(options, this);
-			}
-			this._popup.setContent(content);
-		}
-
-		if (!this._popupHandlersAdded) {
-			this
-			    .on('click', this._openPopup, this)
-			    .on('remove', this.closePopup, this);
-
-			this._popupHandlersAdded = true;
-		}
-
-		return this;
-	},
-
-	unbindPopup: function () {
-		if (this._popup) {
-			this._popup = null;
-			this
-			    .off('click', this._openPopup)
-			    .off('remove', this.closePopup);
-
-			this._popupHandlersAdded = false;
-		}
-		return this;
-	},
-
-	openPopup: function (latlng) {
-
-		if (this._popup) {
-			// open the popup from one of the path's points if not specified
-			latlng = latlng || this._latlng ||
-			         this._latlngs[Math.floor(this._latlngs.length / 2)];
-
-			this._openPopup({latlng: latlng});
-		}
-
-		return this;
-	},
-
-	closePopup: function () {
-		if (this._popup) {
-			this._popup._close();
-		}
-		return this;
-	},
-
-	_openPopup: function (e) {
-		this._popup.setLatLng(e.latlng);
-		this._map.openPopup(this._popup);
-	}
-});
-
-
-/*
- * Vector rendering for IE6-8 through VML.
- * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
- */
-
-L.Browser.vml = !L.Browser.svg && (function () {
-	try {
-		var div = document.createElement('div');
-		div.innerHTML = '<v:shape adj="1"/>';
-
-		var shape = div.firstChild;
-		shape.style.behavior = 'url(#default#VML)';
-
-		return shape && (typeof shape.adj === 'object');
-
-	} catch (e) {
-		return false;
-	}
-}());
-
-L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
-	statics: {
-		VML: true,
-		CLIP_PADDING: 0.02
-	},
-
-	_createElement: (function () {
-		try {
-			document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
-			return function (name) {
-				return document.createElement('<lvml:' + name + ' class="lvml">');
-			};
-		} catch (e) {
-			return function (name) {
-				return document.createElement(
-				        '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
-			};
-		}
-	}()),
-
-	_initPath: function () {
-		var container = this._container = this._createElement('shape');
-
-		L.DomUtil.addClass(container, 'leaflet-vml-shape' +
-			(this.options.className ? ' ' + this.options.className : ''));
-
-		if (this.options.clickable) {
-			L.DomUtil.addClass(container, 'leaflet-clickable');
-		}
-
-		container.coordsize = '1 1';
-
-		this._path = this._createElement('path');
-		container.appendChild(this._path);
-
-		this._map._pathRoot.appendChild(container);
-	},
-
-	_initStyle: function () {
-		this._updateStyle();
-	},
-
-	_updateStyle: function () {
-		var stroke = this._stroke,
-		    fill = this._fill,
-		    options = this.options,
-		    container = this._container;
-
-		container.stroked = options.stroke;
-		container.filled = options.fill;
-
-		if (options.stroke) {
-			if (!stroke) {
-				stroke = this._stroke = this._createElement('stroke');
-				stroke.endcap = 'round';
-				container.appendChild(stroke);
-			}
-			stroke.weight = options.weight + 'px';
-			stroke.color = options.color;
-			stroke.opacity = options.opacity;
-
-			if (options.dashArray) {
-				stroke.dashStyle = L.Util.isArray(options.dashArray) ?
-				    options.dashArray.join(' ') :
-				    options.dashArray.replace(/( *, *)/g, ' ');
-			} else {
-				stroke.dashStyle = '';
-			}
-			if (options.lineCap) {
-				stroke.endcap = options.lineCap.replace('butt', 'flat');
-			}
-			if (options.lineJoin) {
-				stroke.joinstyle = options.lineJoin;
-			}
-
-		} else if (stroke) {
-			container.removeChild(stroke);
-			this._stroke = null;
-		}
-
-		if (options.fill) {
-			if (!fill) {
-				fill = this._fill = this._createElement('fill');
-				container.appendChild(fill);
-			}
-			fill.color = options.fillColor || options.color;
-			fill.opacity = options.fillOpacity;
-
-		} else if (fill) {
-			container.removeChild(fill);
-			this._fill = null;
-		}
-	},
-
-	_updatePath: function () {
-		var style = this._container.style;
-
-		style.display = 'none';
-		this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug
-		style.display = '';
-	}
-});
-
-L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {
-	_initPathRoot: function () {
-		if (this._pathRoot) { return; }
-
-		var root = this._pathRoot = document.createElement('div');
-		root.className = 'leaflet-vml-container';
-		this._panes.overlayPane.appendChild(root);
-
-		this.on('moveend', this._updatePathViewport);
-		this._updatePathViewport();
-	}
-});
-
-
-/*
- * Vector rendering for all browsers that support canvas.
- */
-
-L.Browser.canvas = (function () {
-	return !!document.createElement('canvas').getContext;
-}());
-
-L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({
-	statics: {
-		//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value
-		CANVAS: true,
-		SVG: false
-	},
-
-	redraw: function () {
-		if (this._map) {
-			this.projectLatlngs();
-			this._requestUpdate();
-		}
-		return this;
-	},
-
-	setStyle: function (style) {
-		L.setOptions(this, style);
-
-		if (this._map) {
-			this._updateStyle();
-			this._requestUpdate();
-		}
-		return this;
-	},
-
-	onRemove: function (map) {
-		map
-		    .off('viewreset', this.projectLatlngs, this)
-		    .off('moveend', this._updatePath, this);
-
-		if (this.options.clickable) {
-			this._map.off('click', this._onClick, this);
-			this._map.off('mousemove', this._onMouseMove, this);
-		}
-
-		this._requestUpdate();
-
-		this._map = null;
-	},
-
-	_requestUpdate: function () {
-		if (this._map && !L.Path._updateRequest) {
-			L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);
-		}
-	},
-
-	_fireMapMoveEnd: function () {
-		L.Path._updateRequest = null;
-		this.fire('moveend');
-	},
-
-	_initElements: function () {
-		this._map._initPathRoot();
-		this._ctx = this._map._canvasCtx;
-	},
-
-	_updateStyle: function () {
-		var options = this.options;
-
-		if (options.stroke) {
-			this._ctx.lineWidth = options.weight;
-			this._ctx.strokeStyle = options.color;
-		}
-		if (options.fill) {
-			this._ctx.fillStyle = options.fillColor || options.color;
-		}
-	},
-
-	_drawPath: function () {
-		var i, j, len, len2, point, drawMethod;
-
-		this._ctx.beginPath();
-
-		for (i = 0, len = this._parts.length; i < len; i++) {
-			for (j = 0, len2 = this._parts[i].length; j < len2; j++) {
-				point = this._parts[i][j];
-				drawMethod = (j === 0 ? 'move' : 'line') + 'To';
-
-				this._ctx[drawMethod](point.x, point.y);
-			}
-			// TODO refactor ugly hack
-			if (this instanceof L.Polygon) {
-				this._ctx.closePath();
-			}
-		}
-	},
-
-	_checkIfEmpty: function () {
-		return !this._parts.length;
-	},
-
-	_updatePath: function () {
-		if (this._checkIfEmpty()) { return; }
-
-		var ctx = this._ctx,
-		    options = this.options;
-
-		this._drawPath();
-		ctx.save();
-		this._updateStyle();
-
-		if (options.fill) {
-			ctx.globalAlpha = options.fillOpacity;
-			ctx.fill();
-		}
-
-		if (options.stroke) {
-			ctx.globalAlpha = options.opacity;
-			ctx.stroke();
-		}
-
-		ctx.restore();
-
-		// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
-	},
-
-	_initEvents: function () {
-		if (this.options.clickable) {
-			// TODO dblclick
-			this._map.on('mousemove', this._onMouseMove, this);
-			this._map.on('click', this._onClick, this);
-		}
-	},
-
-	_onClick: function (e) {
-		if (this._containsPoint(e.layerPoint)) {
-			this.fire('click', e);
-		}
-	},
-
-	_onMouseMove: function (e) {
-		if (!this._map || this._map._animatingZoom) { return; }
-
-		// TODO don't do on each move
-		if (this._containsPoint(e.layerPoint)) {
-			this._ctx.canvas.style.cursor = 'pointer';
-			this._mouseInside = true;
-			this.fire('mouseover', e);
-
-		} else if (this._mouseInside) {
-			this._ctx.canvas.style.cursor = '';
-			this._mouseInside = false;
-			this.fire('mouseout', e);
-		}
-	}
-});
-
-L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {
-	_initPathRoot: function () {
-		var root = this._pathRoot,
-		    ctx;
-
-		if (!root) {
-			root = this._pathRoot = document.createElement('canvas');
-			root.style.position = 'absolute';
-			ctx = this._canvasCtx = root.getContext('2d');
-
-			ctx.lineCap = 'round';
-			ctx.lineJoin = 'round';
-
-			this._panes.overlayPane.appendChild(root);
-
-			if (this.options.zoomAnimation) {
-				this._pathRoot.className = 'leaflet-zoom-animated';
-				this.on('zoomanim', this._animatePathZoom);
-				this.on('zoomend', this._endPathZoom);
-			}
-			this.on('moveend', this._updateCanvasViewport);
-			this._updateCanvasViewport();
-		}
-	},
-
-	_updateCanvasViewport: function () {
-		// don't redraw while zooming. See _updateSvgViewport for more details
-		if (this._pathZooming) { return; }
-		this._updatePathViewport();
-
-		var vp = this._pathViewport,
-		    min = vp.min,
-		    size = vp.max.subtract(min),
-		    root = this._pathRoot;
-
-		//TODO check if this works properly on mobile webkit
-		L.DomUtil.setPosition(root, min);
-		root.width = size.x;
-		root.height = size.y;
-		root.getContext('2d').translate(-min.x, -min.y);
-	}
-});
-
-
-/*
- * L.LineUtil contains different utility functions for line segments
- * and polylines (clipping, simplification, distances, etc.)
- */
-
-/*jshint bitwise:false */ // allow bitwise operations for this file
-
-L.LineUtil = {
-
-	// Simplify polyline with vertex reduction and Douglas-Peucker simplification.
-	// Improves rendering performance dramatically by lessening the number of points to draw.
-
-	simplify: function (/*Point[]*/ points, /*Number*/ tolerance) {
-		if (!tolerance || !points.length) {
-			return points.slice();
-		}
-
-		var sqTolerance = tolerance * tolerance;
-
-		// stage 1: vertex reduction
-		points = this._reducePoints(points, sqTolerance);
-
-		// stage 2: Douglas-Peucker simplification
-		points = this._simplifyDP(points, sqTolerance);
-
-		return points;
-	},
-
-	// distance from a point to a segment between two points
-	pointToSegmentDistance:  function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
-		return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));
-	},
-
-	closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
-		return this._sqClosestPointOnSegment(p, p1, p2);
-	},
-
-	// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
-	_simplifyDP: function (points, sqTolerance) {
-
-		var len = points.length,
-		    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
-		    markers = new ArrayConstructor(len);
-
-		markers[0] = markers[len - 1] = 1;
-
-		this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
-
-		var i,
-		    newPoints = [];
-
-		for (i = 0; i < len; i++) {
-			if (markers[i]) {
-				newPoints.push(points[i]);
-			}
-		}
-
-		return newPoints;
-	},
-
-	_simplifyDPStep: function (points, markers, sqTolerance, first, last) {
-
-		var maxSqDist = 0,
-		    index, i, sqDist;
-
-		for (i = first + 1; i <= last - 1; i++) {
-			sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);
-
-			if (sqDist > maxSqDist) {
-				index = i;
-				maxSqDist = sqDist;
-			}
-		}
-
-		if (maxSqDist > sqTolerance) {
-			markers[index] = 1;
-
-			this._simplifyDPStep(points, markers, sqTolerance, first, index);
-			this._simplifyDPStep(points, markers, sqTolerance, index, last);
-		}
-	},
-
-	// reduce points that are too close to each other to a single point
-	_reducePoints: function (points, sqTolerance) {
-		var reducedPoints = [points[0]];
-
-		for (var i = 1, prev = 0, len = points.length; i < len; i++) {
-			if (this._sqDist(points[i], points[prev]) > sqTolerance) {
-				reducedPoints.push(points[i]);
-				prev = i;
-			}
-		}
-		if (prev < len - 1) {
-			reducedPoints.push(points[len - 1]);
-		}
-		return reducedPoints;
-	},
-
-	// Cohen-Sutherland line clipping algorithm.
-	// Used to avoid rendering parts of a polyline that are not currently visible.
-
-	clipSegment: function (a, b, bounds, useLastCode) {
-		var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
-		    codeB = this._getBitCode(b, bounds),
-
-		    codeOut, p, newCode;
-
-		// save 2nd code to avoid calculating it on the next segment
-		this._lastCode = codeB;
-
-		while (true) {
-			// if a,b is inside the clip window (trivial accept)
-			if (!(codeA | codeB)) {
-				return [a, b];
-			// if a,b is outside the clip window (trivial reject)
-			} else if (codeA & codeB) {
-				return false;
-			// other cases
-			} else {
-				codeOut = codeA || codeB;
-				p = this._getEdgeIntersection(a, b, codeOut, bounds);
-				newCode = this._getBitCode(p, bounds);
-
-				if (codeOut === codeA) {
-					a = p;
-					codeA = newCode;
-				} else {
-					b = p;
-					codeB = newCode;
-				}
-			}
-		}
-	},
-
-	_getEdgeIntersection: function (a, b, code, bounds) {
-		var dx = b.x - a.x,
-		    dy = b.y - a.y,
-		    min = bounds.min,
-		    max = bounds.max;
-
-		if (code & 8) { // top
-			return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);
-		} else if (code & 4) { // bottom
-			return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);
-		} else if (code & 2) { // right
-			return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);
-		} else if (code & 1) { // left
-			return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);
-		}
-	},
-
-	_getBitCode: function (/*Point*/ p, bounds) {
-		var code = 0;
-
-		if (p.x < bounds.min.x) { // left
-			code |= 1;
-		} else if (p.x > bounds.max.x) { // right
-			code |= 2;
-		}
-		if (p.y < bounds.min.y) { // bottom
-			code |= 4;
-		} else if (p.y > bounds.max.y) { // top
-			code |= 8;
-		}
-
-		return code;
-	},
-
-	// square distance (to avoid unnecessary Math.sqrt calls)
-	_sqDist: function (p1, p2) {
-		var dx = p2.x - p1.x,
-		    dy = p2.y - p1.y;
-		return dx * dx + dy * dy;
-	},
-
-	// return closest point on segment or distance to that point
-	_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {
-		var x = p1.x,
-		    y = p1.y,
-		    dx = p2.x - x,
-		    dy = p2.y - y,
-		    dot = dx * dx + dy * dy,
-		    t;
-
-		if (dot > 0) {
-			t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
-
-			if (t > 1) {
-				x = p2.x;
-				y = p2.y;
-			} else if (t > 0) {
-				x += dx * t;
-				y += dy * t;
-			}
-		}
-
-		dx = p.x - x;
-		dy = p.y - y;
-
-		return sqDist ? dx * dx + dy * dy : new L.Point(x, y);
-	}
-};
-
-
-/*
- * L.Polyline is used to display polylines on a map.
- */
-
-L.Polyline = L.Path.extend({
-	initialize: function (latlngs, options) {
-		L.Path.prototype.initialize.call(this, options);
-
-		this._latlngs = this._convertLatLngs(latlngs);
-	},
-
-	options: {
-		// how much to simplify the polyline on each zoom level
-		// more = better performance and smoother look, less = more accurate
-		smoothFactor: 1.0,
-		noClip: false
-	},
-
-	projectLatlngs: function () {
-		this._originalPoints = [];
-
-		for (var i = 0, len = this._latlngs.length; i < len; i++) {
-			this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);
-		}
-	},
-
-	getPathString: function () {
-		for (var i = 0, len = this._parts.length, str = ''; i < len; i++) {
-			str += this._getPathPartStr(this._parts[i]);
-		}
-		return str;
-	},
-
-	getLatLngs: function () {
-		return this._latlngs;
-	},
-
-	setLatLngs: function (latlngs) {
-		this._latlngs = this._convertLatLngs(latlngs);
-		return this.redraw();
-	},
-
-	addLatLng: function (latlng) {
-		this._latlngs.push(L.latLng(latlng));
-		return this.redraw();
-	},
-
-	spliceLatLngs: function () { // (Number index, Number howMany)
-		var removed = [].splice.apply(this._latlngs, arguments);
-		this._convertLatLngs(this._latlngs, true);
-		this.redraw();
-		return removed;
-	},
-
-	closestLayerPoint: function (p) {
-		var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;
-
-		for (var j = 0, jLen = parts.length; j < jLen; j++) {
-			var points = parts[j];
-			for (var i = 1, len = points.length; i < len; i++) {
-				p1 = points[i - 1];
-				p2 = points[i];
-				var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);
-				if (sqDist < minDistance) {
-					minDistance = sqDist;
-					minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);
-				}
-			}
-		}
-		if (minPoint) {
-			minPoint.distance = Math.sqrt(minDistance);
-		}
-		return minPoint;
-	},
-
-	getBounds: function () {
-		return new L.LatLngBounds(this.getLatLngs());
-	},
-
-	_convertLatLngs: function (latlngs, overwrite) {
-		var i, len, target = overwrite ? latlngs : [];
-
-		for (i = 0, len = latlngs.length; i < len; i++) {
-			if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {
-				return;
-			}
-			target[i] = L.latLng(latlngs[i]);
-		}
-		return target;
-	},
-
-	_initEvents: function () {
-		L.Path.prototype._initEvents.call(this);
-	},
-
-	_getPathPartStr: function (points) {
-		var round = L.Path.VML;
-
-		for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {
-			p = points[j];
-			if (round) {
-				p._round();
-			}
-			str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
-		}
-		return str;
-	},
-
-	_clipPoints: function () {
-		var points = this._originalPoints,
-		    len = points.length,
-		    i, k, segment;
-
-		if (this.options.noClip) {
-			this._parts = [points];
-			return;
-		}
-
-		this._parts = [];
-
-		var parts = this._parts,
-		    vp = this._map._pathViewport,
-		    lu = L.LineUtil;
-
-		for (i = 0, k = 0; i < len - 1; i++) {
-			segment = lu.clipSegment(points[i], points[i + 1], vp, i);
-			if (!segment) {
-				continue;
-			}
-
-			parts[k] = parts[k] || [];
-			parts[k].push(segment[0]);
-
-			// if segment goes out of screen, or it's the last one, it's the end of the line part
-			if ((segment[1] !== points[i + 1]) || (i === len - 2)) {
-				parts[k].push(segment[1]);
-				k++;
-			}
-		}
-	},
-
-	// simplify each clipped part of the polyline
-	_simplifyPoints: function () {
-		var parts = this._parts,
-		    lu = L.LineUtil;
-
-		for (var i = 0, len = parts.length; i < len; i++) {
-			parts[i] = lu.simplify(parts[i], this.options.smoothFactor);
-		}
-	},
-
-	_updatePath: function () {
-		if (!this._map) { return; }
-
-		this._clipPoints();
-		this._simplifyPoints();
-
-		L.Path.prototype._updatePath.call(this);
-	}
-});
-
-L.polyline = function (latlngs, options) {
-	return new L.Polyline(latlngs, options);
-};
-
-
-/*
- * L.PolyUtil contains utility functions for polygons (clipping, etc.).
- */
-
-/*jshint bitwise:false */ // allow bitwise operations here
-
-L.PolyUtil = {};
-
-/*
- * Sutherland-Hodgeman polygon clipping algorithm.
- * Used to avoid rendering parts of a polygon that are not currently visible.
- */
-L.PolyUtil.clipPolygon = function (points, bounds) {
-	var clippedPoints,
-	    edges = [1, 4, 2, 8],
-	    i, j, k,
-	    a, b,
-	    len, edge, p,
-	    lu = L.LineUtil;
-
-	for (i = 0, len = points.length; i < len; i++) {
-		points[i]._code = lu._getBitCode(points[i], bounds);
-	}
-
-	// for each edge (left, bottom, right, top)
-	for (k = 0; k < 4; k++) {
-		edge = edges[k];
-		clippedPoints = [];
-
-		for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
-			a = points[i];
-			b = points[j];
-
-			// if a is inside the clip window
-			if (!(a._code & edge)) {
-				// if b is outside the clip window (a->b goes out of screen)
-				if (b._code & edge) {
-					p = lu._getEdgeIntersection(b, a, edge, bounds);
-					p._code = lu._getBitCode(p, bounds);
-					clippedPoints.push(p);
-				}
-				clippedPoints.push(a);
-
-			// else if b is inside the clip window (a->b enters the screen)
-			} else if (!(b._code & edge)) {
-				p = lu._getEdgeIntersection(b, a, edge, bounds);
-				p._code = lu._getBitCode(p, bounds);
-				clippedPoints.push(p);
-			}
-		}
-		points = clippedPoints;
-	}
-
-	return points;
-};
-
-
-/*
- * L.Polygon is used to display polygons on a map.
- */
-
-L.Polygon = L.Polyline.extend({
-	options: {
-		fill: true
-	},
-
-	initialize: function (latlngs, options) {
-		L.Polyline.prototype.initialize.call(this, latlngs, options);
-		this._initWithHoles(latlngs);
-	},
-
-	_initWithHoles: function (latlngs) {
-		var i, len, hole;
-		if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
-			this._latlngs = this._convertLatLngs(latlngs[0]);
-			this._holes = latlngs.slice(1);
-
-			for (i = 0, len = this._holes.length; i < len; i++) {
-				hole = this._holes[i] = this._convertLatLngs(this._holes[i]);
-				if (hole[0].equals(hole[hole.length - 1])) {
-					hole.pop();
-				}
-			}
-		}
-
-		// filter out last point if its equal to the first one
-		latlngs = this._latlngs;
-
-		if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {
-			latlngs.pop();
-		}
-	},
-
-	projectLatlngs: function () {
-		L.Polyline.prototype.projectLatlngs.call(this);
-
-		// project polygon holes points
-		// TODO move this logic to Polyline to get rid of duplication
-		this._holePoints = [];
-
-		if (!this._holes) { return; }
-
-		var i, j, len, len2;
-
-		for (i = 0, len = this._holes.length; i < len; i++) {
-			this._holePoints[i] = [];
-
-			for (j = 0, len2 = this._holes[i].length; j < len2; j++) {
-				this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);
-			}
-		}
-	},
-
-	setLatLngs: function (latlngs) {
-		if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
-			this._initWithHoles(latlngs);
-			return this.redraw();
-		} else {
-			return L.Polyline.prototype.setLatLngs.call(this, latlngs);
-		}
-	},
-
-	_clipPoints: function () {
-		var points = this._originalPoints,
-		    newParts = [];
-
-		this._parts = [points].concat(this._holePoints);
-
-		if (this.options.noClip) { return; }
-
-		for (var i = 0, len = this._parts.length; i < len; i++) {
-			var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);
-			if (clipped.length) {
-				newParts.push(clipped);
-			}
-		}
-
-		this._parts = newParts;
-	},
-
-	_getPathPartStr: function (points) {
-		var str = L.Polyline.prototype._getPathPartStr.call(this, points);
-		return str + (L.Browser.svg ? 'z' : 'x');
-	}
-});
-
-L.polygon = function (latlngs, options) {
-	return new L.Polygon(latlngs, options);
-};
-
-
-/*
- * Contains L.MultiPolyline and L.MultiPolygon layers.
- */
-
-(function () {
-	function createMulti(Klass) {
-
-		return L.FeatureGroup.extend({
-
-			initialize: function (latlngs, options) {
-				this._layers = {};
-				this._options = options;
-				this.setLatLngs(latlngs);
-			},
-
-			setLatLngs: function (latlngs) {
-				var i = 0,
-				    len = latlngs.length;
-
-				this.eachLayer(function (layer) {
-					if (i < len) {
-						layer.setLatLngs(latlngs[i++]);
-					} else {
-						this.removeLayer(layer);
-					}
-				}, this);
-
-				while (i < len) {
-					this.addLayer(new Klass(latlngs[i++], this._options));
-				}
-
-				return this;
-			},
-
-			getLatLngs: function () {
-				var latlngs = [];
-
-				this.eachLayer(function (layer) {
-					latlngs.push(layer.getLatLngs());
-				});
-
-				return latlngs;
-			}
-		});
-	}
-
-	L.MultiPolyline = createMulti(L.Polyline);
-	L.MultiPolygon = createMulti(L.Polygon);
-
-	L.multiPolyline = function (latlngs, options) {
-		return new L.MultiPolyline(latlngs, options);
-	};
-
-	L.multiPolygon = function (latlngs, options) {
-		return new L.MultiPolygon(latlngs, options);
-	};
-}());
-
-
-/*
- * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
- */
-
-L.Rectangle = L.Polygon.extend({
-	initialize: function (latLngBounds, options) {
-		L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
-	},
-
-	setBounds: function (latLngBounds) {
-		this.setLatLngs(this._boundsToLatLngs(latLngBounds));
-	},
-
-	_boundsToLatLngs: function (latLngBounds) {
-		latLngBounds = L.latLngBounds(latLngBounds);
-		return [
-			latLngBounds.getSouthWest(),
-			latLngBounds.getNorthWest(),
-			latLngBounds.getNorthEast(),
-			latLngBounds.getSouthEast()
-		];
-	}
-});
-
-L.rectangle = function (latLngBounds, options) {
-	return new L.Rectangle(latLngBounds, options);
-};
-
-
-/*
- * L.Circle is a circle overlay (with a certain radius in meters).
- */
-
-L.Circle = L.Path.extend({
-	initialize: function (latlng, radius, options) {
-		L.Path.prototype.initialize.call(this, options);
-
-		this._latlng = L.latLng(latlng);
-		this._mRadius = radius;
-	},
-
-	options: {
-		fill: true
-	},
-
-	setLatLng: function (latlng) {
-		this._latlng = L.latLng(latlng);
-		return this.redraw();
-	},
-
-	setRadius: function (radius) {
-		this._mRadius = radius;
-		return this.redraw();
-	},
-
-	projectLatlngs: function () {
-		var lngRadius = this._getLngRadius(),
-		    latlng = this._latlng,
-		    pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);
-
-		this._point = this._map.latLngToLayerPoint(latlng);
-		this._radius = Math.max(this._point.x - pointLeft.x, 1);
-	},
-
-	getBounds: function () {
-		var lngRadius = this._getLngRadius(),
-		    latRadius = (this._mRadius / 40075017) * 360,
-		    latlng = this._latlng;
-
-		return new L.LatLngBounds(
-		        [latlng.lat - latRadius, latlng.lng - lngRadius],
-		        [latlng.lat + latRadius, latlng.lng + lngRadius]);
-	},
-
-	getLatLng: function () {
-		return this._latlng;
-	},
-
-	getPathString: function () {
-		var p = this._point,
-		    r = this._radius;
-
-		if (this._checkIfEmpty()) {
-			return '';
-		}
-
-		if (L.Browser.svg) {
-			return 'M' + p.x + ',' + (p.y - r) +
-			       'A' + r + ',' + r + ',0,1,1,' +
-			       (p.x - 0.1) + ',' + (p.y - r) + ' z';
-		} else {
-			p._round();
-			r = Math.round(r);
-			return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);
-		}
-	},
-
-	getRadius: function () {
-		return this._mRadius;
-	},
-
-	// TODO Earth hardcoded, move into projection code!
-
-	_getLatRadius: function () {
-		return (this._mRadius / 40075017) * 360;
-	},
-
-	_getLngRadius: function () {
-		return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);
-	},
-
-	_checkIfEmpty: function () {
-		if (!this._map) {
-			return false;
-		}
-		var vp = this._map._pathViewport,
-		    r = this._radius,
-		    p = this._point;
-
-		return p.x - r > vp.max.x || p.y - r > vp.max.y ||
-		       p.x + r < vp.min.x || p.y + r < vp.min.y;
-	}
-});
-
-L.circle = function (latlng, radius, options) {
-	return new L.Circle(latlng, radius, options);
-};
-
-
-/*
- * L.CircleMarker is a circle overlay with a permanent pixel radius.
- */
-
-L.CircleMarker = L.Circle.extend({
-	options: {
-		radius: 10,
-		weight: 2
-	},
-
-	initialize: function (latlng, options) {
-		L.Circle.prototype.initialize.call(this, latlng, null, options);
-		this._radius = this.options.radius;
-	},
-
-	projectLatlngs: function () {
-		this._point = this._map.latLngToLayerPoint(this._latlng);
-	},
-
-	_updateStyle : function () {
-		L.Circle.prototype._updateStyle.call(this);
-		this.setRadius(this.options.radius);
-	},
-
-	setLatLng: function (latlng) {
-		L.Circle.prototype.setLatLng.call(this, latlng);
-		if (this._popup && this._popup._isOpen) {
-			this._popup.setLatLng(latlng);
-		}
-		return this;
-	},
-
-	setRadius: function (radius) {
-		this.options.radius = this._radius = radius;
-		return this.redraw();
-	},
-
-	getRadius: function () {
-		return this._radius;
-	}
-});
-
-L.circleMarker = function (latlng, options) {
-	return new L.CircleMarker(latlng, options);
-};
-
-
-/*
- * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.
- */
-
-L.Polyline.include(!L.Path.CANVAS ? {} : {
-	_containsPoint: function (p, closed) {
-		var i, j, k, len, len2, dist, part,
-		    w = this.options.weight / 2;
-
-		if (L.Browser.touch) {
-			w += 10; // polyline click tolerance on touch devices
-		}
-
-		for (i = 0, len = this._parts.length; i < len; i++) {
-			part = this._parts[i];
-			for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
-				if (!closed && (j === 0)) {
-					continue;
-				}
-
-				dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);
-
-				if (dist <= w) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-});
-
-
-/*
- * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.
- */
-
-L.Polygon.include(!L.Path.CANVAS ? {} : {
-	_containsPoint: function (p) {
-		var inside = false,
-		    part, p1, p2,
-		    i, j, k,
-		    len, len2;
-
-		// TODO optimization: check if within bounds first
-
-		if (L.Polyline.prototype._containsPoint.call(this, p, true)) {
-			// click on polygon border
-			return true;
-		}
-
-		// ray casting algorithm for detecting if point is in polygon
-
-		for (i = 0, len = this._parts.length; i < len; i++) {
-			part = this._parts[i];
-
-			for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
-				p1 = part[j];
-				p2 = part[k];
-
-				if (((p1.y > p.y) !== (p2.y > p.y)) &&
-						(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
-					inside = !inside;
-				}
-			}
-		}
-
-		return inside;
-	}
-});
-
-
-/*
- * Extends L.Circle with Canvas-specific code.
- */
-
-L.Circle.include(!L.Path.CANVAS ? {} : {
-	_drawPath: function () {
-		var p = this._point;
-		this._ctx.beginPath();
-		this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);
-	},
-
-	_containsPoint: function (p) {
-		var center = this._point,
-		    w2 = this.options.stroke ? this.options.weight / 2 : 0;
-
-		return (p.distanceTo(center) <= this._radius + w2);
-	}
-});
-
-
-/*
- * CircleMarker canvas specific drawing parts.
- */
-
-L.CircleMarker.include(!L.Path.CANVAS ? {} : {
-	_updateStyle: function () {
-		L.Path.prototype._updateStyle.call(this);
-	}
-});
-
-
-/*
- * L.GeoJSON turns any GeoJSON data into a Leaflet layer.
- */
-
-L.GeoJSON = L.FeatureGroup.extend({
-
-	initialize: function (geojson, options) {
-		L.setOptions(this, options);
-
-		this._layers = {};
-
-		if (geojson) {
-			this.addData(geojson);
-		}
-	},
-
-	addData: function (geojson) {
-		var features = L.Util.isArray(geojson) ? geojson : geojson.features,
-		    i, len, feature;
-
-		if (features) {
-			for (i = 0, len = features.length; i < len; i++) {
-				// Only add this if geometry or geometries are set and not null
-				feature = features[i];
-				if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
-					this.addData(features[i]);
-				}
-			}
-			return this;
-		}
-
-		var options = this.options;
-
-		if (options.filter && !options.filter(geojson)) { return; }
-
-		var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);
-		layer.feature = L.GeoJSON.asFeature(geojson);
-
-		layer.defaultOptions = layer.options;
-		this.resetStyle(layer);
-
-		if (options.onEachFeature) {
-			options.onEachFeature(geojson, layer);
-		}
-
-		return this.addLayer(layer);
-	},
-
-	resetStyle: function (layer) {
-		var style = this.options.style;
-		if (style) {
-			// reset any custom styles
-			L.Util.extend(layer.options, layer.defaultOptions);
-
-			this._setLayerStyle(layer, style);
-		}
-	},
-
-	setStyle: function (style) {
-		this.eachLayer(function (layer) {
-			this._setLayerStyle(layer, style);
-		}, this);
-	},
-
-	_setLayerStyle: function (layer, style) {
-		if (typeof style === 'function') {
-			style = style(layer.feature);
-		}
-		if (layer.setStyle) {
-			layer.setStyle(style);
-		}
-	}
-});
-
-L.extend(L.GeoJSON, {
-	geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {
-		var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
-		    coords = geometry.coordinates,
-		    layers = [],
-		    latlng, latlngs, i, len;
-
-		coordsToLatLng = coordsToLatLng || this.coordsToLatLng;
-
-		switch (geometry.type) {
-		case 'Point':
-			latlng = coordsToLatLng(coords);
-			return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
-
-		case 'MultiPoint':
-			for (i = 0, len = coords.length; i < len; i++) {
-				latlng = coordsToLatLng(coords[i]);
-				layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
-			}
-			return new L.FeatureGroup(layers);
-
-		case 'LineString':
-			latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);
-			return new L.Polyline(latlngs, vectorOptions);
-
-		case 'Polygon':
-			if (coords.length === 2 && !coords[1].length) {
-				throw new Error('Invalid GeoJSON object.');
-			}
-			latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
-			return new L.Polygon(latlngs, vectorOptions);
-
-		case 'MultiLineString':
-			latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
-			return new L.MultiPolyline(latlngs, vectorOptions);
-
-		case 'MultiPolygon':
-			latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);
-			return new L.MultiPolygon(latlngs, vectorOptions);
-
-		case 'GeometryCollection':
-			for (i = 0, len = geometry.geometries.length; i < len; i++) {
-
-				layers.push(this.geometryToLayer({
-					geometry: geometry.geometries[i],
-					type: 'Feature',
-					properties: geojson.properties
-				}, pointToLayer, coordsToLatLng, vectorOptions));
-			}
-			return new L.FeatureGroup(layers);
-
-		default:
-			throw new Error('Invalid GeoJSON object.');
-		}
-	},
-
-	coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng
-		return new L.LatLng(coords[1], coords[0], coords[2]);
-	},
-
-	coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array
-		var latlng, i, len,
-		    latlngs = [];
-
-		for (i = 0, len = coords.length; i < len; i++) {
-			latlng = levelsDeep ?
-			        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :
-			        (coordsToLatLng || this.coordsToLatLng)(coords[i]);
-
-			latlngs.push(latlng);
-		}
-
-		return latlngs;
-	},
-
-	latLngToCoords: function (latlng) {
-		var coords = [latlng.lng, latlng.lat];
-
-		if (latlng.alt !== undefined) {
-			coords.push(latlng.alt);
-		}
-		return coords;
-	},
-
-	latLngsToCoords: function (latLngs) {
-		var coords = [];
-
-		for (var i = 0, len = latLngs.length; i < len; i++) {
-			coords.push(L.GeoJSON.latLngToCoords(latLngs[i]));
-		}
-
-		return coords;
-	},
-
-	getFeature: function (layer, newGeometry) {
-		return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);
-	},
-
-	asFeature: function (geoJSON) {
-		if (geoJSON.type === 'Feature') {
-			return geoJSON;
-		}
-
-		return {
-			type: 'Feature',
-			properties: {},
-			geometry: geoJSON
-		};
-	}
-});
-
-var PointToGeoJSON = {
-	toGeoJSON: function () {
-		return L.GeoJSON.getFeature(this, {
-			type: 'Point',
-			coordinates: L.GeoJSON.latLngToCoords(this.getLatLng())
-		});
-	}
-};
-
-L.Marker.include(PointToGeoJSON);
-L.Circle.include(PointToGeoJSON);
-L.CircleMarker.include(PointToGeoJSON);
-
-L.Polyline.include({
-	toGeoJSON: function () {
-		return L.GeoJSON.getFeature(this, {
-			type: 'LineString',
-			coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())
-		});
-	}
-});
-
-L.Polygon.include({
-	toGeoJSON: function () {
-		var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],
-		    i, len, hole;
-
-		coords[0].push(coords[0][0]);
-
-		if (this._holes) {
-			for (i = 0, len = this._holes.length; i < len; i++) {
-				hole = L.GeoJSON.latLngsToCoords(this._holes[i]);
-				hole.push(hole[0]);
-				coords.push(hole);
-			}
-		}
-
-		return L.GeoJSON.getFeature(this, {
-			type: 'Polygon',
-			coordinates: coords
-		});
-	}
-});
-
-(function () {
-	function multiToGeoJSON(type) {
-		return function () {
-			var coords = [];
-
-			this.eachLayer(function (layer) {
-				coords.push(layer.toGeoJSON().geometry.coordinates);
-			});
-
-			return L.GeoJSON.getFeature(this, {
-				type: type,
-				coordinates: coords
-			});
-		};
-	}
-
-	L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});
-	L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});
-
-	L.LayerGroup.include({
-		toGeoJSON: function () {
-
-			var geometry = this.feature && this.feature.geometry,
-				jsons = [],
-				json;
-
-			if (geometry && geometry.type === 'MultiPoint') {
-				return multiToGeoJSON('MultiPoint').call(this);
-			}
-
-			var isGeometryCollection = geometry && geometry.type === 'GeometryCollection';
-
-			this.eachLayer(function (layer) {
-				if (layer.toGeoJSON) {
-					json = layer.toGeoJSON();
-					jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
-				}
-			});
-
-			if (isGeometryCollection) {
-				return L.GeoJSON.getFeature(this, {
-					geometries: jsons,
-					type: 'GeometryCollection'
-				});
-			}
-
-			return {
-				type: 'FeatureCollection',
-				features: jsons
-			};
-		}
-	});
-}());
-
-L.geoJson = function (geojson, options) {
-	return new L.GeoJSON(geojson, options);
-};
-
-
-/*
- * L.DomEvent contains functions for working with DOM events.
- */
-
-L.DomEvent = {
-	/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */
-	addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])
-
-		var id = L.stamp(fn),
-		    key = '_leaflet_' + type + id,
-		    handler, originalHandler, newType;
-
-		if (obj[key]) { return this; }
-
-		handler = function (e) {
-			return fn.call(context || obj, e || L.DomEvent._getEvent());
-		};
-
-		if (L.Browser.pointer && type.indexOf('touch') === 0) {
-			return this.addPointerListener(obj, type, handler, id);
-		}
-		if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
-			this.addDoubleTapListener(obj, handler, id);
-		}
-
-		if ('addEventListener' in obj) {
-
-			if (type === 'mousewheel') {
-				obj.addEventListener('DOMMouseScroll', handler, false);
-				obj.addEventListener(type, handler, false);
-
-			} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
-
-				originalHandler = handler;
-				newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');
-
-				handler = function (e) {
-					if (!L.DomEvent._checkMouse(obj, e)) { return; }
-					return originalHandler(e);
-				};
-
-				obj.addEventListener(newType, handler, false);
-
-			} else if (type === 'click' && L.Browser.android) {
-				originalHandler = handler;
-				handler = function (e) {
-					return L.DomEvent._filterClick(e, originalHandler);
-				};
-
-				obj.addEventListener(type, handler, false);
-			} else {
-				obj.addEventListener(type, handler, false);
-			}
-
-		} else if ('attachEvent' in obj) {
-			obj.attachEvent('on' + type, handler);
-		}
-
-		obj[key] = handler;
-
-		return this;
-	},
-
-	removeListener: function (obj, type, fn) {  // (HTMLElement, String, Function)
-
-		var id = L.stamp(fn),
-		    key = '_leaflet_' + type + id,
-		    handler = obj[key];
-
-		if (!handler) { return this; }
-
-		if (L.Browser.pointer && type.indexOf('touch') === 0) {
-			this.removePointerListener(obj, type, id);
-		} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
-			this.removeDoubleTapListener(obj, id);
-
-		} else if ('removeEventListener' in obj) {
-
-			if (type === 'mousewheel') {
-				obj.removeEventListener('DOMMouseScroll', handler, false);
-				obj.removeEventListener(type, handler, false);
-
-			} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
-				obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);
-			} else {
-				obj.removeEventListener(type, handler, false);
-			}
-		} else if ('detachEvent' in obj) {
-			obj.detachEvent('on' + type, handler);
-		}
-
-		obj[key] = null;
-
-		return this;
-	},
-
-	stopPropagation: function (e) {
-
-		if (e.stopPropagation) {
-			e.stopPropagation();
-		} else {
-			e.cancelBubble = true;
-		}
-		L.DomEvent._skipped(e);
-
-		return this;
-	},
-
-	disableScrollPropagation: function (el) {
-		var stop = L.DomEvent.stopPropagation;
-
-		return L.DomEvent
-			.on(el, 'mousewheel', stop)
-			.on(el, 'MozMousePixelScroll', stop);
-	},
-
-	disableClickPropagation: function (el) {
-		var stop = L.DomEvent.stopPropagation;
-
-		for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
-			L.DomEvent.on(el, L.Draggable.START[i], stop);
-		}
-
-		return L.DomEvent
-			.on(el, 'click', L.DomEvent._fakeStop)
-			.on(el, 'dblclick', stop);
-	},
-
-	preventDefault: function (e) {
-
-		if (e.preventDefault) {
-			e.preventDefault();
-		} else {
-			e.returnValue = false;
-		}
-		return this;
-	},
-
-	stop: function (e) {
-		return L.DomEvent
-			.preventDefault(e)
-			.stopPropagation(e);
-	},
-
-	getMousePosition: function (e, container) {
-		if (!container) {
-			return new L.Point(e.clientX, e.clientY);
-		}
-
-		var rect = container.getBoundingClientRect();
-
-		return new L.Point(
-			e.clientX - rect.left - container.clientLeft,
-			e.clientY - rect.top - container.clientTop);
-	},
-
-	getWheelDelta: function (e) {
-
-		var delta = 0;
-
-		if (e.wheelDelta) {
-			delta = e.wheelDelta / 120;
-		}
-		if (e.detail) {
-			delta = -e.detail / 3;
-		}
-		return delta;
-	},
-
-	_skipEvents: {},
-
-	_fakeStop: function (e) {
-		// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
-		L.DomEvent._skipEvents[e.type] = true;
-	},
-
-	_skipped: function (e) {
-		var skipped = this._skipEvents[e.type];
-		// reset when checking, as it's only used in map container and propagates outside of the map
-		this._skipEvents[e.type] = false;
-		return skipped;
-	},
-
-	// check if element really left/entered the event target (for mouseenter/mouseleave)
-	_checkMouse: function (el, e) {
-
-		var related = e.relatedTarget;
-
-		if (!related) { return true; }
-
-		try {
-			while (related && (related !== el)) {
-				related = related.parentNode;
-			}
-		} catch (err) {
-			return false;
-		}
-		return (related !== el);
-	},
-
-	_getEvent: function () { // evil magic for IE
-		/*jshint noarg:false */
-		var e = window.event;
-		if (!e) {
-			var caller = arguments.callee.caller;
-			while (caller) {
-				e = caller['arguments'][0];
-				if (e && window.Event === e.constructor) {
-					break;
-				}
-				caller = caller.caller;
-			}
-		}
-		return e;
-	},
-
-	// this is a horrible workaround for a bug in Android where a single touch triggers two click events
-	_filterClick: function (e, handler) {
-		var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
-			elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
-
-		// are they closer together than 1000ms yet more than 100ms?
-		// Android typically triggers them ~300ms apart while multiple listeners
-		// on the same event should be triggered far faster;
-		// or check if click is simulated on the element, and if it is, reject any non-simulated events
-
-		if ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) {
-			L.DomEvent.stop(e);
-			return;
-		}
-		L.DomEvent._lastClick = timeStamp;
-
-		return handler(e);
-	}
-};
-
-L.DomEvent.on = L.DomEvent.addListener;
-L.DomEvent.off = L.DomEvent.removeListener;
-
-
-/*
- * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
- */
-
-L.Draggable = L.Class.extend({
-	includes: L.Mixin.Events,
-
-	statics: {
-		START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],
-		END: {
-			mousedown: 'mouseup',
-			touchstart: 'touchend',
-			pointerdown: 'touchend',
-			MSPointerDown: 'touchend'
-		},
-		MOVE: {
-			mousedown: 'mousemove',
-			touchstart: 'touchmove',
-			pointerdown: 'touchmove',
-			MSPointerDown: 'touchmove'
-		}
-	},
-
-	initialize: function (element, dragStartTarget) {
-		this._element = element;
-		this._dragStartTarget = dragStartTarget || element;
-	},
-
-	enable: function () {
-		if (this._enabled) { return; }
-
-		for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
-			L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
-		}
-
-		this._enabled = true;
-	},
-
-	disable: function () {
-		if (!this._enabled) { return; }
-
-		for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
-			L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
-		}
-
-		this._enabled = false;
-		this._moved = false;
-	},
-
-	_onDown: function (e) {
-		this._moved = false;
-
-		if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
-
-		L.DomEvent.stopPropagation(e);
-
-		if (L.Draggable._disabled) { return; }
-
-		L.DomUtil.disableImageDrag();
-		L.DomUtil.disableTextSelection();
-
-		if (this._moving) { return; }
-
-		var first = e.touches ? e.touches[0] : e;
-
-		this._startPoint = new L.Point(first.clientX, first.clientY);
-		this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
-
-		L.DomEvent
-		    .on(document, L.Draggable.MOVE[e.type], this._onMove, this)
-		    .on(document, L.Draggable.END[e.type], this._onUp, this);
-	},
-
-	_onMove: function (e) {
-		if (e.touches && e.touches.length > 1) {
-			this._moved = true;
-			return;
-		}
-
-		var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
-		    newPoint = new L.Point(first.clientX, first.clientY),
-		    offset = newPoint.subtract(this._startPoint);
-
-		if (!offset.x && !offset.y) { return; }
-
-		L.DomEvent.preventDefault(e);
-
-		if (!this._moved) {
-			this.fire('dragstart');
-
-			this._moved = true;
-			this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
-
-			L.DomUtil.addClass(document.body, 'leaflet-dragging');
-			L.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target');
-		}
-
-		this._newPos = this._startPos.add(offset);
-		this._moving = true;
-
-		L.Util.cancelAnimFrame(this._animRequest);
-		this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);
-	},
-
-	_updatePosition: function () {
-		this.fire('predrag');
-		L.DomUtil.setPosition(this._element, this._newPos);
-		this.fire('drag');
-	},
-
-	_onUp: function (e) {
-		L.DomUtil.removeClass(document.body, 'leaflet-dragging');
-		L.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target');
-
-		for (var i in L.Draggable.MOVE) {
-			L.DomEvent
-			    .off(document, L.Draggable.MOVE[i], this._onMove)
-			    .off(document, L.Draggable.END[i], this._onUp);
-		}
-
-		L.DomUtil.enableImageDrag();
-		L.DomUtil.enableTextSelection();
-
-		if (this._moved && this._moving) {
-			// ensure drag is not fired after dragend
-			L.Util.cancelAnimFrame(this._animRequest);
-
-			this.fire('dragend', {
-				distance: this._newPos.distanceTo(this._startPos)
-			});
-		}
-
-		this._moving = false;
-	}
-});
-
-
-/*
-	L.Handler is a base class for handler classes that are used internally to inject
-	interaction features like dragging to classes like Map and Marker.
-*/
-
-L.Handler = L.Class.extend({
-	initialize: function (map) {
-		this._map = map;
-	},
-
-	enable: function () {
-		if (this._enabled) { return; }
-
-		this._enabled = true;
-		this.addHooks();
-	},
-
-	disable: function () {
-		if (!this._enabled) { return; }
-
-		this._enabled = false;
-		this.removeHooks();
-	},
-
-	enabled: function () {
-		return !!this._enabled;
-	}
-});
-
-
-/*
- * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
- */
-
-L.Map.mergeOptions({
-	dragging: true,
-
-	inertia: !L.Browser.android23,
-	inertiaDeceleration: 3400, // px/s^2
-	inertiaMaxSpeed: Infinity, // px/s
-	inertiaThreshold: L.Browser.touch ? 32 : 18, // ms
-	easeLinearity: 0.25,
-
-	// TODO refactor, move to CRS
-	worldCopyJump: false
-});
-
-L.Map.Drag = L.Handler.extend({
-	addHooks: function () {
-		if (!this._draggable) {
-			var map = this._map;
-
-			this._draggable = new L.Draggable(map._mapPane, map._container);
-
-			this._draggable.on({
-				'dragstart': this._onDragStart,
-				'drag': this._onDrag,
-				'dragend': this._onDragEnd
-			}, this);
-
-			if (map.options.worldCopyJump) {
-				this._draggable.on('predrag', this._onPreDrag, this);
-				map.on('viewreset', this._onViewReset, this);
-
-				map.whenReady(this._onViewReset, this);
-			}
-		}
-		this._draggable.enable();
-	},
-
-	removeHooks: function () {
-		this._draggable.disable();
-	},
-
-	moved: function () {
-		return this._draggable && this._draggable._moved;
-	},
-
-	_onDragStart: function () {
-		var map = this._map;
-
-		if (map._panAnim) {
-			map._panAnim.stop();
-		}
-
-		map
-		    .fire('movestart')
-		    .fire('dragstart');
-
-		if (map.options.inertia) {
-			this._positions = [];
-			this._times = [];
-		}
-	},
-
-	_onDrag: function () {
-		if (this._map.options.inertia) {
-			var time = this._lastTime = +new Date(),
-			    pos = this._lastPos = this._draggable._newPos;
-
-			this._positions.push(pos);
-			this._times.push(time);
-
-			if (time - this._times[0] > 200) {
-				this._positions.shift();
-				this._times.shift();
-			}
-		}
-
-		this._map
-		    .fire('move')
-		    .fire('drag');
-	},
-
-	_onViewReset: function () {
-		// TODO fix hardcoded Earth values
-		var pxCenter = this._map.getSize()._divideBy(2),
-		    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
-
-		this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
-		this._worldWidth = this._map.project([0, 180]).x;
-	},
-
-	_onPreDrag: function () {
-		// TODO refactor to be able to adjust map pane position after zoom
-		var worldWidth = this._worldWidth,
-		    halfWidth = Math.round(worldWidth / 2),
-		    dx = this._initialWorldOffset,
-		    x = this._draggable._newPos.x,
-		    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
-		    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
-		    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
-
-		this._draggable._newPos.x = newX;
-	},
-
-	_onDragEnd: function (e) {
-		var map = this._map,
-		    options = map.options,
-		    delay = +new Date() - this._lastTime,
-
-		    noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];
-
-		map.fire('dragend', e);
-
-		if (noInertia) {
-			map.fire('moveend');
-
-		} else {
-
-			var direction = this._lastPos.subtract(this._positions[0]),
-			    duration = (this._lastTime + delay - this._times[0]) / 1000,
-			    ease = options.easeLinearity,
-
-			    speedVector = direction.multiplyBy(ease / duration),
-			    speed = speedVector.distanceTo([0, 0]),
-
-			    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
-			    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
-
-			    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
-			    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
-
-			if (!offset.x || !offset.y) {
-				map.fire('moveend');
-
-			} else {
-				offset = map._limitOffset(offset, map.options.maxBounds);
-
-				L.Util.requestAnimFrame(function () {
-					map.panBy(offset, {
-						duration: decelerationDuration,
-						easeLinearity: ease,
-						noMoveStart: true
-					});
-				});
-			}
-		}
-	}
-});
-
-L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
-
-
-/*
- * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
- */
-
-L.Map.mergeOptions({
-	doubleClickZoom: true
-});
-
-L.Map.DoubleClickZoom = L.Handler.extend({
-	addHooks: function () {
-		this._map.on('dblclick', this._onDoubleClick, this);
-	},
-
-	removeHooks: function () {
-		this._map.off('dblclick', this._onDoubleClick, this);
-	},
-
-	_onDoubleClick: function (e) {
-		var map = this._map,
-		    zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);
-
-		if (map.options.doubleClickZoom === 'center') {
-			map.setZoom(zoom);
-		} else {
-			map.setZoomAround(e.containerPoint, zoom);
-		}
-	}
-});
-
-L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
-
-
-/*
- * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
- */
-
-L.Map.mergeOptions({
-	scrollWheelZoom: true
-});
-
-L.Map.ScrollWheelZoom = L.Handler.extend({
-	addHooks: function () {
-		L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
-		L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
-		this._delta = 0;
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);
-		L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
-	},
-
-	_onWheelScroll: function (e) {
-		var delta = L.DomEvent.getWheelDelta(e);
-
-		this._delta += delta;
-		this._lastMousePos = this._map.mouseEventToContainerPoint(e);
-
-		if (!this._startTime) {
-			this._startTime = +new Date();
-		}
-
-		var left = Math.max(40 - (+new Date() - this._startTime), 0);
-
-		clearTimeout(this._timer);
-		this._timer = setTimeout(L.bind(this._performZoom, this), left);
-
-		L.DomEvent.preventDefault(e);
-		L.DomEvent.stopPropagation(e);
-	},
-
-	_performZoom: function () {
-		var map = this._map,
-		    delta = this._delta,
-		    zoom = map.getZoom();
-
-		delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);
-		delta = Math.max(Math.min(delta, 4), -4);
-		delta = map._limitZoom(zoom + delta) - zoom;
-
-		this._delta = 0;
-		this._startTime = null;
-
-		if (!delta) { return; }
-
-		if (map.options.scrollWheelZoom === 'center') {
-			map.setZoom(zoom + delta);
-		} else {
-			map.setZoomAround(this._lastMousePos, zoom + delta);
-		}
-	}
-});
-
-L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
-
-
-/*
- * Extends the event handling code with double tap support for mobile browsers.
- */
-
-L.extend(L.DomEvent, {
-
-	_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
-	_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
-
-	// inspired by Zepto touch code by Thomas Fuchs
-	addDoubleTapListener: function (obj, handler, id) {
-		var last,
-		    doubleTap = false,
-		    delay = 250,
-		    touch,
-		    pre = '_leaflet_',
-		    touchstart = this._touchstart,
-		    touchend = this._touchend,
-		    trackedTouches = [];
-
-		function onTouchStart(e) {
-			var count;
-
-			if (L.Browser.pointer) {
-				trackedTouches.push(e.pointerId);
-				count = trackedTouches.length;
-			} else {
-				count = e.touches.length;
-			}
-			if (count > 1) {
-				return;
-			}
-
-			var now = Date.now(),
-				delta = now - (last || now);
-
-			touch = e.touches ? e.touches[0] : e;
-			doubleTap = (delta > 0 && delta <= delay);
-			last = now;
-		}
-
-		function onTouchEnd(e) {
-			if (L.Browser.pointer) {
-				var idx = trackedTouches.indexOf(e.pointerId);
-				if (idx === -1) {
-					return;
-				}
-				trackedTouches.splice(idx, 1);
-			}
-
-			if (doubleTap) {
-				if (L.Browser.pointer) {
-					// work around .type being readonly with MSPointer* events
-					var newTouch = { },
-						prop;
-
-					// jshint forin:false
-					for (var i in touch) {
-						prop = touch[i];
-						if (typeof prop === 'function') {
-							newTouch[i] = prop.bind(touch);
-						} else {
-							newTouch[i] = prop;
-						}
-					}
-					touch = newTouch;
-				}
-				touch.type = 'dblclick';
-				handler(touch);
-				last = null;
-			}
-		}
-		obj[pre + touchstart + id] = onTouchStart;
-		obj[pre + touchend + id] = onTouchEnd;
-
-		// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
-		// will not come through to us, so we will lose track of how many touches are ongoing
-		var endElement = L.Browser.pointer ? document.documentElement : obj;
-
-		obj.addEventListener(touchstart, onTouchStart, false);
-		endElement.addEventListener(touchend, onTouchEnd, false);
-
-		if (L.Browser.pointer) {
-			endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
-		}
-
-		return this;
-	},
-
-	removeDoubleTapListener: function (obj, id) {
-		var pre = '_leaflet_';
-
-		obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
-		(L.Browser.pointer ? document.documentElement : obj).removeEventListener(
-		        this._touchend, obj[pre + this._touchend + id], false);
-
-		if (L.Browser.pointer) {
-			document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],
-				false);
-		}
-
-		return this;
-	}
-});
-
-
-/*
- * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
- */
-
-L.extend(L.DomEvent, {
-
-	//static
-	POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',
-	POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',
-	POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',
-	POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
-
-	_pointers: [],
-	_pointerDocumentListener: false,
-
-	// Provides a touch events wrapper for (ms)pointer events.
-	// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019
-	//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
-
-	addPointerListener: function (obj, type, handler, id) {
-
-		switch (type) {
-		case 'touchstart':
-			return this.addPointerListenerStart(obj, type, handler, id);
-		case 'touchend':
-			return this.addPointerListenerEnd(obj, type, handler, id);
-		case 'touchmove':
-			return this.addPointerListenerMove(obj, type, handler, id);
-		default:
-			throw 'Unknown touch event type';
-		}
-	},
-
-	addPointerListenerStart: function (obj, type, handler, id) {
-		var pre = '_leaflet_',
-		    pointers = this._pointers;
-
-		var cb = function (e) {
-
-			L.DomEvent.preventDefault(e);
-
-			var alreadyInArray = false;
-			for (var i = 0; i < pointers.length; i++) {
-				if (pointers[i].pointerId === e.pointerId) {
-					alreadyInArray = true;
-					break;
-				}
-			}
-			if (!alreadyInArray) {
-				pointers.push(e);
-			}
-
-			e.touches = pointers.slice();
-			e.changedTouches = [e];
-
-			handler(e);
-		};
-
-		obj[pre + 'touchstart' + id] = cb;
-		obj.addEventListener(this.POINTER_DOWN, cb, false);
-
-		// need to also listen for end events to keep the _pointers list accurate
-		// this needs to be on the body and never go away
-		if (!this._pointerDocumentListener) {
-			var internalCb = function (e) {
-				for (var i = 0; i < pointers.length; i++) {
-					if (pointers[i].pointerId === e.pointerId) {
-						pointers.splice(i, 1);
-						break;
-					}
-				}
-			};
-			//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there
-			document.documentElement.addEventListener(this.POINTER_UP, internalCb, false);
-			document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);
-
-			this._pointerDocumentListener = true;
-		}
-
-		return this;
-	},
-
-	addPointerListenerMove: function (obj, type, handler, id) {
-		var pre = '_leaflet_',
-		    touches = this._pointers;
-
-		function cb(e) {
-
-			// don't fire touch moves when mouse isn't down
-			if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
-
-			for (var i = 0; i < touches.length; i++) {
-				if (touches[i].pointerId === e.pointerId) {
-					touches[i] = e;
-					break;
-				}
-			}
-
-			e.touches = touches.slice();
-			e.changedTouches = [e];
-
-			handler(e);
-		}
-
-		obj[pre + 'touchmove' + id] = cb;
-		obj.addEventListener(this.POINTER_MOVE, cb, false);
-
-		return this;
-	},
-
-	addPointerListenerEnd: function (obj, type, handler, id) {
-		var pre = '_leaflet_',
-		    touches = this._pointers;
-
-		var cb = function (e) {
-			for (var i = 0; i < touches.length; i++) {
-				if (touches[i].pointerId === e.pointerId) {
-					touches.splice(i, 1);
-					break;
-				}
-			}
-
-			e.touches = touches.slice();
-			e.changedTouches = [e];
-
-			handler(e);
-		};
-
-		obj[pre + 'touchend' + id] = cb;
-		obj.addEventListener(this.POINTER_UP, cb, false);
-		obj.addEventListener(this.POINTER_CANCEL, cb, false);
-
-		return this;
-	},
-
-	removePointerListener: function (obj, type, id) {
-		var pre = '_leaflet_',
-		    cb = obj[pre + type + id];
-
-		switch (type) {
-		case 'touchstart':
-			obj.removeEventListener(this.POINTER_DOWN, cb, false);
-			break;
-		case 'touchmove':
-			obj.removeEventListener(this.POINTER_MOVE, cb, false);
-			break;
-		case 'touchend':
-			obj.removeEventListener(this.POINTER_UP, cb, false);
-			obj.removeEventListener(this.POINTER_CANCEL, cb, false);
-			break;
-		}
-
-		return this;
-	}
-});
-
-
-/*
- * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
- */
-
-L.Map.mergeOptions({
-	touchZoom: L.Browser.touch && !L.Browser.android23,
-	bounceAtZoomLimits: true
-});
-
-L.Map.TouchZoom = L.Handler.extend({
-	addHooks: function () {
-		L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
-	},
-
-	_onTouchStart: function (e) {
-		var map = this._map;
-
-		if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
-
-		var p1 = map.mouseEventToLayerPoint(e.touches[0]),
-		    p2 = map.mouseEventToLayerPoint(e.touches[1]),
-		    viewCenter = map._getCenterLayerPoint();
-
-		this._startCenter = p1.add(p2)._divideBy(2);
-		this._startDist = p1.distanceTo(p2);
-
-		this._moved = false;
-		this._zooming = true;
-
-		this._centerOffset = viewCenter.subtract(this._startCenter);
-
-		if (map._panAnim) {
-			map._panAnim.stop();
-		}
-
-		L.DomEvent
-		    .on(document, 'touchmove', this._onTouchMove, this)
-		    .on(document, 'touchend', this._onTouchEnd, this);
-
-		L.DomEvent.preventDefault(e);
-	},
-
-	_onTouchMove: function (e) {
-		var map = this._map;
-
-		if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
-
-		var p1 = map.mouseEventToLayerPoint(e.touches[0]),
-		    p2 = map.mouseEventToLayerPoint(e.touches[1]);
-
-		this._scale = p1.distanceTo(p2) / this._startDist;
-		this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);
-
-		if (this._scale === 1) { return; }
-
-		if (!map.options.bounceAtZoomLimits) {
-			if ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||
-			    (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }
-		}
-
-		if (!this._moved) {
-			L.DomUtil.addClass(map._mapPane, 'leaflet-touching');
-
-			map
-			    .fire('movestart')
-			    .fire('zoomstart');
-
-			this._moved = true;
-		}
-
-		L.Util.cancelAnimFrame(this._animRequest);
-		this._animRequest = L.Util.requestAnimFrame(
-		        this._updateOnMove, this, true, this._map._container);
-
-		L.DomEvent.preventDefault(e);
-	},
-
-	_updateOnMove: function () {
-		var map = this._map,
-		    origin = this._getScaleOrigin(),
-		    center = map.layerPointToLatLng(origin),
-		    zoom = map.getScaleZoom(this._scale);
-
-		map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta);
-	},
-
-	_onTouchEnd: function () {
-		if (!this._moved || !this._zooming) {
-			this._zooming = false;
-			return;
-		}
-
-		var map = this._map;
-
-		this._zooming = false;
-		L.DomUtil.removeClass(map._mapPane, 'leaflet-touching');
-		L.Util.cancelAnimFrame(this._animRequest);
-
-		L.DomEvent
-		    .off(document, 'touchmove', this._onTouchMove)
-		    .off(document, 'touchend', this._onTouchEnd);
-
-		var origin = this._getScaleOrigin(),
-		    center = map.layerPointToLatLng(origin),
-
-		    oldZoom = map.getZoom(),
-		    floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,
-		    roundZoomDelta = (floatZoomDelta > 0 ?
-		            Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),
-
-		    zoom = map._limitZoom(oldZoom + roundZoomDelta),
-		    scale = map.getZoomScale(zoom) / this._scale;
-
-		map._animateZoom(center, zoom, origin, scale);
-	},
-
-	_getScaleOrigin: function () {
-		var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);
-		return this._startCenter.add(centerOffset);
-	}
-});
-
-L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
-
-
-/*
- * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
- */
-
-L.Map.mergeOptions({
-	tap: true,
-	tapTolerance: 15
-});
-
-L.Map.Tap = L.Handler.extend({
-	addHooks: function () {
-		L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);
-	},
-
-	_onDown: function (e) {
-		if (!e.touches) { return; }
-
-		L.DomEvent.preventDefault(e);
-
-		this._fireClick = true;
-
-		// don't simulate click or track longpress if more than 1 touch
-		if (e.touches.length > 1) {
-			this._fireClick = false;
-			clearTimeout(this._holdTimeout);
-			return;
-		}
-
-		var first = e.touches[0],
-		    el = first.target;
-
-		this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
-
-		// if touching a link, highlight it
-		if (el.tagName && el.tagName.toLowerCase() === 'a') {
-			L.DomUtil.addClass(el, 'leaflet-active');
-		}
-
-		// simulate long hold but setting a timeout
-		this._holdTimeout = setTimeout(L.bind(function () {
-			if (this._isTapValid()) {
-				this._fireClick = false;
-				this._onUp();
-				this._simulateEvent('contextmenu', first);
-			}
-		}, this), 1000);
-
-		L.DomEvent
-			.on(document, 'touchmove', this._onMove, this)
-			.on(document, 'touchend', this._onUp, this);
-	},
-
-	_onUp: function (e) {
-		clearTimeout(this._holdTimeout);
-
-		L.DomEvent
-			.off(document, 'touchmove', this._onMove, this)
-			.off(document, 'touchend', this._onUp, this);
-
-		if (this._fireClick && e && e.changedTouches) {
-
-			var first = e.changedTouches[0],
-			    el = first.target;
-
-			if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
-				L.DomUtil.removeClass(el, 'leaflet-active');
-			}
-
-			// simulate click if the touch didn't move too much
-			if (this._isTapValid()) {
-				this._simulateEvent('click', first);
-			}
-		}
-	},
-
-	_isTapValid: function () {
-		return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
-	},
-
-	_onMove: function (e) {
-		var first = e.touches[0];
-		this._newPos = new L.Point(first.clientX, first.clientY);
-	},
-
-	_simulateEvent: function (type, e) {
-		var simulatedEvent = document.createEvent('MouseEvents');
-
-		simulatedEvent._simulated = true;
-		e.target._simulatedClick = true;
-
-		simulatedEvent.initMouseEvent(
-		        type, true, true, window, 1,
-		        e.screenX, e.screenY,
-		        e.clientX, e.clientY,
-		        false, false, false, false, 0, null);
-
-		e.target.dispatchEvent(simulatedEvent);
-	}
-});
-
-if (L.Browser.touch && !L.Browser.pointer) {
-	L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
-}
-
-
-/*
- * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map
-  * (zoom to a selected bounding box), enabled by default.
- */
-
-L.Map.mergeOptions({
-	boxZoom: true
-});
-
-L.Map.BoxZoom = L.Handler.extend({
-	initialize: function (map) {
-		this._map = map;
-		this._container = map._container;
-		this._pane = map._panes.overlayPane;
-		this._moved = false;
-	},
-
-	addHooks: function () {
-		L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
-	},
-
-	removeHooks: function () {
-		L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);
-		this._moved = false;
-	},
-
-	moved: function () {
-		return this._moved;
-	},
-
-	_onMouseDown: function (e) {
-		this._moved = false;
-
-		if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
-
-		L.DomUtil.disableTextSelection();
-		L.DomUtil.disableImageDrag();
-
-		this._startLayerPoint = this._map.mouseEventToLayerPoint(e);
-
-		L.DomEvent
-		    .on(document, 'mousemove', this._onMouseMove, this)
-		    .on(document, 'mouseup', this._onMouseUp, this)
-		    .on(document, 'keydown', this._onKeyDown, this);
-	},
-
-	_onMouseMove: function (e) {
-		if (!this._moved) {
-			this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);
-			L.DomUtil.setPosition(this._box, this._startLayerPoint);
-
-			//TODO refactor: move cursor to styles
-			this._container.style.cursor = 'crosshair';
-			this._map.fire('boxzoomstart');
-		}
-
-		var startPoint = this._startLayerPoint,
-		    box = this._box,
-
-		    layerPoint = this._map.mouseEventToLayerPoint(e),
-		    offset = layerPoint.subtract(startPoint),
-
-		    newPos = new L.Point(
-		        Math.min(layerPoint.x, startPoint.x),
-		        Math.min(layerPoint.y, startPoint.y));
-
-		L.DomUtil.setPosition(box, newPos);
-
-		this._moved = true;
-
-		// TODO refactor: remove hardcoded 4 pixels
-		box.style.width  = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';
-		box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';
-	},
-
-	_finish: function () {
-		if (this._moved) {
-			this._pane.removeChild(this._box);
-			this._container.style.cursor = '';
-		}
-
-		L.DomUtil.enableTextSelection();
-		L.DomUtil.enableImageDrag();
-
-		L.DomEvent
-		    .off(document, 'mousemove', this._onMouseMove)
-		    .off(document, 'mouseup', this._onMouseUp)
-		    .off(document, 'keydown', this._onKeyDown);
-	},
-
-	_onMouseUp: function (e) {
-
-		this._finish();
-
-		var map = this._map,
-		    layerPoint = map.mouseEventToLayerPoint(e);
-
-		if (this._startLayerPoint.equals(layerPoint)) { return; }
-
-		var bounds = new L.LatLngBounds(
-		        map.layerPointToLatLng(this._startLayerPoint),
-		        map.layerPointToLatLng(layerPoint));
-
-		map.fitBounds(bounds);
-
-		map.fire('boxzoomend', {
-			boxZoomBounds: bounds
-		});
-	},
-
-	_onKeyDown: function (e) {
-		if (e.keyCode === 27) {
-			this._finish();
-		}
-	}
-});
-
-L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
-
-
-/*
- * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
- */
-
-L.Map.mergeOptions({
-	keyboard: true,
-	keyboardPanOffset: 80,
-	keyboardZoomOffset: 1
-});
-
-L.Map.Keyboard = L.Handler.extend({
-
-	keyCodes: {
-		left:    [37],
-		right:   [39],
-		down:    [40],
-		up:      [38],
-		zoomIn:  [187, 107, 61, 171],
-		zoomOut: [189, 109, 173]
-	},
-
-	initialize: function (map) {
-		this._map = map;
-
-		this._setPanOffset(map.options.keyboardPanOffset);
-		this._setZoomOffset(map.options.keyboardZoomOffset);
-	},
-
-	addHooks: function () {
-		var container = this._map._container;
-
-		// make the container focusable by tabbing
-		if (container.tabIndex === -1) {
-			container.tabIndex = '0';
-		}
-
-		L.DomEvent
-		    .on(container, 'focus', this._onFocus, this)
-		    .on(container, 'blur', this._onBlur, this)
-		    .on(container, 'mousedown', this._onMouseDown, this);
-
-		this._map
-		    .on('focus', this._addHooks, this)
-		    .on('blur', this._removeHooks, this);
-	},
-
-	removeHooks: function () {
-		this._removeHooks();
-
-		var container = this._map._container;
-
-		L.DomEvent
-		    .off(container, 'focus', this._onFocus, this)
-		    .off(container, 'blur', this._onBlur, this)
-		    .off(container, 'mousedown', this._onMouseDown, this);
-
-		this._map
-		    .off('focus', this._addHooks, this)
-		    .off('blur', this._removeHooks, this);
-	},
-
-	_onMouseDown: function () {
-		if (this._focused) { return; }
-
-		var body = document.body,
-		    docEl = document.documentElement,
-		    top = body.scrollTop || docEl.scrollTop,
-		    left = body.scrollLeft || docEl.scrollLeft;
-
-		this._map._container.focus();
-
-		window.scrollTo(left, top);
-	},
-
-	_onFocus: function () {
-		this._focused = true;
-		this._map.fire('focus');
-	},
-
-	_onBlur: function () {
-		this._focused = false;
-		this._map.fire('blur');
-	},
-
-	_setPanOffset: function (pan) {
-		var keys = this._panKeys = {},
-		    codes = this.keyCodes,
-		    i, len;
-
-		for (i = 0, len = codes.left.length; i < len; i++) {
-			keys[codes.left[i]] = [-1 * pan, 0];
-		}
-		for (i = 0, len = codes.right.length; i < len; i++) {
-			keys[codes.right[i]] = [pan, 0];
-		}
-		for (i = 0, len = codes.down.length; i < len; i++) {
-			keys[codes.down[i]] = [0, pan];
-		}
-		for (i = 0, len = codes.up.length; i < len; i++) {
-			keys[codes.up[i]] = [0, -1 * pan];
-		}
-	},
-
-	_setZoomOffset: function (zoom) {
-		var keys = this._zoomKeys = {},
-		    codes = this.keyCodes,
-		    i, len;
-
-		for (i = 0, len = codes.zoomIn.length; i < len; i++) {
-			keys[codes.zoomIn[i]] = zoom;
-		}
-		for (i = 0, len = codes.zoomOut.length; i < len; i++) {
-			keys[codes.zoomOut[i]] = -zoom;
-		}
-	},
-
-	_addHooks: function () {
-		L.DomEvent.on(document, 'keydown', this._onKeyDown, this);
-	},
-
-	_removeHooks: function () {
-		L.DomEvent.off(document, 'keydown', this._onKeyDown, this);
-	},
-
-	_onKeyDown: function (e) {
-		var key = e.keyCode,
-		    map = this._map;
-
-		if (key in this._panKeys) {
-
-			if (map._panAnim && map._panAnim._inProgress) { return; }
-
-			map.panBy(this._panKeys[key]);
-
-			if (map.options.maxBounds) {
-				map.panInsideBounds(map.options.maxBounds);
-			}
-
-		} else if (key in this._zoomKeys) {
-			map.setZoom(map.getZoom() + this._zoomKeys[key]);
-
-		} else {
-			return;
-		}
-
-		L.DomEvent.stop(e);
-	}
-});
-
-L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
-
-
-/*
- * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
- */
-
-L.Handler.MarkerDrag = L.Handler.extend({
-	initialize: function (marker) {
-		this._marker = marker;
-	},
-
-	addHooks: function () {
-		var icon = this._marker._icon;
-		if (!this._draggable) {
-			this._draggable = new L.Draggable(icon, icon);
-		}
-
-		this._draggable
-			.on('dragstart', this._onDragStart, this)
-			.on('drag', this._onDrag, this)
-			.on('dragend', this._onDragEnd, this);
-		this._draggable.enable();
-		L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');
-	},
-
-	removeHooks: function () {
-		this._draggable
-			.off('dragstart', this._onDragStart, this)
-			.off('drag', this._onDrag, this)
-			.off('dragend', this._onDragEnd, this);
-
-		this._draggable.disable();
-		L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
-	},
-
-	moved: function () {
-		return this._draggable && this._draggable._moved;
-	},
-
-	_onDragStart: function () {
-		this._marker
-		    .closePopup()
-		    .fire('movestart')
-		    .fire('dragstart');
-	},
-
-	_onDrag: function () {
-		var marker = this._marker,
-		    shadow = marker._shadow,
-		    iconPos = L.DomUtil.getPosition(marker._icon),
-		    latlng = marker._map.layerPointToLatLng(iconPos);
-
-		// update shadow position
-		if (shadow) {
-			L.DomUtil.setPosition(shadow, iconPos);
-		}
-
-		marker._latlng = latlng;
-
-		marker
-		    .fire('move', {latlng: latlng})
-		    .fire('drag');
-	},
-
-	_onDragEnd: function (e) {
-		this._marker
-		    .fire('moveend')
-		    .fire('dragend', e);
-	}
-});
-
-
-/*
- * L.Control is a base class for implementing map controls. Handles positioning.
- * All other controls extend from this class.
- */
-
-L.Control = L.Class.extend({
-	options: {
-		position: 'topright'
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-	},
-
-	getPosition: function () {
-		return this.options.position;
-	},
-
-	setPosition: function (position) {
-		var map = this._map;
-
-		if (map) {
-			map.removeControl(this);
-		}
-
-		this.options.position = position;
-
-		if (map) {
-			map.addControl(this);
-		}
-
-		return this;
-	},
-
-	getContainer: function () {
-		return this._container;
-	},
-
-	addTo: function (map) {
-		this._map = map;
-
-		var container = this._container = this.onAdd(map),
-		    pos = this.getPosition(),
-		    corner = map._controlCorners[pos];
-
-		L.DomUtil.addClass(container, 'leaflet-control');
-
-		if (pos.indexOf('bottom') !== -1) {
-			corner.insertBefore(container, corner.firstChild);
-		} else {
-			corner.appendChild(container);
-		}
-
-		return this;
-	},
-
-	removeFrom: function (map) {
-		var pos = this.getPosition(),
-		    corner = map._controlCorners[pos];
-
-		corner.removeChild(this._container);
-		this._map = null;
-
-		if (this.onRemove) {
-			this.onRemove(map);
-		}
-
-		return this;
-	},
-
-	_refocusOnMap: function () {
-		if (this._map) {
-			this._map.getContainer().focus();
-		}
-	}
-});
-
-L.control = function (options) {
-	return new L.Control(options);
-};
-
-
-// adds control-related methods to L.Map
-
-L.Map.include({
-	addControl: function (control) {
-		control.addTo(this);
-		return this;
-	},
-
-	removeControl: function (control) {
-		control.removeFrom(this);
-		return this;
-	},
-
-	_initControlPos: function () {
-		var corners = this._controlCorners = {},
-		    l = 'leaflet-',
-		    container = this._controlContainer =
-		            L.DomUtil.create('div', l + 'control-container', this._container);
-
-		function createCorner(vSide, hSide) {
-			var className = l + vSide + ' ' + l + hSide;
-
-			corners[vSide + hSide] = L.DomUtil.create('div', className, container);
-		}
-
-		createCorner('top', 'left');
-		createCorner('top', 'right');
-		createCorner('bottom', 'left');
-		createCorner('bottom', 'right');
-	},
-
-	_clearControlPos: function () {
-		this._container.removeChild(this._controlContainer);
-	}
-});
-
-
-/*
- * L.Control.Zoom is used for the default zoom buttons on the map.
- */
-
-L.Control.Zoom = L.Control.extend({
-	options: {
-		position: 'topleft',
-		zoomInText: '+',
-		zoomInTitle: 'Zoom in',
-		zoomOutText: '-',
-		zoomOutTitle: 'Zoom out'
-	},
-
-	onAdd: function (map) {
-		var zoomName = 'leaflet-control-zoom',
-		    container = L.DomUtil.create('div', zoomName + ' leaflet-bar');
-
-		this._map = map;
-
-		this._zoomInButton  = this._createButton(
-		        this.options.zoomInText, this.options.zoomInTitle,
-		        zoomName + '-in',  container, this._zoomIn,  this);
-		this._zoomOutButton = this._createButton(
-		        this.options.zoomOutText, this.options.zoomOutTitle,
-		        zoomName + '-out', container, this._zoomOut, this);
-
-		this._updateDisabled();
-		map.on('zoomend zoomlevelschange', this._updateDisabled, this);
-
-		return container;
-	},
-
-	onRemove: function (map) {
-		map.off('zoomend zoomlevelschange', this._updateDisabled, this);
-	},
-
-	_zoomIn: function (e) {
-		this._map.zoomIn(e.shiftKey ? 3 : 1);
-	},
-
-	_zoomOut: function (e) {
-		this._map.zoomOut(e.shiftKey ? 3 : 1);
-	},
-
-	_createButton: function (html, title, className, container, fn, context) {
-		var link = L.DomUtil.create('a', className, container);
-		link.innerHTML = html;
-		link.href = '#';
-		link.title = title;
-
-		var stop = L.DomEvent.stopPropagation;
-
-		L.DomEvent
-		    .on(link, 'click', stop)
-		    .on(link, 'mousedown', stop)
-		    .on(link, 'dblclick', stop)
-		    .on(link, 'click', L.DomEvent.preventDefault)
-		    .on(link, 'click', fn, context)
-		    .on(link, 'click', this._refocusOnMap, context);
-
-		return link;
-	},
-
-	_updateDisabled: function () {
-		var map = this._map,
-			className = 'leaflet-disabled';
-
-		L.DomUtil.removeClass(this._zoomInButton, className);
-		L.DomUtil.removeClass(this._zoomOutButton, className);
-
-		if (map._zoom === map.getMinZoom()) {
-			L.DomUtil.addClass(this._zoomOutButton, className);
-		}
-		if (map._zoom === map.getMaxZoom()) {
-			L.DomUtil.addClass(this._zoomInButton, className);
-		}
-	}
-});
-
-L.Map.mergeOptions({
-	zoomControl: true
-});
-
-L.Map.addInitHook(function () {
-	if (this.options.zoomControl) {
-		this.zoomControl = new L.Control.Zoom();
-		this.addControl(this.zoomControl);
-	}
-});
-
-L.control.zoom = function (options) {
-	return new L.Control.Zoom(options);
-};
-
-
-
-/*
- * L.Control.Attribution is used for displaying attribution on the map (added by default).
- */
-
-L.Control.Attribution = L.Control.extend({
-	options: {
-		position: 'bottomright',
-		prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
-	},
-
-	initialize: function (options) {
-		L.setOptions(this, options);
-
-		this._attributions = {};
-	},
-
-	onAdd: function (map) {
-		this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
-		L.DomEvent.disableClickPropagation(this._container);
-
-		for (var i in map._layers) {
-			if (map._layers[i].getAttribution) {
-				this.addAttribution(map._layers[i].getAttribution());
-			}
-		}
-		
-		map
-		    .on('layeradd', this._onLayerAdd, this)
-		    .on('layerremove', this._onLayerRemove, this);
-
-		this._update();
-
-		return this._container;
-	},
-
-	onRemove: function (map) {
-		map
-		    .off('layeradd', this._onLayerAdd)
-		    .off('layerremove', this._onLayerRemove);
-
-	},
-
-	setPrefix: function (prefix) {
-		this.options.prefix = prefix;
-		this._update();
-		return this;
-	},
-
-	addAttribution: function (text) {
-		if (!text) { return; }
-
-		if (!this._attributions[text]) {
-			this._attributions[text] = 0;
-		}
-		this._attributions[text]++;
-
-		this._update();
-
-		return this;
-	},
-
-	removeAttribution: function (text) {
-		if (!text) { return; }
-
-		if (this._attributions[text]) {
-			this._attributions[text]--;
-			this._update();
-		}
-
-		return this;
-	},
-
-	_update: function () {
-		if (!this._map) { return; }
-
-		var attribs = [];
-
-		for (var i in this._attributions) {
-			if (this._attributions[i]) {
-				attribs.push(i);
-			}
-		}
-
-		var prefixAndAttribs = [];
-
-		if (this.options.prefix) {
-			prefixAndAttribs.push(this.options.prefix);
-		}
-		if (attribs.length) {
-			prefixAndAttribs.push(attribs.join(', '));
-		}
-
-		this._container.innerHTML = prefixAndAttribs.join(' | ');
-	},
-
-	_onLayerAdd: function (e) {
-		if (e.layer.getAttribution) {
-			this.addAttribution(e.layer.getAttribution());
-		}
-	},
-
-	_onLayerRemove: function (e) {
-		if (e.layer.getAttribution) {
-			this.removeAttribution(e.layer.getAttribution());
-		}
-	}
-});
-
-L.Map.mergeOptions({
-	attributionControl: true
-});
-
-L.Map.addInitHook(function () {
-	if (this.options.attributionControl) {
-		this.attributionControl = (new L.Control.Attribution()).addTo(this);
-	}
-});
-
-L.control.attribution = function (options) {
-	return new L.Control.Attribution(options);
-};
-
-
-/*
- * L.Control.Scale is used for displaying metric/imperial scale on the map.
- */
-
-L.Control.Scale = L.Control.extend({
-	options: {
-		position: 'bottomleft',
-		maxWidth: 100,
-		metric: true,
-		imperial: true,
-		updateWhenIdle: false
-	},
-
-	onAdd: function (map) {
-		this._map = map;
-
-		var className = 'leaflet-control-scale',
-		    container = L.DomUtil.create('div', className),
-		    options = this.options;
-
-		this._addScales(options, className, container);
-
-		map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
-		map.whenReady(this._update, this);
-
-		return container;
-	},
-
-	onRemove: function (map) {
-		map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
-	},
-
-	_addScales: function (options, className, container) {
-		if (options.metric) {
-			this._mScale = L.DomUtil.create('div', className + '-line', container);
-		}
-		if (options.imperial) {
-			this._iScale = L.DomUtil.create('div', className + '-line', container);
-		}
-	},
-
-	_update: function () {
-		var bounds = this._map.getBounds(),
-		    centerLat = bounds.getCenter().lat,
-		    halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
-		    dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,
-
-		    size = this._map.getSize(),
-		    options = this.options,
-		    maxMeters = 0;
-
-		if (size.x > 0) {
-			maxMeters = dist * (options.maxWidth / size.x);
-		}
-
-		this._updateScales(options, maxMeters);
-	},
-
-	_updateScales: function (options, maxMeters) {
-		if (options.metric && maxMeters) {
-			this._updateMetric(maxMeters);
-		}
-
-		if (options.imperial && maxMeters) {
-			this._updateImperial(maxMeters);
-		}
-	},
-
-	_updateMetric: function (maxMeters) {
-		var meters = this._getRoundNum(maxMeters);
-
-		this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';
-		this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
-	},
-
-	_updateImperial: function (maxMeters) {
-		var maxFeet = maxMeters * 3.2808399,
-		    scale = this._iScale,
-		    maxMiles, miles, feet;
-
-		if (maxFeet > 5280) {
-			maxMiles = maxFeet / 5280;
-			miles = this._getRoundNum(maxMiles);
-
-			scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';
-			scale.innerHTML = miles + ' mi';
-
-		} else {
-			feet = this._getRoundNum(maxFeet);
-
-			scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';
-			scale.innerHTML = feet + ' ft';
-		}
-	},
-
-	_getScaleWidth: function (ratio) {
-		return Math.round(this.options.maxWidth * ratio) - 10;
-	},
-
-	_getRoundNum: function (num) {
-		var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
-		    d = num / pow10;
-
-		d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;
-
-		return pow10 * d;
-	}
-});
-
-L.control.scale = function (options) {
-	return new L.Control.Scale(options);
-};
-
-
-/*
- * L.Control.Layers is a control to allow users to switch between different layers on the map.
- */
-
-L.Control.Layers = L.Control.extend({
-	options: {
-		collapsed: true,
-		position: 'topright',
-		autoZIndex: true
-	},
-
-	initialize: function (baseLayers, overlays, options) {
-		L.setOptions(this, options);
-
-		this._layers = {};
-		this._lastZIndex = 0;
-		this._handlingClick = false;
-
-		for (var i in baseLayers) {
-			this._addLayer(baseLayers[i], i);
-		}
-
-		for (i in overlays) {
-			this._addLayer(overlays[i], i, true);
-		}
-	},
-
-	onAdd: function (map) {
-		this._initLayout();
-		this._update();
-
-		map
-		    .on('layeradd', this._onLayerChange, this)
-		    .on('layerremove', this._onLayerChange, this);
-
-		return this._container;
-	},
-
-	onRemove: function (map) {
-		map
-		    .off('layeradd', this._onLayerChange)
-		    .off('layerremove', this._onLayerChange);
-	},
-
-	addBaseLayer: function (layer, name) {
-		this._addLayer(layer, name);
-		this._update();
-		return this;
-	},
-
-	addOverlay: function (layer, name) {
-		this._addLayer(layer, name, true);
-		this._update();
-		return this;
-	},
-
-	removeLayer: function (layer) {
-		var id = L.stamp(layer);
-		delete this._layers[id];
-		this._update();
-		return this;
-	},
-
-	_initLayout: function () {
-		var className = 'leaflet-control-layers',
-		    container = this._container = L.DomUtil.create('div', className);
-
-		//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released
-		container.setAttribute('aria-haspopup', true);
-
-		if (!L.Browser.touch) {
-			L.DomEvent
-				.disableClickPropagation(container)
-				.disableScrollPropagation(container);
-		} else {
-			L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);
-		}
-
-		var form = this._form = L.DomUtil.create('form', className + '-list');
-
-		if (this.options.collapsed) {
-			if (!L.Browser.android) {
-				L.DomEvent
-				    .on(container, 'mouseover', this._expand, this)
-				    .on(container, 'mouseout', this._collapse, this);
-			}
-			var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
-			link.href = '#';
-			link.title = 'Layers';
-
-			if (L.Browser.touch) {
-				L.DomEvent
-				    .on(link, 'click', L.DomEvent.stop)
-				    .on(link, 'click', this._expand, this);
-			}
-			else {
-				L.DomEvent.on(link, 'focus', this._expand, this);
-			}
-			//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033
-			L.DomEvent.on(form, 'click', function () {
-				setTimeout(L.bind(this._onInputClick, this), 0);
-			}, this);
-
-			this._map.on('click', this._collapse, this);
-			// TODO keyboard accessibility
-		} else {
-			this._expand();
-		}
-
-		this._baseLayersList = L.DomUtil.create('div', className + '-base', form);
-		this._separator = L.DomUtil.create('div', className + '-separator', form);
-		this._overlaysList = L.DomUtil.create('div', className + '-overlays', form);
-
-		container.appendChild(form);
-	},
-
-	_addLayer: function (layer, name, overlay) {
-		var id = L.stamp(layer);
-
-		this._layers[id] = {
-			layer: layer,
-			name: name,
-			overlay: overlay
-		};
-
-		if (this.options.autoZIndex && layer.setZIndex) {
-			this._lastZIndex++;
-			layer.setZIndex(this._lastZIndex);
-		}
-	},
-
-	_update: function () {
-		if (!this._container) {
-			return;
-		}
-
-		this._baseLayersList.innerHTML = '';
-		this._overlaysList.innerHTML = '';
-
-		var baseLayersPresent = false,
-		    overlaysPresent = false,
-		    i, obj;
-
-		for (i in this._layers) {
-			obj = this._layers[i];
-			this._addItem(obj);
-			overlaysPresent = overlaysPresent || obj.overlay;
-			baseLayersPresent = baseLayersPresent || !obj.overlay;
-		}
-
-		this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
-	},
-
-	_onLayerChange: function (e) {
-		var obj = this._layers[L.stamp(e.layer)];
-
-		if (!obj) { return; }
-
-		if (!this._handlingClick) {
-			this._update();
-		}
-
-		var type = obj.overlay ?
-			(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :
-			(e.type === 'layeradd' ? 'baselayerchange' : null);
-
-		if (type) {
-			this._map.fire(type, obj);
-		}
-	},
-
-	// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
-	_createRadioElement: function (name, checked) {
-
-		var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' + name + '"';
-		if (checked) {
-			radioHtml += ' checked="checked"';
-		}
-		radioHtml += '/>';
-
-		var radioFragment = document.createElement('div');
-		radioFragment.innerHTML = radioHtml;
-
-		return radioFragment.firstChild;
-	},
-
-	_addItem: function (obj) {
-		var label = document.createElement('label'),
-		    input,
-		    checked = this._map.hasLayer(obj.layer);
-
-		if (obj.overlay) {
-			input = document.createElement('input');
-			input.type = 'checkbox';
-			input.className = 'leaflet-control-layers-selector';
-			input.defaultChecked = checked;
-		} else {
-			input = this._createRadioElement('leaflet-base-layers', checked);
-		}
-
-		input.layerId = L.stamp(obj.layer);
-
-		L.DomEvent.on(input, 'click', this._onInputClick, this);
-
-		var name = document.createElement('span');
-		name.innerHTML = ' ' + obj.name;
-
-		label.appendChild(input);
-		label.appendChild(name);
-
-		var container = obj.overlay ? this._overlaysList : this._baseLayersList;
-		container.appendChild(label);
-
-		return label;
-	},
-
-	_onInputClick: function () {
-		var i, input, obj,
-		    inputs = this._form.getElementsByTagName('input'),
-		    inputsLen = inputs.length;
-
-		this._handlingClick = true;
-
-		for (i = 0; i < inputsLen; i++) {
-			input = inputs[i];
-			obj = this._layers[input.layerId];
-
-			if (input.checked && !this._map.hasLayer(obj.layer)) {
-				this._map.addLayer(obj.layer);
-
-			} else if (!input.checked && this._map.hasLayer(obj.layer)) {
-				this._map.removeLayer(obj.layer);
-			}
-		}
-
-		this._handlingClick = false;
-
-		this._refocusOnMap();
-	},
-
-	_expand: function () {
-		L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');
-	},
-
-	_collapse: function () {
-		this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');
-	}
-});
-
-L.control.layers = function (baseLayers, overlays, options) {
-	return new L.Control.Layers(baseLayers, overlays, options);
-};
-
-
-/*
- * L.PosAnimation is used by Leaflet internally for pan animations.
- */
-
-L.PosAnimation = L.Class.extend({
-	includes: L.Mixin.Events,
-
-	run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
-		this.stop();
-
-		this._el = el;
-		this._inProgress = true;
-		this._newPos = newPos;
-
-		this.fire('start');
-
-		el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +
-		        's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';
-
-		L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
-		L.DomUtil.setPosition(el, newPos);
-
-		// toggle reflow, Chrome flickers for some reason if you don't do this
-		L.Util.falseFn(el.offsetWidth);
-
-		// there's no native way to track value updates of transitioned properties, so we imitate this
-		this._stepTimer = setInterval(L.bind(this._onStep, this), 50);
-	},
-
-	stop: function () {
-		if (!this._inProgress) { return; }
-
-		// if we just removed the transition property, the element would jump to its final position,
-		// so we need to make it stay at the current position
-
-		L.DomUtil.setPosition(this._el, this._getPos());
-		this._onTransitionEnd();
-		L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation
-	},
-
-	_onStep: function () {
-		var stepPos = this._getPos();
-		if (!stepPos) {
-			this._onTransitionEnd();
-			return;
-		}
-		// jshint camelcase: false
-		// make L.DomUtil.getPosition return intermediate position value during animation
-		this._el._leaflet_pos = stepPos;
-
-		this.fire('step');
-	},
-
-	// you can't easily get intermediate values of properties animated with CSS3 Transitions,
-	// we need to parse computed style (in case of transform it returns matrix string)
-
-	_transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,
-
-	_getPos: function () {
-		var left, top, matches,
-		    el = this._el,
-		    style = window.getComputedStyle(el);
-
-		if (L.Browser.any3d) {
-			matches = style[L.DomUtil.TRANSFORM].match(this._transformRe);
-			if (!matches) { return; }
-			left = parseFloat(matches[1]);
-			top  = parseFloat(matches[2]);
-		} else {
-			left = parseFloat(style.left);
-			top  = parseFloat(style.top);
-		}
-
-		return new L.Point(left, top, true);
-	},
-
-	_onTransitionEnd: function () {
-		L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
-
-		if (!this._inProgress) { return; }
-		this._inProgress = false;
-
-		this._el.style[L.DomUtil.TRANSITION] = '';
-
-		// jshint camelcase: false
-		// make sure L.DomUtil.getPosition returns the final position value after animation
-		this._el._leaflet_pos = this._newPos;
-
-		clearInterval(this._stepTimer);
-
-		this.fire('step').fire('end');
-	}
-
-});
-
-
-/*
- * Extends L.Map to handle panning animations.
- */
-
-L.Map.include({
-
-	setView: function (center, zoom, options) {
-
-		zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
-		center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
-		options = options || {};
-
-		if (this._panAnim) {
-			this._panAnim.stop();
-		}
-
-		if (this._loaded && !options.reset && options !== true) {
-
-			if (options.animate !== undefined) {
-				options.zoom = L.extend({animate: options.animate}, options.zoom);
-				options.pan = L.extend({animate: options.animate}, options.pan);
-			}
-
-			// try animating pan or zoom
-			var animated = (this._zoom !== zoom) ?
-				this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
-				this._tryAnimatedPan(center, options.pan);
-
-			if (animated) {
-				// prevent resize handler call, the view will refresh after animation anyway
-				clearTimeout(this._sizeTimer);
-				return this;
-			}
-		}
-
-		// animation didn't start, just reset the map view
-		this._resetView(center, zoom);
-
-		return this;
-	},
-
-	panBy: function (offset, options) {
-		offset = L.point(offset).round();
-		options = options || {};
-
-		if (!offset.x && !offset.y) {
-			return this;
-		}
-
-		if (!this._panAnim) {
-			this._panAnim = new L.PosAnimation();
-
-			this._panAnim.on({
-				'step': this._onPanTransitionStep,
-				'end': this._onPanTransitionEnd
-			}, this);
-		}
-
-		// don't fire movestart if animating inertia
-		if (!options.noMoveStart) {
-			this.fire('movestart');
-		}
-
-		// animate pan unless animate: false specified
-		if (options.animate !== false) {
-			L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
-
-			var newPos = this._getMapPanePos().subtract(offset);
-			this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
-		} else {
-			this._rawPanBy(offset);
-			this.fire('move').fire('moveend');
-		}
-
-		return this;
-	},
-
-	_onPanTransitionStep: function () {
-		this.fire('move');
-	},
-
-	_onPanTransitionEnd: function () {
-		L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
-		this.fire('moveend');
-	},
-
-	_tryAnimatedPan: function (center, options) {
-		// difference between the new and current centers in pixels
-		var offset = this._getCenterOffset(center)._floor();
-
-		// don't animate too far unless animate: true specified in options
-		if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
-
-		this.panBy(offset, options);
-
-		return true;
-	}
-});
-
-
-/*
- * L.PosAnimation fallback implementation that powers Leaflet pan animations
- * in browsers that don't support CSS3 Transitions.
- */
-
-L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({
-
-	run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
-		this.stop();
-
-		this._el = el;
-		this._inProgress = true;
-		this._duration = duration || 0.25;
-		this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
-
-		this._startPos = L.DomUtil.getPosition(el);
-		this._offset = newPos.subtract(this._startPos);
-		this._startTime = +new Date();
-
-		this.fire('start');
-
-		this._animate();
-	},
-
-	stop: function () {
-		if (!this._inProgress) { return; }
-
-		this._step();
-		this._complete();
-	},
-
-	_animate: function () {
-		// animation loop
-		this._animId = L.Util.requestAnimFrame(this._animate, this);
-		this._step();
-	},
-
-	_step: function () {
-		var elapsed = (+new Date()) - this._startTime,
-		    duration = this._duration * 1000;
-
-		if (elapsed < duration) {
-			this._runFrame(this._easeOut(elapsed / duration));
-		} else {
-			this._runFrame(1);
-			this._complete();
-		}
-	},
-
-	_runFrame: function (progress) {
-		var pos = this._startPos.add(this._offset.multiplyBy(progress));
-		L.DomUtil.setPosition(this._el, pos);
-
-		this.fire('step');
-	},
-
-	_complete: function () {
-		L.Util.cancelAnimFrame(this._animId);
-
-		this._inProgress = false;
-		this.fire('end');
-	},
-
-	_easeOut: function (t) {
-		return 1 - Math.pow(1 - t, this._easeOutPower);
-	}
-});
-
-
-/*
- * Extends L.Map to handle zoom animations.
- */
-
-L.Map.mergeOptions({
-	zoomAnimation: true,
-	zoomAnimationThreshold: 4
-});
-
-if (L.DomUtil.TRANSITION) {
-
-	L.Map.addInitHook(function () {
-		// don't animate on browsers without hardware-accelerated transitions or old Android/Opera
-		this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&
-				L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;
-
-		// zoom transitions run with the same duration for all layers, so if one of transitionend events
-		// happens after starting zoom animation (propagating to the map pane), we know that it ended globally
-		if (this._zoomAnimated) {
-			L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);
-		}
-	});
-}
-
-L.Map.include(!L.DomUtil.TRANSITION ? {} : {
-
-	_catchTransitionEnd: function (e) {
-		if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
-			this._onZoomTransitionEnd();
-		}
-	},
-
-	_nothingToAnimate: function () {
-		return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
-	},
-
-	_tryAnimatedZoom: function (center, zoom, options) {
-
-		if (this._animatingZoom) { return true; }
-
-		options = options || {};
-
-		// don't animate if disabled, not supported or zoom difference is too large
-		if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
-		        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
-
-		// offset is the pixel coords of the zoom origin relative to the current center
-		var scale = this.getZoomScale(zoom),
-		    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),
-			origin = this._getCenterLayerPoint()._add(offset);
-
-		// don't animate if the zoom origin isn't within one screen from the current center, unless forced
-		if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
-
-		this
-		    .fire('movestart')
-		    .fire('zoomstart');
-
-		this._animateZoom(center, zoom, origin, scale, null, true);
-
-		return true;
-	},
-
-	_animateZoom: function (center, zoom, origin, scale, delta, backwards) {
-
-		this._animatingZoom = true;
-
-		// put transform transition on all layers with leaflet-zoom-animated class
-		L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
-
-		// remember what center/zoom to set after animation
-		this._animateToCenter = center;
-		this._animateToZoom = zoom;
-
-		// disable any dragging during animation
-		if (L.Draggable) {
-			L.Draggable._disabled = true;
-		}
-
-		this.fire('zoomanim', {
-			center: center,
-			zoom: zoom,
-			origin: origin,
-			scale: scale,
-			delta: delta,
-			backwards: backwards
-		});
-	},
-
-	_onZoomTransitionEnd: function () {
-
-		this._animatingZoom = false;
-
-		L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
-
-		this._resetView(this._animateToCenter, this._animateToZoom, true, true);
-
-		if (L.Draggable) {
-			L.Draggable._disabled = false;
-		}
-	}
-});
-
-
-/*
-	Zoom animation logic for L.TileLayer.
-*/
-
-L.TileLayer.include({
-	_animateZoom: function (e) {
-		if (!this._animating) {
-			this._animating = true;
-			this._prepareBgBuffer();
-		}
-
-		var bg = this._bgBuffer,
-		    transform = L.DomUtil.TRANSFORM,
-		    initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],
-		    scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);
-
-		bg.style[transform] = e.backwards ?
-				scaleStr + ' ' + initialTransform :
-				initialTransform + ' ' + scaleStr;
-	},
-
-	_endZoomAnim: function () {
-		var front = this._tileContainer,
-		    bg = this._bgBuffer;
-
-		front.style.visibility = '';
-		front.parentNode.appendChild(front); // Bring to fore
-
-		// force reflow
-		L.Util.falseFn(bg.offsetWidth);
-
-		this._animating = false;
-	},
-
-	_clearBgBuffer: function () {
-		var map = this._map;
-
-		if (map && !map._animatingZoom && !map.touchZoom._zooming) {
-			this._bgBuffer.innerHTML = '';
-			this._bgBuffer.style[L.DomUtil.TRANSFORM] = '';
-		}
-	},
-
-	_prepareBgBuffer: function () {
-
-		var front = this._tileContainer,
-		    bg = this._bgBuffer;
-
-		// if foreground layer doesn't have many tiles but bg layer does,
-		// keep the existing bg layer and just zoom it some more
-
-		var bgLoaded = this._getLoadedTilesPercentage(bg),
-		    frontLoaded = this._getLoadedTilesPercentage(front);
-
-		if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {
-
-			front.style.visibility = 'hidden';
-			this._stopLoadingImages(front);
-			return;
-		}
-
-		// prepare the buffer to become the front tile pane
-		bg.style.visibility = 'hidden';
-		bg.style[L.DomUtil.TRANSFORM] = '';
-
-		// switch out the current layer to be the new bg layer (and vice-versa)
-		this._tileContainer = bg;
-		bg = this._bgBuffer = front;
-
-		this._stopLoadingImages(bg);
-
-		//prevent bg buffer from clearing right after zoom
-		clearTimeout(this._clearBgBufferTimer);
-	},
-
-	_getLoadedTilesPercentage: function (container) {
-		var tiles = container.getElementsByTagName('img'),
-		    i, len, count = 0;
-
-		for (i = 0, len = tiles.length; i < len; i++) {
-			if (tiles[i].complete) {
-				count++;
-			}
-		}
-		return count / len;
-	},
-
-	// stops loading all tiles in the background layer
-	_stopLoadingImages: function (container) {
-		var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),
-		    i, len, tile;
-
-		for (i = 0, len = tiles.length; i < len; i++) {
-			tile = tiles[i];
-
-			if (!tile.complete) {
-				tile.onload = L.Util.falseFn;
-				tile.onerror = L.Util.falseFn;
-				tile.src = L.Util.emptyImageUrl;
-
-				tile.parentNode.removeChild(tile);
-			}
-		}
-	}
-});
-
-
-/*
- * Provides L.Map with convenient shortcuts for using browser geolocation features.
- */
-
-L.Map.include({
-	_defaultLocateOptions: {
-		watch: false,
-		setView: false,
-		maxZoom: Infinity,
-		timeout: 10000,
-		maximumAge: 0,
-		enableHighAccuracy: false
-	},
-
-	locate: function (/*Object*/ options) {
-
-		options = this._locateOptions = L.extend(this._defaultLocateOptions, options);
-
-		if (!navigator.geolocation) {
-			this._handleGeolocationError({
-				code: 0,
-				message: 'Geolocation not supported.'
-			});
-			return this;
-		}
-
-		var onResponse = L.bind(this._handleGeolocationResponse, this),
-			onError = L.bind(this._handleGeolocationError, this);
-
-		if (options.watch) {
-			this._locationWatchId =
-			        navigator.geolocation.watchPosition(onResponse, onError, options);
-		} else {
-			navigator.geolocation.getCurrentPosition(onResponse, onError, options);
-		}
-		return this;
-	},
-
-	stopLocate: function () {
-		if (navigator.geolocation) {
-			navigator.geolocation.clearWatch(this._locationWatchId);
-		}
-		if (this._locateOptions) {
-			this._locateOptions.setView = false;
-		}
-		return this;
-	},
-
-	_handleGeolocationError: function (error) {
-		var c = error.code,
-		    message = error.message ||
-		            (c === 1 ? 'permission denied' :
-		            (c === 2 ? 'position unavailable' : 'timeout'));
-
-		if (this._locateOptions.setView && !this._loaded) {
-			this.fitWorld();
-		}
-
-		this.fire('locationerror', {
-			code: c,
-			message: 'Geolocation error: ' + message + '.'
-		});
-	},
-
-	_handleGeolocationResponse: function (pos) {
-		var lat = pos.coords.latitude,
-		    lng = pos.coords.longitude,
-		    latlng = new L.LatLng(lat, lng),
-
-		    latAccuracy = 180 * pos.coords.accuracy / 40075017,
-		    lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),
-
-		    bounds = L.latLngBounds(
-		            [lat - latAccuracy, lng - lngAccuracy],
-		            [lat + latAccuracy, lng + lngAccuracy]),
-
-		    options = this._locateOptions;
-
-		if (options.setView) {
-			var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);
-			this.setView(latlng, zoom);
-		}
-
-		var data = {
-			latlng: latlng,
-			bounds: bounds,
-			timestamp: pos.timestamp
-		};
-
-		for (var i in pos.coords) {
-			if (typeof pos.coords[i] === 'number') {
-				data[i] = pos.coords[i];
-			}
-		}
-
-		this.fire('locationfound', data);
-	}
-});
-
-
-}(window, document));
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.css b/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.css
deleted file mode 100644
index ac0cd17..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.css
+++ /dev/null
@@ -1,478 +0,0 @@
-/* required styles */
-
-.leaflet-map-pane,
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-tile-pane,
-.leaflet-tile-container,
-.leaflet-overlay-pane,
-.leaflet-shadow-pane,
-.leaflet-marker-pane,
-.leaflet-popup-pane,
-.leaflet-overlay-pane svg,
-.leaflet-zoom-box,
-.leaflet-image-layer,
-.leaflet-layer {
-	position: absolute;
-	left: 0;
-	top: 0;
-	}
-.leaflet-container {
-	overflow: hidden;
-	-ms-touch-action: none;
-	}
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	        user-select: none;
-	-webkit-user-drag: none;
-	}
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
-	display: block;
-	}
-/* map is broken in FF if you have max-width: 100% on tiles */
-.leaflet-container img {
-	max-width: none !important;
-	}
-/* stupid Android 2 doesn't understand "max-width: none" properly */
-.leaflet-container img.leaflet-image-layer {
-	max-width: 15000px !important;
-	}
-.leaflet-tile {
-	filter: inherit;
-	visibility: hidden;
-	}
-.leaflet-tile-loaded {
-	visibility: inherit;
-	}
-.leaflet-zoom-box {
-	width: 0;
-	height: 0;
-	}
-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
-.leaflet-overlay-pane svg {
-	-moz-user-select: none;
-	}
-
-.leaflet-tile-pane    { z-index: 2; }
-.leaflet-objects-pane { z-index: 3; }
-.leaflet-overlay-pane { z-index: 4; }
-.leaflet-shadow-pane  { z-index: 5; }
-.leaflet-marker-pane  { z-index: 6; }
-.leaflet-popup-pane   { z-index: 7; }
-
-.leaflet-vml-shape {
-	width: 1px;
-	height: 1px;
-	}
-.lvml {
-	behavior: url(#default#VML);
-	display: inline-block;
-	position: absolute;
-	}
-
-
-/* control positioning */
-
-.leaflet-control {
-	position: relative;
-	z-index: 7;
-	pointer-events: auto;
-	}
-.leaflet-top,
-.leaflet-bottom {
-	position: absolute;
-	z-index: 1000;
-	pointer-events: none;
-	}
-.leaflet-top {
-	top: 0;
-	}
-.leaflet-right {
-	right: 0;
-	}
-.leaflet-bottom {
-	bottom: 0;
-	}
-.leaflet-left {
-	left: 0;
-	}
-.leaflet-control {
-	float: left;
-	clear: both;
-	}
-.leaflet-right .leaflet-control {
-	float: right;
-	}
-.leaflet-top .leaflet-control {
-	margin-top: 10px;
-	}
-.leaflet-bottom .leaflet-control {
-	margin-bottom: 10px;
-	}
-.leaflet-left .leaflet-control {
-	margin-left: 10px;
-	}
-.leaflet-right .leaflet-control {
-	margin-right: 10px;
-	}
-
-
-/* zoom and fade animations */
-
-.leaflet-fade-anim .leaflet-tile,
-.leaflet-fade-anim .leaflet-popup {
-	opacity: 0;
-	-webkit-transition: opacity 0.2s linear;
-	   -moz-transition: opacity 0.2s linear;
-	     -o-transition: opacity 0.2s linear;
-	        transition: opacity 0.2s linear;
-	}
-.leaflet-fade-anim .leaflet-tile-loaded,
-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
-	opacity: 1;
-	}
-
-.leaflet-zoom-anim .leaflet-zoom-animated {
-	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
-	     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);
-	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
-	}
-.leaflet-zoom-anim .leaflet-tile,
-.leaflet-pan-anim .leaflet-tile,
-.leaflet-touching .leaflet-zoom-animated {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	     -o-transition: none;
-	        transition: none;
-	}
-
-.leaflet-zoom-anim .leaflet-zoom-hide {
-	visibility: hidden;
-	}
-
-
-/* cursors */
-
-.leaflet-clickable {
-	cursor: pointer;
-	}
-.leaflet-container {
-	cursor: -webkit-grab;
-	cursor:    -moz-grab;
-	}
-.leaflet-popup-pane,
-.leaflet-control {
-	cursor: auto;
-	}
-.leaflet-dragging .leaflet-container,
-.leaflet-dragging .leaflet-clickable {
-	cursor: move;
-	cursor: -webkit-grabbing;
-	cursor:    -moz-grabbing;
-	}
-
-
-/* visual tweaks */
-
-.leaflet-container {
-	background: #ddd;
-	outline: 0;
-	}
-.leaflet-container a {
-	color: #0078A8;
-	}
-.leaflet-container a.leaflet-active {
-	outline: 2px solid orange;
-	}
-.leaflet-zoom-box {
-	border: 2px dotted #38f;
-	background: rgba(255,255,255,0.5);
-	}
-
-
-/* general typography */
-.leaflet-container {
-	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
-	}
-
-
-/* general toolbar styles */
-
-.leaflet-bar {
-	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
-	border-radius: 4px;
-	}
-.leaflet-bar a,
-.leaflet-bar a:hover {
-	background-color: #fff;
-	border-bottom: 1px solid #ccc;
-	width: 26px;
-	height: 26px;
-	line-height: 26px;
-	display: block;
-	text-align: center;
-	text-decoration: none;
-	color: black;
-	}
-.leaflet-bar a,
-.leaflet-control-layers-toggle {
-	background-position: 50% 50%;
-	background-repeat: no-repeat;
-	display: block;
-	}
-.leaflet-bar a:hover {
-	background-color: #f4f4f4;
-	}
-.leaflet-bar a:first-child {
-	border-top-left-radius: 4px;
-	border-top-right-radius: 4px;
-	}
-.leaflet-bar a:last-child {
-	border-bottom-left-radius: 4px;
-	border-bottom-right-radius: 4px;
-	border-bottom: none;
-	}
-.leaflet-bar a.leaflet-disabled {
-	cursor: default;
-	background-color: #f4f4f4;
-	color: #bbb;
-	}
-
-.leaflet-touch .leaflet-bar a {
-	width: 30px;
-	height: 30px;
-	line-height: 30px;
-	}
-
-
-/* zoom control */
-
-.leaflet-control-zoom-in,
-.leaflet-control-zoom-out {
-	font: bold 18px 'Lucida Console', Monaco, monospace;
-	text-indent: 1px;
-	}
-.leaflet-control-zoom-out {
-	font-size: 20px;
-	}
-
-.leaflet-touch .leaflet-control-zoom-in {
-	font-size: 22px;
-	}
-.leaflet-touch .leaflet-control-zoom-out {
-	font-size: 24px;
-	}
-
-
-/* layers control */
-
-.leaflet-control-layers {
-	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
-	background: #fff;
-	border-radius: 5px;
-	}
-.leaflet-control-layers-toggle {
-	background-image: url(images/layers.png);
-	width: 36px;
-	height: 36px;
-	}
-.leaflet-retina .leaflet-control-layers-toggle {
-	background-image: url(images/layers-2x.png);
-	background-size: 26px 26px;
-	}
-.leaflet-touch .leaflet-control-layers-toggle {
-	width: 44px;
-	height: 44px;
-	}
-.leaflet-control-layers .leaflet-control-layers-list,
-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
-	display: none;
-	}
-.leaflet-control-layers-expanded .leaflet-control-layers-list {
-	display: block;
-	position: relative;
-	}
-.leaflet-control-layers-expanded {
-	padding: 6px 10px 6px 6px;
-	color: #333;
-	background: #fff;
-	}
-.leaflet-control-layers-selector {
-	margin-top: 2px;
-	position: relative;
-	top: 1px;
-	}
-.leaflet-control-layers label {
-	display: block;
-	}
-.leaflet-control-layers-separator {
-	height: 0;
-	border-top: 1px solid #ddd;
-	margin: 5px -10px 5px -6px;
-	}
-
-
-/* attribution and scale controls */
-
-.leaflet-container .leaflet-control-attribution {
-	background: #fff;
-	background: rgba(255, 255, 255, 0.7);
-	margin: 0;
-	}
-.leaflet-control-attribution,
-.leaflet-control-scale-line {
-	padding: 0 5px;
-	color: #333;
-	}
-.leaflet-control-attribution a {
-	text-decoration: none;
-	}
-.leaflet-control-attribution a:hover {
-	text-decoration: underline;
-	}
-.leaflet-container .leaflet-control-attribution,
-.leaflet-container .leaflet-control-scale {
-	font-size: 11px;
-	}
-.leaflet-left .leaflet-control-scale {
-	margin-left: 5px;
-	}
-.leaflet-bottom .leaflet-control-scale {
-	margin-bottom: 5px;
-	}
-.leaflet-control-scale-line {
-	border: 2px solid #777;
-	border-top: none;
-	line-height: 1.1;
-	padding: 2px 5px 1px;
-	font-size: 11px;
-	white-space: nowrap;
-	overflow: hidden;
-	-moz-box-sizing: content-box;
-	     box-sizing: content-box;
-
-	background: #fff;
-	background: rgba(255, 255, 255, 0.5);
-	}
-.leaflet-control-scale-line:not(:first-child) {
-	border-top: 2px solid #777;
-	border-bottom: none;
-	margin-top: -2px;
-	}
-.leaflet-control-scale-line:not(:first-child):not(:last-child) {
-	border-bottom: 2px solid #777;
-	}
-
-.leaflet-touch .leaflet-control-attribution,
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
-	box-shadow: none;
-	}
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
-	border: 2px solid rgba(0,0,0,0.2);
-	background-clip: padding-box;
-	}
-
-
-/* popup */
-
-.leaflet-popup {
-	position: absolute;
-	text-align: center;
-	}
-.leaflet-popup-content-wrapper {
-	padding: 1px;
-	text-align: left;
-	border-radius: 12px;
-	}
-.leaflet-popup-content {
-	margin: 13px 19px;
-	line-height: 1.4;
-	}
-.leaflet-popup-content p {
-	margin: 18px 0;
-	}
-.leaflet-popup-tip-container {
-	margin: 0 auto;
-	width: 40px;
-	height: 20px;
-	position: relative;
-	overflow: hidden;
-	}
-.leaflet-popup-tip {
-	width: 17px;
-	height: 17px;
-	padding: 1px;
-
-	margin: -10px auto 0;
-
-	-webkit-transform: rotate(45deg);
-	   -moz-transform: rotate(45deg);
-	    -ms-transform: rotate(45deg);
-	     -o-transform: rotate(45deg);
-	        transform: rotate(45deg);
-	}
-.leaflet-popup-content-wrapper,
-.leaflet-popup-tip {
-	background: white;
-
-	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
-	}
-.leaflet-container a.leaflet-popup-close-button {
-	position: absolute;
-	top: 0;
-	right: 0;
-	padding: 4px 4px 0 0;
-	text-align: center;
-	width: 18px;
-	height: 14px;
-	font: 16px/14px Tahoma, Verdana, sans-serif;
-	color: #c3c3c3;
-	text-decoration: none;
-	font-weight: bold;
-	background: transparent;
-	}
-.leaflet-container a.leaflet-popup-close-button:hover {
-	color: #999;
-	}
-.leaflet-popup-scrolled {
-	overflow: auto;
-	border-bottom: 1px solid #ddd;
-	border-top: 1px solid #ddd;
-	}
-
-.leaflet-oldie .leaflet-popup-content-wrapper {
-	zoom: 1;
-	}
-.leaflet-oldie .leaflet-popup-tip {
-	width: 24px;
-	margin: 0 auto;
-
-	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
-	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
-	}
-.leaflet-oldie .leaflet-popup-tip-container {
-	margin-top: -1px;
-	}
-
-.leaflet-oldie .leaflet-control-zoom,
-.leaflet-oldie .leaflet-control-layers,
-.leaflet-oldie .leaflet-popup-content-wrapper,
-.leaflet-oldie .leaflet-popup-tip {
-	border: 1px solid #999;
-	}
-
-
-/* div icon */
-
-.leaflet-div-icon {
-	background: #fff;
-	border: 1px solid #666;
-	}
diff --git a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.js b/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.js
deleted file mode 100644
index e7d2be1..0000000
--- a/dashboard/lib/assets/packages/leaflet-0.7.2/leaflet.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
- (c) 2010-2013, Vladimir Agafonkin
- (c) 2010-2011, CloudMade
-*/
-!function(t,e,i){var n=t.L,o={};o.version="0.7.2","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?void e():s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;n<t.length;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=o.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",n=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+n},getScaleString:function(t,e){var i=o.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),n=" scale("+t+") ";return i+n},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&o.Browser.any3d?t.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(e):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},o.DomUtil.TRANSFORM=o.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),o.DomUtil.TRANSITION=o.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),o.DomUtil.TRANSITION_END="webkitTransition"===o.DomUtil.TRANSITION||"OTransition"===o.DomUtil.TRANSITION?o.DomUtil.TRANSITION+"End":"transitionend",function(){if("onselectstart"in e)o.extend(o.DomUtil,{disableTextSelection:function(){o.DomEvent.on(t,"selectstart",o.DomEvent.preventDefault)},enableTextSelection:function(){o.DomEvent.off(t,"selectstart",o.DomEvent.preventDefault)}});else{var i=o.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);o.extend(o.DomUtil,{disableTextSelection:function(){if(i){var t=e.documentElement.style;this._userSelect=t[i],t[i]="none"}},enableTextSelection:function(){i&&(e.documentElement.style[i]=this._userSelect,delete this._userSelect)}})}o.extend(o.DomUtil,{disableImageDrag:function(){o.DomEvent.on(t,"dragstart",o.DomEvent.preventDefault)},enableImageDrag:function(){o.DomEvent.off(t,"dragstart",o.DomEvent.preventDefault)}})}(),o.LatLng=function(t,e,n){if(t=parseFloat(t),e=parseFloat(e),isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=t,this.lng=e,n!==i&&(this.alt=parseFloat(n))},o.extend(o.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),o.LatLng.prototype={equals:function(t){if(!t)return!1;t=o.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return e<=o.LatLng.MAX_MARGIN},toString:function(t){return"LatLng("+o.Util.formatNum(this.lat,t)+", "+o.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=o.latLng(t);var e=6378137,i=o.LatLng.DEG_TO_RAD,n=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(n/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x<r.x||n.y<r.y:r.contains(n);while(u&&a>=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;
-return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||i<this.options.minZoom)){var s=o.bounds(e.min.divideBy(n)._floor(),e.max.divideBy(n)._floor());this._addTilesFromCenterOut(s),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(s)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=t.getCenter();for(i=t.min.y;i<=t.max.y;i++)for(n=t.min.x;n<=t.max.x;n++)s=new o.Point(n,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,n=0;h>n;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(i<t.min.x||i>t.max.x||n<t.min.y||n>t.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i=o.point("shadow"===e?n.shadowAnchor||n.iconAnchor:n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)o.DomEvent.on(t,e[i],this._fireMouseEvent,this);o.Handler.MarkerDrag&&(this.dragging=new o.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&o.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t,latlng:this._latlng})},_onKeyPress:function(t){13===t.keyCode&&this.fire("click",{originalEvent:t,latlng:this._latlng})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t,latlng:this._latlng}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&o.DomEvent.preventDefault(t),"mousedown"!==t.type?o.DomEvent.stopPropagation(t):o.DomEvent.preventDefault(t)},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){o.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&o.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),o.marker=function(t,e){return new o.Marker(t,e)},o.DivIcon=o.Icon.extend({options:{iconSize:[12,12],className:"leaflet-div-icon",html:!1},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),n=this.options;return i.innerHTML=n.html!==!1?n.html:"",n.bgPos&&(i.style.backgroundPosition=-n.bgPos.x+"px "+-n.bgPos.y+"px"),this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),o.divIcon=function(t){return new o.DivIcon(t)},o.Map.mergeOptions({closePopupOnClick:!0}),o.Popup=o.Class.extend({includes:o.Mixin.Events,options:{minWidth:50,maxWidth:300,autoPan:!0,closeButton:!0,offset:[0,7],autoPanPadding:[5,5],keepInView:!1,className:"",zoomAnimation:!0},initialize:function(t,e){o.setOptions(this,t),this._source=e,this._animated=o.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._container||this._initLayout();var e=t.options.fadeAnimation;e&&o.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on(this._getEvents(),this),this.update(),e&&o.DomUtil.setOpacity(this._container,1),this.fire("open"),t.fire("popupopen",{popup:this}),this._source&&this._source.fire("popupopen",{popup:this})},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),o.Util.falseFn(this._container.offsetWidth),t.off(this._getEvents(),this),t.options.fadeAnimation&&o.DomUtil.setOpacity(this._container,0),this._map=null,this.fire("close"),t.fire("popupclose",{popup:this}),this._source&&this._source.fire("popupclose",{popup:this})},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_getEvents:function(){var t={viewreset:this._updatePosition};return this._animated&&(t.zoomanim=this._zoomAnimation),("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),n=this._container=o.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=o.DomUtil.create("a",e+"-close-button",n),t.href="#close",t.innerHTML="&#215;",o.DomEvent.disableClickPropagation(t),o.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=o.DomUtil.create("div",e+"-content-wrapper",n);o.DomEvent.disableClickPropagation(s),this._contentNode=o.DomUtil.create("div",e+"-content",s),o.DomEvent.disableScrollPropagation(this._contentNode),o.DomEvent.on(s,"contextmenu",o.DomEvent.stopPropagation),this._tipContainer=o.DomUtil.create("div",e+"-tip-container",n),this._tip=o.DomUtil.create("div",e+"-tip",this._tipContainer)},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var n=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&n>s?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e<t.length;e++)o.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),n=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(n);this.fire(t.type,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&o.DomEvent.preventDefault(t),"mousemove"!==t.type&&o.DomEvent.stopPropagation(t)}}}),o.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=o.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&o.Browser.any3d?(o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())
-},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+e<t.min.x||i.y+e<t.min.y}}),o.circle=function(t,e,i){return new o.Circle(t,e,i)},o.CircleMarker=o.Circle.extend({options:{radius:10,weight:2},initialize:function(t,e){o.Circle.prototype.initialize.call(this,t,null,e),this._radius=this.options.radius},projectLatlngs:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_updateStyle:function(){o.Circle.prototype._updateStyle.call(this),this.setRadius(this.options.radius)},setLatLng:function(t){return o.Circle.prototype.setLatLng.call(this,t),this._popup&&this._popup._isOpen&&this._popup.setLatLng(t),this},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius}}),o.circleMarker=function(t,e){return new o.CircleMarker(t,e)},o.Polyline.include(o.Path.CANVAS?{_containsPoint:function(t,e){var i,n,s,a,r,h,l,u=this.options.weight/2;for(o.Browser.touch&&(u+=10),i=0,a=this._parts.length;a>i;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)<Math.abs(s+i)?o:s;this._draggable._newPos.x=a},_onDragEnd:function(t){var e=this._map,i=e.options,n=+new Date-this._lastTime,s=!i.inertia||n>i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i<r.length;i++)if(r[i].pointerId===t.pointerId){e=!0;break}e||r.push(t),t.touches=r.slice(),t.changedTouches=[t],n(t)};if(t[a+"touchstart"+s]=h,t.addEventListener(this.POINTER_DOWN,h,!1),!this._pointerDocumentListener){var l=function(t){for(var e=0;e<r.length;e++)if(r[e].pointerId===t.pointerId){r.splice(e,1);
-break}};e.documentElement.addEventListener(this.POINTER_UP,l,!1),e.documentElement.addEventListener(this.POINTER_CANCEL,l,!1),this._pointerDocumentListener=!0}return this},addPointerListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._pointers;return t[s+"touchmove"+n]=o,t.addEventListener(this.POINTER_MOVE,o,!1),this},addPointerListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._pointers,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener(this.POINTER_UP,a,!1),t.addEventListener(this.POINTER_CANCEL,a,!1),this},removePointerListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener(this.POINTER_DOWN,o,!1);break;case"touchmove":t.removeEventListener(this.POINTER_MOVE,o,!1);break;case"touchend":t.removeEventListener(this.POINTER_UP,o,!1),t.removeEventListener(this.POINTER_CANCEL,o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23,bounceAtZoomLimits:!0}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(e.options.bounceAtZoomLimits||!(e.getZoom()===e.getMinZoom()&&this._scale<1||e.getZoom()===e.getMaxZoom()&&this._scale>1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"';i&&(n+=' checked="checked"'),n+="/>";var o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,n=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=o.stamp(t.layer),o.DomEvent.on(i,"click",this._onInputClick,this);var a=e.createElement("span");a.innerHTML=" "+t.name,n.appendChild(i),n.appendChild(a);var r=t.overlay?this._overlaysList:this._baseLayersList;return r.appendChild(n),n},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=n.length;for(this._handlingClick=!0,t=0;o>t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document);
\ No newline at end of file
diff --git a/dashboard/lib/assets/packages/select2/select2-bootstrap.css b/dashboard/lib/assets/packages/select2/select2-bootstrap.css
deleted file mode 100755
index 3b83f0a..0000000
--- a/dashboard/lib/assets/packages/select2/select2-bootstrap.css
+++ /dev/null
@@ -1,87 +0,0 @@
-.form-control .select2-choice {
-    border: 0;
-    border-radius: 2px;
-}
-
-.form-control .select2-choice .select2-arrow {
-    border-radius: 0 2px 2px 0;   
-}
-
-.form-control.select2-container {
-    height: auto !important;
-    padding: 0;
-}
-
-.form-control.select2-container.select2-dropdown-open {
-    border-color: #5897FB;
-    border-radius: 3px 3px 0 0;
-}
-
-.form-control .select2-container.select2-dropdown-open .select2-choices {
-    border-radius: 3px 3px 0 0;
-}
-
-.form-control.select2-container .select2-choices {
-    border: 0 !important;
-    border-radius: 3px;
-}
-
-.control-group.warning .select2-container .select2-choice,
-.control-group.warning .select2-container .select2-choices,
-.control-group.warning .select2-container-active .select2-choice,
-.control-group.warning .select2-container-active .select2-choices,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #C09853 !important;
-}
-
-.control-group.warning .select2-container .select2-choice div {
-    border-left: 1px solid #C09853 !important;
-    background: #FCF8E3 !important;
-}
-
-.control-group.error .select2-container .select2-choice,
-.control-group.error .select2-container .select2-choices,
-.control-group.error .select2-container-active .select2-choice,
-.control-group.error .select2-container-active .select2-choices,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.error .select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #B94A48 !important;
-}
-
-.control-group.error .select2-container .select2-choice div {
-    border-left: 1px solid #B94A48 !important;
-    background: #F2DEDE !important;
-}
-
-.control-group.info .select2-container .select2-choice,
-.control-group.info .select2-container .select2-choices,
-.control-group.info .select2-container-active .select2-choice,
-.control-group.info .select2-container-active .select2-choices,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.info .select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #3A87AD !important;
-}
-
-.control-group.info .select2-container .select2-choice div {
-    border-left: 1px solid #3A87AD !important;
-    background: #D9EDF7 !important;
-}
-
-.control-group.success .select2-container .select2-choice,
-.control-group.success .select2-container .select2-choices,
-.control-group.success .select2-container-active .select2-choice,
-.control-group.success .select2-container-active .select2-choices,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
-.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
-.control-group.success .select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #468847 !important;
-}
-
-.control-group.success .select2-container .select2-choice div {
-    border-left: 1px solid #468847 !important;
-    background: #DFF0D8 !important;
-}
diff --git a/dashboard/lib/assets/packages/select2/select2-spinner.gif b/dashboard/lib/assets/packages/select2/select2-spinner.gif
deleted file mode 100755
index 5b33f7e..0000000
--- a/dashboard/lib/assets/packages/select2/select2-spinner.gif
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/select2/select2.css b/dashboard/lib/assets/packages/select2/select2.css
deleted file mode 100755
index 4b2a2a8..0000000
--- a/dashboard/lib/assets/packages/select2/select2.css
+++ /dev/null
@@ -1,646 +0,0 @@
-/*
-Version: 3.4.6 Timestamp: Sat Mar 22 22:30:15 EDT 2014
-*/
-.select2-container {
-    margin: 0;
-    position: relative;
-    display: inline-block;
-    /* inline-block for ie7 */
-    zoom: 1;
-    *display: inline;
-    vertical-align: middle;
-}
-
-.select2-container,
-.select2-drop,
-.select2-search,
-.select2-search input {
-  /*
-    Force border-box so that % widths fit the parent
-    container without overlap because of margin/padding.
-    More Info : http://www.quirksmode.org/css/box.html
-  */
-  -webkit-box-sizing: border-box; /* webkit */
-     -moz-box-sizing: border-box; /* firefox */
-          box-sizing: border-box; /* css3 */
-}
-
-.select2-container .select2-choice {
-    display: block;
-    height: 26px;
-    padding: 0 0 0 8px;
-    overflow: hidden;
-    position: relative;
-
-    border: 1px solid #aaa;
-    white-space: nowrap;
-    line-height: 26px;
-    color: #444;
-    text-decoration: none;
-
-    border-radius: 4px;
-
-    background-clip: padding-box;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-
-    background-color: #fff;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
-    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
-    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
-    background-image: linear-gradient(to top, #eee 0%, #fff 50%);
-}
-
-.select2-container.select2-drop-above .select2-choice {
-    border-bottom-color: #aaa;
-
-    border-radius: 0 0 4px 4px;
-
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
-    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
-    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
-    background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
-}
-
-.select2-container.select2-allowclear .select2-choice .select2-chosen {
-    margin-right: 42px;
-}
-
-.select2-container .select2-choice > .select2-chosen {
-    margin-right: 26px;
-    display: block;
-    overflow: hidden;
-
-    white-space: nowrap;
-
-    text-overflow: ellipsis;
-    float: none;
-    width: auto;
-}
-
-.select2-container .select2-choice abbr {
-    display: none;
-    width: 12px;
-    height: 12px;
-    position: absolute;
-    right: 24px;
-    top: 8px;
-
-    font-size: 1px;
-    text-decoration: none;
-
-    border: 0;
-    background: url('select2.png') right top no-repeat;
-    cursor: pointer;
-    outline: 0;
-}
-
-.select2-container.select2-allowclear .select2-choice abbr {
-    display: inline-block;
-}
-
-.select2-container .select2-choice abbr:hover {
-    background-position: right -11px;
-    cursor: pointer;
-}
-
-.select2-drop-mask {
-    border: 0;
-    margin: 0;
-    padding: 0;
-    position: fixed;
-    left: 0;
-    top: 0;
-    min-height: 100%;
-    min-width: 100%;
-    height: auto;
-    width: auto;
-    opacity: 0;
-    z-index: 9998;
-    /* styles required for IE to work */
-    background-color: #fff;
-    filter: alpha(opacity=0);
-}
-
-.select2-drop {
-    width: 100%;
-    margin-top: -1px;
-    position: absolute;
-    z-index: 9999;
-    top: 100%;
-
-    background: #fff;
-    color: #000;
-    border: 1px solid #aaa;
-    border-top: 0;
-
-    border-radius: 0 0 4px 4px;
-
-    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-            box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop.select2-drop-above {
-    margin-top: 1px;
-    border-top: 1px solid #aaa;
-    border-bottom: 0;
-
-    border-radius: 4px 4px 0 0;
-
-    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-            box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop-active {
-    border: 1px solid #5897fb;
-    border-top: none;
-}
-
-.select2-drop.select2-drop-above.select2-drop-active {
-    border-top: 1px solid #5897fb;
-}
-
-.select2-drop-auto-width {
-    border-top: 1px solid #aaa;
-    width: auto;
-}
-
-.select2-drop-auto-width .select2-search {
-    padding-top: 4px;
-}
-
-.select2-container .select2-choice .select2-arrow {
-    display: inline-block;
-    width: 18px;
-    height: 100%;
-    position: absolute;
-    right: 0;
-    top: 0;
-
-    border-left: 1px solid #aaa;
-    border-radius: 0 4px 4px 0;
-
-    background-clip: padding-box;
-
-    background: #ccc;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
-    background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-    background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
-    background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
-}
-
-.select2-container .select2-choice .select2-arrow b {
-    display: block;
-    width: 100%;
-    height: 100%;
-    background: url('select2.png') no-repeat 0 1px;
-}
-
-.select2-search {
-    display: inline-block;
-    width: 100%;
-    min-height: 26px;
-    margin: 0;
-    padding-left: 4px;
-    padding-right: 4px;
-
-    position: relative;
-    z-index: 10000;
-
-    white-space: nowrap;
-}
-
-.select2-search input {
-    width: 100%;
-    height: auto !important;
-    min-height: 26px;
-    padding: 4px 20px 4px 5px;
-    margin: 0;
-
-    outline: 0;
-    font-family: sans-serif;
-    font-size: 1em;
-
-    border: 1px solid #aaa;
-    border-radius: 0;
-
-    -webkit-box-shadow: none;
-            box-shadow: none;
-
-    background: #fff url('select2.png') no-repeat 100% -22px;
-    background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
-    background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-drop.select2-drop-above .select2-search input {
-    margin-top: 4px;
-}
-
-.select2-search input.select2-active {
-    background: #fff url('select2-spinner.gif') no-repeat 100%;
-    background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
-    background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
-    border: 1px solid #5897fb;
-    outline: none;
-
-    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-
-.select2-dropdown-open .select2-choice {
-    border-bottom-color: transparent;
-    -webkit-box-shadow: 0 1px 0 #fff inset;
-            box-shadow: 0 1px 0 #fff inset;
-
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 0;
-
-    background-color: #eee;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
-    background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
-    background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-    background-image: linear-gradient(to top, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open.select2-drop-above .select2-choice,
-.select2-dropdown-open.select2-drop-above .select2-choices {
-    border: 1px solid #5897fb;
-    border-top-color: transparent;
-
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
-    background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
-    background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-    background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open .select2-choice .select2-arrow {
-    background: transparent;
-    border-left: none;
-    filter: none;
-}
-.select2-dropdown-open .select2-choice .select2-arrow b {
-    background-position: -18px 1px;
-}
-
-.select2-hidden-accessible {
-    border: 0;
-    clip: rect(0 0 0 0);
-    height: 1px;
-    margin: -1px;
-    overflow: hidden;
-    padding: 0;
-    position: absolute;
-    width: 1px;
-}
-
-/* results */
-.select2-results {
-    max-height: 200px;
-    padding: 0 0 0 4px;
-    margin: 4px 4px 4px 0;
-    position: relative;
-    overflow-x: hidden;
-    overflow-y: auto;
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-.select2-results ul.select2-result-sub {
-    margin: 0;
-    padding-left: 0;
-}
-
-.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
-.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
-
-.select2-results li {
-    list-style: none;
-    display: list-item;
-    background-image: none;
-}
-
-.select2-results li.select2-result-with-children > .select2-result-label {
-    font-weight: bold;
-}
-
-.select2-results .select2-result-label {
-    padding: 3px 7px 4px;
-    margin: 0;
-    cursor: pointer;
-
-    min-height: 1em;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-}
-
-.select2-results .select2-highlighted {
-    background: #3875d7;
-    color: #fff;
-}
-
-.select2-results li em {
-    background: #feffde;
-    font-style: normal;
-}
-
-.select2-results .select2-highlighted em {
-    background: transparent;
-}
-
-.select2-results .select2-highlighted ul {
-    background: #fff;
-    color: #000;
-}
-
-
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-selection-limit {
-    background: #f4f4f4;
-    display: list-item;
-    padding-left: 5px;
-}
-
-/*
-disabled look for disabled choices in the results dropdown
-*/
-.select2-results .select2-disabled.select2-highlighted {
-    color: #666;
-    background: #f4f4f4;
-    display: list-item;
-    cursor: default;
-}
-.select2-results .select2-disabled {
-  background: #f4f4f4;
-  display: list-item;
-  cursor: default;
-}
-
-.select2-results .select2-selected {
-    display: none;
-}
-
-.select2-more-results.select2-active {
-    background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
-}
-
-.select2-more-results {
-    background: #f4f4f4;
-    display: list-item;
-}
-
-/* disabled styles */
-
-.select2-container.select2-container-disabled .select2-choice {
-    background-color: #f4f4f4;
-    background-image: none;
-    border: 1px solid #ddd;
-    cursor: default;
-}
-
-.select2-container.select2-container-disabled .select2-choice .select2-arrow {
-    background-color: #f4f4f4;
-    background-image: none;
-    border-left: 0;
-}
-
-.select2-container.select2-container-disabled .select2-choice abbr {
-    display: none;
-}
-
-
-/* multiselect */
-
-.select2-container-multi .select2-choices {
-    height: auto !important;
-    height: 1%;
-    margin: 0;
-    padding: 0;
-    position: relative;
-
-    border: 1px solid #aaa;
-    cursor: text;
-    overflow: hidden;
-
-    background-color: #fff;
-    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
-    background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
-    background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
-    background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
-}
-
-.select2-locked {
-  padding: 3px 5px 3px 5px !important;
-}
-
-.select2-container-multi .select2-choices {
-    min-height: 26px;
-}
-
-.select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #5897fb;
-    outline: none;
-
-    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-.select2-container-multi .select2-choices li {
-    float: left;
-    list-style: none;
-}
-html[dir="rtl"] .select2-container-multi .select2-choices li
-{
-    float: right;
-}
-.select2-container-multi .select2-choices .select2-search-field {
-    margin: 0;
-    padding: 0;
-    white-space: nowrap;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input {
-    padding: 5px;
-    margin: 1px 0;
-
-    font-family: sans-serif;
-    font-size: 100%;
-    color: #666;
-    outline: 0;
-    border: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-    background: transparent !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
-    background: #fff url('select2-spinner.gif') no-repeat 100% !important;
-}
-
-.select2-default {
-    color: #999 !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice {
-    padding: 3px 5px 3px 18px;
-    margin: 3px 0 3px 5px;
-    position: relative;
-
-    line-height: 13px;
-    color: #333;
-    cursor: default;
-    border: 1px solid #aaaaaa;
-
-    border-radius: 3px;
-
-    -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-            box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-
-    background-clip: padding-box;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-
-    background-color: #e4e4e4;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
-    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
-    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-    background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-}
-html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
-{
-    margin-left: 0;
-    margin-right: 5px;
-}
-.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
-    cursor: default;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus {
-    background: #d4d4d4;
-}
-
-.select2-search-choice-close {
-    display: block;
-    width: 12px;
-    height: 13px;
-    position: absolute;
-    right: 3px;
-    top: 4px;
-
-    font-size: 1px;
-    outline: none;
-    background: url('select2.png') right top no-repeat;
-}
-html[dir="rtl"] .select2-search-choice-close {
-    right: auto;
-    left: 3px;
-}
-
-.select2-container-multi .select2-search-choice-close {
-    left: 3px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
-  background-position: right -11px;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
-    background-position: right -11px;
-}
-
-/* disabled styles */
-.select2-container-multi.select2-container-disabled .select2-choices {
-    background-color: #f4f4f4;
-    background-image: none;
-    border: 1px solid #ddd;
-    cursor: default;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
-    padding: 3px 5px 3px 5px;
-    border: 1px solid #ddd;
-    background-image: none;
-    background-color: #f4f4f4;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {    display: none;
-    background: none;
-}
-/* end multiselect */
-
-
-.select2-result-selectable .select2-match,
-.select2-result-unselectable .select2-match {
-    text-decoration: underline;
-}
-
-.select2-offscreen, .select2-offscreen:focus {
-    clip: rect(0 0 0 0) !important;
-    width: 1px !important;
-    height: 1px !important;
-    border: 0 !important;
-    margin: 0 !important;
-    padding: 0 !important;
-    overflow: hidden !important;
-    position: absolute !important;
-    outline: 0 !important;
-    left: 0px !important;
-    top: 0px !important;
-}
-
-.select2-display-none {
-    display: none;
-}
-
-.select2-measure-scrollbar {
-    position: absolute;
-    top: -10000px;
-    left: -10000px;
-    width: 100px;
-    height: 100px;
-    overflow: scroll;
-}
-
-/* Retina-ize icons */
-
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx)  {
-    .select2-search input,
-    .select2-search-choice-close,
-    .select2-container .select2-choice abbr,
-    .select2-container .select2-choice .select2-arrow b {
-        background-image: url('select2x2.png') !important;
-        background-repeat: no-repeat !important;
-        background-size: 60px 40px !important;
-    }
-
-    .select2-search input {
-        background-position: 100% -21px !important;
-    }
-}
diff --git a/dashboard/lib/assets/packages/select2/select2.js b/dashboard/lib/assets/packages/select2/select2.js
deleted file mode 100755
index f2a75f3..0000000
--- a/dashboard/lib/assets/packages/select2/select2.js
+++ /dev/null
@@ -1,3397 +0,0 @@
-/*
-Copyright 2012 Igor Vaynberg
-
-Version: 3.4.6 Timestamp: Sat Mar 22 22:30:15 EDT 2014
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
-    http://www.apache.org/licenses/LICENSE-2.0
-    http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the
-Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
-the specific language governing permissions and limitations under the Apache License and the GPL License.
-*/
-(function ($) {
-    if(typeof $.fn.each2 == "undefined") {
-        $.extend($.fn, {
-            /*
-            * 4-10 times faster .each replacement
-            * use it carefully, as it overrides jQuery context of element on each iteration
-            */
-            each2 : function (c) {
-                var j = $([0]), i = -1, l = this.length;
-                while (
-                    ++i < l
-                    && (j.context = j[0] = this[i])
-                    && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
-                );
-                return this;
-            }
-        });
-    }
-})(jQuery);
-
-(function ($, undefined) {
-    "use strict";
-    /*global document, window, jQuery, console */
-
-    if (window.Select2 !== undefined) {
-        return;
-    }
-
-    var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
-        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
-
-    KEY = {
-        TAB: 9,
-        ENTER: 13,
-        ESC: 27,
-        SPACE: 32,
-        LEFT: 37,
-        UP: 38,
-        RIGHT: 39,
-        DOWN: 40,
-        SHIFT: 16,
-        CTRL: 17,
-        ALT: 18,
-        PAGE_UP: 33,
-        PAGE_DOWN: 34,
-        HOME: 36,
-        END: 35,
-        BACKSPACE: 8,
-        DELETE: 46,
-        isArrow: function (k) {
-            k = k.which ? k.which : k;
-            switch (k) {
-            case KEY.LEFT:
-            case KEY.RIGHT:
-            case KEY.UP:
-            case KEY.DOWN:
-                return true;
-            }
-            return false;
-        },
-        isControl: function (e) {
-            var k = e.which;
-            switch (k) {
-            case KEY.SHIFT:
-            case KEY.CTRL:
-            case KEY.ALT:
-                return true;
-            }
-
-            if (e.metaKey) return true;
-
-            return false;
-        },
-        isFunctionKey: function (k) {
-            k = k.which ? k.which : k;
-            return k >= 112 && k <= 123;
-        }
-    },
-    MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
-
-    DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"};
-
-    $document = $(document);
-
-    nextUid=(function() { var counter=1; return function() { return counter++; }; }());
-
-
-    function reinsertElement(element) {
-        var placeholder = $(document.createTextNode(''));
-
-        element.before(placeholder);
-        placeholder.before(element);
-        placeholder.remove();
-    }
-
-    function stripDiacritics(str) {
-        var ret, i, l, c;
-
-        if (!str || str.length < 1) return str;
-
-        ret = "";
-        for (i = 0, l = str.length; i < l; i++) {
-            c = str.charAt(i);
-            ret += DIACRITICS[c] || c;
-        }
-        return ret;
-    }
-
-    function indexOf(value, array) {
-        var i = 0, l = array.length;
-        for (; i < l; i = i + 1) {
-            if (equal(value, array[i])) return i;
-        }
-        return -1;
-    }
-
-    function measureScrollbar () {
-        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
-        $template.appendTo('body');
-
-        var dim = {
-            width: $template.width() - $template[0].clientWidth,
-            height: $template.height() - $template[0].clientHeight
-        };
-        $template.remove();
-
-        return dim;
-    }
-
-    /**
-     * Compares equality of a and b
-     * @param a
-     * @param b
-     */
-    function equal(a, b) {
-        if (a === b) return true;
-        if (a === undefined || b === undefined) return false;
-        if (a === null || b === null) return false;
-        // Check whether 'a' or 'b' is a string (primitive or object).
-        // The concatenation of an empty string (+'') converts its argument to a string's primitive.
-        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
-        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
-        return false;
-    }
-
-    /**
-     * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
-     * strings
-     * @param string
-     * @param separator
-     */
-    function splitVal(string, separator) {
-        var val, i, l;
-        if (string === null || string.length < 1) return [];
-        val = string.split(separator);
-        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
-        return val;
-    }
-
-    function getSideBorderPadding(element) {
-        return element.outerWidth(false) - element.width();
-    }
-
-    function installKeyUpChangeEvent(element) {
-        var key="keyup-change-value";
-        element.on("keydown", function () {
-            if ($.data(element, key) === undefined) {
-                $.data(element, key, element.val());
-            }
-        });
-        element.on("keyup", function () {
-            var val= $.data(element, key);
-            if (val !== undefined && element.val() !== val) {
-                $.removeData(element, key);
-                element.trigger("keyup-change");
-            }
-        });
-    }
-
-    $document.on("mousemove", function (e) {
-        lastMousePosition.x = e.pageX;
-        lastMousePosition.y = e.pageY;
-    });
-
-    /**
-     * filters mouse events so an event is fired only if the mouse moved.
-     *
-     * filters out mouse events that occur when mouse is stationary but
-     * the elements under the pointer are scrolled.
-     */
-    function installFilteredMouseMove(element) {
-        element.on("mousemove", function (e) {
-            var lastpos = lastMousePosition;
-            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
-                $(e.target).trigger("mousemove-filtered", e);
-            }
-        });
-    }
-
-    /**
-     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
-     * within the last quietMillis milliseconds.
-     *
-     * @param quietMillis number of milliseconds to wait before invoking fn
-     * @param fn function to be debounced
-     * @param ctx object to be used as this reference within fn
-     * @return debounced version of fn
-     */
-    function debounce(quietMillis, fn, ctx) {
-        ctx = ctx || undefined;
-        var timeout;
-        return function () {
-            var args = arguments;
-            window.clearTimeout(timeout);
-            timeout = window.setTimeout(function() {
-                fn.apply(ctx, args);
-            }, quietMillis);
-        };
-    }
-
-    /**
-     * A simple implementation of a thunk
-     * @param formula function used to lazily initialize the thunk
-     * @return {Function}
-     */
-    function thunk(formula) {
-        var evaluated = false,
-            value;
-        return function() {
-            if (evaluated === false) { value = formula(); evaluated = true; }
-            return value;
-        };
-    };
-
-    function installDebouncedScroll(threshold, element) {
-        var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
-        element.on("scroll", function (e) {
-            if (indexOf(e.target, element.get()) >= 0) notify(e);
-        });
-    }
-
-    function focus($el) {
-        if ($el[0] === document.activeElement) return;
-
-        /* set the focus in a 0 timeout - that way the focus is set after the processing
-            of the current event has finished - which seems like the only reliable way
-            to set focus */
-        window.setTimeout(function() {
-            var el=$el[0], pos=$el.val().length, range;
-
-            $el.focus();
-
-            /* make sure el received focus so we do not error out when trying to manipulate the caret.
-                sometimes modals or others listeners may steal it after its set */
-            var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
-            if (isVisible && el === document.activeElement) {
-
-                /* after the focus is set move the caret to the end, necessary when we val()
-                    just before setting focus */
-                if(el.setSelectionRange)
-                {
-                    el.setSelectionRange(pos, pos);
-                }
-                else if (el.createTextRange) {
-                    range = el.createTextRange();
-                    range.collapse(false);
-                    range.select();
-                }
-            }
-        }, 0);
-    }
-
-    function getCursorInfo(el) {
-        el = $(el)[0];
-        var offset = 0;
-        var length = 0;
-        if ('selectionStart' in el) {
-            offset = el.selectionStart;
-            length = el.selectionEnd - offset;
-        } else if ('selection' in document) {
-            el.focus();
-            var sel = document.selection.createRange();
-            length = document.selection.createRange().text.length;
-            sel.moveStart('character', -el.value.length);
-            offset = sel.text.length - length;
-        }
-        return { offset: offset, length: length };
-    }
-
-    function killEvent(event) {
-        event.preventDefault();
-        event.stopPropagation();
-    }
-    function killEventImmediately(event) {
-        event.preventDefault();
-        event.stopImmediatePropagation();
-    }
-
-    function measureTextWidth(e) {
-        if (!sizer){
-            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
-            sizer = $(document.createElement("div")).css({
-                position: "absolute",
-                left: "-10000px",
-                top: "-10000px",
-                display: "none",
-                fontSize: style.fontSize,
-                fontFamily: style.fontFamily,
-                fontStyle: style.fontStyle,
-                fontWeight: style.fontWeight,
-                letterSpacing: style.letterSpacing,
-                textTransform: style.textTransform,
-                whiteSpace: "nowrap"
-            });
-            sizer.attr("class","select2-sizer");
-            $("body").append(sizer);
-        }
-        sizer.text(e.val());
-        return sizer.width();
-    }
-
-    function syncCssClasses(dest, src, adapter) {
-        var classes, replacements = [], adapted;
-
-        classes = dest.attr("class");
-        if (classes) {
-            classes = '' + classes; // for IE which returns object
-            $(classes.split(" ")).each2(function() {
-                if (this.indexOf("select2-") === 0) {
-                    replacements.push(this);
-                }
-            });
-        }
-        classes = src.attr("class");
-        if (classes) {
-            classes = '' + classes; // for IE which returns object
-            $(classes.split(" ")).each2(function() {
-                if (this.indexOf("select2-") !== 0) {
-                    adapted = adapter(this);
-                    if (adapted) {
-                        replacements.push(adapted);
-                    }
-                }
-            });
-        }
-        dest.attr("class", replacements.join(" "));
-    }
-
-
-    function markMatch(text, term, markup, escapeMarkup) {
-        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
-            tl=term.length;
-
-        if (match<0) {
-            markup.push(escapeMarkup(text));
-            return;
-        }
-
-        markup.push(escapeMarkup(text.substring(0, match)));
-        markup.push("<span class='select2-match'>");
-        markup.push(escapeMarkup(text.substring(match, match + tl)));
-        markup.push("</span>");
-        markup.push(escapeMarkup(text.substring(match + tl, text.length)));
-    }
-
-    function defaultEscapeMarkup(markup) {
-        var replace_map = {
-            '\\': '&#92;',
-            '&': '&amp;',
-            '<': '&lt;',
-            '>': '&gt;',
-            '"': '&quot;',
-            "'": '&#39;',
-            "/": '&#47;'
-        };
-
-        return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
-            return replace_map[match];
-        });
-    }
-
-    /**
-     * Produces an ajax-based query function
-     *
-     * @param options object containing configuration parameters
-     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
-     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
-     * @param options.url url for the data
-     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
-     * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
-     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
-     * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
-     *      The expected format is an object containing the following keys:
-     *      results array of objects that will be used as choices
-     *      more (optional) boolean indicating whether there are more results available
-     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
-     */
-    function ajax(options) {
-        var timeout, // current scheduled but not yet executed request
-            handler = null,
-            quietMillis = options.quietMillis || 100,
-            ajaxUrl = options.url,
-            self = this;
-
-        return function (query) {
-            window.clearTimeout(timeout);
-            timeout = window.setTimeout(function () {
-                var data = options.data, // ajax data function
-                    url = ajaxUrl, // ajax url string or function
-                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,
-                    // deprecated - to be removed in 4.0  - use params instead
-                    deprecated = {
-                        type: options.type || 'GET', // set type of request (GET or POST)
-                        cache: options.cache || false,
-                        jsonpCallback: options.jsonpCallback||undefined,
-                        dataType: options.dataType||"json"
-                    },
-                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
-
-                data = data ? data.call(self, query.term, query.page, query.context) : null;
-                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
-
-                if (handler && typeof handler.abort === "function") { handler.abort(); }
-
-                if (options.params) {
-                    if ($.isFunction(options.params)) {
-                        $.extend(params, options.params.call(self));
-                    } else {
-                        $.extend(params, options.params);
-                    }
-                }
-
-                $.extend(params, {
-                    url: url,
-                    dataType: options.dataType,
-                    data: data,
-                    success: function (data) {
-                        // TODO - replace query.page with query so users have access to term, page, etc.
-                        var results = options.results(data, query.page);
-                        query.callback(results);
-                    }
-                });
-                handler = transport.call(self, params);
-            }, quietMillis);
-        };
-    }
-
-    /**
-     * Produces a query function that works with a local array
-     *
-     * @param options object containing configuration parameters. The options parameter can either be an array or an
-     * object.
-     *
-     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
-     *
-     * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
-     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
-     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
-     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
-     * the text.
-     */
-    function local(options) {
-        var data = options, // data elements
-            dataText,
-            tmp,
-            text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
-
-         if ($.isArray(data)) {
-            tmp = data;
-            data = { results: tmp };
-        }
-
-         if ($.isFunction(data) === false) {
-            tmp = data;
-            data = function() { return tmp; };
-        }
-
-        var dataItem = data();
-        if (dataItem.text) {
-            text = dataItem.text;
-            // if text is not a function we assume it to be a key name
-            if (!$.isFunction(text)) {
-                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
-                text = function (item) { return item[dataText]; };
-            }
-        }
-
-        return function (query) {
-            var t = query.term, filtered = { results: [] }, process;
-            if (t === "") {
-                query.callback(data());
-                return;
-            }
-
-            process = function(datum, collection) {
-                var group, attr;
-                datum = datum[0];
-                if (datum.children) {
-                    group = {};
-                    for (attr in datum) {
-                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
-                    }
-                    group.children=[];
-                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
-                    if (group.children.length || query.matcher(t, text(group), datum)) {
-                        collection.push(group);
-                    }
-                } else {
-                    if (query.matcher(t, text(datum), datum)) {
-                        collection.push(datum);
-                    }
-                }
-            };
-
-            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
-            query.callback(filtered);
-        };
-    }
-
-    // TODO javadoc
-    function tags(data) {
-        var isFunc = $.isFunction(data);
-        return function (query) {
-            var t = query.term, filtered = {results: []};
-            $(isFunc ? data() : data).each(function () {
-                var isObject = this.text !== undefined,
-                    text = isObject ? this.text : this;
-                if (t === "" || query.matcher(t, text)) {
-                    filtered.results.push(isObject ? this : {id: this, text: this});
-                }
-            });
-            query.callback(filtered);
-        };
-    }
-
-    /**
-     * Checks if the formatter function should be used.
-     *
-     * Throws an error if it is not a function. Returns true if it should be used,
-     * false if no formatting should be performed.
-     *
-     * @param formatter
-     */
-    function checkFormatter(formatter, formatterName) {
-        if ($.isFunction(formatter)) return true;
-        if (!formatter) return false;
-        if (typeof(formatter) === 'string') return true;
-        throw new Error(formatterName +" must be a string, function, or falsy value");
-    }
-
-    function evaluate(val) {
-        if ($.isFunction(val)) {
-            var args = Array.prototype.slice.call(arguments, 1);
-            return val.apply(null, args);
-        }
-        return val;
-    }
-
-    function countResults(results) {
-        var count = 0;
-        $.each(results, function(i, item) {
-            if (item.children) {
-                count += countResults(item.children);
-            } else {
-                count++;
-            }
-        });
-        return count;
-    }
-
-    /**
-     * Default tokenizer. This function uses breaks the input on substring match of any string from the
-     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
-     * two options have to be defined in order for the tokenizer to work.
-     *
-     * @param input text user has typed so far or pasted into the search field
-     * @param selection currently selected choices
-     * @param selectCallback function(choice) callback tho add the choice to selection
-     * @param opts select2's opts
-     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
-     */
-    function defaultTokenizer(input, selection, selectCallback, opts) {
-        var original = input, // store the original so we can compare and know if we need to tell the search to update its text
-            dupe = false, // check for whether a token we extracted represents a duplicate selected choice
-            token, // token
-            index, // position at which the separator was found
-            i, l, // looping variables
-            separator; // the matched separator
-
-        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
-
-        while (true) {
-            index = -1;
-
-            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
-                separator = opts.tokenSeparators[i];
-                index = input.indexOf(separator);
-                if (index >= 0) break;
-            }
-
-            if (index < 0) break; // did not find any token separator in the input string, bail
-
-            token = input.substring(0, index);
-            input = input.substring(index + separator.length);
-
-            if (token.length > 0) {
-                token = opts.createSearchChoice.call(this, token, selection);
-                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
-                    dupe = false;
-                    for (i = 0, l = selection.length; i < l; i++) {
-                        if (equal(opts.id(token), opts.id(selection[i]))) {
-                            dupe = true; break;
-                        }
-                    }
-
-                    if (!dupe) selectCallback(token);
-                }
-            }
-        }
-
-        if (original!==input) return input;
-    }
-
-    /**
-     * Creates a new class
-     *
-     * @param superClass
-     * @param methods
-     */
-    function clazz(SuperClass, methods) {
-        var constructor = function () {};
-        constructor.prototype = new SuperClass;
-        constructor.prototype.constructor = constructor;
-        constructor.prototype.parent = SuperClass.prototype;
-        constructor.prototype = $.extend(constructor.prototype, methods);
-        return constructor;
-    }
-
-    AbstractSelect2 = clazz(Object, {
-
-        // abstract
-        bind: function (func) {
-            var self = this;
-            return function () {
-                func.apply(self, arguments);
-            };
-        },
-
-        // abstract
-        init: function (opts) {
-            var results, search, resultsSelector = ".select2-results";
-
-            // prepare options
-            this.opts = opts = this.prepareOpts(opts);
-
-            this.id=opts.id;
-
-            // destroy if called on an existing component
-            if (opts.element.data("select2") !== undefined &&
-                opts.element.data("select2") !== null) {
-                opts.element.data("select2").destroy();
-            }
-
-            this.container = this.createContainer();
-
-            this.liveRegion = $("<span>", {
-                    role: "status",
-                    "aria-live": "polite"
-                })
-                .addClass("select2-hidden-accessible")
-                .appendTo(document.body);
-
-            this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()).replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
-            this.containerSelector="#"+this.containerId;
-            this.container.attr("id", this.containerId);
-
-            // cache the body so future lookups are cheap
-            this.body = thunk(function() { return opts.element.closest("body"); });
-
-            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
-
-            this.container.attr("style", opts.element.attr("style"));
-            this.container.css(evaluate(opts.containerCss));
-            this.container.addClass(evaluate(opts.containerCssClass));
-
-            this.elementTabIndex = this.opts.element.attr("tabindex");
-
-            // swap container for the element
-            this.opts.element
-                .data("select2", this)
-                .attr("tabindex", "-1")
-                .before(this.container)
-                .on("click.select2", killEvent); // do not leak click events
-
-            this.container.data("select2", this);
-
-            this.dropdown = this.container.find(".select2-drop");
-
-            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
-
-            this.dropdown.addClass(evaluate(opts.dropdownCssClass));
-            this.dropdown.data("select2", this);
-            this.dropdown.on("click", killEvent);
-
-            this.results = results = this.container.find(resultsSelector);
-            this.search = search = this.container.find("input.select2-input");
-
-            this.queryCount = 0;
-            this.resultsPage = 0;
-            this.context = null;
-
-            // initialize the container
-            this.initContainer();
-
-            this.container.on("click", killEvent);
-
-            installFilteredMouseMove(this.results);
-            this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));
-            this.dropdown.on("touchend", resultsSelector, this.bind(this.selectHighlighted));
-            this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
-            this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
-
-            installDebouncedScroll(80, this.results);
-            this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
-
-            // do not propagate change event from the search field out of the component
-            $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
-            $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
-
-            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
-            if ($.fn.mousewheel) {
-                results.mousewheel(function (e, delta, deltaX, deltaY) {
-                    var top = results.scrollTop();
-                    if (deltaY > 0 && top - deltaY <= 0) {
-                        results.scrollTop(0);
-                        killEvent(e);
-                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
-                        results.scrollTop(results.get(0).scrollHeight - results.height());
-                        killEvent(e);
-                    }
-                });
-            }
-
-            installKeyUpChangeEvent(search);
-            search.on("keyup-change input paste", this.bind(this.updateResults));
-            search.on("focus", function () { search.addClass("select2-focused"); });
-            search.on("blur", function () { search.removeClass("select2-focused");});
-
-            this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
-                if ($(e.target).closest(".select2-result-selectable").length > 0) {
-                    this.highlightUnderEvent(e);
-                    this.selectHighlighted(e);
-                }
-            }));
-
-            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
-            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
-            // dom it will trigger the popup close, which is not what we want
-            // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
-            this.dropdown.on("click mouseup mousedown focusin", function (e) { e.stopPropagation(); });
-
-            this.nextSearchTerm = undefined;
-
-            if ($.isFunction(this.opts.initSelection)) {
-                // initialize selection based on the current value of the source element
-                this.initSelection();
-
-                // if the user has provided a function that can set selection based on the value of the source element
-                // we monitor the change event on the element and trigger it, allowing for two way synchronization
-                this.monitorSource();
-            }
-
-            if (opts.maximumInputLength !== null) {
-                this.search.attr("maxlength", opts.maximumInputLength);
-            }
-
-            var disabled = opts.element.prop("disabled");
-            if (disabled === undefined) disabled = false;
-            this.enable(!disabled);
-
-            var readonly = opts.element.prop("readonly");
-            if (readonly === undefined) readonly = false;
-            this.readonly(readonly);
-
-            // Calculate size of scrollbar
-            scrollBarDimensions = scrollBarDimensions || measureScrollbar();
-
-            this.autofocus = opts.element.prop("autofocus");
-            opts.element.prop("autofocus", false);
-            if (this.autofocus) this.focus();
-
-            this.search.attr("placeholder", opts.searchInputPlaceholder);
-        },
-
-        // abstract
-        destroy: function () {
-            var element=this.opts.element, select2 = element.data("select2");
-
-            this.close();
-
-            if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
-
-            if (select2 !== undefined) {
-                select2.container.remove();
-                select2.liveRegion.remove();
-                select2.dropdown.remove();
-                element
-                    .removeClass("select2-offscreen")
-                    .removeData("select2")
-                    .off(".select2")
-                    .prop("autofocus", this.autofocus || false);
-                if (this.elementTabIndex) {
-                    element.attr({tabindex: this.elementTabIndex});
-                } else {
-                    element.removeAttr("tabindex");
-                }
-                element.show();
-            }
-        },
-
-        // abstract
-        optionToData: function(element) {
-            if (element.is("option")) {
-                return {
-                    id:element.prop("value"),
-                    text:element.text(),
-                    element: element.get(),
-                    css: element.attr("class"),
-                    disabled: element.prop("disabled"),
-                    locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
-                };
-            } else if (element.is("optgroup")) {
-                return {
-                    text:element.attr("label"),
-                    children:[],
-                    element: element.get(),
-                    css: element.attr("class")
-                };
-            }
-        },
-
-        // abstract
-        prepareOpts: function (opts) {
-            var element, select, idKey, ajaxUrl, self = this;
-
-            element = opts.element;
-
-            if (element.get(0).tagName.toLowerCase() === "select") {
-                this.select = select = opts.element;
-            }
-
-            if (select) {
-                // these options are not allowed when attached to a select because they are picked up off the element itself
-                $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
-                    if (this in opts) {
-                        throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
-                    }
-                });
-            }
-
-            opts = $.extend({}, {
-                populateResults: function(container, results, query) {
-                    var populate, id=this.opts.id, liveRegion=this.liveRegion;
-
-                    populate=function(results, container, depth) {
-
-                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
-
-                        results = opts.sortResults(results, container, query);
-
-                        for (i = 0, l = results.length; i < l; i = i + 1) {
-
-                            result=results[i];
-
-                            disabled = (result.disabled === true);
-                            selectable = (!disabled) && (id(result) !== undefined);
-
-                            compound=result.children && result.children.length > 0;
-
-                            node=$("<li></li>");
-                            node.addClass("select2-results-dept-"+depth);
-                            node.addClass("select2-result");
-                            node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
-                            if (disabled) { node.addClass("select2-disabled"); }
-                            if (compound) { node.addClass("select2-result-with-children"); }
-                            node.addClass(self.opts.formatResultCssClass(result));
-                            node.attr("role", "presentation");
-
-                            label=$(document.createElement("div"));
-                            label.addClass("select2-result-label");
-                            label.attr("id", "select2-result-label-" + nextUid());
-                            label.attr("role", "option");
-
-                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
-                            if (formatted!==undefined) {
-                                label.html(formatted);
-                                node.append(label);
-                            }
-
-
-                            if (compound) {
-
-                                innerContainer=$("<ul></ul>");
-                                innerContainer.addClass("select2-result-sub");
-                                populate(result.children, innerContainer, depth+1);
-                                node.append(innerContainer);
-                            }
-
-                            node.data("select2-data", result);
-                            container.append(node);
-                        }
-
-                        liveRegion.text(opts.formatMatches(results.length));
-                    };
-
-                    populate(results, container, 0);
-                }
-            }, $.fn.select2.defaults, opts);
-
-            if (typeof(opts.id) !== "function") {
-                idKey = opts.id;
-                opts.id = function (e) { return e[idKey]; };
-            }
-
-            if ($.isArray(opts.element.data("select2Tags"))) {
-                if ("tags" in opts) {
-                    throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
-                }
-                opts.tags=opts.element.data("select2Tags");
-            }
-
-            if (select) {
-                opts.query = this.bind(function (query) {
-                    var data = { results: [], more: false },
-                        term = query.term,
-                        children, placeholderOption, process;
-
-                    process=function(element, collection) {
-                        var group;
-                        if (element.is("option")) {
-                            if (query.matcher(term, element.text(), element)) {
-                                collection.push(self.optionToData(element));
-                            }
-                        } else if (element.is("optgroup")) {
-                            group=self.optionToData(element);
-                            element.children().each2(function(i, elm) { process(elm, group.children); });
-                            if (group.children.length>0) {
-                                collection.push(group);
-                            }
-                        }
-                    };
-
-                    children=element.children();
-
-                    // ignore the placeholder option if there is one
-                    if (this.getPlaceholder() !== undefined && children.length > 0) {
-                        placeholderOption = this.getPlaceholderOption();
-                        if (placeholderOption) {
-                            children=children.not(placeholderOption);
-                        }
-                    }
-
-                    children.each2(function(i, elm) { process(elm, data.results); });
-
-                    query.callback(data);
-                });
-                // this is needed because inside val() we construct choices from options and there id is hardcoded
-                opts.id=function(e) { return e.id; };
-            } else {
-                if (!("query" in opts)) {
-
-                    if ("ajax" in opts) {
-                        ajaxUrl = opts.element.data("ajax-url");
-                        if (ajaxUrl && ajaxUrl.length > 0) {
-                            opts.ajax.url = ajaxUrl;
-                        }
-                        opts.query = ajax.call(opts.element, opts.ajax);
-                    } else if ("data" in opts) {
-                        opts.query = local(opts.data);
-                    } else if ("tags" in opts) {
-                        opts.query = tags(opts.tags);
-                        if (opts.createSearchChoice === undefined) {
-                            opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
-                        }
-                        if (opts.initSelection === undefined) {
-                            opts.initSelection = function (element, callback) {
-                                var data = [];
-                                $(splitVal(element.val(), opts.separator)).each(function () {
-                                    var obj = { id: this, text: this },
-                                        tags = opts.tags;
-                                    if ($.isFunction(tags)) tags=tags();
-                                    $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
-                                    data.push(obj);
-                                });
-
-                                callback(data);
-                            };
-                        }
-                    }
-                }
-            }
-            if (typeof(opts.query) !== "function") {
-                throw "query function not defined for Select2 " + opts.element.attr("id");
-            }
-
-            if (opts.createSearchChoicePosition === 'top') {
-                opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
-            }
-            else if (opts.createSearchChoicePosition === 'bottom') {
-                opts.createSearchChoicePosition = function(list, item) { list.push(item); };
-            }
-            else if (typeof(opts.createSearchChoicePosition) !== "function")  {
-                throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
-            }
-
-            return opts;
-        },
-
-        /**
-         * Monitor the original element for changes and update select2 accordingly
-         */
-        // abstract
-        monitorSource: function () {
-            var el = this.opts.element, sync, observer;
-
-            el.on("change.select2", this.bind(function (e) {
-                if (this.opts.element.data("select2-change-triggered") !== true) {
-                    this.initSelection();
-                }
-            }));
-
-            sync = this.bind(function () {
-
-                // sync enabled state
-                var disabled = el.prop("disabled");
-                if (disabled === undefined) disabled = false;
-                this.enable(!disabled);
-
-                var readonly = el.prop("readonly");
-                if (readonly === undefined) readonly = false;
-                this.readonly(readonly);
-
-                syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
-                this.container.addClass(evaluate(this.opts.containerCssClass));
-
-                syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
-                this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));
-
-            });
-
-            // IE8-10
-            el.on("propertychange.select2", sync);
-
-            // hold onto a reference of the callback to work around a chromium bug
-            if (this.mutationCallback === undefined) {
-                this.mutationCallback = function (mutations) {
-                    mutations.forEach(sync);
-                }
-            }
-
-            // safari, chrome, firefox, IE11
-            observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
-            if (observer !== undefined) {
-                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
-                this.propertyObserver = new observer(this.mutationCallback);
-                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
-            }
-        },
-
-        // abstract
-        triggerSelect: function(data) {
-            var evt = $.Event("select2-selecting", { val: this.id(data), object: data });
-            this.opts.element.trigger(evt);
-            return !evt.isDefaultPrevented();
-        },
-
-        /**
-         * Triggers the change event on the source element
-         */
-        // abstract
-        triggerChange: function (details) {
-
-            details = details || {};
-            details= $.extend({}, details, { type: "change", val: this.val() });
-            // prevents recursive triggering
-            this.opts.element.data("select2-change-triggered", true);
-            this.opts.element.trigger(details);
-            this.opts.element.data("select2-change-triggered", false);
-
-            // some validation frameworks ignore the change event and listen instead to keyup, click for selects
-            // so here we trigger the click event manually
-            this.opts.element.click();
-
-            // ValidationEngine ignores the change event and listens instead to blur
-            // so here we trigger the blur event manually if so desired
-            if (this.opts.blurOnChange)
-                this.opts.element.blur();
-        },
-
-        //abstract
-        isInterfaceEnabled: function()
-        {
-            return this.enabledInterface === true;
-        },
-
-        // abstract
-        enableInterface: function() {
-            var enabled = this._enabled && !this._readonly,
-                disabled = !enabled;
-
-            if (enabled === this.enabledInterface) return false;
-
-            this.container.toggleClass("select2-container-disabled", disabled);
-            this.close();
-            this.enabledInterface = enabled;
-
-            return true;
-        },
-
-        // abstract
-        enable: function(enabled) {
-            if (enabled === undefined) enabled = true;
-            if (this._enabled === enabled) return;
-            this._enabled = enabled;
-
-            this.opts.element.prop("disabled", !enabled);
-            this.enableInterface();
-        },
-
-        // abstract
-        disable: function() {
-            this.enable(false);
-        },
-
-        // abstract
-        readonly: function(enabled) {
-            if (enabled === undefined) enabled = false;
-            if (this._readonly === enabled) return;
-            this._readonly = enabled;
-
-            this.opts.element.prop("readonly", enabled);
-            this.enableInterface();
-        },
-
-        // abstract
-        opened: function () {
-            return this.container.hasClass("select2-dropdown-open");
-        },
-
-        // abstract
-        positionDropdown: function() {
-            var $dropdown = this.dropdown,
-                offset = this.container.offset(),
-                height = this.container.outerHeight(false),
-                width = this.container.outerWidth(false),
-                dropHeight = $dropdown.outerHeight(false),
-                $window = $(window),
-                windowWidth = $window.width(),
-                windowHeight = $window.height(),
-                viewPortRight = $window.scrollLeft() + windowWidth,
-                viewportBottom = $window.scrollTop() + windowHeight,
-                dropTop = offset.top + height,
-                dropLeft = offset.left,
-                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
-                enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
-                dropWidth = $dropdown.outerWidth(false),
-                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
-                aboveNow = $dropdown.hasClass("select2-drop-above"),
-                bodyOffset,
-                above,
-                changeDirection,
-                css,
-                resultsListNode;
-
-            // always prefer the current above/below alignment, unless there is not enough room
-            if (aboveNow) {
-                above = true;
-                if (!enoughRoomAbove && enoughRoomBelow) {
-                    changeDirection = true;
-                    above = false;
-                }
-            } else {
-                above = false;
-                if (!enoughRoomBelow && enoughRoomAbove) {
-                    changeDirection = true;
-                    above = true;
-                }
-            }
-
-            //if we are changing direction we need to get positions when dropdown is hidden;
-            if (changeDirection) {
-                $dropdown.hide();
-                offset = this.container.offset();
-                height = this.container.outerHeight(false);
-                width = this.container.outerWidth(false);
-                dropHeight = $dropdown.outerHeight(false);
-                viewPortRight = $window.scrollLeft() + windowWidth;
-                viewportBottom = $window.scrollTop() + windowHeight;
-                dropTop = offset.top + height;
-                dropLeft = offset.left;
-                dropWidth = $dropdown.outerWidth(false);
-                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
-                $dropdown.show();
-            }
-
-            if (this.opts.dropdownAutoWidth) {
-                resultsListNode = $('.select2-results', $dropdown)[0];
-                $dropdown.addClass('select2-drop-auto-width');
-                $dropdown.css('width', '');
-                // Add scrollbar width to dropdown if vertical scrollbar is present
-                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
-                dropWidth > width ? width = dropWidth : dropWidth = width;
-                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
-            }
-            else {
-                this.container.removeClass('select2-drop-auto-width');
-            }
-
-            //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
-            //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);
-
-            // fix positioning when body has an offset and is not position: static
-            if (this.body().css('position') !== 'static') {
-                bodyOffset = this.body().offset();
-                dropTop -= bodyOffset.top;
-                dropLeft -= bodyOffset.left;
-            }
-
-            if (!enoughRoomOnRight) {
-                dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
-            }
-
-            css =  {
-                left: dropLeft,
-                width: width
-            };
-
-            if (above) {
-                css.top = offset.top - dropHeight;
-                css.bottom = 'auto';
-                this.container.addClass("select2-drop-above");
-                $dropdown.addClass("select2-drop-above");
-            }
-            else {
-                css.top = dropTop;
-                css.bottom = 'auto';
-                this.container.removeClass("select2-drop-above");
-                $dropdown.removeClass("select2-drop-above");
-            }
-            css = $.extend(css, evaluate(this.opts.dropdownCss));
-
-            $dropdown.css(css);
-        },
-
-        // abstract
-        shouldOpen: function() {
-            var event;
-
-            if (this.opened()) return false;
-
-            if (this._enabled === false || this._readonly === true) return false;
-
-            event = $.Event("select2-opening");
-            this.opts.element.trigger(event);
-            return !event.isDefaultPrevented();
-        },
-
-        // abstract
-        clearDropdownAlignmentPreference: function() {
-            // clear the classes used to figure out the preference of where the dropdown should be opened
-            this.container.removeClass("select2-drop-above");
-            this.dropdown.removeClass("select2-drop-above");
-        },
-
-        /**
-         * Opens the dropdown
-         *
-         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
-         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
-         */
-        // abstract
-        open: function () {
-
-            if (!this.shouldOpen()) return false;
-
-            this.opening();
-
-            return true;
-        },
-
-        /**
-         * Performs the opening of the dropdown
-         */
-        // abstract
-        opening: function() {
-            var cid = this.containerId,
-                scroll = "scroll." + cid,
-                resize = "resize."+cid,
-                orient = "orientationchange."+cid,
-                mask;
-
-            this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
-
-            this.clearDropdownAlignmentPreference();
-
-            if(this.dropdown[0] !== this.body().children().last()[0]) {
-                this.dropdown.detach().appendTo(this.body());
-            }
-
-            // create the dropdown mask if doesn't already exist
-            mask = $("#select2-drop-mask");
-            if (mask.length == 0) {
-                mask = $(document.createElement("div"));
-                mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
-                mask.hide();
-                mask.appendTo(this.body());
-                mask.on("mousedown touchstart click", function (e) {
-                    // Prevent IE from generating a click event on the body
-                    reinsertElement(mask);
-
-                    var dropdown = $("#select2-drop"), self;
-                    if (dropdown.length > 0) {
-                        self=dropdown.data("select2");
-                        if (self.opts.selectOnBlur) {
-                            self.selectHighlighted({noFocus: true});
-                        }
-                        self.close();
-                        e.preventDefault();
-                        e.stopPropagation();
-                    }
-                });
-            }
-
-            // ensure the mask is always right before the dropdown
-            if (this.dropdown.prev()[0] !== mask[0]) {
-                this.dropdown.before(mask);
-            }
-
-            // move the global id to the correct dropdown
-            $("#select2-drop").removeAttr("id");
-            this.dropdown.attr("id", "select2-drop");
-
-            // show the elements
-            mask.show();
-
-            this.positionDropdown();
-            this.dropdown.show();
-            this.positionDropdown();
-
-            this.dropdown.addClass("select2-drop-active");
-
-            // attach listeners to events that can change the position of the container and thus require
-            // the position of the dropdown to be updated as well so it does not come unglued from the container
-            var that = this;
-            this.container.parents().add(window).each(function () {
-                $(this).on(resize+" "+scroll+" "+orient, function (e) {
-                    that.positionDropdown();
-                });
-            });
-
-
-        },
-
-        // abstract
-        close: function () {
-            if (!this.opened()) return;
-
-            var cid = this.containerId,
-                scroll = "scroll." + cid,
-                resize = "resize."+cid,
-                orient = "orientationchange."+cid;
-
-            // unbind event listeners
-            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
-
-            this.clearDropdownAlignmentPreference();
-
-            $("#select2-drop-mask").hide();
-            this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
-            this.dropdown.hide();
-            this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
-            this.results.empty();
-
-
-            this.clearSearch();
-            this.search.removeClass("select2-active");
-            this.opts.element.trigger($.Event("select2-close"));
-        },
-
-        /**
-         * Opens control, sets input value, and updates results.
-         */
-        // abstract
-        externalSearch: function (term) {
-            this.open();
-            this.search.val(term);
-            this.updateResults(false);
-        },
-
-        // abstract
-        clearSearch: function () {
-
-        },
-
-        //abstract
-        getMaximumSelectionSize: function() {
-            return evaluate(this.opts.maximumSelectionSize);
-        },
-
-        // abstract
-        ensureHighlightVisible: function () {
-            var results = this.results, children, index, child, hb, rb, y, more;
-
-            index = this.highlight();
-
-            if (index < 0) return;
-
-            if (index == 0) {
-
-                // if the first element is highlighted scroll all the way to the top,
-                // that way any unselectable headers above it will also be scrolled
-                // into view
-
-                results.scrollTop(0);
-                return;
-            }
-
-            children = this.findHighlightableChoices().find('.select2-result-label');
-
-            child = $(children[index]);
-
-            hb = child.offset().top + child.outerHeight(true);
-
-            // if this is the last child lets also make sure select2-more-results is visible
-            if (index === children.length - 1) {
-                more = results.find("li.select2-more-results");
-                if (more.length > 0) {
-                    hb = more.offset().top + more.outerHeight(true);
-                }
-            }
-
-            rb = results.offset().top + results.outerHeight(true);
-            if (hb > rb) {
-                results.scrollTop(results.scrollTop() + (hb - rb));
-            }
-            y = child.offset().top - results.offset().top;
-
-            // make sure the top of the element is visible
-            if (y < 0 && child.css('display') != 'none' ) {
-                results.scrollTop(results.scrollTop() + y); // y is negative
-            }
-        },
-
-        // abstract
-        findHighlightableChoices: function() {
-            return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
-        },
-
-        // abstract
-        moveHighlight: function (delta) {
-            var choices = this.findHighlightableChoices(),
-                index = this.highlight();
-
-            while (index > -1 && index < choices.length) {
-                index += delta;
-                var choice = $(choices[index]);
-                if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
-                    this.highlight(index);
-                    break;
-                }
-            }
-        },
-
-        // abstract
-        highlight: function (index) {
-            var choices = this.findHighlightableChoices(),
-                choice,
-                data;
-
-            if (arguments.length === 0) {
-                return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
-            }
-
-            if (index >= choices.length) index = choices.length - 1;
-            if (index < 0) index = 0;
-
-            this.removeHighlight();
-
-            choice = $(choices[index]);
-            choice.addClass("select2-highlighted");
-
-            // ensure assistive technology can determine the active choice
-            this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
-
-            this.ensureHighlightVisible();
-
-            this.liveRegion.text(choice.text());
-
-            data = choice.data("select2-data");
-            if (data) {
-                this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
-            }
-        },
-
-        removeHighlight: function() {
-            this.results.find(".select2-highlighted").removeClass("select2-highlighted");
-        },
-
-        touchMoved: function() {
-            this._touchMoved = true;
-        },
-
-        clearTouchMoved: function() {
-          this._touchMoved = false;
-        },
-
-        // abstract
-        countSelectableResults: function() {
-            return this.findHighlightableChoices().length;
-        },
-
-        // abstract
-        highlightUnderEvent: function (event) {
-            var el = $(event.target).closest(".select2-result-selectable");
-            if (el.length > 0 && !el.is(".select2-highlighted")) {
-                var choices = this.findHighlightableChoices();
-                this.highlight(choices.index(el));
-            } else if (el.length == 0) {
-                // if we are over an unselectable item remove all highlights
-                this.removeHighlight();
-            }
-        },
-
-        // abstract
-        loadMoreIfNeeded: function () {
-            var results = this.results,
-                more = results.find("li.select2-more-results"),
-                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
-                page = this.resultsPage + 1,
-                self=this,
-                term=this.search.val(),
-                context=this.context;
-
-            if (more.length === 0) return;
-            below = more.offset().top - results.offset().top - results.height();
-
-            if (below <= this.opts.loadMorePadding) {
-                more.addClass("select2-active");
-                this.opts.query({
-                        element: this.opts.element,
-                        term: term,
-                        page: page,
-                        context: context,
-                        matcher: this.opts.matcher,
-                        callback: this.bind(function (data) {
-
-                    // ignore a response if the select2 has been closed before it was received
-                    if (!self.opened()) return;
-
-
-                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
-                    self.postprocessResults(data, false, false);
-
-                    if (data.more===true) {
-                        more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, page+1));
-                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
-                    } else {
-                        more.remove();
-                    }
-                    self.positionDropdown();
-                    self.resultsPage = page;
-                    self.context = data.context;
-                    this.opts.element.trigger({ type: "select2-loaded", items: data });
-                })});
-            }
-        },
-
-        /**
-         * Default tokenizer function which does nothing
-         */
-        tokenize: function() {
-
-        },
-
-        /**
-         * @param initial whether or not this is the call to this method right after the dropdown has been opened
-         */
-        // abstract
-        updateResults: function (initial) {
-            var search = this.search,
-                results = this.results,
-                opts = this.opts,
-                data,
-                self = this,
-                input,
-                term = search.val(),
-                lastTerm = $.data(this.container, "select2-last-term"),
-                // sequence number used to drop out-of-order responses
-                queryNumber;
-
-            // prevent duplicate queries against the same term
-            if (initial !== true && lastTerm && equal(term, lastTerm)) return;
-
-            $.data(this.container, "select2-last-term", term);
-
-            // if the search is currently hidden we do not alter the results
-            if (initial !== true && (this.showSearchInput === false || !this.opened())) {
-                return;
-            }
-
-            function postRender() {
-                search.removeClass("select2-active");
-                self.positionDropdown();
-                if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
-                    self.liveRegion.text(results.text());
-                }
-                else {
-                    self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));
-                }
-            }
-
-            function render(html) {
-                results.html(html);
-                postRender();
-            }
-
-            queryNumber = ++this.queryCount;
-
-            var maxSelSize = this.getMaximumSelectionSize();
-            if (maxSelSize >=1) {
-                data = this.data();
-                if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
-                    render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, maxSelSize) + "</li>");
-                    return;
-                }
-            }
-
-            if (search.val().length < opts.minimumInputLength) {
-                if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
-                    render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, search.val(), opts.minimumInputLength) + "</li>");
-                } else {
-                    render("");
-                }
-                if (initial && this.showSearch) this.showSearch(true);
-                return;
-            }
-
-            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
-                if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
-                    render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, search.val(), opts.maximumInputLength) + "</li>");
-                } else {
-                    render("");
-                }
-                return;
-            }
-
-            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
-                render("<li class='select2-searching'>" + evaluate(opts.formatSearching) + "</li>");
-            }
-
-            search.addClass("select2-active");
-
-            this.removeHighlight();
-
-            // give the tokenizer a chance to pre-process the input
-            input = this.tokenize();
-            if (input != undefined && input != null) {
-                search.val(input);
-            }
-
-            this.resultsPage = 1;
-
-            opts.query({
-                element: opts.element,
-                    term: search.val(),
-                    page: this.resultsPage,
-                    context: null,
-                    matcher: opts.matcher,
-                    callback: this.bind(function (data) {
-                var def; // default choice
-
-                // ignore old responses
-                if (queryNumber != this.queryCount) {
-                  return;
-                }
-
-                // ignore a response if the select2 has been closed before it was received
-                if (!this.opened()) {
-                    this.search.removeClass("select2-active");
-                    return;
-                }
-
-                // save context, if any
-                this.context = (data.context===undefined) ? null : data.context;
-                // create a default choice and prepend it to the list
-                if (this.opts.createSearchChoice && search.val() !== "") {
-                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);
-                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
-                        if ($(data.results).filter(
-                            function () {
-                                return equal(self.id(this), self.id(def));
-                            }).length === 0) {
-                            this.opts.createSearchChoicePosition(data.results, def);
-                        }
-                    }
-                }
-
-                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
-                    render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, search.val()) + "</li>");
-                    return;
-                }
-
-                results.empty();
-                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
-
-                if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
-                    results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(evaluate(opts.formatLoadMore, this.resultsPage)) + "</li>");
-                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
-                }
-
-                this.postprocessResults(data, initial);
-
-                postRender();
-
-                this.opts.element.trigger({ type: "select2-loaded", items: data });
-            })});
-        },
-
-        // abstract
-        cancel: function () {
-            this.close();
-        },
-
-        // abstract
-        blur: function () {
-            // if selectOnBlur == true, select the currently highlighted option
-            if (this.opts.selectOnBlur)
-                this.selectHighlighted({noFocus: true});
-
-            this.close();
-            this.container.removeClass("select2-container-active");
-            // synonymous to .is(':focus'), which is available in jquery >= 1.6
-            if (this.search[0] === document.activeElement) { this.search.blur(); }
-            this.clearSearch();
-            this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
-        },
-
-        // abstract
-        focusSearch: function () {
-            focus(this.search);
-        },
-
-        // abstract
-        selectHighlighted: function (options) {
-            if (this._touchMoved) {
-              this.clearTouchMoved();
-              return;
-            }
-            var index=this.highlight(),
-                highlighted=this.results.find(".select2-highlighted"),
-                data = highlighted.closest('.select2-result').data("select2-data");
-
-            if (data) {
-                this.highlight(index);
-                this.onSelect(data, options);
-            } else if (options && options.noFocus) {
-                this.close();
-            }
-        },
-
-        // abstract
-        getPlaceholder: function () {
-            var placeholderOption;
-            return this.opts.element.attr("placeholder") ||
-                this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
-                this.opts.element.data("placeholder") ||
-                this.opts.placeholder ||
-                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
-        },
-
-        // abstract
-        getPlaceholderOption: function() {
-            if (this.select) {
-                var firstOption = this.select.children('option').first();
-                if (this.opts.placeholderOption !== undefined ) {
-                    //Determine the placeholder option based on the specified placeholderOption setting
-                    return (this.opts.placeholderOption === "first" && firstOption) ||
-                           (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
-                } else if (firstOption.text() === "" && firstOption.val() === "") {
-                    //No explicit placeholder option specified, use the first if it's blank
-                    return firstOption;
-                }
-            }
-        },
-
-        /**
-         * Get the desired width for the container element.  This is
-         * derived first from option `width` passed to select2, then
-         * the inline 'style' on the original element, and finally
-         * falls back to the jQuery calculated element width.
-         */
-        // abstract
-        initContainerWidth: function () {
-            function resolveContainerWidth() {
-                var style, attrs, matches, i, l, attr;
-
-                if (this.opts.width === "off") {
-                    return null;
-                } else if (this.opts.width === "element"){
-                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
-                } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
-                    // check if there is inline style on the element that contains width
-                    style = this.opts.element.attr('style');
-                    if (style !== undefined) {
-                        attrs = style.split(';');
-                        for (i = 0, l = attrs.length; i < l; i = i + 1) {
-                            attr = attrs[i].replace(/\s/g, '');
-                            matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
-                            if (matches !== null && matches.length >= 1)
-                                return matches[1];
-                        }
-                    }
-
-                    if (this.opts.width === "resolve") {
-                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible
-                        // when attached to input type=hidden or elements hidden via css
-                        style = this.opts.element.css('width');
-                        if (style.indexOf("%") > 0) return style;
-
-                        // finally, fallback on the calculated width of the element
-                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
-                    }
-
-                    return null;
-                } else if ($.isFunction(this.opts.width)) {
-                    return this.opts.width();
-                } else {
-                    return this.opts.width;
-               }
-            };
-
-            var width = resolveContainerWidth.call(this);
-            if (width !== null) {
-                this.container.css("width", width);
-            }
-        }
-    });
-
-    SingleSelect2 = clazz(AbstractSelect2, {
-
-        // single
-
-        createContainer: function () {
-            var container = $(document.createElement("div")).attr({
-                "class": "select2-container"
-            }).html([
-                "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
-                "   <span class='select2-chosen'>&nbsp;</span><abbr class='select2-search-choice-close'></abbr>",
-                "   <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
-                "</a>",
-                "<label for='' class='select2-offscreen'></label>",
-                "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
-                "<div class='select2-drop select2-display-none'>",
-                "   <div class='select2-search'>",
-                "       <label for='' class='select2-offscreen'></label>",
-                "       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
-                "       aria-autocomplete='list' />",
-                "   </div>",
-                "   <ul class='select2-results' role='listbox'>",
-                "   </ul>",
-                "</div>"].join(""));
-            return container;
-        },
-
-        // single
-        enableInterface: function() {
-            if (this.parent.enableInterface.apply(this, arguments)) {
-                this.focusser.prop("disabled", !this.isInterfaceEnabled());
-            }
-        },
-
-        // single
-        opening: function () {
-            var el, range, len;
-
-            if (this.opts.minimumResultsForSearch >= 0) {
-                this.showSearch(true);
-            }
-
-            this.parent.opening.apply(this, arguments);
-
-            if (this.showSearchInput !== false) {
-                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
-                // all other browsers handle this just fine
-
-                this.search.val(this.focusser.val());
-            }
-            this.search.focus();
-            // move the cursor to the end after focussing, otherwise it will be at the beginning and
-            // new text will appear *before* focusser.val()
-            el = this.search.get(0);
-            if (el.createTextRange) {
-                range = el.createTextRange();
-                range.collapse(false);
-                range.select();
-            } else if (el.setSelectionRange) {
-                len = this.search.val().length;
-                el.setSelectionRange(len, len);
-            }
-
-            // initializes search's value with nextSearchTerm (if defined by user)
-            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
-            if(this.search.val() === "") {
-                if(this.nextSearchTerm != undefined){
-                    this.search.val(this.nextSearchTerm);
-                    this.search.select();
-                }
-            }
-
-            this.focusser.prop("disabled", true).val("");
-            this.updateResults(true);
-            this.opts.element.trigger($.Event("select2-open"));
-        },
-
-        // single
-        close: function () {
-            if (!this.opened()) return;
-            this.parent.close.apply(this, arguments);
-
-            this.focusser.prop("disabled", false);
-
-            if (this.opts.shouldFocusInput(this)) {
-                this.focusser.focus();
-            }
-        },
-
-        // single
-        focus: function () {
-            if (this.opened()) {
-                this.close();
-            } else {
-                this.focusser.prop("disabled", false);
-                if (this.opts.shouldFocusInput(this)) {
-                    this.focusser.focus();
-                }
-            }
-        },
-
-        // single
-        isFocused: function () {
-            return this.container.hasClass("select2-container-active");
-        },
-
-        // single
-        cancel: function () {
-            this.parent.cancel.apply(this, arguments);
-            this.focusser.prop("disabled", false);
-
-            if (this.opts.shouldFocusInput(this)) {
-                this.focusser.focus();
-            }
-        },
-
-        // single
-        destroy: function() {
-            $("label[for='" + this.focusser.attr('id') + "']")
-                .attr('for', this.opts.element.attr("id"));
-            this.parent.destroy.apply(this, arguments);
-        },
-
-        // single
-        initContainer: function () {
-
-            var selection,
-                container = this.container,
-                dropdown = this.dropdown,
-                idSuffix = nextUid(),
-                elementLabel;
-
-            if (this.opts.minimumResultsForSearch < 0) {
-                this.showSearch(false);
-            } else {
-                this.showSearch(true);
-            }
-
-            this.selection = selection = container.find(".select2-choice");
-
-            this.focusser = container.find(".select2-focusser");
-
-            // add aria associations
-            selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
-            this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
-            this.results.attr("id", "select2-results-"+idSuffix);
-            this.search.attr("aria-owns", "select2-results-"+idSuffix);
-
-            // rewrite labels from original element to focusser
-            this.focusser.attr("id", "s2id_autogen"+idSuffix);
-
-            elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
-
-            this.focusser.prev()
-                .text(elementLabel.text())
-                .attr('for', this.focusser.attr('id'));
-
-            // Ensure the original element retains an accessible name
-            var originalTitle = this.opts.element.attr("title");
-            this.opts.element.attr("title", (originalTitle || elementLabel.text()));
-
-            this.focusser.attr("tabindex", this.elementTabIndex);
-
-            // write label for search field using the label from the focusser element
-            this.search.attr("id", this.focusser.attr('id') + '_search');
-
-            this.search.prev()
-                .text($("label[for='" + this.focusser.attr('id') + "']").text())
-                .attr('for', this.search.attr('id'));
-
-            this.search.on("keydown", this.bind(function (e) {
-                if (!this.isInterfaceEnabled()) return;
-
-                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
-                    // prevent the page from scrolling
-                    killEvent(e);
-                    return;
-                }
-
-                switch (e.which) {
-                    case KEY.UP:
-                    case KEY.DOWN:
-                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
-                        killEvent(e);
-                        return;
-                    case KEY.ENTER:
-                        this.selectHighlighted();
-                        killEvent(e);
-                        return;
-                    case KEY.TAB:
-                        this.selectHighlighted({noFocus: true});
-                        return;
-                    case KEY.ESC:
-                        this.cancel(e);
-                        killEvent(e);
-                        return;
-                }
-            }));
-
-            this.search.on("blur", this.bind(function(e) {
-                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
-                // without this the search field loses focus which is annoying
-                if (document.activeElement === this.body().get(0)) {
-                    window.setTimeout(this.bind(function() {
-                        if (this.opened()) {
-                            this.search.focus();
-                        }
-                    }), 0);
-                }
-            }));
-
-            this.focusser.on("keydown", this.bind(function (e) {
-                if (!this.isInterfaceEnabled()) return;
-
-                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
-                    return;
-                }
-
-                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
-                    killEvent(e);
-                    return;
-                }
-
-                if (e.which == KEY.DOWN || e.which == KEY.UP
-                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
-
-                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
-
-                    this.open();
-                    killEvent(e);
-                    return;
-                }
-
-                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
-                    if (this.opts.allowClear) {
-                        this.clear();
-                    }
-                    killEvent(e);
-                    return;
-                }
-            }));
-
-
-            installKeyUpChangeEvent(this.focusser);
-            this.focusser.on("keyup-change input", this.bind(function(e) {
-                if (this.opts.minimumResultsForSearch >= 0) {
-                    e.stopPropagation();
-                    if (this.opened()) return;
-                    this.open();
-                }
-            }));
-
-            selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
-                if (!this.isInterfaceEnabled()) return;
-                this.clear();
-                killEventImmediately(e);
-                this.close();
-                this.selection.focus();
-            }));
-
-            selection.on("mousedown touchstart", this.bind(function (e) {
-                // Prevent IE from generating a click event on the body
-                reinsertElement(selection);
-
-                if (!this.container.hasClass("select2-container-active")) {
-                    this.opts.element.trigger($.Event("select2-focus"));
-                }
-
-                if (this.opened()) {
-                    this.close();
-                } else if (this.isInterfaceEnabled()) {
-                    this.open();
-                }
-
-                killEvent(e);
-            }));
-
-            dropdown.on("mousedown touchstart", this.bind(function() { this.search.focus(); }));
-
-            selection.on("focus", this.bind(function(e) {
-                killEvent(e);
-            }));
-
-            this.focusser.on("focus", this.bind(function(){
-                if (!this.container.hasClass("select2-container-active")) {
-                    this.opts.element.trigger($.Event("select2-focus"));
-                }
-                this.container.addClass("select2-container-active");
-            })).on("blur", this.bind(function() {
-                if (!this.opened()) {
-                    this.container.removeClass("select2-container-active");
-                    this.opts.element.trigger($.Event("select2-blur"));
-                }
-            }));
-            this.search.on("focus", this.bind(function(){
-                if (!this.container.hasClass("select2-container-active")) {
-                    this.opts.element.trigger($.Event("select2-focus"));
-                }
-                this.container.addClass("select2-container-active");
-            }));
-
-            this.initContainerWidth();
-            this.opts.element.addClass("select2-offscreen");
-            this.setPlaceholder();
-
-        },
-
-        // single
-        clear: function(triggerChange) {
-            var data=this.selection.data("select2-data");
-            if (data) { // guard against queued quick consecutive clicks
-                var evt = $.Event("select2-clearing");
-                this.opts.element.trigger(evt);
-                if (evt.isDefaultPrevented()) {
-                    return;
-                }
-                var placeholderOption = this.getPlaceholderOption();
-                this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
-                this.selection.find(".select2-chosen").empty();
-                this.selection.removeData("select2-data");
-                this.setPlaceholder();
-
-                if (triggerChange !== false){
-                    this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
-                    this.triggerChange({removed:data});
-                }
-            }
-        },
-
-        /**
-         * Sets selection based on source element's value
-         */
-        // single
-        initSelection: function () {
-            var selected;
-            if (this.isPlaceholderOptionSelected()) {
-                this.updateSelection(null);
-                this.close();
-                this.setPlaceholder();
-            } else {
-                var self = this;
-                this.opts.initSelection.call(null, this.opts.element, function(selected){
-                    if (selected !== undefined && selected !== null) {
-                        self.updateSelection(selected);
-                        self.close();
-                        self.setPlaceholder();
-                        self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
-                    }
-                });
-            }
-        },
-
-        isPlaceholderOptionSelected: function() {
-            var placeholderOption;
-            if (!this.getPlaceholder()) return false; // no placeholder specified so no option should be considered
-            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
-                || (this.opts.element.val() === "")
-                || (this.opts.element.val() === undefined)
-                || (this.opts.element.val() === null);
-        },
-
-        // single
-        prepareOpts: function () {
-            var opts = this.parent.prepareOpts.apply(this, arguments),
-                self=this;
-
-            if (opts.element.get(0).tagName.toLowerCase() === "select") {
-                // install the selection initializer
-                opts.initSelection = function (element, callback) {
-                    var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
-                    // a single select box always has a value, no need to null check 'selected'
-                    callback(self.optionToData(selected));
-                };
-            } else if ("data" in opts) {
-                // install default initSelection when applied to hidden input and data is local
-                opts.initSelection = opts.initSelection || function (element, callback) {
-                    var id = element.val();
-                    //search in data by id, storing the actual matching item
-                    var match = null;
-                    opts.query({
-                        matcher: function(term, text, el){
-                            var is_match = equal(id, opts.id(el));
-                            if (is_match) {
-                                match = el;
-                            }
-                            return is_match;
-                        },
-                        callback: !$.isFunction(callback) ? $.noop : function() {
-                            callback(match);
-                        }
-                    });
-                };
-            }
-
-            return opts;
-        },
-
-        // single
-        getPlaceholder: function() {
-            // if a placeholder is specified on a single select without a valid placeholder option ignore it
-            if (this.select) {
-                if (this.getPlaceholderOption() === undefined) {
-                    return undefined;
-                }
-            }
-
-            return this.parent.getPlaceholder.apply(this, arguments);
-        },
-
-        // single
-        setPlaceholder: function () {
-            var placeholder = this.getPlaceholder();
-
-            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
-
-                // check for a placeholder option if attached to a select
-                if (this.select && this.getPlaceholderOption() === undefined) return;
-
-                this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
-
-                this.selection.addClass("select2-default");
-
-                this.container.removeClass("select2-allowclear");
-            }
-        },
-
-        // single
-        postprocessResults: function (data, initial, noHighlightUpdate) {
-            var selected = 0, self = this, showSearchInput = true;
-
-            // find the selected element in the result list
-
-            this.findHighlightableChoices().each2(function (i, elm) {
-                if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
-                    selected = i;
-                    return false;
-                }
-            });
-
-            // and highlight it
-            if (noHighlightUpdate !== false) {
-                if (initial === true && selected >= 0) {
-                    this.highlight(selected);
-                } else {
-                    this.highlight(0);
-                }
-            }
-
-            // hide the search box if this is the first we got the results and there are enough of them for search
-
-            if (initial === true) {
-                var min = this.opts.minimumResultsForSearch;
-                if (min >= 0) {
-                    this.showSearch(countResults(data.results) >= min);
-                }
-            }
-        },
-
-        // single
-        showSearch: function(showSearchInput) {
-            if (this.showSearchInput === showSearchInput) return;
-
-            this.showSearchInput = showSearchInput;
-
-            this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
-            this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
-            //add "select2-with-searchbox" to the container if search box is shown
-            $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
-        },
-
-        // single
-        onSelect: function (data, options) {
-
-            if (!this.triggerSelect(data)) { return; }
-
-            var old = this.opts.element.val(),
-                oldData = this.data();
-
-            this.opts.element.val(this.id(data));
-            this.updateSelection(data);
-
-            this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
-
-            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
-            this.close();
-
-            if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
-                this.focusser.focus();
-            }
-
-            if (!equal(old, this.id(data))) {
-                this.triggerChange({ added: data, removed: oldData });
-            }
-        },
-
-        // single
-        updateSelection: function (data) {
-
-            var container=this.selection.find(".select2-chosen"), formatted, cssClass;
-
-            this.selection.data("select2-data", data);
-
-            container.empty();
-            if (data !== null) {
-                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
-            }
-            if (formatted !== undefined) {
-                container.append(formatted);
-            }
-            cssClass=this.opts.formatSelectionCssClass(data, container);
-            if (cssClass !== undefined) {
-                container.addClass(cssClass);
-            }
-
-            this.selection.removeClass("select2-default");
-
-            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
-                this.container.addClass("select2-allowclear");
-            }
-        },
-
-        // single
-        val: function () {
-            var val,
-                triggerChange = false,
-                data = null,
-                self = this,
-                oldData = this.data();
-
-            if (arguments.length === 0) {
-                return this.opts.element.val();
-            }
-
-            val = arguments[0];
-
-            if (arguments.length > 1) {
-                triggerChange = arguments[1];
-            }
-
-            if (this.select) {
-                this.select
-                    .val(val)
-                    .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
-                        data = self.optionToData(elm);
-                        return false;
-                    });
-                this.updateSelection(data);
-                this.setPlaceholder();
-                if (triggerChange) {
-                    this.triggerChange({added: data, removed:oldData});
-                }
-            } else {
-                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
-                if (!val && val !== 0) {
-                    this.clear(triggerChange);
-                    return;
-                }
-                if (this.opts.initSelection === undefined) {
-                    throw new Error("cannot call val() if initSelection() is not defined");
-                }
-                this.opts.element.val(val);
-                this.opts.initSelection(this.opts.element, function(data){
-                    self.opts.element.val(!data ? "" : self.id(data));
-                    self.updateSelection(data);
-                    self.setPlaceholder();
-                    if (triggerChange) {
-                        self.triggerChange({added: data, removed:oldData});
-                    }
-                });
-            }
-        },
-
-        // single
-        clearSearch: function () {
-            this.search.val("");
-            this.focusser.val("");
-        },
-
-        // single
-        data: function(value) {
-            var data,
-                triggerChange = false;
-
-            if (arguments.length === 0) {
-                data = this.selection.data("select2-data");
-                if (data == undefined) data = null;
-                return data;
-            } else {
-                if (arguments.length > 1) {
-                    triggerChange = arguments[1];
-                }
-                if (!value) {
-                    this.clear(triggerChange);
-                } else {
-                    data = this.data();
-                    this.opts.element.val(!value ? "" : this.id(value));
-                    this.updateSelection(value);
-                    if (triggerChange) {
-                        this.triggerChange({added: value, removed:data});
-                    }
-                }
-            }
-        }
-    });
-
-    MultiSelect2 = clazz(AbstractSelect2, {
-
-        // multi
-        createContainer: function () {
-            var container = $(document.createElement("div")).attr({
-                "class": "select2-container select2-container-multi"
-            }).html([
-                "<ul class='select2-choices'>",
-                "  <li class='select2-search-field'>",
-                "    <label for='' class='select2-offscreen'></label>",
-                "    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
-                "  </li>",
-                "</ul>",
-                "<div class='select2-drop select2-drop-multi select2-display-none'>",
-                "   <ul class='select2-results'>",
-                "   </ul>",
-                "</div>"].join(""));
-            return container;
-        },
-
-        // multi
-        prepareOpts: function () {
-            var opts = this.parent.prepareOpts.apply(this, arguments),
-                self=this;
-
-            // TODO validate placeholder is a string if specified
-
-            if (opts.element.get(0).tagName.toLowerCase() === "select") {
-                // install the selection initializer
-                opts.initSelection = function (element, callback) {
-
-                    var data = [];
-
-                    element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
-                        data.push(self.optionToData(elm));
-                    });
-                    callback(data);
-                };
-            } else if ("data" in opts) {
-                // install default initSelection when applied to hidden input and data is local
-                opts.initSelection = opts.initSelection || function (element, callback) {
-                    var ids = splitVal(element.val(), opts.separator);
-                    //search in data by array of ids, storing matching items in a list
-                    var matches = [];
-                    opts.query({
-                        matcher: function(term, text, el){
-                            var is_match = $.grep(ids, function(id) {
-                                return equal(id, opts.id(el));
-                            }).length;
-                            if (is_match) {
-                                matches.push(el);
-                            }
-                            return is_match;
-                        },
-                        callback: !$.isFunction(callback) ? $.noop : function() {
-                            // reorder matches based on the order they appear in the ids array because right now
-                            // they are in the order in which they appear in data array
-                            var ordered = [];
-                            for (var i = 0; i < ids.length; i++) {
-                                var id = ids[i];
-                                for (var j = 0; j < matches.length; j++) {
-                                    var match = matches[j];
-                                    if (equal(id, opts.id(match))) {
-                                        ordered.push(match);
-                                        matches.splice(j, 1);
-                                        break;
-                                    }
-                                }
-                            }
-                            callback(ordered);
-                        }
-                    });
-                };
-            }
-
-            return opts;
-        },
-
-        // multi
-        selectChoice: function (choice) {
-
-            var selected = this.container.find(".select2-search-choice-focus");
-            if (selected.length && choice && choice[0] == selected[0]) {
-
-            } else {
-                if (selected.length) {
-                    this.opts.element.trigger("choice-deselected", selected);
-                }
-                selected.removeClass("select2-search-choice-focus");
-                if (choice && choice.length) {
-                    this.close();
-                    choice.addClass("select2-search-choice-focus");
-                    this.opts.element.trigger("choice-selected", choice);
-                }
-            }
-        },
-
-        // multi
-        destroy: function() {
-            $("label[for='" + this.search.attr('id') + "']")
-                .attr('for', this.opts.element.attr("id"));
-            this.parent.destroy.apply(this, arguments);
-        },
-
-        // multi
-        initContainer: function () {
-
-            var selector = ".select2-choices", selection;
-
-            this.searchContainer = this.container.find(".select2-search-field");
-            this.selection = selection = this.container.find(selector);
-
-            var _this = this;
-            this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
-                //killEvent(e);
-                _this.search[0].focus();
-                _this.selectChoice($(this));
-            });
-
-            // rewrite labels from original element to focusser
-            this.search.attr("id", "s2id_autogen"+nextUid());
-
-            this.search.prev()
-                .text($("label[for='" + this.opts.element.attr("id") + "']").text())
-                .attr('for', this.search.attr('id'));
-
-            this.search.on("input paste", this.bind(function() {
-                if (!this.isInterfaceEnabled()) return;
-                if (!this.opened()) {
-                    this.open();
-                }
-            }));
-
-            this.search.attr("tabindex", this.elementTabIndex);
-
-            this.keydowns = 0;
-            this.search.on("keydown", this.bind(function (e) {
-                if (!this.isInterfaceEnabled()) return;
-
-                ++this.keydowns;
-                var selected = selection.find(".select2-search-choice-focus");
-                var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
-                var next = selected.next(".select2-search-choice:not(.select2-locked)");
-                var pos = getCursorInfo(this.search);
-
-                if (selected.length &&
-                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
-                    var selectedChoice = selected;
-                    if (e.which == KEY.LEFT && prev.length) {
-                        selectedChoice = prev;
-                    }
-                    else if (e.which == KEY.RIGHT) {
-                        selectedChoice = next.length ? next : null;
-                    }
-                    else if (e.which === KEY.BACKSPACE) {
-                        if (this.unselect(selected.first())) {
-                            this.search.width(10);
-                            selectedChoice = prev.length ? prev : next;
-                        }
-                    } else if (e.which == KEY.DELETE) {
-                        if (this.unselect(selected.first())) {
-                            this.search.width(10);
-                            selectedChoice = next.length ? next : null;
-                        }
-                    } else if (e.which == KEY.ENTER) {
-                        selectedChoice = null;
-                    }
-
-                    this.selectChoice(selectedChoice);
-                    killEvent(e);
-                    if (!selectedChoice || !selectedChoice.length) {
-                        this.open();
-                    }
-                    return;
-                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
-                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
-
-                    this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
-                    killEvent(e);
-                    return;
-                } else {
-                    this.selectChoice(null);
-                }
-
-                if (this.opened()) {
-                    switch (e.which) {
-                    case KEY.UP:
-                    case KEY.DOWN:
-                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
-                        killEvent(e);
-                        return;
-                    case KEY.ENTER:
-                        this.selectHighlighted();
-                        killEvent(e);
-                        return;
-                    case KEY.TAB:
-                        this.selectHighlighted({noFocus:true});
-                        this.close();
-                        return;
-                    case KEY.ESC:
-                        this.cancel(e);
-                        killEvent(e);
-                        return;
-                    }
-                }
-
-                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
-                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
-                    return;
-                }
-
-                if (e.which === KEY.ENTER) {
-                    if (this.opts.openOnEnter === false) {
-                        return;
-                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
-                        return;
-                    }
-                }
-
-                this.open();
-
-                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
-                    // prevent the page from scrolling
-                    killEvent(e);
-                }
-
-                if (e.which === KEY.ENTER) {
-                    // prevent form from being submitted
-                    killEvent(e);
-                }
-
-            }));
-
-            this.search.on("keyup", this.bind(function (e) {
-                this.keydowns = 0;
-                this.resizeSearch();
-            })
-            );
-
-            this.search.on("blur", this.bind(function(e) {
-                this.container.removeClass("select2-container-active");
-                this.search.removeClass("select2-focused");
-                this.selectChoice(null);
-                if (!this.opened()) this.clearSearch();
-                e.stopImmediatePropagation();
-                this.opts.element.trigger($.Event("select2-blur"));
-            }));
-
-            this.container.on("click", selector, this.bind(function (e) {
-                if (!this.isInterfaceEnabled()) return;
-                if ($(e.target).closest(".select2-search-choice").length > 0) {
-                    // clicked inside a select2 search choice, do not open
-                    return;
-                }
-                this.selectChoice(null);
-                this.clearPlaceholder();
-                if (!this.container.hasClass("select2-container-active")) {
-                    this.opts.element.trigger($.Event("select2-focus"));
-                }
-                this.open();
-                this.focusSearch();
-                e.preventDefault();
-            }));
-
-            this.container.on("focus", selector, this.bind(function () {
-                if (!this.isInterfaceEnabled()) return;
-                if (!this.container.hasClass("select2-container-active")) {
-                    this.opts.element.trigger($.Event("select2-focus"));
-                }
-                this.container.addClass("select2-container-active");
-                this.dropdown.addClass("select2-drop-active");
-                this.clearPlaceholder();
-            }));
-
-            this.initContainerWidth();
-            this.opts.element.addClass("select2-offscreen");
-
-            // set the placeholder if necessary
-            this.clearSearch();
-        },
-
-        // multi
-        enableInterface: function() {
-            if (this.parent.enableInterface.apply(this, arguments)) {
-                this.search.prop("disabled", !this.isInterfaceEnabled());
-            }
-        },
-
-        // multi
-        initSelection: function () {
-            var data;
-            if (this.opts.element.val() === "" && this.opts.element.text() === "") {
-                this.updateSelection([]);
-                this.close();
-                // set the placeholder if necessary
-                this.clearSearch();
-            }
-            if (this.select || this.opts.element.val() !== "") {
-                var self = this;
-                this.opts.initSelection.call(null, this.opts.element, function(data){
-                    if (data !== undefined && data !== null) {
-                        self.updateSelection(data);
-                        self.close();
-                        // set the placeholder if necessary
-                        self.clearSearch();
-                    }
-                });
-            }
-        },
-
-        // multi
-        clearSearch: function () {
-            var placeholder = this.getPlaceholder(),
-                maxWidth = this.getMaxSearchWidth();
-
-            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
-                this.search.val(placeholder).addClass("select2-default");
-                // stretch the search box to full width of the container so as much of the placeholder is visible as possible
-                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
-                this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
-            } else {
-                this.search.val("").width(10);
-            }
-        },
-
-        // multi
-        clearPlaceholder: function () {
-            if (this.search.hasClass("select2-default")) {
-                this.search.val("").removeClass("select2-default");
-            }
-        },
-
-        // multi
-        opening: function () {
-            this.clearPlaceholder(); // should be done before super so placeholder is not used to search
-            this.resizeSearch();
-
-            this.parent.opening.apply(this, arguments);
-
-            this.focusSearch();
-
-            // initializes search's value with nextSearchTerm (if defined by user)
-            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
-            if(this.search.val() === "") {
-                if(this.nextSearchTerm != undefined){
-                    this.search.val(this.nextSearchTerm);
-                    this.search.select();
-                }
-            }
-
-            this.updateResults(true);
-            this.search.focus();
-            this.opts.element.trigger($.Event("select2-open"));
-        },
-
-        // multi
-        close: function () {
-            if (!this.opened()) return;
-            this.parent.close.apply(this, arguments);
-        },
-
-        // multi
-        focus: function () {
-            this.close();
-            this.search.focus();
-        },
-
-        // multi
-        isFocused: function () {
-            return this.search.hasClass("select2-focused");
-        },
-
-        // multi
-        updateSelection: function (data) {
-            var ids = [], filtered = [], self = this;
-
-            // filter out duplicates
-            $(data).each(function () {
-                if (indexOf(self.id(this), ids) < 0) {
-                    ids.push(self.id(this));
-                    filtered.push(this);
-                }
-            });
-            data = filtered;
-
-            this.selection.find(".select2-search-choice").remove();
-            $(data).each(function () {
-                self.addSelectedChoice(this);
-            });
-            self.postprocessResults();
-        },
-
-        // multi
-        tokenize: function() {
-            var input = this.search.val();
-            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
-            if (input != null && input != undefined) {
-                this.search.val(input);
-                if (input.length > 0) {
-                    this.open();
-                }
-            }
-
-        },
-
-        // multi
-        onSelect: function (data, options) {
-
-            if (!this.triggerSelect(data)) { return; }
-
-            this.addSelectedChoice(data);
-
-            this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
-
-            // keep track of the search's value before it gets cleared
-            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
-
-            this.clearSearch();
-            this.updateResults();
-
-            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
-
-            if (this.opts.closeOnSelect) {
-                this.close();
-                this.search.width(10);
-            } else {
-                if (this.countSelectableResults()>0) {
-                    this.search.width(10);
-                    this.resizeSearch();
-                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
-                        // if we reached max selection size repaint the results so choices
-                        // are replaced with the max selection reached message
-                        this.updateResults(true);
-                    } else {
-                        // initializes search's value with nextSearchTerm and update search result
-                        if(this.nextSearchTerm != undefined){
-                            this.search.val(this.nextSearchTerm);
-                            this.updateResults();
-                            this.search.select();
-                        }
-                    }
-                    this.positionDropdown();
-                } else {
-                    // if nothing left to select close
-                    this.close();
-                    this.search.width(10);
-                }
-            }
-
-            // since its not possible to select an element that has already been
-            // added we do not need to check if this is a new element before firing change
-            this.triggerChange({ added: data });
-
-            if (!options || !options.noFocus)
-                this.focusSearch();
-        },
-
-        // multi
-        cancel: function () {
-            this.close();
-            this.focusSearch();
-        },
-
-        addSelectedChoice: function (data) {
-            var enableChoice = !data.locked,
-                enabledItem = $(
-                    "<li class='select2-search-choice'>" +
-                    "    <div></div>" +
-                    "    <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
-                    "</li>"),
-                disabledItem = $(
-                    "<li class='select2-search-choice select2-locked'>" +
-                    "<div></div>" +
-                    "</li>");
-            var choice = enableChoice ? enabledItem : disabledItem,
-                id = this.id(data),
-                val = this.getVal(),
-                formatted,
-                cssClass;
-
-            formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
-            if (formatted != undefined) {
-                choice.find("div").replaceWith("<div>"+formatted+"</div>");
-            }
-            cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
-            if (cssClass != undefined) {
-                choice.addClass(cssClass);
-            }
-
-            if(enableChoice){
-              choice.find(".select2-search-choice-close")
-                  .on("mousedown", killEvent)
-                  .on("click dblclick", this.bind(function (e) {
-                  if (!this.isInterfaceEnabled()) return;
-
-                  this.unselect($(e.target));
-                  this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
-                  killEvent(e);
-                  this.close();
-                  this.focusSearch();
-              })).on("focus", this.bind(function () {
-                  if (!this.isInterfaceEnabled()) return;
-                  this.container.addClass("select2-container-active");
-                  this.dropdown.addClass("select2-drop-active");
-              }));
-            }
-
-            choice.data("select2-data", data);
-            choice.insertBefore(this.searchContainer);
-
-            val.push(id);
-            this.setVal(val);
-        },
-
-        // multi
-        unselect: function (selected) {
-            var val = this.getVal(),
-                data,
-                index;
-            selected = selected.closest(".select2-search-choice");
-
-            if (selected.length === 0) {
-                throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
-            }
-
-            data = selected.data("select2-data");
-
-            if (!data) {
-                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
-                // and invoked on an element already removed
-                return;
-            }
-
-            var evt = $.Event("select2-removing");
-            evt.val = this.id(data);
-            evt.choice = data;
-            this.opts.element.trigger(evt);
-
-            if (evt.isDefaultPrevented()) {
-                return false;
-            }
-
-            while((index = indexOf(this.id(data), val)) >= 0) {
-                val.splice(index, 1);
-                this.setVal(val);
-                if (this.select) this.postprocessResults();
-            }
-
-            selected.remove();
-
-            this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
-            this.triggerChange({ removed: data });
-
-            return true;
-        },
-
-        // multi
-        postprocessResults: function (data, initial, noHighlightUpdate) {
-            var val = this.getVal(),
-                choices = this.results.find(".select2-result"),
-                compound = this.results.find(".select2-result-with-children"),
-                self = this;
-
-            choices.each2(function (i, choice) {
-                var id = self.id(choice.data("select2-data"));
-                if (indexOf(id, val) >= 0) {
-                    choice.addClass("select2-selected");
-                    // mark all children of the selected parent as selected
-                    choice.find(".select2-result-selectable").addClass("select2-selected");
-                }
-            });
-
-            compound.each2(function(i, choice) {
-                // hide an optgroup if it doesn't have any selectable children
-                if (!choice.is('.select2-result-selectable')
-                    && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
-                    choice.addClass("select2-selected");
-                }
-            });
-
-            if (this.highlight() == -1 && noHighlightUpdate !== false){
-                self.highlight(0);
-            }
-
-            //If all results are chosen render formatNoMatches
-            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
-                if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
-                    if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
-                        this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.search.val()) + "</li>");
-                    }
-                }
-            }
-
-        },
-
-        // multi
-        getMaxSearchWidth: function() {
-            return this.selection.width() - getSideBorderPadding(this.search);
-        },
-
-        // multi
-        resizeSearch: function () {
-            var minimumWidth, left, maxWidth, containerLeft, searchWidth,
-                sideBorderPadding = getSideBorderPadding(this.search);
-
-            minimumWidth = measureTextWidth(this.search) + 10;
-
-            left = this.search.offset().left;
-
-            maxWidth = this.selection.width();
-            containerLeft = this.selection.offset().left;
-
-            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
-
-            if (searchWidth < minimumWidth) {
-                searchWidth = maxWidth - sideBorderPadding;
-            }
-
-            if (searchWidth < 40) {
-                searchWidth = maxWidth - sideBorderPadding;
-            }
-
-            if (searchWidth <= 0) {
-              searchWidth = minimumWidth;
-            }
-
-            this.search.width(Math.floor(searchWidth));
-        },
-
-        // multi
-        getVal: function () {
-            var val;
-            if (this.select) {
-                val = this.select.val();
-                return val === null ? [] : val;
-            } else {
-                val = this.opts.element.val();
-                return splitVal(val, this.opts.separator);
-            }
-        },
-
-        // multi
-        setVal: function (val) {
-            var unique;
-            if (this.select) {
-                this.select.val(val);
-            } else {
-                unique = [];
-                // filter out duplicates
-                $(val).each(function () {
-                    if (indexOf(this, unique) < 0) unique.push(this);
-                });
-                this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
-            }
-        },
-
-        // multi
-        buildChangeDetails: function (old, current) {
-            var current = current.slice(0),
-                old = old.slice(0);
-
-            // remove intersection from each array
-            for (var i = 0; i < current.length; i++) {
-                for (var j = 0; j < old.length; j++) {
-                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
-                        current.splice(i, 1);
-                        if(i>0){
-                        	i--;
-                        }
-                        old.splice(j, 1);
-                        j--;
-                    }
-                }
-            }
-
-            return {added: current, removed: old};
-        },
-
-
-        // multi
-        val: function (val, triggerChange) {
-            var oldData, self=this;
-
-            if (arguments.length === 0) {
-                return this.getVal();
-            }
-
-            oldData=this.data();
-            if (!oldData.length) oldData=[];
-
-            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
-            if (!val && val !== 0) {
-                this.opts.element.val("");
-                this.updateSelection([]);
-                this.clearSearch();
-                if (triggerChange) {
-                    this.triggerChange({added: this.data(), removed: oldData});
-                }
-                return;
-            }
-
-            // val is a list of ids
-            this.setVal(val);
-
-            if (this.select) {
-                this.opts.initSelection(this.select, this.bind(this.updateSelection));
-                if (triggerChange) {
-                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));
-                }
-            } else {
-                if (this.opts.initSelection === undefined) {
-                    throw new Error("val() cannot be called if initSelection() is not defined");
-                }
-
-                this.opts.initSelection(this.opts.element, function(data){
-                    var ids=$.map(data, self.id);
-                    self.setVal(ids);
-                    self.updateSelection(data);
-                    self.clearSearch();
-                    if (triggerChange) {
-                        self.triggerChange(self.buildChangeDetails(oldData, self.data()));
-                    }
-                });
-            }
-            this.clearSearch();
-        },
-
-        // multi
-        onSortStart: function() {
-            if (this.select) {
-                throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
-            }
-
-            // collapse search field into 0 width so its container can be collapsed as well
-            this.search.width(0);
-            // hide the container
-            this.searchContainer.hide();
-        },
-
-        // multi
-        onSortEnd:function() {
-
-            var val=[], self=this;
-
-            // show search and move it to the end of the list
-            this.searchContainer.show();
-            // make sure the search container is the last item in the list
-            this.searchContainer.appendTo(this.searchContainer.parent());
-            // since we collapsed the width in dragStarted, we resize it here
-            this.resizeSearch();
-
-            // update selection
-            this.selection.find(".select2-search-choice").each(function() {
-                val.push(self.opts.id($(this).data("select2-data")));
-            });
-            this.setVal(val);
-            this.triggerChange();
-        },
-
-        // multi
-        data: function(values, triggerChange) {
-            var self=this, ids, old;
-            if (arguments.length === 0) {
-                 return this.selection
-                     .children(".select2-search-choice")
-                     .map(function() { return $(this).data("select2-data"); })
-                     .get();
-            } else {
-                old = this.data();
-                if (!values) { values = []; }
-                ids = $.map(values, function(e) { return self.opts.id(e); });
-                this.setVal(ids);
-                this.updateSelection(values);
-                this.clearSearch();
-                if (triggerChange) {
-                    this.triggerChange(this.buildChangeDetails(old, this.data()));
-                }
-            }
-        }
-    });
-
-    $.fn.select2 = function () {
-
-        var args = Array.prototype.slice.call(arguments, 0),
-            opts,
-            select2,
-            method, value, multiple,
-            allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
-            valueMethods = ["opened", "isFocused", "container", "dropdown"],
-            propertyMethods = ["val", "data"],
-            methodsMap = { search: "externalSearch" };
-
-        this.each(function () {
-            if (args.length === 0 || typeof(args[0]) === "object") {
-                opts = args.length === 0 ? {} : $.extend({}, args[0]);
-                opts.element = $(this);
-
-                if (opts.element.get(0).tagName.toLowerCase() === "select") {
-                    multiple = opts.element.prop("multiple");
-                } else {
-                    multiple = opts.multiple || false;
-                    if ("tags" in opts) {opts.multiple = multiple = true;}
-                }
-
-                select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
-                select2.init(opts);
-            } else if (typeof(args[0]) === "string") {
-
-                if (indexOf(args[0], allowedMethods) < 0) {
-                    throw "Unknown method: " + args[0];
-                }
-
-                value = undefined;
-                select2 = $(this).data("select2");
-                if (select2 === undefined) return;
-
-                method=args[0];
-
-                if (method === "container") {
-                    value = select2.container;
-                } else if (method === "dropdown") {
-                    value = select2.dropdown;
-                } else {
-                    if (methodsMap[method]) method = methodsMap[method];
-
-                    value = select2[method].apply(select2, args.slice(1));
-                }
-                if (indexOf(args[0], valueMethods) >= 0
-                    || (indexOf(args[0], propertyMethods) && args.length == 1)) {
-                    return false; // abort the iteration, ready to return first matched value
-                }
-            } else {
-                throw "Invalid arguments to select2 plugin: " + args;
-            }
-        });
-        return (value === undefined) ? this : value;
-    };
-
-    // plugin defaults, accessible to users
-    $.fn.select2.defaults = {
-        width: "copy",
-        loadMorePadding: 0,
-        closeOnSelect: true,
-        openOnEnter: true,
-        containerCss: {},
-        dropdownCss: {},
-        containerCssClass: "",
-        dropdownCssClass: "",
-        formatResult: function(result, container, query, escapeMarkup) {
-            var markup=[];
-            markMatch(result.text, query.term, markup, escapeMarkup);
-            return markup.join("");
-        },
-        formatSelection: function (data, container, escapeMarkup) {
-            return data ? escapeMarkup(data.text) : undefined;
-        },
-        sortResults: function (results, container, query) {
-            return results;
-        },
-        formatResultCssClass: function(data) {return data.css;},
-        formatSelectionCssClass: function(data, container) {return undefined;},
-        formatMatches: function (matches) { return matches + " results are available, use up and down arrow keys to navigate."; },
-        formatNoMatches: function () { return "No matches found"; },
-        formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1? "" : "s"); },
-        formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1? "" : "s"); },
-        formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
-        formatLoadMore: function (pageNumber) { return "Loading more results…"; },
-        formatSearching: function () { return "Searching…"; },
-        minimumResultsForSearch: 0,
-        minimumInputLength: 0,
-        maximumInputLength: null,
-        maximumSelectionSize: 0,
-        id: function (e) { return e == undefined ? null : e.id; },
-        matcher: function(term, text) {
-            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
-        },
-        separator: ",",
-        tokenSeparators: [],
-        tokenizer: defaultTokenizer,
-        escapeMarkup: defaultEscapeMarkup,
-        blurOnChange: false,
-        selectOnBlur: false,
-        adaptContainerCssClass: function(c) { return c; },
-        adaptDropdownCssClass: function(c) { return null; },
-        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
-        searchInputPlaceholder: '',
-        createSearchChoicePosition: 'top',
-        shouldFocusInput: function (instance) {
-            // Never focus the input if search is disabled
-            if (instance.opts.minimumResultsForSearch < 0) {
-                return false;
-            }
-
-            return true;
-        }
-    };
-
-    $.fn.select2.ajaxDefaults = {
-        transport: $.ajax,
-        params: {
-            type: "GET",
-            cache: false,
-            dataType: "json"
-        }
-    };
-
-    // exports
-    window.Select2 = {
-        query: {
-            ajax: ajax,
-            local: local,
-            tags: tags
-        }, util: {
-            debounce: debounce,
-            markMatch: markMatch,
-            escapeMarkup: defaultEscapeMarkup,
-            stripDiacritics: stripDiacritics
-        }, "class": {
-            "abstract": AbstractSelect2,
-            "single": SingleSelect2,
-            "multi": MultiSelect2
-        }
-    };
-
-}(jQuery));
diff --git a/dashboard/lib/assets/packages/select2/select2.png b/dashboard/lib/assets/packages/select2/select2.png
deleted file mode 100755
index 1d804ff..0000000
--- a/dashboard/lib/assets/packages/select2/select2.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/packages/select2/select2x2.png b/dashboard/lib/assets/packages/select2/select2x2.png
deleted file mode 100755
index 4bdd5c9..0000000
--- a/dashboard/lib/assets/packages/select2/select2x2.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/assets/showdown.min.js b/dashboard/lib/assets/showdown.min.js
deleted file mode 100644
index 65ee602..0000000
--- a/dashboard/lib/assets/showdown.min.js
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// showdown.js -- A javascript port of Markdown.
-//
-// Copyright (c) 2007 John Fraser.
-//
-// Original Markdown Copyright (c) 2004-2005 John Gruber
-//   <http://daringfireball.net/projects/markdown/>
-//
-// Redistributable under a BSD-style open source license.
-// See license.txt for more information.
-//
-// The full source distribution is at:
-//
-//				A A L
-//				T C A
-//				T K B
-//
-//   <http://www.attacklab.net/>
-//
-//
-// Wherever possible, Showdown is a straight, line-by-line port
-// of the Perl version of Markdown.
-//
-// This is not a normal parser design; it's basically just a
-// series of string substitutions.  It's hard to read and
-// maintain this way,  but keeping Showdown close to the original
-// design makes it easier to port new features.
-//
-// More importantly, Showdown behaves like markdown.pl in most
-// edge cases.  So web applications can do client-side preview
-// in Javascript, and then build identical HTML on the server.
-//
-// This port needs the new RegExp functionality of ECMA 262,
-// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers
-// should do fine.  Even with the new regular expression features,
-// We do a lot of work to emulate Perl's regex functionality.
-// The tricky changes in this file mostly have the "attacklab:"
-// label.  Major or self-explanatory changes don't.
-//
-// Smart diff tools like Araxis Merge will be able to match up
-// this file with markdown.pl in a useful way.  A little tweaking
-// helps: in a copy of markdown.pl, replace "#" with "//" and
-// replace "$text" with "text".  Be sure to ignore whitespace
-// and line endings.
-//
-//
-// Showdown usage:
-//
-//   var text = "Markdown *rocks*.";
-//
-//   var converter = new Showdown.converter();
-//   var html = converter.makeHtml(text);
-//
-//   alert(html);
-//
-// Note: move the sample code to the bottom of this
-// file before uncommenting it.
-//
-//
-// Showdown namespace
-//
-var Showdown={extensions:{}},forEach=Showdown.forEach=function(a,b){if(typeof a.forEach=="function")a.forEach(b);else{var c,d=a.length;for(c=0;c<d;c++)b(a[c],c,a)}},stdExtName=function(a){return a.replace(/[_-]||\s/g,"").toLowerCase()};Showdown.converter=function(a){var b,c,d,e=0,f=[],g=[];if(typeof module!="undefind"&&typeof exports!="undefined"&&typeof require!="undefind"){var h=require("fs");if(h){var i=h.readdirSync((__dirname||".")+"/extensions").filter(function(a){return~a.indexOf(".js")}).map(function(a){return a.replace(/\.js$/,"")});Showdown.forEach(i,function(a){var b=stdExtName(a);Showdown.extensions[b]=require("./extensions/"+a)})}}this.makeHtml=function(a){return b={},c={},d=[],a=a.replace(/~/g,"~T"),a=a.replace(/\$/g,"~D"),a=a.replace(/\r\n/g,"\n"),a=a.replace(/\r/g,"\n"),a="\n\n"+a+"\n\n",a=M(a),a=a.replace(/^[ \t]+$/mg,""),Showdown.forEach(f,function(b){a=k(b,a)}),a=z(a),a=m(a),a=l(a),a=o(a),a=K(a),a=a.replace(/~D/g,"$$"),a=a.replace(/~T/g,"~"),Showdown.forEach(g,function(b){a=k(b,a)}),a};if(a&&a.extensions){var j=this;Showdown.forEach(a.extensions,function(a){typeof a=="string"&&(a=Showdown.extensions[stdExtName(a)]);if(typeof a!="function")throw"Extension '"+a+"' could not be loaded.  It was either not found or is not a valid extension.";Showdown.forEach(a(j),function(a){a.type?a.type==="language"||a.type==="lang"?f.push(a):(a.type==="output"||a.type==="html")&&g.push(a):g.push(a)})})}var k=function(a,b){if(a.regex){var c=new RegExp(a.regex,"g");return b.replace(c,a.replace)}if(a.filter)return a.filter(b)},l=function(a){return a+="~0",a=a.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|(?=~0))/gm,function(a,d,e,f,g){return d=d.toLowerCase(),b[d]=G(e),f?f+g:(g&&(c[d]=g.replace(/"/g,"&quot;")),"")}),a=a.replace(/~0/,""),a},m=function(a){a=a.replace(/\n/g,"\n\n");var b="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside",c="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside";return a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,n),a=a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?<\/\2>[ \t]*(?=\n+)\n)/gm,n),a=a.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,n),a=a.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,n),a=a.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,n),a=a.replace(/\n\n/g,"\n"),a},n=function(a,b){var c=b;return c=c.replace(/\n\n/g,"\n"),c=c.replace(/^\n/,""),c=c.replace(/\n+$/g,""),c="\n\n~K"+(d.push(c)-1)+"K\n\n",c},o=function(a){a=v(a);var b=A("<hr />");return a=a.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,b),a=a.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,b),a=x(a),a=y(a),a=E(a),a=m(a),a=F(a),a},p=function(a){return a=B(a),a=q(a),a=H(a),a=t(a),a=r(a),a=I(a),a=G(a),a=D(a),a=a.replace(/  +\n/g," <br />\n"),a},q=function(a){var b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;return a=a.replace(b,function(a){var b=a.replace(/(.)<\/?code>(?=.)/g,"$1`");return b=N(b,"\\`*_"),b}),a},r=function(a){return a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,s),a=a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?(?:\(.*?\).*?)?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,s),a=a.replace(/(\[([^\[\]]+)\])()()()()()/g,s),a},s=function(a,d,e,f,g,h,i,j){j==undefined&&(j="");var k=d,l=e,m=f.toLowerCase(),n=g,o=j;if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(b[m]!=undefined)n=b[m],c[m]!=undefined&&(o=c[m]);else{if(!(k.search(/\(\s*\)$/m)>-1))return k;n=""}}n=N(n,"*_");var p='<a href="'+n+'"';return o!=""&&(o=o.replace(/"/g,"&quot;"),o=N(o,"*_"),p+=' title="'+o+'"'),p+=">"+l+"</a>",p},t=function(a){return a=a.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,u),a=a.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,u),a},u=function(a,d,e,f,g,h,i,j){var k=d,l=e,m=f.toLowerCase(),n=g,o=j;o||(o="");if(n==""){m==""&&(m=l.toLowerCase().replace(/ ?\n/g," ")),n="#"+m;if(b[m]==undefined)return k;n=b[m],c[m]!=undefined&&(o=c[m])}l=l.replace(/"/g,"&quot;"),n=N(n,"*_");var p='<img src="'+n+'" alt="'+l+'"';return o=o.replace(/"/g,"&quot;"),o=N(o,"*_"),p+=' title="'+o+'"',p+=" />",p},v=function(a){function b(a){return a.replace(/[^\w]/g,"").toLowerCase()}return a=a.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,function(a,c){return A('<h1 id="'+b(c)+'">'+p(c)+"</h1>")}),a=a.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(a,c){return A('<h2 id="'+b(c)+'">'+p(c)+"</h2>")}),a=a.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(a,c,d){var e=c.length;return A("<h"+e+' id="'+b(d)+'">'+p(d)+"</h"+e+">")}),a},w,x=function(a){a+="~0";var b=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;return e?a=a.replace(b,function(a,b,c){var d=b,e=c.search(/[*+-]/g)>-1?"ul":"ol";d=d.replace(/\n{2,}/g,"\n\n\n");var f=w(d);return f=f.replace(/\s+$/,""),f="<"+e+">"+f+"</"+e+">\n",f}):(b=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g,a=a.replace(b,function(a,b,c,d){var e=b,f=c,g=d.search(/[*+-]/g)>-1?"ul":"ol",f=f.replace(/\n{2,}/g,"\n\n\n"),h=w(f);return h=e+"<"+g+">\n"+h+"</"+g+">\n",h})),a=a.replace(/~0/,""),a};w=function(a){return e++,a=a.replace(/\n{2,}$/,"\n"),a+="~0",a=a.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(a,b,c,d,e){var f=e,g=b,h=c;return g||f.search(/\n{2,}/)>-1?f=o(L(f)):(f=x(L(f)),f=f.replace(/\n$/,""),f=p(f)),"<li>"+f+"</li>\n"}),a=a.replace(/~0/g,""),e--,a};var y=function(a){return a+="~0",a=a.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(a,b,c){var d=b,e=c;return d=C(L(d)),d=M(d),d=d.replace(/^\n+/g,""),d=d.replace(/\n+$/g,""),d="<pre><code>"+d+"\n</code></pre>",A(d)+e}),a=a.replace(/~0/,""),a},z=function(a){return a+="~0",a=a.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g,function(a,b,c){var d=b,e=c;return e=C(e),e=M(e),e=e.replace(/^\n+/g,""),e=e.replace(/\n+$/g,""),e="<pre><code"+(d?' class="'+d+'"':"")+">"+e+"\n</code></pre>",A(e)}),a=a.replace(/~0/,""),a},A=function(a){return a=a.replace(/(^\n+|\n+$)/g,""),"\n\n~K"+(d.push(a)-1)+"K\n\n"},B=function(a){return a=a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(a,b,c,d,e){var f=d;return f=f.replace(/^([ \t]*)/g,""),f=f.replace(/[ \t]*$/g,""),f=C(f),b+"<code>"+f+"</code>"}),a},C=function(a){return a=a.replace(/&/g,"&amp;"),a=a.replace(/</g,"&lt;"),a=a.replace(/>/g,"&gt;"),a=N(a,"*_{}[]\\",!1),a},D=function(a){return a=a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"<strong>$2</strong>"),a=a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"<em>$2</em>"),a},E=function(a){return a=a.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(a,b){var c=b;return c=c.replace(/^[ \t]*>[ \t]?/gm,"~0"),c=c.replace(/~0/g,""),c=c.replace(/^[ \t]+$/gm,""),c=o(c),c=c.replace(/(^|\n)/g,"$1  "),c=c.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm,function(a,b){var c=b;return c=c.replace(/^  /mg,"~0"),c=c.replace(/~0/g,""),c}),A("<blockquote>\n"+c+"\n</blockquote>")}),a},F=function(a){a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,"");var b=a.split(/\n{2,}/g),c=[],e=b.length;for(var f=0;f<e;f++){var g=b[f];g.search(/~K(\d+)K/g)>=0?c.push(g):g.search(/\S/)>=0&&(g=p(g),g=g.replace(/^([ \t]*)/g,"<p>"),g+="</p>",c.push(g))}e=c.length;for(var f=0;f<e;f++)while(c[f].search(/~K(\d+)K/)>=0){var h=d[RegExp.$1];h=h.replace(/\$/g,"$$$$"),c[f]=c[f].replace(/~K\d+K/,h)}return c.join("\n\n")},G=function(a){return a=a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&amp;"),a=a.replace(/<(?![a-z\/?\$!])/gi,"&lt;"),a},H=function(a){return a=a.replace(/\\(\\)/g,O),a=a.replace(/\\([`*_{}\[\]()>#+-.!])/g,O),a},I=function(a){return a=a.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,'<a href="$1">$1</a>'),a=a.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(a,b){return J(K(b))}),a},J=function(a){var b=[function(a){return"&#"+a.charCodeAt(0)+";"},function(a){return"&#x"+a.charCodeAt(0).toString(16)+";"},function(a){return a}];return a="mailto:"+a,a=a.replace(/./g,function(a){if(a=="@")a=b[Math.floor(Math.random()*2)](a);else if(a!=":"){var c=Math.random();a=c>.9?b[2](a):c>.45?b[1](a):b[0](a)}return a}),a='<a href="'+a+'">'+a+"</a>",a=a.replace(/">.+:/g,'">'),a},K=function(a){return a=a.replace(/~E(\d+)E/g,function(a,b){var c=parseInt(b);return String.fromCharCode(c)}),a},L=function(a){return a=a.replace(/^(\t|[ ]{1,4})/gm,"~0"),a=a.replace(/~0/g,""),a},M=function(a){return a=a.replace(/\t(?=\t)/g,"    "),a=a.replace(/\t/g,"~A~B"),a=a.replace(/~B(.+?)~A/g,function(a,b,c){var d=b,e=4-d.length%4;for(var f=0;f<e;f++)d+=" ";return d}),a=a.replace(/~A/g,"    "),a=a.replace(/~B/g,""),a},N=function(a,b,c){var d="(["+b.replace(/([\[\]\\])/g,"\\$1")+"])";c&&(d="\\\\"+d);var e=new RegExp(d,"g");return a=a.replace(e,O),a},O=function(a,b){var c=b.charCodeAt(0);return"~E"+c+"E"}},typeof module!="undefined"&&(module.exports=Showdown),typeof define=="function"&&define.amd&&define("showdown",function(){return Showdown});
\ No newline at end of file
diff --git a/dashboard/lib/assets/ui-bootstrap-tpls-0.10.0.js b/dashboard/lib/assets/ui-bootstrap-tpls-0.10.0.js
deleted file mode 100644
index cfec6be..0000000
--- a/dashboard/lib/assets/ui-bootstrap-tpls-0.10.0.js
+++ /dev/null
@@ -1,3677 +0,0 @@
-/*
- * angular-ui-bootstrap
- * http://angular-ui.github.io/bootstrap/
-
- * Version: 0.10.0 - 2014-01-13
- * License: MIT
- */
-angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]);
-angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]);
-angular.module('ui.bootstrap.transition', [])
-
-/**
- * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete.
- * @param  {DOMElement} element  The DOMElement that will be animated.
- * @param  {string|object|function} trigger  The thing that will cause the transition to start:
- *   - As a string, it represents the css class to be added to the element.
- *   - As an object, it represents a hash of style attributes to be applied to the element.
- *   - As a function, it represents a function to be called that will cause the transition to occur.
- * @return {Promise}  A promise that is resolved when the transition finishes.
- */
-.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) {
-
-  var $transition = function(element, trigger, options) {
-    options = options || {};
-    var deferred = $q.defer();
-    var endEventName = $transition[options.animation ? "animationEndEventName" : "transitionEndEventName"];
-
-    var transitionEndHandler = function(event) {
-      $rootScope.$apply(function() {
-        element.unbind(endEventName, transitionEndHandler);
-        deferred.resolve(element);
-      });
-    };
-
-    if (endEventName) {
-      element.bind(endEventName, transitionEndHandler);
-    }
-
-    // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur
-    $timeout(function() {
-      if ( angular.isString(trigger) ) {
-        element.addClass(trigger);
-      } else if ( angular.isFunction(trigger) ) {
-        trigger(element);
-      } else if ( angular.isObject(trigger) ) {
-        element.css(trigger);
-      }
-      //If browser does not support transitions, instantly resolve
-      if ( !endEventName ) {
-        deferred.resolve(element);
-      }
-    });
-
-    // Add our custom cancel function to the promise that is returned
-    // We can call this if we are about to run a new transition, which we know will prevent this transition from ending,
-    // i.e. it will therefore never raise a transitionEnd event for that transition
-    deferred.promise.cancel = function() {
-      if ( endEventName ) {
-        element.unbind(endEventName, transitionEndHandler);
-      }
-      deferred.reject('Transition cancelled');
-    };
-
-    return deferred.promise;
-  };
-
-  // Work out the name of the transitionEnd event
-  var transElement = document.createElement('trans');
-  var transitionEndEventNames = {
-    'WebkitTransition': 'webkitTransitionEnd',
-    'MozTransition': 'transitionend',
-    'OTransition': 'oTransitionEnd',
-    'transition': 'transitionend'
-  };
-  var animationEndEventNames = {
-    'WebkitTransition': 'webkitAnimationEnd',
-    'MozTransition': 'animationend',
-    'OTransition': 'oAnimationEnd',
-    'transition': 'animationend'
-  };
-  function findEndEventName(endEventNames) {
-    for (var name in endEventNames){
-      if (transElement.style[name] !== undefined) {
-        return endEventNames[name];
-      }
-    }
-  }
-  $transition.transitionEndEventName = findEndEventName(transitionEndEventNames);
-  $transition.animationEndEventName = findEndEventName(animationEndEventNames);
-  return $transition;
-}]);
-
-angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition'])
-
-  .directive('collapse', ['$transition', function ($transition, $timeout) {
-
-    return {
-      link: function (scope, element, attrs) {
-
-        var initialAnimSkip = true;
-        var currentTransition;
-
-        function doTransition(change) {
-          var newTransition = $transition(element, change);
-          if (currentTransition) {
-            currentTransition.cancel();
-          }
-          currentTransition = newTransition;
-          newTransition.then(newTransitionDone, newTransitionDone);
-          return newTransition;
-
-          function newTransitionDone() {
-            // Make sure it's this transition, otherwise, leave it alone.
-            if (currentTransition === newTransition) {
-              currentTransition = undefined;
-            }
-          }
-        }
-
-        function expand() {
-          if (initialAnimSkip) {
-            initialAnimSkip = false;
-            expandDone();
-          } else {
-            element.removeClass('collapse').addClass('collapsing');
-            doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone);
-          }
-        }
-
-        function expandDone() {
-          element.removeClass('collapsing');
-          element.addClass('collapse in');
-          element.css({height: 'auto'});
-        }
-
-        function collapse() {
-          if (initialAnimSkip) {
-            initialAnimSkip = false;
-            collapseDone();
-            element.css({height: 0});
-          } else {
-            // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value
-            element.css({ height: element[0].scrollHeight + 'px' });
-            //trigger reflow so a browser realizes that height was updated from auto to a specific value
-            var x = element[0].offsetWidth;
-
-            element.removeClass('collapse in').addClass('collapsing');
-
-            doTransition({ height: 0 }).then(collapseDone);
-          }
-        }
-
-        function collapseDone() {
-          element.removeClass('collapsing');
-          element.addClass('collapse');
-        }
-
-        scope.$watch(attrs.collapse, function (shouldCollapse) {
-          if (shouldCollapse) {
-            collapse();
-          } else {
-            expand();
-          }
-        });
-      }
-    };
-  }]);
-
-angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])
-
-.constant('accordionConfig', {
-  closeOthers: true
-})
-
-.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) {
-
-  // This array keeps track of the accordion groups
-  this.groups = [];
-
-  // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to
-  this.closeOthers = function(openGroup) {
-    var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;
-    if ( closeOthers ) {
-      angular.forEach(this.groups, function (group) {
-        if ( group !== openGroup ) {
-          group.isOpen = false;
-        }
-      });
-    }
-  };
-  
-  // This is called from the accordion-group directive to add itself to the accordion
-  this.addGroup = function(groupScope) {
-    var that = this;
-    this.groups.push(groupScope);
-
-    groupScope.$on('$destroy', function (event) {
-      that.removeGroup(groupScope);
-    });
-  };
-
-  // This is called from the accordion-group directive when to remove itself
-  this.removeGroup = function(group) {
-    var index = this.groups.indexOf(group);
-    if ( index !== -1 ) {
-      this.groups.splice(this.groups.indexOf(group), 1);
-    }
-  };
-
-}])
-
-// The accordion directive simply sets up the directive controller
-// and adds an accordion CSS class to itself element.
-.directive('accordion', function () {
-  return {
-    restrict:'EA',
-    controller:'AccordionController',
-    transclude: true,
-    replace: false,
-    templateUrl: 'template/accordion/accordion.html'
-  };
-})
-
-// The accordion-group directive indicates a block of html that will expand and collapse in an accordion
-.directive('accordionGroup', ['$parse', function($parse) {
-  return {
-    require:'^accordion',         // We need this directive to be inside an accordion
-    restrict:'EA',
-    transclude:true,              // It transcludes the contents of the directive into the template
-    replace: true,                // The element containing the directive will be replaced with the template
-    templateUrl:'template/accordion/accordion-group.html',
-    scope:{ heading:'@' },        // Create an isolated scope and interpolate the heading attribute onto this scope
-    controller: function() {
-      this.setHeading = function(element) {
-        this.heading = element;
-      };
-    },
-    link: function(scope, element, attrs, accordionCtrl) {
-      var getIsOpen, setIsOpen;
-
-      accordionCtrl.addGroup(scope);
-
-      scope.isOpen = false;
-      
-      if ( attrs.isOpen ) {
-        getIsOpen = $parse(attrs.isOpen);
-        setIsOpen = getIsOpen.assign;
-
-        scope.$parent.$watch(getIsOpen, function(value) {
-          scope.isOpen = !!value;
-        });
-      }
-
-      scope.$watch('isOpen', function(value) {
-        if ( value ) {
-          accordionCtrl.closeOthers(scope);
-        }
-        if ( setIsOpen ) {
-          setIsOpen(scope.$parent, value);
-        }
-      });
-    }
-  };
-}])
-
-// Use accordion-heading below an accordion-group to provide a heading containing HTML
-// <accordion-group>
-//   <accordion-heading>Heading containing HTML - <img src="..."></accordion-heading>
-// </accordion-group>
-.directive('accordionHeading', function() {
-  return {
-    restrict: 'EA',
-    transclude: true,   // Grab the contents to be used as the heading
-    template: '',       // In effect remove this element!
-    replace: true,
-    require: '^accordionGroup',
-    compile: function(element, attr, transclude) {
-      return function link(scope, element, attr, accordionGroupCtrl) {
-        // Pass the heading to the accordion-group controller
-        // so that it can be transcluded into the right place in the template
-        // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]
-        accordionGroupCtrl.setHeading(transclude(scope, function() {}));
-      };
-    }
-  };
-})
-
-// Use in the accordion-group template to indicate where you want the heading to be transcluded
-// You must provide the property on the accordion-group controller that will hold the transcluded element
-// <div class="accordion-group">
-//   <div class="accordion-heading" ><a ... accordion-transclude="heading">...</a></div>
-//   ...
-// </div>
-.directive('accordionTransclude', function() {
-  return {
-    require: '^accordionGroup',
-    link: function(scope, element, attr, controller) {
-      scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) {
-        if ( heading ) {
-          element.html('');
-          element.append(heading);
-        }
-      });
-    }
-  };
-});
-
-angular.module("ui.bootstrap.alert", [])
-
-.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) {
-  $scope.closeable = 'close' in $attrs;
-}])
-
-.directive('alert', function () {
-  return {
-    restrict:'EA',
-    controller:'AlertController',
-    templateUrl:'template/alert/alert.html',
-    transclude:true,
-    replace:true,
-    scope: {
-      type: '=',
-      close: '&'
-    }
-  };
-});
-
-angular.module('ui.bootstrap.bindHtml', [])
-
-  .directive('bindHtmlUnsafe', function () {
-    return function (scope, element, attr) {
-      element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe);
-      scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) {
-        element.html(value || '');
-      });
-    };
-  });
-angular.module('ui.bootstrap.buttons', [])
-
-.constant('buttonConfig', {
-  activeClass: 'active',
-  toggleEvent: 'click'
-})
-
-.controller('ButtonsController', ['buttonConfig', function(buttonConfig) {
-  this.activeClass = buttonConfig.activeClass || 'active';
-  this.toggleEvent = buttonConfig.toggleEvent || 'click';
-}])
-
-.directive('btnRadio', function () {
-  return {
-    require: ['btnRadio', 'ngModel'],
-    controller: 'ButtonsController',
-    link: function (scope, element, attrs, ctrls) {
-      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
-
-      //model -> UI
-      ngModelCtrl.$render = function () {
-        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio)));
-      };
-
-      //ui->model
-      element.bind(buttonsCtrl.toggleEvent, function () {
-        if (!element.hasClass(buttonsCtrl.activeClass)) {
-          scope.$apply(function () {
-            ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio));
-            ngModelCtrl.$render();
-          });
-        }
-      });
-    }
-  };
-})
-
-.directive('btnCheckbox', function () {
-  return {
-    require: ['btnCheckbox', 'ngModel'],
-    controller: 'ButtonsController',
-    link: function (scope, element, attrs, ctrls) {
-      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];
-
-      function getTrueValue() {
-        return getCheckboxValue(attrs.btnCheckboxTrue, true);
-      }
-
-      function getFalseValue() {
-        return getCheckboxValue(attrs.btnCheckboxFalse, false);
-      }
-      
-      function getCheckboxValue(attributeValue, defaultValue) {
-        var val = scope.$eval(attributeValue);
-        return angular.isDefined(val) ? val : defaultValue;
-      }
-
-      //model -> UI
-      ngModelCtrl.$render = function () {
-        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));
-      };
-
-      //ui->model
-      element.bind(buttonsCtrl.toggleEvent, function () {
-        scope.$apply(function () {
-          ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());
-          ngModelCtrl.$render();
-        });
-      });
-    }
-  };
-});
-
-/**
-* @ngdoc overview
-* @name ui.bootstrap.carousel
-*
-* @description
-* AngularJS version of an image carousel.
-*
-*/
-angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])
-.controller('CarouselController', ['$scope', '$timeout', '$transition', '$q', function ($scope, $timeout, $transition, $q) {
-  var self = this,
-    slides = self.slides = [],
-    currentIndex = -1,
-    currentTimeout, isPlaying;
-  self.currentSlide = null;
-
-  var destroyed = false;
-  /* direction: "prev" or "next" */
-  self.select = function(nextSlide, direction) {
-    var nextIndex = slides.indexOf(nextSlide);
-    //Decide direction if it's not given
-    if (direction === undefined) {
-      direction = nextIndex > currentIndex ? "next" : "prev";
-    }
-    if (nextSlide && nextSlide !== self.currentSlide) {
-      if ($scope.$currentTransition) {
-        $scope.$currentTransition.cancel();
-        //Timeout so ng-class in template has time to fix classes for finished slide
-        $timeout(goNext);
-      } else {
-        goNext();
-      }
-    }
-    function goNext() {
-      // Scope has been destroyed, stop here.
-      if (destroyed) { return; }
-      //If we have a slide to transition from and we have a transition type and we're allowed, go
-      if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) {
-        //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime
-        nextSlide.$element.addClass(direction);
-        var reflow = nextSlide.$element[0].offsetWidth; //force reflow
-
-        //Set all other slides to stop doing their stuff for the new transition
-        angular.forEach(slides, function(slide) {
-          angular.extend(slide, {direction: '', entering: false, leaving: false, active: false});
-        });
-        angular.extend(nextSlide, {direction: direction, active: true, entering: true});
-        angular.extend(self.currentSlide||{}, {direction: direction, leaving: true});
-
-        $scope.$currentTransition = $transition(nextSlide.$element, {});
-        //We have to create new pointers inside a closure since next & current will change
-        (function(next,current) {
-          $scope.$currentTransition.then(
-            function(){ transitionDone(next, current); },
-            function(){ transitionDone(next, current); }
-          );
-        }(nextSlide, self.currentSlide));
-      } else {
-        transitionDone(nextSlide, self.currentSlide);
-      }
-      self.currentSlide = nextSlide;
-      currentIndex = nextIndex;
-      //every time you change slides, reset the timer
-      restartTimer();
-    }
-    function transitionDone(next, current) {
-      angular.extend(next, {direction: '', active: true, leaving: false, entering: false});
-      angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false});
-      $scope.$currentTransition = null;
-    }
-  };
-  $scope.$on('$destroy', function () {
-    destroyed = true;
-  });
-
-  /* Allow outside people to call indexOf on slides array */
-  self.indexOfSlide = function(slide) {
-    return slides.indexOf(slide);
-  };
-
-  $scope.next = function() {
-    var newIndex = (currentIndex + 1) % slides.length;
-
-    //Prevent this user-triggered transition from occurring if there is already one in progress
-    if (!$scope.$currentTransition) {
-      return self.select(slides[newIndex], 'next');
-    }
-  };
-
-  $scope.prev = function() {
-    var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1;
-
-    //Prevent this user-triggered transition from occurring if there is already one in progress
-    if (!$scope.$currentTransition) {
-      return self.select(slides[newIndex], 'prev');
-    }
-  };
-
-  $scope.select = function(slide) {
-    self.select(slide);
-  };
-
-  $scope.isActive = function(slide) {
-     return self.currentSlide === slide;
-  };
-
-  $scope.slides = function() {
-    return slides;
-  };
-
-  $scope.$watch('interval', restartTimer);
-  $scope.$on('$destroy', resetTimer);
-
-  function restartTimer() {
-    resetTimer();
-    var interval = +$scope.interval;
-    if (!isNaN(interval) && interval>=0) {
-      currentTimeout = $timeout(timerFn, interval);
-    }
-  }
-
-  function resetTimer() {
-    if (currentTimeout) {
-      $timeout.cancel(currentTimeout);
-      currentTimeout = null;
-    }
-  }
-
-  function timerFn() {
-    if (isPlaying) {
-      $scope.next();
-      restartTimer();
-    } else {
-      $scope.pause();
-    }
-  }
-
-  $scope.play = function() {
-    if (!isPlaying) {
-      isPlaying = true;
-      restartTimer();
-    }
-  };
-  $scope.pause = function() {
-    if (!$scope.noPause) {
-      isPlaying = false;
-      resetTimer();
-    }
-  };
-
-  self.addSlide = function(slide, element) {
-    slide.$element = element;
-    slides.push(slide);
-    //if this is the first slide or the slide is set to active, select it
-    if(slides.length === 1 || slide.active) {
-      self.select(slides[slides.length-1]);
-      if (slides.length == 1) {
-        $scope.play();
-      }
-    } else {
-      slide.active = false;
-    }
-  };
-
-  self.removeSlide = function(slide) {
-    //get the index of the slide inside the carousel
-    var index = slides.indexOf(slide);
-    slides.splice(index, 1);
-    if (slides.length > 0 && slide.active) {
-      if (index >= slides.length) {
-        self.select(slides[index-1]);
-      } else {
-        self.select(slides[index]);
-      }
-    } else if (currentIndex > index) {
-      currentIndex--;
-    }
-  };
-
-}])
-
-/**
- * @ngdoc directive
- * @name ui.bootstrap.carousel.directive:carousel
- * @restrict EA
- *
- * @description
- * Carousel is the outer container for a set of image 'slides' to showcase.
- *
- * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide.
- * @param {boolean=} noTransition Whether to disable transitions on the carousel.
- * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover).
- *
- * @example
-<example module="ui.bootstrap">
-  <file name="index.html">
-    <carousel>
-      <slide>
-        <img src="http://placekitten.com/150/150" style="margin:auto;">
-        <div class="carousel-caption">
-          <p>Beautiful!</p>
-        </div>
-      </slide>
-      <slide>
-        <img src="http://placekitten.com/100/150" style="margin:auto;">
-        <div class="carousel-caption">
-          <p>D'aww!</p>
-        </div>
-      </slide>
-    </carousel>
-  </file>
-  <file name="demo.css">
-    .carousel-indicators {
-      top: auto;
-      bottom: 15px;
-    }
-  </file>
-</example>
- */
-.directive('carousel', [function() {
-  return {
-    restrict: 'EA',
-    transclude: true,
-    replace: true,
-    controller: 'CarouselController',
-    require: 'carousel',
-    templateUrl: 'template/carousel/carousel.html',
-    scope: {
-      interval: '=',
-      noTransition: '=',
-      noPause: '='
-    }
-  };
-}])
-
-/**
- * @ngdoc directive
- * @name ui.bootstrap.carousel.directive:slide
- * @restrict EA
- *
- * @description
- * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}.  Must be placed as a child of a carousel element.
- *
- * @param {boolean=} active Model binding, whether or not this slide is currently active.
- *
- * @example
-<example module="ui.bootstrap">
-  <file name="index.html">
-<div ng-controller="CarouselDemoCtrl">
-  <carousel>
-    <slide ng-repeat="slide in slides" active="slide.active">
-      <img ng-src="{{slide.image}}" style="margin:auto;">
-      <div class="carousel-caption">
-        <h4>Slide {{$index}}</h4>
-        <p>{{slide.text}}</p>
-      </div>
-    </slide>
-  </carousel>
-  <div class="row-fluid">
-    <div class="span6">
-      <ul>
-        <li ng-repeat="slide in slides">
-          <button class="btn btn-mini" ng-class="{'btn-info': !slide.active, 'btn-success': slide.active}" ng-disabled="slide.active" ng-click="slide.active = true">select</button>
-          {{$index}}: {{slide.text}}
-        </li>
-      </ul>
-      <a class="btn" ng-click="addSlide()">Add Slide</a>
-    </div>
-    <div class="span6">
-      Interval, in milliseconds: <input type="number" ng-model="myInterval">
-      <br />Enter a negative number to stop the interval.
-    </div>
-  </div>
-</div>
-  </file>
-  <file name="script.js">
-function CarouselDemoCtrl($scope) {
-  $scope.myInterval = 5000;
-  var slides = $scope.slides = [];
-  $scope.addSlide = function() {
-    var newWidth = 200 + ((slides.length + (25 * slides.length)) % 150);
-    slides.push({
-      image: 'http://placekitten.com/' + newWidth + '/200',
-      text: ['More','Extra','Lots of','Surplus'][slides.length % 4] + ' '
-        ['Cats', 'Kittys', 'Felines', 'Cutes'][slides.length % 4]
-    });
-  };
-  for (var i=0; i<4; i++) $scope.addSlide();
-}
-  </file>
-  <file name="demo.css">
-    .carousel-indicators {
-      top: auto;
-      bottom: 15px;
-    }
-  </file>
-</example>
-*/
-
-.directive('slide', ['$parse', function($parse) {
-  return {
-    require: '^carousel',
-    restrict: 'EA',
-    transclude: true,
-    replace: true,
-    templateUrl: 'template/carousel/slide.html',
-    scope: {
-    },
-    link: function (scope, element, attrs, carouselCtrl) {
-      //Set up optional 'active' = binding
-      if (attrs.active) {
-        var getActive = $parse(attrs.active);
-        var setActive = getActive.assign;
-        var lastValue = scope.active = getActive(scope.$parent);
-        scope.$watch(function parentActiveWatch() {
-          var parentActive = getActive(scope.$parent);
-
-          if (parentActive !== scope.active) {
-            // we are out of sync and need to copy
-            if (parentActive !== lastValue) {
-              // parent changed and it has precedence
-              lastValue = scope.active = parentActive;
-            } else {
-              // if the parent can be assigned then do so
-              setActive(scope.$parent, parentActive = lastValue = scope.active);
-            }
-          }
-          return parentActive;
-        });
-      }
-
-      carouselCtrl.addSlide(scope, element);
-      //when the scope is destroyed then remove the slide from the current slides array
-      scope.$on('$destroy', function() {
-        carouselCtrl.removeSlide(scope);
-      });
-
-      scope.$watch('active', function(active) {
-        if (active) {
-          carouselCtrl.select(scope);
-        }
-      });
-    }
-  };
-}]);
-
-angular.module('ui.bootstrap.position', [])
-
-/**
- * A set of utility methods that can be use to retrieve position of DOM elements.
- * It is meant to be used where we need to absolute-position DOM elements in
- * relation to other, existing elements (this is the case for tooltips, popovers,
- * typeahead suggestions etc.).
- */
-  .factory('$position', ['$document', '$window', function ($document, $window) {
-
-    function getStyle(el, cssprop) {
-      if (el.currentStyle) { //IE
-        return el.currentStyle[cssprop];
-      } else if ($window.getComputedStyle) {
-        return $window.getComputedStyle(el)[cssprop];
-      }
-      // finally try and get inline style
-      return el.style[cssprop];
-    }
-
-    /**
-     * Checks if a given element is statically positioned
-     * @param element - raw DOM element
-     */
-    function isStaticPositioned(element) {
-      return (getStyle(element, "position") || 'static' ) === 'static';
-    }
-
-    /**
-     * returns the closest, non-statically positioned parentOffset of a given element
-     * @param element
-     */
-    var parentOffsetEl = function (element) {
-      var docDomEl = $document[0];
-      var offsetParent = element.offsetParent || docDomEl;
-      while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) {
-        offsetParent = offsetParent.offsetParent;
-      }
-      return offsetParent || docDomEl;
-    };
-
-    return {
-      /**
-       * Provides read-only equivalent of jQuery's position function:
-       * http://api.jquery.com/position/
-       */
-      position: function (element) {
-        var elBCR = this.offset(element);
-        var offsetParentBCR = { top: 0, left: 0 };
-        var offsetParentEl = parentOffsetEl(element[0]);
-        if (offsetParentEl != $document[0]) {
-          offsetParentBCR = this.offset(angular.element(offsetParentEl));
-          offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;
-          offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;
-        }
-
-        var boundingClientRect = element[0].getBoundingClientRect();
-        return {
-          width: boundingClientRect.width || element.prop('offsetWidth'),
-          height: boundingClientRect.height || element.prop('offsetHeight'),
-          top: elBCR.top - offsetParentBCR.top,
-          left: elBCR.left - offsetParentBCR.left
-        };
-      },
-
-      /**
-       * Provides read-only equivalent of jQuery's offset function:
-       * http://api.jquery.com/offset/
-       */
-      offset: function (element) {
-        var boundingClientRect = element[0].getBoundingClientRect();
-        return {
-          width: boundingClientRect.width || element.prop('offsetWidth'),
-          height: boundingClientRect.height || element.prop('offsetHeight'),
-          top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop),
-          left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft  || $document[0].documentElement.scrollLeft)
-        };
-      }
-    };
-  }]);
-
-angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.position'])
-
-.constant('datepickerConfig', {
-  dayFormat: 'dd',
-  monthFormat: 'MMMM',
-  yearFormat: 'yyyy',
-  dayHeaderFormat: 'EEE',
-  dayTitleFormat: 'MMMM yyyy',
-  monthTitleFormat: 'yyyy',
-  showWeeks: true,
-  startingDay: 0,
-  yearRange: 20,
-  minDate: null,
-  maxDate: null
-})
-
-.controller('DatepickerController', ['$scope', '$attrs', 'dateFilter', 'datepickerConfig', function($scope, $attrs, dateFilter, dtConfig) {
-  var format = {
-    day:        getValue($attrs.dayFormat,        dtConfig.dayFormat),
-    month:      getValue($attrs.monthFormat,      dtConfig.monthFormat),
-    year:       getValue($attrs.yearFormat,       dtConfig.yearFormat),
-    dayHeader:  getValue($attrs.dayHeaderFormat,  dtConfig.dayHeaderFormat),
-    dayTitle:   getValue($attrs.dayTitleFormat,   dtConfig.dayTitleFormat),
-    monthTitle: getValue($attrs.monthTitleFormat, dtConfig.monthTitleFormat)
-  },
-  startingDay = getValue($attrs.startingDay,      dtConfig.startingDay),
-  yearRange =   getValue($attrs.yearRange,        dtConfig.yearRange);
-
-  this.minDate = dtConfig.minDate ? new Date(dtConfig.minDate) : null;
-  this.maxDate = dtConfig.maxDate ? new Date(dtConfig.maxDate) : null;
-
-  function getValue(value, defaultValue) {
-    return angular.isDefined(value) ? $scope.$parent.$eval(value) : defaultValue;
-  }
-
-  function getDaysInMonth( year, month ) {
-    return new Date(year, month, 0).getDate();
-  }
-
-  function getDates(startDate, n) {
-    var dates = new Array(n);
-    var current = startDate, i = 0;
-    while (i < n) {
-      dates[i++] = new Date(current);
-      current.setDate( current.getDate() + 1 );
-    }
-    return dates;
-  }
-
-  function makeDate(date, format, isSelected, isSecondary) {
-    return { date: date, label: dateFilter(date, format), selected: !!isSelected, secondary: !!isSecondary };
-  }
-
-  this.modes = [
-    {
-      name: 'day',
-      getVisibleDates: function(date, selected) {
-        var year = date.getFullYear(), month = date.getMonth(), firstDayOfMonth = new Date(year, month, 1);
-        var difference = startingDay - firstDayOfMonth.getDay(),
-        numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference,
-        firstDate = new Date(firstDayOfMonth), numDates = 0;
-
-        if ( numDisplayedFromPreviousMonth > 0 ) {
-          firstDate.setDate( - numDisplayedFromPreviousMonth + 1 );
-          numDates += numDisplayedFromPreviousMonth; // Previous
-        }
-        numDates += getDaysInMonth(year, month + 1); // Current
-        numDates += (7 - numDates % 7) % 7; // Next
-
-        var days = getDates(firstDate, numDates), labels = new Array(7);
-        for (var i = 0; i < numDates; i ++) {
-          var dt = new Date(days[i]);
-          days[i] = makeDate(dt, format.day, (selected && selected.getDate() === dt.getDate() && selected.getMonth() === dt.getMonth() && selected.getFullYear() === dt.getFullYear()), dt.getMonth() !== month);
-        }
-        for (var j = 0; j < 7; j++) {
-          labels[j] = dateFilter(days[j].date, format.dayHeader);
-        }
-        return { objects: days, title: dateFilter(date, format.dayTitle), labels: labels };
-      },
-      compare: function(date1, date2) {
-        return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) );
-      },
-      split: 7,
-      step: { months: 1 }
-    },
-    {
-      name: 'month',
-      getVisibleDates: function(date, selected) {
-        var months = new Array(12), year = date.getFullYear();
-        for ( var i = 0; i < 12; i++ ) {
-          var dt = new Date(year, i, 1);
-          months[i] = makeDate(dt, format.month, (selected && selected.getMonth() === i && selected.getFullYear() === year));
-        }
-        return { objects: months, title: dateFilter(date, format.monthTitle) };
-      },
-      compare: function(date1, date2) {
-        return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() );
-      },
-      split: 3,
-      step: { years: 1 }
-    },
-    {
-      name: 'year',
-      getVisibleDates: function(date, selected) {
-        var years = new Array(yearRange), year = date.getFullYear(), startYear = parseInt((year - 1) / yearRange, 10) * yearRange + 1;
-        for ( var i = 0; i < yearRange; i++ ) {
-          var dt = new Date(startYear + i, 0, 1);
-          years[i] = makeDate(dt, format.year, (selected && selected.getFullYear() === dt.getFullYear()));
-        }
-        return { objects: years, title: [years[0].label, years[yearRange - 1].label].join(' - ') };
-      },
-      compare: function(date1, date2) {
-        return date1.getFullYear() - date2.getFullYear();
-      },
-      split: 5,
-      step: { years: yearRange }
-    }
-  ];
-
-  this.isDisabled = function(date, mode) {
-    var currentMode = this.modes[mode || 0];
-    return ((this.minDate && currentMode.compare(date, this.minDate) < 0) || (this.maxDate && currentMode.compare(date, this.maxDate) > 0) || ($scope.dateDisabled && $scope.dateDisabled({date: date, mode: currentMode.name})));
-  };
-}])
-
-.directive( 'datepicker', ['dateFilter', '$parse', 'datepickerConfig', '$log', function (dateFilter, $parse, datepickerConfig, $log) {
-  return {
-    restrict: 'EA',
-    replace: true,
-    templateUrl: 'template/datepicker/datepicker.html',
-    scope: {
-      dateDisabled: '&'
-    },
-    require: ['datepicker', '?^ngModel'],
-    controller: 'DatepickerController',
-    link: function(scope, element, attrs, ctrls) {
-      var datepickerCtrl = ctrls[0], ngModel = ctrls[1];
-
-      if (!ngModel) {
-        return; // do nothing if no ng-model
-      }
-
-      // Configuration parameters
-      var mode = 0, selected = new Date(), showWeeks = datepickerConfig.showWeeks;
-
-      if (attrs.showWeeks) {
-        scope.$parent.$watch($parse(attrs.showWeeks), function(value) {
-          showWeeks = !! value;
-          updateShowWeekNumbers();
-        });
-      } else {
-        updateShowWeekNumbers();
-      }
-
-      if (attrs.min) {
-        scope.$parent.$watch($parse(attrs.min), function(value) {
-          datepickerCtrl.minDate = value ? new Date(value) : null;
-          refill();
-        });
-      }
-      if (attrs.max) {
-        scope.$parent.$watch($parse(attrs.max), function(value) {
-          datepickerCtrl.maxDate = value ? new Date(value) : null;
-          refill();
-        });
-      }
-
-      function updateShowWeekNumbers() {
-        scope.showWeekNumbers = mode === 0 && showWeeks;
-      }
-
-      // Split array into smaller arrays
-      function split(arr, size) {
-        var arrays = [];
-        while (arr.length > 0) {
-          arrays.push(arr.splice(0, size));
-        }
-        return arrays;
-      }
-
-      function refill( updateSelected ) {
-        var date = null, valid = true;
-
-        if ( ngModel.$modelValue ) {
-          date = new Date( ngModel.$modelValue );
-
-          if ( isNaN(date) ) {
-            valid = false;
-            $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');
-          } else if ( updateSelected ) {
-            selected = date;
-          }
-        }
-        ngModel.$setValidity('date', valid);
-
-        var currentMode = datepickerCtrl.modes[mode], data = currentMode.getVisibleDates(selected, date);
-        angular.forEach(data.objects, function(obj) {
-          obj.disabled = datepickerCtrl.isDisabled(obj.date, mode);
-        });
-
-        ngModel.$setValidity('date-disabled', (!date || !datepickerCtrl.isDisabled(date)));
-
-        scope.rows = split(data.objects, currentMode.split);
-        scope.labels = data.labels || [];
-        scope.title = data.title;
-      }
-
-      function setMode(value) {
-        mode = value;
-        updateShowWeekNumbers();
-        refill();
-      }
-
-      ngModel.$render = function() {
-        refill( true );
-      };
-
-      scope.select = function( date ) {
-        if ( mode === 0 ) {
-          var dt = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0);
-          dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() );
-          ngModel.$setViewValue( dt );
-          refill( true );
-        } else {
-          selected = date;
-          setMode( mode - 1 );
-        }
-      };
-      scope.move = function(direction) {
-        var step = datepickerCtrl.modes[mode].step;
-        selected.setMonth( selected.getMonth() + direction * (step.months || 0) );
-        selected.setFullYear( selected.getFullYear() + direction * (step.years || 0) );
-        refill();
-      };
-      scope.toggleMode = function() {
-        setMode( (mode + 1) % datepickerCtrl.modes.length );
-      };
-      scope.getWeekNumber = function(row) {
-        return ( mode === 0 && scope.showWeekNumbers && row.length === 7 ) ? getISO8601WeekNumber(row[0].date) : null;
-      };
-
-      function getISO8601WeekNumber(date) {
-        var checkDate = new Date(date);
-        checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday
-        var time = checkDate.getTime();
-        checkDate.setMonth(0); // Compare with Jan 1
-        checkDate.setDate(1);
-        return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
-      }
-    }
-  };
-}])
-
-.constant('datepickerPopupConfig', {
-  dateFormat: 'yyyy-MM-dd',
-  currentText: 'Today',
-  toggleWeeksText: 'Weeks',
-  clearText: 'Clear',
-  closeText: 'Done',
-  closeOnDateSelection: true,
-  appendToBody: false,
-  showButtonBar: true
-})
-
-.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'datepickerPopupConfig', 'datepickerConfig',
-function ($compile, $parse, $document, $position, dateFilter, datepickerPopupConfig, datepickerConfig) {
-  return {
-    restrict: 'EA',
-    require: 'ngModel',
-    link: function(originalScope, element, attrs, ngModel) {
-      var scope = originalScope.$new(), // create a child scope so we are not polluting original one
-          dateFormat,
-          closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? originalScope.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection,
-          appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? originalScope.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody;
-
-      attrs.$observe('datepickerPopup', function(value) {
-          dateFormat = value || datepickerPopupConfig.dateFormat;
-          ngModel.$render();
-      });
-
-      scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? originalScope.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar;
-
-      originalScope.$on('$destroy', function() {
-        $popup.remove();
-        scope.$destroy();
-      });
-
-      attrs.$observe('currentText', function(text) {
-        scope.currentText = angular.isDefined(text) ? text : datepickerPopupConfig.currentText;
-      });
-      attrs.$observe('toggleWeeksText', function(text) {
-        scope.toggleWeeksText = angular.isDefined(text) ? text : datepickerPopupConfig.toggleWeeksText;
-      });
-      attrs.$observe('clearText', function(text) {
-        scope.clearText = angular.isDefined(text) ? text : datepickerPopupConfig.clearText;
-      });
-      attrs.$observe('closeText', function(text) {
-        scope.closeText = angular.isDefined(text) ? text : datepickerPopupConfig.closeText;
-      });
-
-      var getIsOpen, setIsOpen;
-      if ( attrs.isOpen ) {
-        getIsOpen = $parse(attrs.isOpen);
-        setIsOpen = getIsOpen.assign;
-
-        originalScope.$watch(getIsOpen, function updateOpen(value) {
-          scope.isOpen = !! value;
-        });
-      }
-      scope.isOpen = getIsOpen ? getIsOpen(originalScope) : false; // Initial state
-
-      function setOpen( value ) {
-        if (setIsOpen) {
-          setIsOpen(originalScope, !!value);
-        } else {
-          scope.isOpen = !!value;
-        }
-      }
-
-      var documentClickBind = function(event) {
-        if (scope.isOpen && event.target !== element[0]) {
-          scope.$apply(function() {
-            setOpen(false);
-          });
-        }
-      };
-
-      var elementFocusBind = function() {
-        scope.$apply(function() {
-          setOpen( true );
-        });
-      };
-
-      // popup element used to display calendar
-      var popupEl = angular.element('<div datepicker-popup-wrap><div datepicker></div></div>');
-      popupEl.attr({
-        'ng-model': 'date',
-        'ng-change': 'dateSelection()'
-      });
-      var datepickerEl = angular.element(popupEl.children()[0]),
-          datepickerOptions = {};
-      if (attrs.datepickerOptions) {
-        datepickerOptions = originalScope.$eval(attrs.datepickerOptions);
-        datepickerEl.attr(angular.extend({}, datepickerOptions));
-      }
-
-      // TODO: reverse from dateFilter string to Date object
-      function parseDate(viewValue) {
-        if (!viewValue) {
-          ngModel.$setValidity('date', true);
-          return null;
-        } else if (angular.isDate(viewValue)) {
-          ngModel.$setValidity('date', true);
-          return viewValue;
-        } else if (angular.isString(viewValue)) {
-          var date = new Date(viewValue);
-          if (isNaN(date)) {
-            ngModel.$setValidity('date', false);
-            return undefined;
-          } else {
-            ngModel.$setValidity('date', true);
-            return date;
-          }
-        } else {
-          ngModel.$setValidity('date', false);
-          return undefined;
-        }
-      }
-      ngModel.$parsers.unshift(parseDate);
-
-      // Inner change
-      scope.dateSelection = function(dt) {
-        if (angular.isDefined(dt)) {
-          scope.date = dt;
-        }
-        ngModel.$setViewValue(scope.date);
-        ngModel.$render();
-
-        if (closeOnDateSelection) {
-          setOpen( false );
-        }
-      };
-
-      element.bind('input change keyup', function() {
-        scope.$apply(function() {
-          scope.date = ngModel.$modelValue;
-        });
-      });
-
-      // Outter change
-      ngModel.$render = function() {
-        var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : '';
-        element.val(date);
-        scope.date = ngModel.$modelValue;
-      };
-
-      function addWatchableAttribute(attribute, scopeProperty, datepickerAttribute) {
-        if (attribute) {
-          originalScope.$watch($parse(attribute), function(value){
-            scope[scopeProperty] = value;
-          });
-          datepickerEl.attr(datepickerAttribute || scopeProperty, scopeProperty);
-        }
-      }
-      addWatchableAttribute(attrs.min, 'min');
-      addWatchableAttribute(attrs.max, 'max');
-      if (attrs.showWeeks) {
-        addWatchableAttribute(attrs.showWeeks, 'showWeeks', 'show-weeks');
-      } else {
-        scope.showWeeks = 'show-weeks' in datepickerOptions ? datepickerOptions['show-weeks'] : datepickerConfig.showWeeks;
-        datepickerEl.attr('show-weeks', 'showWeeks');
-      }
-      if (attrs.dateDisabled) {
-        datepickerEl.attr('date-disabled', attrs.dateDisabled);
-      }
-
-      function updatePosition() {
-        scope.position = appendToBody ? $position.offset(element) : $position.position(element);
-        scope.position.top = scope.position.top + element.prop('offsetHeight');
-      }
-
-      var documentBindingInitialized = false, elementFocusInitialized = false;
-      scope.$watch('isOpen', function(value) {
-        if (value) {
-          updatePosition();
-          $document.bind('click', documentClickBind);
-          if(elementFocusInitialized) {
-            element.unbind('focus', elementFocusBind);
-          }
-          element[0].focus();
-          documentBindingInitialized = true;
-        } else {
-          if(documentBindingInitialized) {
-            $document.unbind('click', documentClickBind);
-          }
-          element.bind('focus', elementFocusBind);
-          elementFocusInitialized = true;
-        }
-
-        if ( setIsOpen ) {
-          setIsOpen(originalScope, value);
-        }
-      });
-
-      scope.today = function() {
-        scope.dateSelection(new Date());
-      };
-      scope.clear = function() {
-        scope.dateSelection(null);
-      };
-
-      var $popup = $compile(popupEl)(scope);
-      if ( appendToBody ) {
-        $document.find('body').append($popup);
-      } else {
-        element.after($popup);
-      }
-    }
-  };
-}])
-
-.directive('datepickerPopupWrap', function() {
-  return {
-    restrict:'EA',
-    replace: true,
-    transclude: true,
-    templateUrl: 'template/datepicker/popup.html',
-    link:function (scope, element, attrs) {
-      element.bind('click', function(event) {
-        event.preventDefault();
-        event.stopPropagation();
-      });
-    }
-  };
-});
-
-/*
- * dropdownToggle - Provides dropdown menu functionality in place of bootstrap js
- * @restrict class or attribute
- * @example:
-   <li class="dropdown">
-     <a class="dropdown-toggle">My Dropdown Menu</a>
-     <ul class="dropdown-menu">
-       <li ng-repeat="choice in dropChoices">
-         <a ng-href="{{choice.href}}">{{choice.text}}</a>
-       </li>
-     </ul>
-   </li>
- */
-
-angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) {
-  var openElement = null,
-      closeMenu   = angular.noop;
-  return {
-    restrict: 'CA',
-    link: function(scope, element, attrs) {
-      scope.$watch('$location.path', function() { closeMenu(); });
-      element.parent().bind('click', function() { closeMenu(); });
-      element.bind('click', function (event) {
-
-        var elementWasOpen = (element === openElement);
-
-        event.preventDefault();
-        event.stopPropagation();
-
-        if (!!openElement) {
-          closeMenu();
-        }
-
-        if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) {
-          element.parent().addClass('open');
-          openElement = element;
-          closeMenu = function (event) {
-            if (event) {
-              event.preventDefault();
-              event.stopPropagation();
-            }
-            $document.unbind('click', closeMenu);
-            element.parent().removeClass('open');
-            closeMenu = angular.noop;
-            openElement = null;
-          };
-          $document.bind('click', closeMenu);
-        }
-      });
-    }
-  };
-}]);
-
-angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition'])
-
-/**
- * A helper, internal data structure that acts as a map but also allows getting / removing
- * elements in the LIFO order
- */
-  .factory('$$stackedMap', function () {
-    return {
-      createNew: function () {
-        var stack = [];
-
-        return {
-          add: function (key, value) {
-            stack.push({
-              key: key,
-              value: value
-            });
-          },
-          get: function (key) {
-            for (var i = 0; i < stack.length; i++) {
-              if (key == stack[i].key) {
-                return stack[i];
-              }
-            }
-          },
-          keys: function() {
-            var keys = [];
-            for (var i = 0; i < stack.length; i++) {
-              keys.push(stack[i].key);
-            }
-            return keys;
-          },
-          top: function () {
-            return stack[stack.length - 1];
-          },
-          remove: function (key) {
-            var idx = -1;
-            for (var i = 0; i < stack.length; i++) {
-              if (key == stack[i].key) {
-                idx = i;
-                break;
-              }
-            }
-            return stack.splice(idx, 1)[0];
-          },
-          removeTop: function () {
-            return stack.splice(stack.length - 1, 1)[0];
-          },
-          length: function () {
-            return stack.length;
-          }
-        };
-      }
-    };
-  })
-
-/**
- * A helper directive for the $modal service. It creates a backdrop element.
- */
-  .directive('modalBackdrop', ['$timeout', function ($timeout) {
-    return {
-      restrict: 'EA',
-      replace: true,
-      templateUrl: 'template/modal/backdrop.html',
-      link: function (scope) {
-
-        scope.animate = false;
-
-        //trigger CSS transitions
-        $timeout(function () {
-          scope.animate = true;
-        });
-      }
-    };
-  }])
-
-  .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) {
-    return {
-      restrict: 'EA',
-      scope: {
-        index: '@',
-        animate: '='
-      },
-      replace: true,
-      transclude: true,
-      templateUrl: 'template/modal/window.html',
-      link: function (scope, element, attrs) {
-        scope.windowClass = attrs.windowClass || '';
-
-        $timeout(function () {
-          // trigger CSS transitions
-          scope.animate = true;
-          // focus a freshly-opened modal
-          element[0].focus();
-        });
-
-        scope.close = function (evt) {
-          var modal = $modalStack.getTop();
-          if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) {
-            evt.preventDefault();
-            evt.stopPropagation();
-            $modalStack.dismiss(modal.key, 'backdrop click');
-          }
-        };
-      }
-    };
-  }])
-
-  .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap',
-    function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) {
-
-      var OPENED_MODAL_CLASS = 'modal-open';
-
-      var backdropDomEl, backdropScope;
-      var openedWindows = $$stackedMap.createNew();
-      var $modalStack = {};
-
-      function backdropIndex() {
-        var topBackdropIndex = -1;
-        var opened = openedWindows.keys();
-        for (var i = 0; i < opened.length; i++) {
-          if (openedWindows.get(opened[i]).value.backdrop) {
-            topBackdropIndex = i;
-          }
-        }
-        return topBackdropIndex;
-      }
-
-      $rootScope.$watch(backdropIndex, function(newBackdropIndex){
-        if (backdropScope) {
-          backdropScope.index = newBackdropIndex;
-        }
-      });
-
-      function removeModalWindow(modalInstance) {
-
-        var body = $document.find('body').eq(0);
-        var modalWindow = openedWindows.get(modalInstance).value;
-
-        //clean up the stack
-        openedWindows.remove(modalInstance);
-
-        //remove window DOM element
-        removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, checkRemoveBackdrop);
-        body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);
-      }
-
-      function checkRemoveBackdrop() {
-          //remove backdrop if no longer needed
-          if (backdropDomEl && backdropIndex() == -1) {
-            var backdropScopeRef = backdropScope;
-            removeAfterAnimate(backdropDomEl, backdropScope, 150, function () {
-              backdropScopeRef.$destroy();
-              backdropScopeRef = null;
-            });
-            backdropDomEl = undefined;
-            backdropScope = undefined;
-          }
-      }
-
-      function removeAfterAnimate(domEl, scope, emulateTime, done) {
-        // Closing animation
-        scope.animate = false;
-
-        var transitionEndEventName = $transition.transitionEndEventName;
-        if (transitionEndEventName) {
-          // transition out
-          var timeout = $timeout(afterAnimating, emulateTime);
-
-          domEl.bind(transitionEndEventName, function () {
-            $timeout.cancel(timeout);
-            afterAnimating();
-            scope.$apply();
-          });
-        } else {
-          // Ensure this call is async
-          $timeout(afterAnimating, 0);
-        }
-
-        function afterAnimating() {
-          if (afterAnimating.done) {
-            return;
-          }
-          afterAnimating.done = true;
-
-          domEl.remove();
-          if (done) {
-            done();
-          }
-        }
-      }
-
-      $document.bind('keydown', function (evt) {
-        var modal;
-
-        if (evt.which === 27) {
-          modal = openedWindows.top();
-          if (modal && modal.value.keyboard) {
-            $rootScope.$apply(function () {
-              $modalStack.dismiss(modal.key);
-            });
-          }
-        }
-      });
-
-      $modalStack.open = function (modalInstance, modal) {
-
-        openedWindows.add(modalInstance, {
-          deferred: modal.deferred,
-          modalScope: modal.scope,
-          backdrop: modal.backdrop,
-          keyboard: modal.keyboard
-        });
-
-        var body = $document.find('body').eq(0),
-            currBackdropIndex = backdropIndex();
-
-        if (currBackdropIndex >= 0 && !backdropDomEl) {
-          backdropScope = $rootScope.$new(true);
-          backdropScope.index = currBackdropIndex;
-          backdropDomEl = $compile('<div modal-backdrop></div>')(backdropScope);
-          body.append(backdropDomEl);
-        }
-          
-        var angularDomEl = angular.element('<div modal-window></div>');
-        angularDomEl.attr('window-class', modal.windowClass);
-        angularDomEl.attr('index', openedWindows.length() - 1);
-        angularDomEl.attr('animate', 'animate');
-        angularDomEl.html(modal.content);
-
-        var modalDomEl = $compile(angularDomEl)(modal.scope);
-        openedWindows.top().value.modalDomEl = modalDomEl;
-        body.append(modalDomEl);
-        body.addClass(OPENED_MODAL_CLASS);
-      };
-
-      $modalStack.close = function (modalInstance, result) {
-        var modalWindow = openedWindows.get(modalInstance).value;
-        if (modalWindow) {
-          modalWindow.deferred.resolve(result);
-          removeModalWindow(modalInstance);
-        }
-      };
-
-      $modalStack.dismiss = function (modalInstance, reason) {
-        var modalWindow = openedWindows.get(modalInstance).value;
-        if (modalWindow) {
-          modalWindow.deferred.reject(reason);
-          removeModalWindow(modalInstance);
-        }
-      };
-
-      $modalStack.dismissAll = function (reason) {
-        var topModal = this.getTop();
-        while (topModal) {
-          this.dismiss(topModal.key, reason);
-          topModal = this.getTop();
-        }
-      };
-
-      $modalStack.getTop = function () {
-        return openedWindows.top();
-      };
-
-      return $modalStack;
-    }])
-
-  .provider('$modal', function () {
-
-    var $modalProvider = {
-      options: {
-        backdrop: true, //can be also false or 'static'
-        keyboard: true
-      },
-      $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack',
-        function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) {
-
-          var $modal = {};
-
-          function getTemplatePromise(options) {
-            return options.template ? $q.when(options.template) :
-              $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {
-                return result.data;
-              });
-          }
-
-          function getResolvePromises(resolves) {
-            var promisesArr = [];
-            angular.forEach(resolves, function (value, key) {
-              if (angular.isFunction(value) || angular.isArray(value)) {
-                promisesArr.push($q.when($injector.invoke(value)));
-              }
-            });
-            return promisesArr;
-          }
-
-          $modal.open = function (modalOptions) {
-
-            var modalResultDeferred = $q.defer();
-            var modalOpenedDeferred = $q.defer();
-
-            //prepare an instance of a modal to be injected into controllers and returned to a caller
-            var modalInstance = {
-              result: modalResultDeferred.promise,
-              opened: modalOpenedDeferred.promise,
-              close: function (result) {
-                $modalStack.close(modalInstance, result);
-              },
-              dismiss: function (reason) {
-                $modalStack.dismiss(modalInstance, reason);
-              }
-            };
-
-            //merge and clean up options
-            modalOptions = angular.extend({}, $modalProvider.options, modalOptions);
-            modalOptions.resolve = modalOptions.resolve || {};
-
-            //verify options
-            if (!modalOptions.template && !modalOptions.templateUrl) {
-              throw new Error('One of template or templateUrl options is required.');
-            }
-
-            var templateAndResolvePromise =
-              $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));
-
-
-            templateAndResolvePromise.then(function resolveSuccess(tplAndVars) {
-
-              var modalScope = (modalOptions.scope || $rootScope).$new();
-              modalScope.$close = modalInstance.close;
-              modalScope.$dismiss = modalInstance.dismiss;
-
-              var ctrlInstance, ctrlLocals = {};
-              var resolveIter = 1;
-
-              //controllers
-              if (modalOptions.controller) {
-                ctrlLocals.$scope = modalScope;
-                ctrlLocals.$modalInstance = modalInstance;
-                angular.forEach(modalOptions.resolve, function (value, key) {
-                  ctrlLocals[key] = tplAndVars[resolveIter++];
-                });
-
-                ctrlInstance = $controller(modalOptions.controller, ctrlLocals);
-              }
-
-              $modalStack.open(modalInstance, {
-                scope: modalScope,
-                deferred: modalResultDeferred,
-                content: tplAndVars[0],
-                backdrop: modalOptions.backdrop,
-                keyboard: modalOptions.keyboard,
-                windowClass: modalOptions.windowClass
-              });
-
-            }, function resolveError(reason) {
-              modalResultDeferred.reject(reason);
-            });
-
-            templateAndResolvePromise.then(function () {
-              modalOpenedDeferred.resolve(true);
-            }, function () {
-              modalOpenedDeferred.reject(false);
-            });
-
-            return modalInstance;
-          };
-
-          return $modal;
-        }]
-    };
-
-    return $modalProvider;
-  });
-
-angular.module('ui.bootstrap.pagination', [])
-
-.controller('PaginationController', ['$scope', '$attrs', '$parse', '$interpolate', function ($scope, $attrs, $parse, $interpolate) {
-  var self = this,
-      setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;
-
-  this.init = function(defaultItemsPerPage) {
-    if ($attrs.itemsPerPage) {
-      $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) {
-        self.itemsPerPage = parseInt(value, 10);
-        $scope.totalPages = self.calculateTotalPages();
-      });
-    } else {
-      this.itemsPerPage = defaultItemsPerPage;
-    }
-  };
-
-  this.noPrevious = function() {
-    return this.page === 1;
-  };
-  this.noNext = function() {
-    return this.page === $scope.totalPages;
-  };
-
-  this.isActive = function(page) {
-    return this.page === page;
-  };
-
-  this.calculateTotalPages = function() {
-    var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage);
-    return Math.max(totalPages || 0, 1);
-  };
-
-  this.getAttributeValue = function(attribute, defaultValue, interpolate) {
-    return angular.isDefined(attribute) ? (interpolate ? $interpolate(attribute)($scope.$parent) : $scope.$parent.$eval(attribute)) : defaultValue;
-  };
-
-  this.render = function() {
-    this.page = parseInt($scope.page, 10) || 1;
-    if (this.page > 0 && this.page <= $scope.totalPages) {
-      $scope.pages = this.getPages(this.page, $scope.totalPages);
-    }
-  };
-
-  $scope.selectPage = function(page) {
-    if ( ! self.isActive(page) && page > 0 && page <= $scope.totalPages) {
-      $scope.page = page;
-      $scope.onSelectPage({ page: page });
-    }
-  };
-
-  $scope.$watch('page', function() {
-    self.render();
-  });
-
-  $scope.$watch('totalItems', function() {
-    $scope.totalPages = self.calculateTotalPages();
-  });
-
-  $scope.$watch('totalPages', function(value) {
-    setNumPages($scope.$parent, value); // Readonly variable
-
-    if ( self.page > value ) {
-      $scope.selectPage(value);
-    } else {
-      self.render();
-    }
-  });
-}])
-
-.constant('paginationConfig', {
-  itemsPerPage: 10,
-  boundaryLinks: false,
-  directionLinks: true,
-  firstText: 'First',
-  previousText: 'Previous',
-  nextText: 'Next',
-  lastText: 'Last',
-  rotate: true
-})
-
-.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) {
-  return {
-    restrict: 'EA',
-    scope: {
-      page: '=',
-      totalItems: '=',
-      onSelectPage:' &'
-    },
-    controller: 'PaginationController',
-    templateUrl: 'template/pagination/pagination.html',
-    replace: true,
-    link: function(scope, element, attrs, paginationCtrl) {
-
-      // Setup configuration parameters
-      var maxSize,
-      boundaryLinks  = paginationCtrl.getAttributeValue(attrs.boundaryLinks,  config.boundaryLinks      ),
-      directionLinks = paginationCtrl.getAttributeValue(attrs.directionLinks, config.directionLinks     ),
-      firstText      = paginationCtrl.getAttributeValue(attrs.firstText,      config.firstText,     true),
-      previousText   = paginationCtrl.getAttributeValue(attrs.previousText,   config.previousText,  true),
-      nextText       = paginationCtrl.getAttributeValue(attrs.nextText,       config.nextText,      true),
-      lastText       = paginationCtrl.getAttributeValue(attrs.lastText,       config.lastText,      true),
-      rotate         = paginationCtrl.getAttributeValue(attrs.rotate,         config.rotate);
-
-      paginationCtrl.init(config.itemsPerPage);
-
-      if (attrs.maxSize) {
-        scope.$parent.$watch($parse(attrs.maxSize), function(value) {
-          maxSize = parseInt(value, 10);
-          paginationCtrl.render();
-        });
-      }
-
-      // Create page object used in template
-      function makePage(number, text, isActive, isDisabled) {
-        return {
-          number: number,
-          text: text,
-          active: isActive,
-          disabled: isDisabled
-        };
-      }
-
-      paginationCtrl.getPages = function(currentPage, totalPages) {
-        var pages = [];
-
-        // Default page limits
-        var startPage = 1, endPage = totalPages;
-        var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages );
-
-        // recompute if maxSize
-        if ( isMaxSized ) {
-          if ( rotate ) {
-            // Current page is displayed in the middle of the visible ones
-            startPage = Math.max(currentPage - Math.floor(maxSize/2), 1);
-            endPage   = startPage + maxSize - 1;
-
-            // Adjust if limit is exceeded
-            if (endPage > totalPages) {
-              endPage   = totalPages;
-              startPage = endPage - maxSize + 1;
-            }
-          } else {
-            // Visible pages are paginated with maxSize
-            startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1;
-
-            // Adjust last page if limit is exceeded
-            endPage = Math.min(startPage + maxSize - 1, totalPages);
-          }
-        }
-
-        // Add page number links
-        for (var number = startPage; number <= endPage; number++) {
-          var page = makePage(number, number, paginationCtrl.isActive(number), false);
-          pages.push(page);
-        }
-
-        // Add links to move between page sets
-        if ( isMaxSized && ! rotate ) {
-          if ( startPage > 1 ) {
-            var previousPageSet = makePage(startPage - 1, '...', false, false);
-            pages.unshift(previousPageSet);
-          }
-
-          if ( endPage < totalPages ) {
-            var nextPageSet = makePage(endPage + 1, '...', false, false);
-            pages.push(nextPageSet);
-          }
-        }
-
-        // Add previous & next links
-        if (directionLinks) {
-          var previousPage = makePage(currentPage - 1, previousText, false, paginationCtrl.noPrevious());
-          pages.unshift(previousPage);
-
-          var nextPage = makePage(currentPage + 1, nextText, false, paginationCtrl.noNext());
-          pages.push(nextPage);
-        }
-
-        // Add first & last links
-        if (boundaryLinks) {
-          var firstPage = makePage(1, firstText, false, paginationCtrl.noPrevious());
-          pages.unshift(firstPage);
-
-          var lastPage = makePage(totalPages, lastText, false, paginationCtrl.noNext());
-          pages.push(lastPage);
-        }
-
-        return pages;
-      };
-    }
-  };
-}])
-
-.constant('pagerConfig', {
-  itemsPerPage: 10,
-  previousText: '« Previous',
-  nextText: 'Next »',
-  align: true
-})
-
-.directive('pager', ['pagerConfig', function(config) {
-  return {
-    restrict: 'EA',
-    scope: {
-      page: '=',
-      totalItems: '=',
-      onSelectPage:' &'
-    },
-    controller: 'PaginationController',
-    templateUrl: 'template/pagination/pager.html',
-    replace: true,
-    link: function(scope, element, attrs, paginationCtrl) {
-
-      // Setup configuration parameters
-      var previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true),
-      nextText         = paginationCtrl.getAttributeValue(attrs.nextText,     config.nextText,     true),
-      align            = paginationCtrl.getAttributeValue(attrs.align,        config.align);
-
-      paginationCtrl.init(config.itemsPerPage);
-
-      // Create page object used in template
-      function makePage(number, text, isDisabled, isPrevious, isNext) {
-        return {
-          number: number,
-          text: text,
-          disabled: isDisabled,
-          previous: ( align && isPrevious ),
-          next: ( align && isNext )
-        };
-      }
-
-      paginationCtrl.getPages = function(currentPage) {
-        return [
-          makePage(currentPage - 1, previousText, paginationCtrl.noPrevious(), true, false),
-          makePage(currentPage + 1, nextText, paginationCtrl.noNext(), false, true)
-        ];
-      };
-    }
-  };
-}]);
-
-/**
- * The following features are still outstanding: animation as a
- * function, placement as a function, inside, support for more triggers than
- * just mouse enter/leave, html tooltips, and selector delegation.
- */
-angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] )
-
-/**
- * The $tooltip service creates tooltip- and popover-like directives as well as
- * houses global options for them.
- */
-.provider( '$tooltip', function () {
-  // The default options tooltip and popover.
-  var defaultOptions = {
-    placement: 'top',
-    animation: true,
-    popupDelay: 0
-  };
-
-  // Default hide triggers for each show trigger
-  var triggerMap = {
-    'mouseenter': 'mouseleave',
-    'click': 'click',
-    'focus': 'blur'
-  };
-
-  // The options specified to the provider globally.
-  var globalOptions = {};
-  
-  /**
-   * `options({})` allows global configuration of all tooltips in the
-   * application.
-   *
-   *   var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {
-   *     // place tooltips left instead of top by default
-   *     $tooltipProvider.options( { placement: 'left' } );
-   *   });
-   */
-	this.options = function( value ) {
-		angular.extend( globalOptions, value );
-	};
-
-  /**
-   * This allows you to extend the set of trigger mappings available. E.g.:
-   *
-   *   $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );
-   */
-  this.setTriggers = function setTriggers ( triggers ) {
-    angular.extend( triggerMap, triggers );
-  };
-
-  /**
-   * This is a helper function for translating camel-case to snake-case.
-   */
-  function snake_case(name){
-    var regexp = /[A-Z]/g;
-    var separator = '-';
-    return name.replace(regexp, function(letter, pos) {
-      return (pos ? separator : '') + letter.toLowerCase();
-    });
-  }
-
-  /**
-   * Returns the actual instance of the $tooltip service.
-   * TODO support multiple triggers
-   */
-  this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) {
-    return function $tooltip ( type, prefix, defaultTriggerShow ) {
-      var options = angular.extend( {}, defaultOptions, globalOptions );
-
-      /**
-       * Returns an object of show and hide triggers.
-       *
-       * If a trigger is supplied,
-       * it is used to show the tooltip; otherwise, it will use the `trigger`
-       * option passed to the `$tooltipProvider.options` method; else it will
-       * default to the trigger supplied to this directive factory.
-       *
-       * The hide trigger is based on the show trigger. If the `trigger` option
-       * was passed to the `$tooltipProvider.options` method, it will use the
-       * mapped trigger from `triggerMap` or the passed trigger if the map is
-       * undefined; otherwise, it uses the `triggerMap` value of the show
-       * trigger; else it will just use the show trigger.
-       */
-      function getTriggers ( trigger ) {
-        var show = trigger || options.trigger || defaultTriggerShow;
-        var hide = triggerMap[show] || show;
-        return {
-          show: show,
-          hide: hide
-        };
-      }
-
-      var directiveName = snake_case( type );
-
-      var startSym = $interpolate.startSymbol();
-      var endSym = $interpolate.endSymbol();
-      var template = 
-        '<div '+ directiveName +'-popup '+
-          'title="'+startSym+'tt_title'+endSym+'" '+
-          'content="'+startSym+'tt_content'+endSym+'" '+
-          'placement="'+startSym+'tt_placement'+endSym+'" '+
-          'animation="tt_animation" '+
-          'is-open="tt_isOpen"'+
-          '>'+
-        '</div>';
-
-      return {
-        restrict: 'EA',
-        scope: true,
-        compile: function (tElem, tAttrs) {
-          var tooltipLinker = $compile( template );
-
-          return function link ( scope, element, attrs ) {
-            var tooltip;
-            var transitionTimeout;
-            var popupTimeout;
-            var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false;
-            var triggers = getTriggers( undefined );
-            var hasRegisteredTriggers = false;
-            var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']);
-
-            var positionTooltip = function (){
-              var position,
-                ttWidth,
-                ttHeight,
-                ttPosition;
-              // Get the position of the directive element.
-              position = appendToBody ? $position.offset( element ) : $position.position( element );
-
-              // Get the height and width of the tooltip so we can center it.
-              ttWidth = tooltip.prop( 'offsetWidth' );
-              ttHeight = tooltip.prop( 'offsetHeight' );
-
-              // Calculate the tooltip's top and left coordinates to center it with
-              // this directive.
-              switch ( scope.tt_placement ) {
-                case 'right':
-                  ttPosition = {
-                    top: position.top + position.height / 2 - ttHeight / 2,
-                    left: position.left + position.width
-                  };
-                  break;
-                case 'bottom':
-                  ttPosition = {
-                    top: position.top + position.height,
-                    left: position.left + position.width / 2 - ttWidth / 2
-                  };
-                  break;
-                case 'left':
-                  ttPosition = {
-                    top: position.top + position.height / 2 - ttHeight / 2,
-                    left: position.left - ttWidth
-                  };
-                  break;
-                default:
-                  ttPosition = {
-                    top: position.top - ttHeight,
-                    left: position.left + position.width / 2 - ttWidth / 2
-                  };
-                  break;
-              }
-
-              ttPosition.top += 'px';
-              ttPosition.left += 'px';
-
-              // Now set the calculated positioning.
-              tooltip.css( ttPosition );
-
-            };
-
-            // By default, the tooltip is not open.
-            // TODO add ability to start tooltip opened
-            scope.tt_isOpen = false;
-
-            function toggleTooltipBind () {
-              if ( ! scope.tt_isOpen ) {
-                showTooltipBind();
-              } else {
-                hideTooltipBind();
-              }
-            }
-
-            // Show the tooltip with delay if specified, otherwise show it immediately
-            function showTooltipBind() {
-              if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) {
-                return;
-              }
-              if ( scope.tt_popupDelay ) {
-                popupTimeout = $timeout( show, scope.tt_popupDelay, false );
-                popupTimeout.then(function(reposition){reposition();});
-              } else {
-                show()();
-              }
-            }
-
-            function hideTooltipBind () {
-              scope.$apply(function () {
-                hide();
-              });
-            }
-
-            // Show the tooltip popup element.
-            function show() {
-
-
-              // Don't show empty tooltips.
-              if ( ! scope.tt_content ) {
-                return angular.noop;
-              }
-
-              createTooltip();
-
-              // If there is a pending remove transition, we must cancel it, lest the
-              // tooltip be mysteriously removed.
-              if ( transitionTimeout ) {
-                $timeout.cancel( transitionTimeout );
-              }
-
-              // Set the initial positioning.
-              tooltip.css({ top: 0, left: 0, display: 'block' });
-
-              // Now we add it to the DOM because need some info about it. But it's not 
-              // visible yet anyway.
-              if ( appendToBody ) {
-                  $document.find( 'body' ).append( tooltip );
-              } else {
-                element.after( tooltip );
-              }
-
-              positionTooltip();
-
-              // And show the tooltip.
-              scope.tt_isOpen = true;
-              scope.$digest(); // digest required as $apply is not called
-
-              // Return positioning function as promise callback for correct
-              // positioning after draw.
-              return positionTooltip;
-            }
-
-            // Hide the tooltip popup element.
-            function hide() {
-              // First things first: we don't show it anymore.
-              scope.tt_isOpen = false;
-
-              //if tooltip is going to be shown after delay, we must cancel this
-              $timeout.cancel( popupTimeout );
-
-              // And now we remove it from the DOM. However, if we have animation, we 
-              // need to wait for it to expire beforehand.
-              // FIXME: this is a placeholder for a port of the transitions library.
-              if ( scope.tt_animation ) {
-                transitionTimeout = $timeout(removeTooltip, 500);
-              } else {
-                removeTooltip();
-              }
-            }
-
-            function createTooltip() {
-              // There can only be one tooltip element per directive shown at once.
-              if (tooltip) {
-                removeTooltip();
-              }
-              tooltip = tooltipLinker(scope, function () {});
-
-              // Get contents rendered into the tooltip
-              scope.$digest();
-            }
-
-            function removeTooltip() {
-              if (tooltip) {
-                tooltip.remove();
-                tooltip = null;
-              }
-            }
-
-            /**
-             * Observe the relevant attributes.
-             */
-            attrs.$observe( type, function ( val ) {
-              scope.tt_content = val;
-
-              if (!val && scope.tt_isOpen ) {
-                hide();
-              }
-            });
-
-            attrs.$observe( prefix+'Title', function ( val ) {
-              scope.tt_title = val;
-            });
-
-            attrs.$observe( prefix+'Placement', function ( val ) {
-              scope.tt_placement = angular.isDefined( val ) ? val : options.placement;
-            });
-
-            attrs.$observe( prefix+'PopupDelay', function ( val ) {
-              var delay = parseInt( val, 10 );
-              scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay;
-            });
-
-            var unregisterTriggers = function() {
-              if (hasRegisteredTriggers) {
-                element.unbind( triggers.show, showTooltipBind );
-                element.unbind( triggers.hide, hideTooltipBind );
-              }
-            };
-
-            attrs.$observe( prefix+'Trigger', function ( val ) {
-              unregisterTriggers();
-
-              triggers = getTriggers( val );
-
-              if ( triggers.show === triggers.hide ) {
-                element.bind( triggers.show, toggleTooltipBind );
-              } else {
-                element.bind( triggers.show, showTooltipBind );
-                element.bind( triggers.hide, hideTooltipBind );
-              }
-
-              hasRegisteredTriggers = true;
-            });
-
-            var animation = scope.$eval(attrs[prefix + 'Animation']);
-            scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation;
-
-            attrs.$observe( prefix+'AppendToBody', function ( val ) {
-              appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody;
-            });
-
-            // if a tooltip is attached to <body> we need to remove it on
-            // location change as its parent scope will probably not be destroyed
-            // by the change.
-            if ( appendToBody ) {
-              scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () {
-              if ( scope.tt_isOpen ) {
-                hide();
-              }
-            });
-            }
-
-            // Make sure tooltip is destroyed and removed.
-            scope.$on('$destroy', function onDestroyTooltip() {
-              $timeout.cancel( transitionTimeout );
-              $timeout.cancel( popupTimeout );
-              unregisterTriggers();
-              removeTooltip();
-            });
-          };
-        }
-      };
-    };
-  }];
-})
-
-.directive( 'tooltipPopup', function () {
-  return {
-    restrict: 'EA',
-    replace: true,
-    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },
-    templateUrl: 'template/tooltip/tooltip-popup.html'
-  };
-})
-
-.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) {
-  return $tooltip( 'tooltip', 'tooltip', 'mouseenter' );
-}])
-
-.directive( 'tooltipHtmlUnsafePopup', function () {
-  return {
-    restrict: 'EA',
-    replace: true,
-    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },
-    templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html'
-  };
-})
-
-.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) {
-  return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' );
-}]);
-
-/**
- * The following features are still outstanding: popup delay, animation as a
- * function, placement as a function, inside, support for more triggers than
- * just mouse enter/leave, html popovers, and selector delegatation.
- */
-angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] )
-
-.directive( 'popoverPopup', function () {
-  return {
-    restrict: 'EA',
-    replace: true,
-    scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' },
-    templateUrl: 'template/popover/popover.html'
-  };
-})
-
-.directive( 'popover', [ '$tooltip', function ( $tooltip ) {
-  return $tooltip( 'popover', 'popover', 'click' );
-}]);
-
-angular.module('ui.bootstrap.progressbar', ['ui.bootstrap.transition'])
-
-.constant('progressConfig', {
-  animate: true,
-  max: 100
-})
-
-.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', '$transition', function($scope, $attrs, progressConfig, $transition) {
-    var self = this,
-        bars = [],
-        max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max,
-        animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;
-
-    this.addBar = function(bar, element) {
-        var oldValue = 0, index = bar.$parent.$index;
-        if ( angular.isDefined(index) &&  bars[index] ) {
-            oldValue = bars[index].value;
-        }
-        bars.push(bar);
-
-        this.update(element, bar.value, oldValue);
-
-        bar.$watch('value', function(value, oldValue) {
-            if (value !== oldValue) {
-                self.update(element, value, oldValue);
-            }
-        });
-
-        bar.$on('$destroy', function() {
-            self.removeBar(bar);
-        });
-    };
-
-    // Update bar element width
-    this.update = function(element, newValue, oldValue) {
-        var percent = this.getPercentage(newValue);
-
-        if (animate) {
-            element.css('width', this.getPercentage(oldValue) + '%');
-            $transition(element, {width: percent + '%'});
-        } else {
-            element.css({'transition': 'none', 'width': percent + '%'});
-        }
-    };
-
-    this.removeBar = function(bar) {
-        bars.splice(bars.indexOf(bar), 1);
-    };
-
-    this.getPercentage = function(value) {
-        return Math.round(100 * value / max);
-    };
-}])
-
-.directive('progress', function() {
-    return {
-        restrict: 'EA',
-        replace: true,
-        transclude: true,
-        controller: 'ProgressController',
-        require: 'progress',
-        scope: {},
-        template: '<div class="progress" ng-transclude></div>'
-        //templateUrl: 'template/progressbar/progress.html' // Works in AngularJS 1.2
-    };
-})
-
-.directive('bar', function() {
-    return {
-        restrict: 'EA',
-        replace: true,
-        transclude: true,
-        require: '^progress',
-        scope: {
-            value: '=',
-            type: '@'
-        },
-        templateUrl: 'template/progressbar/bar.html',
-        link: function(scope, element, attrs, progressCtrl) {
-            progressCtrl.addBar(scope, element);
-        }
-    };
-})
-
-.directive('progressbar', function() {
-    return {
-        restrict: 'EA',
-        replace: true,
-        transclude: true,
-        controller: 'ProgressController',
-        scope: {
-            value: '=',
-            type: '@'
-        },
-        templateUrl: 'template/progressbar/progressbar.html',
-        link: function(scope, element, attrs, progressCtrl) {
-            progressCtrl.addBar(scope, angular.element(element.children()[0]));
-        }
-    };
-});
-angular.module('ui.bootstrap.rating', [])
-
-.constant('ratingConfig', {
-  max: 5,
-  stateOn: null,
-  stateOff: null
-})
-
-.controller('RatingController', ['$scope', '$attrs', '$parse', 'ratingConfig', function($scope, $attrs, $parse, ratingConfig) {
-
-  this.maxRange = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max;
-  this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;
-  this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;
-
-  this.createRateObjects = function(states) {
-    var defaultOptions = {
-      stateOn: this.stateOn,
-      stateOff: this.stateOff
-    };
-
-    for (var i = 0, n = states.length; i < n; i++) {
-      states[i] = angular.extend({ index: i }, defaultOptions, states[i]);
-    }
-    return states;
-  };
-
-  // Get objects used in template
-  $scope.range = angular.isDefined($attrs.ratingStates) ?  this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))): this.createRateObjects(new Array(this.maxRange));
-
-  $scope.rate = function(value) {
-    if ( $scope.value !== value && !$scope.readonly ) {
-      $scope.value = value;
-    }
-  };
-
-  $scope.enter = function(value) {
-    if ( ! $scope.readonly ) {
-      $scope.val = value;
-    }
-    $scope.onHover({value: value});
-  };
-
-  $scope.reset = function() {
-    $scope.val = angular.copy($scope.value);
-    $scope.onLeave();
-  };
-
-  $scope.$watch('value', function(value) {
-    $scope.val = value;
-  });
-
-  $scope.readonly = false;
-  if ($attrs.readonly) {
-    $scope.$parent.$watch($parse($attrs.readonly), function(value) {
-      $scope.readonly = !!value;
-    });
-  }
-}])
-
-.directive('rating', function() {
-  return {
-    restrict: 'EA',
-    scope: {
-      value: '=',
-      onHover: '&',
-      onLeave: '&'
-    },
-    controller: 'RatingController',
-    templateUrl: 'template/rating/rating.html',
-    replace: true
-  };
-});
-
-/**
- * @ngdoc overview
- * @name ui.bootstrap.tabs
- *
- * @description
- * AngularJS version of the tabs directive.
- */
-
-angular.module('ui.bootstrap.tabs', [])
-
-.controller('TabsetController', ['$scope', function TabsetCtrl($scope) {
-  var ctrl = this,
-      tabs = ctrl.tabs = $scope.tabs = [];
-
-  ctrl.select = function(tab) {
-    angular.forEach(tabs, function(tab) {
-      tab.active = false;
-    });
-    tab.active = true;
-  };
-
-  ctrl.addTab = function addTab(tab) {
-    tabs.push(tab);
-    if (tabs.length === 1 || tab.active) {
-      ctrl.select(tab);
-    }
-  };
-
-  ctrl.removeTab = function removeTab(tab) {
-    var index = tabs.indexOf(tab);
-    //Select a new tab if the tab to be removed is selected
-    if (tab.active && tabs.length > 1) {
-      //If this is the last tab, select the previous tab. else, the next tab.
-      var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1;
-      ctrl.select(tabs[newActiveIndex]);
-    }
-    tabs.splice(index, 1);
-  };
-}])
-
-/**
- * @ngdoc directive
- * @name ui.bootstrap.tabs.directive:tabset
- * @restrict EA
- *
- * @description
- * Tabset is the outer container for the tabs directive
- *
- * @param {boolean=} vertical Whether or not to use vertical styling for the tabs.
- * @param {boolean=} justified Whether or not to use justified styling for the tabs.
- *
- * @example
-<example module="ui.bootstrap">
-  <file name="index.html">
-    <tabset>
-      <tab heading="Tab 1"><b>First</b> Content!</tab>
-      <tab heading="Tab 2"><i>Second</i> Content!</tab>
-    </tabset>
-    <hr />
-    <tabset vertical="true">
-      <tab heading="Vertical Tab 1"><b>First</b> Vertical Content!</tab>
-      <tab heading="Vertical Tab 2"><i>Second</i> Vertical Content!</tab>
-    </tabset>
-    <tabset justified="true">
-      <tab heading="Justified Tab 1"><b>First</b> Justified Content!</tab>
-      <tab heading="Justified Tab 2"><i>Second</i> Justified Content!</tab>
-    </tabset>
-  </file>
-</example>
- */
-.directive('tabset', function() {
-  return {
-    restrict: 'EA',
-    transclude: true,
-    replace: true,
-    scope: {},
-    controller: 'TabsetController',
-    templateUrl: 'template/tabs/tabset.html',
-    link: function(scope, element, attrs) {
-      scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false;
-      scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false;
-      scope.type = angular.isDefined(attrs.type) ? scope.$parent.$eval(attrs.type) : 'tabs';
-    }
-  };
-})
-
-/**
- * @ngdoc directive
- * @name ui.bootstrap.tabs.directive:tab
- * @restrict EA
- *
- * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}.
- * @param {string=} select An expression to evaluate when the tab is selected.
- * @param {boolean=} active A binding, telling whether or not this tab is selected.
- * @param {boolean=} disabled A binding, telling whether or not this tab is disabled.
- *
- * @description
- * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}.
- *
- * @example
-<example module="ui.bootstrap">
-  <file name="index.html">
-    <div ng-controller="TabsDemoCtrl">
-      <button class="btn btn-small" ng-click="items[0].active = true">
-        Select item 1, using active binding
-      </button>
-      <button class="btn btn-small" ng-click="items[1].disabled = !items[1].disabled">
-        Enable/disable item 2, using disabled binding
-      </button>
-      <br />
-      <tabset>
-        <tab heading="Tab 1">First Tab</tab>
-        <tab select="alertMe()">
-          <tab-heading><i class="icon-bell"></i> Alert me!</tab-heading>
-          Second Tab, with alert callback and html heading!
-        </tab>
-        <tab ng-repeat="item in items"
-          heading="{{item.title}}"
-          disabled="item.disabled"
-          active="item.active">
-          {{item.content}}
-        </tab>
-      </tabset>
-    </div>
-  </file>
-  <file name="script.js">
-    function TabsDemoCtrl($scope) {
-      $scope.items = [
-        { title:"Dynamic Title 1", content:"Dynamic Item 0" },
-        { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true }
-      ];
-
-      $scope.alertMe = function() {
-        setTimeout(function() {
-          alert("You've selected the alert tab!");
-        });
-      };
-    };
-  </file>
-</example>
- */
-
-/**
- * @ngdoc directive
- * @name ui.bootstrap.tabs.directive:tabHeading
- * @restrict EA
- *
- * @description
- * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element.
- *
- * @example
-<example module="ui.bootstrap">
-  <file name="index.html">
-    <tabset>
-      <tab>
-        <tab-heading><b>HTML</b> in my titles?!</tab-heading>
-        And some content, too!
-      </tab>
-      <tab>
-        <tab-heading><i class="icon-heart"></i> Icon heading?!?</tab-heading>
-        That's right.
-      </tab>
-    </tabset>
-  </file>
-</example>
- */
-.directive('tab', ['$parse', function($parse) {
-  return {
-    require: '^tabset',
-    restrict: 'EA',
-    replace: true,
-    templateUrl: 'template/tabs/tab.html',
-    transclude: true,
-    scope: {
-      heading: '@',
-      onSelect: '&select', //This callback is called in contentHeadingTransclude
-                          //once it inserts the tab's content into the dom
-      onDeselect: '&deselect'
-    },
-    controller: function() {
-      //Empty controller so other directives can require being 'under' a tab
-    },
-    compile: function(elm, attrs, transclude) {
-      return function postLink(scope, elm, attrs, tabsetCtrl) {
-        var getActive, setActive;
-        if (attrs.active) {
-          getActive = $parse(attrs.active);
-          setActive = getActive.assign;
-          scope.$parent.$watch(getActive, function updateActive(value, oldVal) {
-            // Avoid re-initializing scope.active as it is already initialized
-            // below. (watcher is called async during init with value ===
-            // oldVal)
-            if (value !== oldVal) {
-              scope.active = !!value;
-            }
-          });
-          scope.active = getActive(scope.$parent);
-        } else {
-          setActive = getActive = angular.noop;
-        }
-
-        scope.$watch('active', function(active) {
-          // Note this watcher also initializes and assigns scope.active to the
-          // attrs.active expression.
-          setActive(scope.$parent, active);
-          if (active) {
-            tabsetCtrl.select(scope);
-            scope.onSelect();
-          } else {
-            scope.onDeselect();
-          }
-        });
-
-        scope.disabled = false;
-        if ( attrs.disabled ) {
-          scope.$parent.$watch($parse(attrs.disabled), function(value) {
-            scope.disabled = !! value;
-          });
-        }
-
-        scope.select = function() {
-          if ( ! scope.disabled ) {
-            scope.active = true;
-          }
-        };
-
-        tabsetCtrl.addTab(scope);
-        scope.$on('$destroy', function() {
-          tabsetCtrl.removeTab(scope);
-        });
-
-
-        //We need to transclude later, once the content container is ready.
-        //when this link happens, we're inside a tab heading.
-        scope.$transcludeFn = transclude;
-      };
-    }
-  };
-}])
-
-.directive('tabHeadingTransclude', [function() {
-  return {
-    restrict: 'A',
-    require: '^tab',
-    link: function(scope, elm, attrs, tabCtrl) {
-      scope.$watch('headingElement', function updateHeadingElement(heading) {
-        if (heading) {
-          elm.html('');
-          elm.append(heading);
-        }
-      });
-    }
-  };
-}])
-
-.directive('tabContentTransclude', function() {
-  return {
-    restrict: 'A',
-    require: '^tabset',
-    link: function(scope, elm, attrs) {
-      var tab = scope.$eval(attrs.tabContentTransclude);
-
-      //Now our tab is ready to be transcluded: both the tab heading area
-      //and the tab content area are loaded.  Transclude 'em both.
-      tab.$transcludeFn(tab.$parent, function(contents) {
-        angular.forEach(contents, function(node) {
-          if (isTabHeading(node)) {
-            //Let tabHeadingTransclude know.
-            tab.headingElement = node;
-          } else {
-            elm.append(node);
-          }
-        });
-      });
-    }
-  };
-  function isTabHeading(node) {
-    return node.tagName &&  (
-      node.hasAttribute('tab-heading') ||
-      node.hasAttribute('data-tab-heading') ||
-      node.tagName.toLowerCase() === 'tab-heading' ||
-      node.tagName.toLowerCase() === 'data-tab-heading'
-    );
-  }
-})
-
-;
-
-angular.module('ui.bootstrap.timepicker', [])
-
-.constant('timepickerConfig', {
-  hourStep: 1,
-  minuteStep: 1,
-  showMeridian: true,
-  meridians: null,
-  readonlyInput: false,
-  mousewheel: true
-})
-
-.directive('timepicker', ['$parse', '$log', 'timepickerConfig', '$locale', function ($parse, $log, timepickerConfig, $locale) {
-  return {
-    restrict: 'EA',
-    require:'?^ngModel',
-    replace: true,
-    scope: {},
-    templateUrl: 'template/timepicker/timepicker.html',
-    link: function(scope, element, attrs, ngModel) {
-      if ( !ngModel ) {
-        return; // do nothing if no ng-model
-      }
-
-      var selected = new Date(),
-          meridians = angular.isDefined(attrs.meridians) ? scope.$parent.$eval(attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS;
-
-      var hourStep = timepickerConfig.hourStep;
-      if (attrs.hourStep) {
-        scope.$parent.$watch($parse(attrs.hourStep), function(value) {
-          hourStep = parseInt(value, 10);
-        });
-      }
-
-      var minuteStep = timepickerConfig.minuteStep;
-      if (attrs.minuteStep) {
-        scope.$parent.$watch($parse(attrs.minuteStep), function(value) {
-          minuteStep = parseInt(value, 10);
-        });
-      }
-
-      // 12H / 24H mode
-      scope.showMeridian = timepickerConfig.showMeridian;
-      if (attrs.showMeridian) {
-        scope.$parent.$watch($parse(attrs.showMeridian), function(value) {
-          scope.showMeridian = !!value;
-
-          if ( ngModel.$error.time ) {
-            // Evaluate from template
-            var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();
-            if (angular.isDefined( hours ) && angular.isDefined( minutes )) {
-              selected.setHours( hours );
-              refresh();
-            }
-          } else {
-            updateTemplate();
-          }
-        });
-      }
-
-      // Get scope.hours in 24H mode if valid
-      function getHoursFromTemplate ( ) {
-        var hours = parseInt( scope.hours, 10 );
-        var valid = ( scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24);
-        if ( !valid ) {
-          return undefined;
-        }
-
-        if ( scope.showMeridian ) {
-          if ( hours === 12 ) {
-            hours = 0;
-          }
-          if ( scope.meridian === meridians[1] ) {
-            hours = hours + 12;
-          }
-        }
-        return hours;
-      }
-
-      function getMinutesFromTemplate() {
-        var minutes = parseInt(scope.minutes, 10);
-        return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined;
-      }
-
-      function pad( value ) {
-        return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value;
-      }
-
-      // Input elements
-      var inputs = element.find('input'), hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1);
-
-      // Respond on mousewheel spin
-      var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel;
-      if ( mousewheel ) {
-
-        var isScrollingUp = function(e) {
-          if (e.originalEvent) {
-            e = e.originalEvent;
-          }
-          //pick correct delta variable depending on event
-          var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;
-          return (e.detail || delta > 0);
-        };
-
-        hoursInputEl.bind('mousewheel wheel', function(e) {
-          scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() );
-          e.preventDefault();
-        });
-
-        minutesInputEl.bind('mousewheel wheel', function(e) {
-          scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() );
-          e.preventDefault();
-        });
-      }
-
-      scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : timepickerConfig.readonlyInput;
-      if ( ! scope.readonlyInput ) {
-
-        var invalidate = function(invalidHours, invalidMinutes) {
-          ngModel.$setViewValue( null );
-          ngModel.$setValidity('time', false);
-          if (angular.isDefined(invalidHours)) {
-            scope.invalidHours = invalidHours;
-          }
-          if (angular.isDefined(invalidMinutes)) {
-            scope.invalidMinutes = invalidMinutes;
-          }
-        };
-
-        scope.updateHours = function() {
-          var hours = getHoursFromTemplate();
-
-          if ( angular.isDefined(hours) ) {
-            selected.setHours( hours );
-            refresh( 'h' );
-          } else {
-            invalidate(true);
-          }
-        };
-
-        hoursInputEl.bind('blur', function(e) {
-          if ( !scope.validHours && scope.hours < 10) {
-            scope.$apply( function() {
-              scope.hours = pad( scope.hours );
-            });
-          }
-        });
-
-        scope.updateMinutes = function() {
-          var minutes = getMinutesFromTemplate();
-
-          if ( angular.isDefined(minutes) ) {
-            selected.setMinutes( minutes );
-            refresh( 'm' );
-          } else {
-            invalidate(undefined, true);
-          }
-        };
-
-        minutesInputEl.bind('blur', function(e) {
-          if ( !scope.invalidMinutes && scope.minutes < 10 ) {
-            scope.$apply( function() {
-              scope.minutes = pad( scope.minutes );
-            });
-          }
-        });
-      } else {
-        scope.updateHours = angular.noop;
-        scope.updateMinutes = angular.noop;
-      }
-
-      ngModel.$render = function() {
-        var date = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : null;
-
-        if ( isNaN(date) ) {
-          ngModel.$setValidity('time', false);
-          $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');
-        } else {
-          if ( date ) {
-            selected = date;
-          }
-          makeValid();
-          updateTemplate();
-        }
-      };
-
-      // Call internally when we know that model is valid.
-      function refresh( keyboardChange ) {
-        makeValid();
-        ngModel.$setViewValue( new Date(selected) );
-        updateTemplate( keyboardChange );
-      }
-
-      function makeValid() {
-        ngModel.$setValidity('time', true);
-        scope.invalidHours = false;
-        scope.invalidMinutes = false;
-      }
-
-      function updateTemplate( keyboardChange ) {
-        var hours = selected.getHours(), minutes = selected.getMinutes();
-
-        if ( scope.showMeridian ) {
-          hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system
-        }
-        scope.hours =  keyboardChange === 'h' ? hours : pad(hours);
-        scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes);
-        scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];
-      }
-
-      function addMinutes( minutes ) {
-        var dt = new Date( selected.getTime() + minutes * 60000 );
-        selected.setHours( dt.getHours(), dt.getMinutes() );
-        refresh();
-      }
-
-      scope.incrementHours = function() {
-        addMinutes( hourStep * 60 );
-      };
-      scope.decrementHours = function() {
-        addMinutes( - hourStep * 60 );
-      };
-      scope.incrementMinutes = function() {
-        addMinutes( minuteStep );
-      };
-      scope.decrementMinutes = function() {
-        addMinutes( - minuteStep );
-      };
-      scope.toggleMeridian = function() {
-        addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) );
-      };
-    }
-  };
-}]);
-
-angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml'])
-
-/**
- * A helper service that can parse typeahead's syntax (string provided by users)
- * Extracted to a separate service for ease of unit testing
- */
-  .factory('typeaheadParser', ['$parse', function ($parse) {
-
-  //                      00000111000000000000022200000000000000003333333333333330000000000044000
-  var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;
-
-  return {
-    parse:function (input) {
-
-      var match = input.match(TYPEAHEAD_REGEXP), modelMapper, viewMapper, source;
-      if (!match) {
-        throw new Error(
-          "Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_'" +
-            " but got '" + input + "'.");
-      }
-
-      return {
-        itemName:match[3],
-        source:$parse(match[4]),
-        viewMapper:$parse(match[2] || match[1]),
-        modelMapper:$parse(match[1])
-      };
-    }
-  };
-}])
-
-  .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser',
-    function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) {
-
-  var HOT_KEYS = [9, 13, 27, 38, 40];
-
-  return {
-    require:'ngModel',
-    link:function (originalScope, element, attrs, modelCtrl) {
-
-      //SUPPORTED ATTRIBUTES (OPTIONS)
-
-      //minimal no of characters that needs to be entered before typeahead kicks-in
-      var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1;
-
-      //minimal wait time after last character typed before typehead kicks-in
-      var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;
-
-      //should it restrict model values to the ones selected from the popup only?
-      var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;
-
-      //binding to a variable that indicates if matches are being retrieved asynchronously
-      var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;
-
-      //a callback executed when a match is selected
-      var onSelectCallback = $parse(attrs.typeaheadOnSelect);
-
-      var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;
-
-      var appendToBody =  attrs.typeaheadAppendToBody ? $parse(attrs.typeaheadAppendToBody) : false;
-
-      //INTERNAL VARIABLES
-
-      //model setter executed upon match selection
-      var $setModelValue = $parse(attrs.ngModel).assign;
-
-      //expressions used by typeahead
-      var parserResult = typeaheadParser.parse(attrs.typeahead);
-
-      var hasFocus;
-
-      //pop-up element used to display matches
-      var popUpEl = angular.element('<div typeahead-popup></div>');
-      popUpEl.attr({
-        matches: 'matches',
-        active: 'activeIdx',
-        select: 'select(activeIdx)',
-        query: 'query',
-        position: 'position'
-      });
-      //custom item template
-      if (angular.isDefined(attrs.typeaheadTemplateUrl)) {
-        popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);
-      }
-
-      //create a child scope for the typeahead directive so we are not polluting original scope
-      //with typeahead-specific data (matches, query etc.)
-      var scope = originalScope.$new();
-      originalScope.$on('$destroy', function(){
-        scope.$destroy();
-      });
-
-      var resetMatches = function() {
-        scope.matches = [];
-        scope.activeIdx = -1;
-      };
-
-      var getMatchesAsync = function(inputValue) {
-
-        var locals = {$viewValue: inputValue};
-        isLoadingSetter(originalScope, true);
-        $q.when(parserResult.source(originalScope, locals)).then(function(matches) {
-
-          //it might happen that several async queries were in progress if a user were typing fast
-          //but we are interested only in responses that correspond to the current view value
-          if (inputValue === modelCtrl.$viewValue && hasFocus) {
-            if (matches.length > 0) {
-
-              scope.activeIdx = 0;
-              scope.matches.length = 0;
-
-              //transform labels
-              for(var i=0; i<matches.length; i++) {
-                locals[parserResult.itemName] = matches[i];
-                scope.matches.push({
-                  label: parserResult.viewMapper(scope, locals),
-                  model: matches[i]
-                });
-              }
-
-              scope.query = inputValue;
-              //position pop-up with matches - we need to re-calculate its position each time we are opening a window
-              //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page
-              //due to other elements being rendered
-              scope.position = appendToBody ? $position.offset(element) : $position.position(element);
-              scope.position.top = scope.position.top + element.prop('offsetHeight');
-
-            } else {
-              resetMatches();
-            }
-            isLoadingSetter(originalScope, false);
-          }
-        }, function(){
-          resetMatches();
-          isLoadingSetter(originalScope, false);
-        });
-      };
-
-      resetMatches();
-
-      //we need to propagate user's query so we can higlight matches
-      scope.query = undefined;
-
-      //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later 
-      var timeoutPromise;
-
-      //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM
-      //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue
-      modelCtrl.$parsers.unshift(function (inputValue) {
-
-        hasFocus = true;
-
-        if (inputValue && inputValue.length >= minSearch) {
-          if (waitTime > 0) {
-            if (timeoutPromise) {
-              $timeout.cancel(timeoutPromise);//cancel previous timeout
-            }
-            timeoutPromise = $timeout(function () {
-              getMatchesAsync(inputValue);
-            }, waitTime);
-          } else {
-            getMatchesAsync(inputValue);
-          }
-        } else {
-          isLoadingSetter(originalScope, false);
-          resetMatches();
-        }
-
-        if (isEditable) {
-          return inputValue;
-        } else {
-          if (!inputValue) {
-            // Reset in case user had typed something previously.
-            modelCtrl.$setValidity('editable', true);
-            return inputValue;
-          } else {
-            modelCtrl.$setValidity('editable', false);
-            return undefined;
-          }
-        }
-      });
-
-      modelCtrl.$formatters.push(function (modelValue) {
-
-        var candidateViewValue, emptyViewValue;
-        var locals = {};
-
-        if (inputFormatter) {
-
-          locals['$model'] = modelValue;
-          return inputFormatter(originalScope, locals);
-
-        } else {
-
-          //it might happen that we don't have enough info to properly render input value
-          //we need to check for this situation and simply return model value if we can't apply custom formatting
-          locals[parserResult.itemName] = modelValue;
-          candidateViewValue = parserResult.viewMapper(originalScope, locals);
-          locals[parserResult.itemName] = undefined;
-          emptyViewValue = parserResult.viewMapper(originalScope, locals);
-
-          return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue;
-        }
-      });
-
-      scope.select = function (activeIdx) {
-        //called from within the $digest() cycle
-        var locals = {};
-        var model, item;
-
-        locals[parserResult.itemName] = item = scope.matches[activeIdx].model;
-        model = parserResult.modelMapper(originalScope, locals);
-        $setModelValue(originalScope, model);
-        modelCtrl.$setValidity('editable', true);
-
-        onSelectCallback(originalScope, {
-          $item: item,
-          $model: model,
-          $label: parserResult.viewMapper(originalScope, locals)
-        });
-
-        resetMatches();
-
-        //return focus to the input element if a mach was selected via a mouse click event
-        element[0].focus();
-      };
-
-      //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)
-      element.bind('keydown', function (evt) {
-
-        //typeahead is open and an "interesting" key was pressed
-        if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {
-          return;
-        }
-
-        evt.preventDefault();
-
-        if (evt.which === 40) {
-          scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;
-          scope.$digest();
-
-        } else if (evt.which === 38) {
-          scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1;
-          scope.$digest();
-
-        } else if (evt.which === 13 || evt.which === 9) {
-          scope.$apply(function () {
-            scope.select(scope.activeIdx);
-          });
-
-        } else if (evt.which === 27) {
-          evt.stopPropagation();
-
-          resetMatches();
-          scope.$digest();
-        }
-      });
-
-      element.bind('blur', function (evt) {
-        hasFocus = false;
-      });
-
-      // Keep reference to click handler to unbind it.
-      var dismissClickHandler = function (evt) {
-        if (element[0] !== evt.target) {
-          resetMatches();
-          scope.$digest();
-        }
-      };
-
-      $document.bind('click', dismissClickHandler);
-
-      originalScope.$on('$destroy', function(){
-        $document.unbind('click', dismissClickHandler);
-      });
-
-      var $popup = $compile(popUpEl)(scope);
-      if ( appendToBody ) {
-        $document.find('body').append($popup);
-      } else {
-        element.after($popup);
-      }
-    }
-  };
-
-}])
-
-  .directive('typeaheadPopup', function () {
-    return {
-      restrict:'EA',
-      scope:{
-        matches:'=',
-        query:'=',
-        active:'=',
-        position:'=',
-        select:'&'
-      },
-      replace:true,
-      templateUrl:'template/typeahead/typeahead-popup.html',
-      link:function (scope, element, attrs) {
-
-        scope.templateUrl = attrs.templateUrl;
-
-        scope.isOpen = function () {
-          return scope.matches.length > 0;
-        };
-
-        scope.isActive = function (matchIdx) {
-          return scope.active == matchIdx;
-        };
-
-        scope.selectActive = function (matchIdx) {
-          scope.active = matchIdx;
-        };
-
-        scope.selectMatch = function (activeIdx) {
-          scope.select({activeIdx:activeIdx});
-        };
-      }
-    };
-  })
-
-  .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) {
-    return {
-      restrict:'EA',
-      scope:{
-        index:'=',
-        match:'=',
-        query:'='
-      },
-      link:function (scope, element, attrs) {
-        var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html';
-        $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){
-           element.replaceWith($compile(tplContent.trim())(scope));
-        });
-      }
-    };
-  }])
-
-  .filter('typeaheadHighlight', function() {
-
-    function escapeRegexp(queryToEscape) {
-      return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
-    }
-
-    return function(matchItem, query) {
-      return query ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem;
-    };
-  });
-angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/accordion/accordion-group.html",
-    "<div class=\"panel panel-default\">\n" +
-    "  <div class=\"panel-heading\">\n" +
-    "    <h4 class=\"panel-title\">\n" +
-    "      <a class=\"accordion-toggle\" ng-click=\"isOpen = !isOpen\" accordion-transclude=\"heading\">{{heading}}</a>\n" +
-    "    </h4>\n" +
-    "  </div>\n" +
-    "  <div class=\"panel-collapse\" collapse=\"!isOpen\">\n" +
-    "	  <div class=\"panel-body\" ng-transclude></div>\n" +
-    "  </div>\n" +
-    "</div>");
-}]);
-
-angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/accordion/accordion.html",
-    "<div class=\"panel-group\" ng-transclude></div>");
-}]);
-
-angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/alert/alert.html",
-    "<div class='alert' ng-class='\"alert-\" + (type || \"warning\")'>\n" +
-    "    <button ng-show='closeable' type='button' class='close' ng-click='close()'>&times;</button>\n" +
-    "    <div ng-transclude></div>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/carousel/carousel.html",
-    "<div ng-mouseenter=\"pause()\" ng-mouseleave=\"play()\" class=\"carousel\">\n" +
-    "    <ol class=\"carousel-indicators\" ng-show=\"slides().length > 1\">\n" +
-    "        <li ng-repeat=\"slide in slides()\" ng-class=\"{active: isActive(slide)}\" ng-click=\"select(slide)\"></li>\n" +
-    "    </ol>\n" +
-    "    <div class=\"carousel-inner\" ng-transclude></div>\n" +
-    "    <a class=\"left carousel-control\" ng-click=\"prev()\" ng-show=\"slides().length > 1\"><span class=\"icon-prev\"></span></a>\n" +
-    "    <a class=\"right carousel-control\" ng-click=\"next()\" ng-show=\"slides().length > 1\"><span class=\"icon-next\"></span></a>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/carousel/slide.html",
-    "<div ng-class=\"{\n" +
-    "    'active': leaving || (active && !entering),\n" +
-    "    'prev': (next || active) && direction=='prev',\n" +
-    "    'next': (next || active) && direction=='next',\n" +
-    "    'right': direction=='prev',\n" +
-    "    'left': direction=='next'\n" +
-    "  }\" class=\"item text-center\" ng-transclude></div>\n" +
-    "");
-}]);
-
-angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/datepicker/datepicker.html",
-    "<table>\n" +
-    "  <thead>\n" +
-    "    <tr>\n" +
-    "      <th><button type=\"button\" class=\"btn btn-default btn-sm pull-left\" ng-click=\"move(-1)\"><i class=\"glyphicon glyphicon-chevron-left\"></i></button></th>\n" +
-    "      <th colspan=\"{{rows[0].length - 2 + showWeekNumbers}}\"><button type=\"button\" class=\"btn btn-default btn-sm btn-block\" ng-click=\"toggleMode()\"><strong>{{title}}</strong></button></th>\n" +
-    "      <th><button type=\"button\" class=\"btn btn-default btn-sm pull-right\" ng-click=\"move(1)\"><i class=\"glyphicon glyphicon-chevron-right\"></i></button></th>\n" +
-    "    </tr>\n" +
-    "    <tr ng-show=\"labels.length > 0\" class=\"h6\">\n" +
-    "      <th ng-show=\"showWeekNumbers\" class=\"text-center\">#</th>\n" +
-    "      <th ng-repeat=\"label in labels\" class=\"text-center\">{{label}}</th>\n" +
-    "    </tr>\n" +
-    "  </thead>\n" +
-    "  <tbody>\n" +
-    "    <tr ng-repeat=\"row in rows\">\n" +
-    "      <td ng-show=\"showWeekNumbers\" class=\"text-center\"><em>{{ getWeekNumber(row) }}</em></td>\n" +
-    "      <td ng-repeat=\"dt in row\" class=\"text-center\">\n" +
-    "        <button type=\"button\" style=\"width:100%;\" class=\"btn btn-default btn-sm\" ng-class=\"{'btn-info': dt.selected}\" ng-click=\"select(dt.date)\" ng-disabled=\"dt.disabled\"><span ng-class=\"{'text-muted': dt.secondary}\">{{dt.label}}</span></button>\n" +
-    "      </td>\n" +
-    "    </tr>\n" +
-    "  </tbody>\n" +
-    "</table>\n" +
-    "");
-}]);
-
-angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/datepicker/popup.html",
-    "<ul class=\"dropdown-menu\" ng-style=\"{display: (isOpen && 'block') || 'none', top: position.top+'px', left: position.left+'px'}\">\n" +
-    "	<li ng-transclude></li>\n" +
-    "	<li ng-show=\"showButtonBar\" style=\"padding:10px 9px 2px\">\n" +
-    "		<span class=\"btn-group\">\n" +
-    "			<button type=\"button\" class=\"btn btn-sm btn-info\" ng-click=\"today()\">{{currentText}}</button>\n" +
-    "			<button type=\"button\" class=\"btn btn-sm btn-default\" ng-click=\"showWeeks = ! showWeeks\" ng-class=\"{active: showWeeks}\">{{toggleWeeksText}}</button>\n" +
-    "			<button type=\"button\" class=\"btn btn-sm btn-danger\" ng-click=\"clear()\">{{clearText}}</button>\n" +
-    "		</span>\n" +
-    "		<button type=\"button\" class=\"btn btn-sm btn-success pull-right\" ng-click=\"isOpen = false\">{{closeText}}</button>\n" +
-    "	</li>\n" +
-    "</ul>\n" +
-    "");
-}]);
-
-angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/modal/backdrop.html",
-    "<div class=\"modal-backdrop fade\" ng-class=\"{in: animate}\" ng-style=\"{'z-index': 1040 + index*10}\"></div>");
-}]);
-
-angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/modal/window.html",
-    "<div tabindex=\"-1\" class=\"modal fade {{ windowClass }}\" ng-class=\"{in: animate}\" ng-style=\"{'z-index': 1050 + index*10, display: 'block'}\" ng-click=\"close($event)\">\n" +
-    "    <div class=\"modal-dialog\"><div class=\"modal-content\" ng-transclude></div></div>\n" +
-    "</div>");
-}]);
-
-angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/pagination/pager.html",
-    "<ul class=\"pager\">\n" +
-    "  <li ng-repeat=\"page in pages\" ng-class=\"{disabled: page.disabled, previous: page.previous, next: page.next}\"><a ng-click=\"selectPage(page.number)\">{{page.text}}</a></li>\n" +
-    "</ul>");
-}]);
-
-angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/pagination/pagination.html",
-    "<ul class=\"pagination\">\n" +
-    "  <li ng-repeat=\"page in pages\" ng-class=\"{active: page.active, disabled: page.disabled}\"><a ng-click=\"selectPage(page.number)\">{{page.text}}</a></li>\n" +
-    "</ul>");
-}]);
-
-angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html",
-    "<div class=\"tooltip {{placement}}\" ng-class=\"{ in: isOpen(), fade: animation() }\">\n" +
-    "  <div class=\"tooltip-arrow\"></div>\n" +
-    "  <div class=\"tooltip-inner\" bind-html-unsafe=\"content\"></div>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/tooltip/tooltip-popup.html",
-    "<div class=\"tooltip {{placement}}\" ng-class=\"{ in: isOpen(), fade: animation() }\">\n" +
-    "  <div class=\"tooltip-arrow\"></div>\n" +
-    "  <div class=\"tooltip-inner\" ng-bind=\"content\"></div>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/popover/popover.html",
-    "<div class=\"popover {{placement}}\" ng-class=\"{ in: isOpen(), fade: animation() }\">\n" +
-    "  <div class=\"arrow\"></div>\n" +
-    "\n" +
-    "  <div class=\"popover-inner\">\n" +
-    "      <h3 class=\"popover-title\" ng-bind=\"title\" ng-show=\"title\"></h3>\n" +
-    "      <div class=\"popover-content\" ng-bind=\"content\"></div>\n" +
-    "  </div>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/progressbar/bar.html",
-    "<div class=\"progress-bar\" ng-class=\"type && 'progress-bar-' + type\" ng-transclude></div>");
-}]);
-
-angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/progressbar/progress.html",
-    "<div class=\"progress\" ng-transclude></div>");
-}]);
-
-angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/progressbar/progressbar.html",
-    "<div class=\"progress\"><div class=\"progress-bar\" ng-class=\"type && 'progress-bar-' + type\" ng-transclude></div></div>");
-}]);
-
-angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/rating/rating.html",
-    "<span ng-mouseleave=\"reset()\">\n" +
-    "    <i ng-repeat=\"r in range\" ng-mouseenter=\"enter($index + 1)\" ng-click=\"rate($index + 1)\" class=\"glyphicon\" ng-class=\"$index < val && (r.stateOn || 'glyphicon-star') || (r.stateOff || 'glyphicon-star-empty')\"></i>\n" +
-    "</span>");
-}]);
-
-angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/tabs/tab.html",
-    "<li ng-class=\"{active: active, disabled: disabled}\">\n" +
-    "  <a ng-click=\"select()\" tab-heading-transclude>{{heading}}</a>\n" +
-    "</li>\n" +
-    "");
-}]);
-
-angular.module("template/tabs/tabset-titles.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/tabs/tabset-titles.html",
-    "<ul class=\"nav {{type && 'nav-' + type}}\" ng-class=\"{'nav-stacked': vertical}\">\n" +
-    "</ul>\n" +
-    "");
-}]);
-
-angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/tabs/tabset.html",
-    "\n" +
-    "<div class=\"tabbable\">\n" +
-    "  <ul class=\"nav {{type && 'nav-' + type}}\" ng-class=\"{'nav-stacked': vertical, 'nav-justified': justified}\" ng-transclude></ul>\n" +
-    "  <div class=\"tab-content\">\n" +
-    "    <div class=\"tab-pane\" \n" +
-    "         ng-repeat=\"tab in tabs\" \n" +
-    "         ng-class=\"{active: tab.active}\"\n" +
-    "         tab-content-transclude=\"tab\">\n" +
-    "    </div>\n" +
-    "  </div>\n" +
-    "</div>\n" +
-    "");
-}]);
-
-angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/timepicker/timepicker.html",
-    "<table>\n" +
-    "	<tbody>\n" +
-    "		<tr class=\"text-center\">\n" +
-    "			<td><a ng-click=\"incrementHours()\" class=\"btn btn-link\"><span class=\"glyphicon glyphicon-chevron-up\"></span></a></td>\n" +
-    "			<td>&nbsp;</td>\n" +
-    "			<td><a ng-click=\"incrementMinutes()\" class=\"btn btn-link\"><span class=\"glyphicon glyphicon-chevron-up\"></span></a></td>\n" +
-    "			<td ng-show=\"showMeridian\"></td>\n" +
-    "		</tr>\n" +
-    "		<tr>\n" +
-    "			<td style=\"width:50px;\" class=\"form-group\" ng-class=\"{'has-error': invalidHours}\">\n" +
-    "				<input type=\"text\" ng-model=\"hours\" ng-change=\"updateHours()\" class=\"form-control text-center\" ng-mousewheel=\"incrementHours()\" ng-readonly=\"readonlyInput\" maxlength=\"2\">\n" +
-    "			</td>\n" +
-    "			<td>:</td>\n" +
-    "			<td style=\"width:50px;\" class=\"form-group\" ng-class=\"{'has-error': invalidMinutes}\">\n" +
-    "				<input type=\"text\" ng-model=\"minutes\" ng-change=\"updateMinutes()\" class=\"form-control text-center\" ng-readonly=\"readonlyInput\" maxlength=\"2\">\n" +
-    "			</td>\n" +
-    "			<td ng-show=\"showMeridian\"><button type=\"button\" class=\"btn btn-default text-center\" ng-click=\"toggleMeridian()\">{{meridian}}</button></td>\n" +
-    "		</tr>\n" +
-    "		<tr class=\"text-center\">\n" +
-    "			<td><a ng-click=\"decrementHours()\" class=\"btn btn-link\"><span class=\"glyphicon glyphicon-chevron-down\"></span></a></td>\n" +
-    "			<td>&nbsp;</td>\n" +
-    "			<td><a ng-click=\"decrementMinutes()\" class=\"btn btn-link\"><span class=\"glyphicon glyphicon-chevron-down\"></span></a></td>\n" +
-    "			<td ng-show=\"showMeridian\"></td>\n" +
-    "		</tr>\n" +
-    "	</tbody>\n" +
-    "</table>\n" +
-    "");
-}]);
-
-angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/typeahead/typeahead-match.html",
-    "<a tabindex=\"-1\" bind-html-unsafe=\"match.label | typeaheadHighlight:query\"></a>");
-}]);
-
-angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) {
-  $templateCache.put("template/typeahead/typeahead-popup.html",
-    "<ul class=\"dropdown-menu\" ng-style=\"{display: isOpen()&&'block' || 'none', top: position.top+'px', left: position.left+'px'}\">\n" +
-    "    <li ng-repeat=\"match in matches\" ng-class=\"{active: isActive($index) }\" ng-mouseenter=\"selectActive($index)\" ng-click=\"selectMatch($index)\">\n" +
-    "        <div typeahead-match index=\"$index\" match=\"match\" query=\"query\" template-url=\"templateUrl\"></div>\n" +
-    "    </li>\n" +
-    "</ul>");
-}]);
diff --git a/dashboard/lib/assets/underscore-min.js b/dashboard/lib/assets/underscore-min.js
deleted file mode 100644
index 3434d6c..0000000
--- a/dashboard/lib/assets/underscore-min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-//     Underscore.js 1.6.0
-//     http://underscorejs.org
-//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:j.now(),a=null,i=n.apply(e,u),e=u=null};return function(){var l=j.now();o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this);
-//# sourceMappingURL=underscore-min.map
\ No newline at end of file
diff --git a/dashboard/lib/fonts/glyphicons-halflings-regular.eot b/dashboard/lib/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index 4a4ca86..0000000
--- a/dashboard/lib/fonts/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/fonts/glyphicons-halflings-regular.svg b/dashboard/lib/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index e3e2dc7..0000000
--- a/dashboard/lib/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph />
-<glyph />
-<glyph unicode="&#xd;" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
-<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#x2000;" horiz-adv-x="652" />
-<glyph unicode="&#x2001;" horiz-adv-x="1304" />
-<glyph unicode="&#x2002;" horiz-adv-x="652" />
-<glyph unicode="&#x2003;" horiz-adv-x="1304" />
-<glyph unicode="&#x2004;" horiz-adv-x="434" />
-<glyph unicode="&#x2005;" horiz-adv-x="326" />
-<glyph unicode="&#x2006;" horiz-adv-x="217" />
-<glyph unicode="&#x2007;" horiz-adv-x="217" />
-<glyph unicode="&#x2008;" horiz-adv-x="163" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="326" />
-<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
-<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
-<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
-<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
-<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
-<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
-<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
-<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
-<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
-<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
-<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
-<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
-<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
-<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
-<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
-<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
-<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
-<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
-<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
-<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
-<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
-<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
-<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
-<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
-<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
-<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
-<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
-<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
-<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
-<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
-<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
-<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
-<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
-<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
-<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
-<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
-<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
-<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
-<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
-<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
-<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
-<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
-<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
-<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
-<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
-<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
-<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
-<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
-<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
-<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
-<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
-<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
-<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
-<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
-<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
-<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
-<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
-<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
-<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
-<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
-<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
-<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
-<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
-<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
-<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
-<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
-<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
-<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
-<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
-<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
-<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
-<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
-<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
-<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
-<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
-<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
-<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
-<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
-<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
-<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
-<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
-<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
-<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
-<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
-<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
-<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
-<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
-<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
-<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
-<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
-<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
-<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
-<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
-<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
-<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
-<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
-<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
-<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
-<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
-<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
-<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
-<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
-<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
-<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
-<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
-<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
-<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
-<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
-<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
-<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
-<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
-<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
-<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
-<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
-<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
-<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
-<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
-<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
-<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
-<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
-<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
-<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
-<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
-<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
-<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
-<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
-<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
-<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
-<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
-<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
-<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
-<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
-<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
-<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
-<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
-<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
-<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
-<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
-<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
-<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
-<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
-<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
-<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
-<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
-<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
-<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
-<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
-<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
-<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
-<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
-<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
-<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
-<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
-<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
-<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
-<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
-<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
-<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
-<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
-<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
-<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
-<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
-<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
-<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
-<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
-<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
-<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
-<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
-<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
-<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
-<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
-</font>
-</defs></svg> 
\ No newline at end of file
diff --git a/dashboard/lib/fonts/glyphicons-halflings-regular.ttf b/dashboard/lib/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 67fa00b..0000000
--- a/dashboard/lib/fonts/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/fonts/glyphicons-halflings-regular.woff b/dashboard/lib/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 8c54182..0000000
--- a/dashboard/lib/fonts/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/index.html b/dashboard/lib/index.html
deleted file mode 100644
index ebbd44e..0000000
--- a/dashboard/lib/index.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" ng-app='xdata-db'>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description" content="">
-    <meta name="author" content="">
-    <meta charset="UTF-8" />
-    <meta name="google" content="notranslate">
-    <meta http-equiv="Content-Language" content="en" />
-
-    <title>XDATA | Logging Dashboard</title>
-
-    <link rel="stylesheet" href="css/bootstrap.css">
-
-    <!-- add packages here -->
-
-    <!-- custom css -->
-    <link rel="stylesheet" href="css/style.css">
-  </head>
-
-  <body ng-controller="AppController">
-    <div class="navbar navbar-default navbar-static-top" role="navigation">
-      <div class="container">
-        <div class="navbar-header">
-          <draper-logo></draper-logo>
-          <a class="navbar-brand" href="#">{{title}}</a>
-        </div>
-        <div class="navbar-collapse collapse">
-          <ul class="nav navbar-nav">
-            <li bootstrap-nav ng-repeat="route in routes" ng-class="{ active: isActive()}" url=route.url name=route.name></li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Statistics <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li><a href="/#/stats/compActivity">Components Per Activity</a></li>     
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Examples <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li class="dropdown-header">Kitware</li>
-                <!-- <li><a href="/static/HospitalCosts/index2.html">Hospital Costs</a></li>    -->
-                <li><a href="http://10.1.98.102/year2/twitter-mentions-instrumented-v2/">Twitter Mentions</a></li>     
-                <!-- <li><a href="http://10.1.98.102/year2/twitter-geomap-instrumented-v2/ -->
-<!-- ">Twitter Geomap</a></li>      -->
-                <li class="divider"></li>
-                <li class="dropdown-header">Oculus</li>
-                <li><a href="http://10.1.98.104:8080/kiva/">Influent</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Documentation <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li><a href="/static/simple_guide">Getting Started</a></li> 
-                <li><a href="/static/wf_states">Workflow Guide</a></li> 
-                <li><a href="/static/doc/index.html">Full API</a></li>     
-              </ul>
-            </li>
-            <!-- <li><a href="/static/HospitalCosts/index2.html">Demo</a></li> -->
-            <!-- <li><a href="/static/doc/index.html">Documentation</a></li> -->
-            <!-- <li><a href="/#/wfDesc">Workflow Descriptions</a></li> -->
-          </ul>
-          <ul class="nav navbar-nav navbar-right">
-            <li><a href="">Login</a></li>
-          </ul>
-        </div><!--/.nav-collapse -->
-      </div>
-    </div>
-
-    <div class="container" ng-view>
-    </div>
-
-    <script src="js/assets.js"></script>
-
-    <!-- add packages here -->
-
-    <script src="js/src.js"></script>
-  </body>
-</html>
diff --git a/dashboard/lib/less/.csscomb.json b/dashboard/lib/less/.csscomb.json
deleted file mode 100644
index c3d0c08..0000000
--- a/dashboard/lib/less/.csscomb.json
+++ /dev/null
@@ -1,297 +0,0 @@
-{
-  "always-semicolon": true,
-  "block-indent": 2,
-  "colon-space": true,
-  "color-case": "lower",
-  "color-shorthand": true,
-  "combinator-space": true,
-  "element-case": "lower",
-  "eof-newline": true,
-  "leading-zero": false,
-  "remove-empty-rulesets": true,
-  "rule-indent": 2,
-  "stick-brace": true,
-  "strip-spaces": true,
-  "unitless-zero": true,
-  "vendor-prefix-align": true,
-  "sort-order": [
-    [
-      "position",
-      "top",
-      "right",
-      "bottom",
-      "left",
-      "z-index",
-      "display",
-      "float",
-      "width",
-      "min-width",
-      "max-width",
-      "height",
-      "min-height",
-      "max-height",
-      "-webkit-box-sizing",
-      "-moz-box-sizing",
-      "box-sizing",
-      "-webkit-appearance",
-      "padding",
-      "padding-top",
-      "padding-right",
-      "padding-bottom",
-      "padding-left",
-      "margin",
-      "margin-top",
-      "margin-right",
-      "margin-bottom",
-      "margin-left",
-      "overflow",
-      "overflow-x",
-      "overflow-y",
-      "-webkit-overflow-scrolling",
-      "-ms-overflow-x",
-      "-ms-overflow-y",
-      "-ms-overflow-style",
-      "clip",
-      "clear",
-      "font",
-      "font-family",
-      "font-size",
-      "font-style",
-      "font-weight",
-      "font-variant",
-      "font-size-adjust",
-      "font-stretch",
-      "font-effect",
-      "font-emphasize",
-      "font-emphasize-position",
-      "font-emphasize-style",
-      "font-smooth",
-      "-webkit-hyphens",
-      "-moz-hyphens",
-      "hyphens",
-      "line-height",
-      "color",
-      "text-align",
-      "-webkit-text-align-last",
-      "-moz-text-align-last",
-      "-ms-text-align-last",
-      "text-align-last",
-      "text-emphasis",
-      "text-emphasis-color",
-      "text-emphasis-style",
-      "text-emphasis-position",
-      "text-decoration",
-      "text-indent",
-      "text-justify",
-      "text-outline",
-      "-ms-text-overflow",
-      "text-overflow",
-      "text-overflow-ellipsis",
-      "text-overflow-mode",
-      "text-shadow",
-      "text-transform",
-      "text-wrap",
-      "-webkit-text-size-adjust",
-      "-ms-text-size-adjust",
-      "letter-spacing",
-      "-ms-word-break",
-      "word-break",
-      "word-spacing",
-      "-ms-word-wrap",
-      "word-wrap",
-      "-moz-tab-size",
-      "-o-tab-size",
-      "tab-size",
-      "white-space",
-      "vertical-align",
-      "list-style",
-      "list-style-position",
-      "list-style-type",
-      "list-style-image",
-      "pointer-events",
-      "cursor",
-      "visibility",
-      "zoom",
-      "flex-direction",
-      "flex-order",
-      "flex-pack",
-      "flex-align",
-      "table-layout",
-      "empty-cells",
-      "caption-side",
-      "border-spacing",
-      "border-collapse",
-      "content",
-      "quotes",
-      "counter-reset",
-      "counter-increment",
-      "resize",
-      "-webkit-user-select",
-      "-moz-user-select",
-      "-ms-user-select",
-      "-o-user-select",
-      "user-select",
-      "nav-index",
-      "nav-up",
-      "nav-right",
-      "nav-down",
-      "nav-left",
-      "background",
-      "background-color",
-      "background-image",
-      "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient",
-      "filter:progid:DXImageTransform.Microsoft.gradient",
-      "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
-      "filter",
-      "background-repeat",
-      "background-attachment",
-      "background-position",
-      "background-position-x",
-      "background-position-y",
-      "-webkit-background-clip",
-      "-moz-background-clip",
-      "background-clip",
-      "background-origin",
-      "-webkit-background-size",
-      "-moz-background-size",
-      "-o-background-size",
-      "background-size",
-      "border",
-      "border-color",
-      "border-style",
-      "border-width",
-      "border-top",
-      "border-top-color",
-      "border-top-style",
-      "border-top-width",
-      "border-right",
-      "border-right-color",
-      "border-right-style",
-      "border-right-width",
-      "border-bottom",
-      "border-bottom-color",
-      "border-bottom-style",
-      "border-bottom-width",
-      "border-left",
-      "border-left-color",
-      "border-left-style",
-      "border-left-width",
-      "border-radius",
-      "border-top-left-radius",
-      "border-top-right-radius",
-      "border-bottom-right-radius",
-      "border-bottom-left-radius",
-      "-webkit-border-image",
-      "-moz-border-image",
-      "-o-border-image",
-      "border-image",
-      "-webkit-border-image-source",
-      "-moz-border-image-source",
-      "-o-border-image-source",
-      "border-image-source",
-      "-webkit-border-image-slice",
-      "-moz-border-image-slice",
-      "-o-border-image-slice",
-      "border-image-slice",
-      "-webkit-border-image-width",
-      "-moz-border-image-width",
-      "-o-border-image-width",
-      "border-image-width",
-      "-webkit-border-image-outset",
-      "-moz-border-image-outset",
-      "-o-border-image-outset",
-      "border-image-outset",
-      "-webkit-border-image-repeat",
-      "-moz-border-image-repeat",
-      "-o-border-image-repeat",
-      "border-image-repeat",
-      "outline",
-      "outline-width",
-      "outline-style",
-      "outline-color",
-      "outline-offset",
-      "-webkit-box-shadow",
-      "-moz-box-shadow",
-      "box-shadow",
-      "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
-      "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha",
-      "opacity",
-      "-ms-interpolation-mode",
-      "-webkit-transition",
-      "-moz-transition",
-      "-ms-transition",
-      "-o-transition",
-      "transition",
-      "-webkit-transition-delay",
-      "-moz-transition-delay",
-      "-ms-transition-delay",
-      "-o-transition-delay",
-      "transition-delay",
-      "-webkit-transition-timing-function",
-      "-moz-transition-timing-function",
-      "-ms-transition-timing-function",
-      "-o-transition-timing-function",
-      "transition-timing-function",
-      "-webkit-transition-duration",
-      "-moz-transition-duration",
-      "-ms-transition-duration",
-      "-o-transition-duration",
-      "transition-duration",
-      "-webkit-transition-property",
-      "-moz-transition-property",
-      "-ms-transition-property",
-      "-o-transition-property",
-      "transition-property",
-      "-webkit-transform",
-      "-moz-transform",
-      "-ms-transform",
-      "-o-transform",
-      "transform",
-      "-webkit-transform-origin",
-      "-moz-transform-origin",
-      "-ms-transform-origin",
-      "-o-transform-origin",
-      "transform-origin",
-      "-webkit-animation",
-      "-moz-animation",
-      "-ms-animation",
-      "-o-animation",
-      "animation",
-      "-webkit-animation-name",
-      "-moz-animation-name",
-      "-ms-animation-name",
-      "-o-animation-name",
-      "animation-name",
-      "-webkit-animation-duration",
-      "-moz-animation-duration",
-      "-ms-animation-duration",
-      "-o-animation-duration",
-      "animation-duration",
-      "-webkit-animation-play-state",
-      "-moz-animation-play-state",
-      "-ms-animation-play-state",
-      "-o-animation-play-state",
-      "animation-play-state",
-      "-webkit-animation-timing-function",
-      "-moz-animation-timing-function",
-      "-ms-animation-timing-function",
-      "-o-animation-timing-function",
-      "animation-timing-function",
-      "-webkit-animation-delay",
-      "-moz-animation-delay",
-      "-ms-animation-delay",
-      "-o-animation-delay",
-      "animation-delay",
-      "-webkit-animation-iteration-count",
-      "-moz-animation-iteration-count",
-      "-ms-animation-iteration-count",
-      "-o-animation-iteration-count",
-      "animation-iteration-count",
-      "-webkit-animation-direction",
-      "-moz-animation-direction",
-      "-ms-animation-direction",
-      "-o-animation-direction",
-      "animation-direction"
-    ]
-  ]
-}
diff --git a/dashboard/lib/less/.csslintrc b/dashboard/lib/less/.csslintrc
deleted file mode 100644
index 005b862..0000000
--- a/dashboard/lib/less/.csslintrc
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "adjoining-classes": false,
-  "box-sizing": false,
-  "box-model": false,
-  "compatible-vendor-prefixes": false,
-  "floats": false,
-  "font-sizes": false,
-  "gradients": false,
-  "important": false,
-  "known-properties": false,
-  "outline-none": false,
-  "qualified-headings": false,
-  "regex-selectors": false,
-  "shorthand": false,
-  "text-indent": false,
-  "unique-headings": false,
-  "universal-selector": false,
-  "unqualified-attributes": false
-}
diff --git a/dashboard/lib/less/bootstrap/alerts.less b/dashboard/lib/less/bootstrap/alerts.less
deleted file mode 100644
index 3eab066..0000000
--- a/dashboard/lib/less/bootstrap/alerts.less
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// Alerts
-// --------------------------------------------------
-
-
-// Base styles
-// -------------------------
-
-.alert {
-  padding: @alert-padding;
-  margin-bottom: @line-height-computed;
-  border: 1px solid transparent;
-  border-radius: @alert-border-radius;
-
-  // Headings for larger alerts
-  h4 {
-    margin-top: 0;
-    // Specified for the h4 to prevent conflicts of changing @headings-color
-    color: inherit;
-  }
-  // Provide class for links that match alerts
-  .alert-link {
-    font-weight: @alert-link-font-weight;
-  }
-
-  // Improve alignment and spacing of inner content
-  > p,
-  > ul {
-    margin-bottom: 0;
-  }
-  > p + p {
-    margin-top: 5px;
-  }
-}
-
-// Dismissable alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissable {
- padding-right: (@alert-padding + 20);
-
-  // Adjust close link position
-  .close {
-    position: relative;
-    top: -2px;
-    right: -21px;
-    color: inherit;
-  }
-}
-
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
-.alert-success {
-  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
-}
-.alert-info {
-  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
-}
-.alert-warning {
-  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
-}
-.alert-danger {
-  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
-}
diff --git a/dashboard/lib/less/bootstrap/badges.less b/dashboard/lib/less/bootstrap/badges.less
deleted file mode 100644
index 56828ca..0000000
--- a/dashboard/lib/less/bootstrap/badges.less
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Badges
-// --------------------------------------------------
-
-
-// Base classes
-.badge {
-  display: inline-block;
-  min-width: 10px;
-  padding: 3px 7px;
-  font-size: @font-size-small;
-  font-weight: @badge-font-weight;
-  color: @badge-color;
-  line-height: @badge-line-height;
-  vertical-align: baseline;
-  white-space: nowrap;
-  text-align: center;
-  background-color: @badge-bg;
-  border-radius: @badge-border-radius;
-
-  // Empty badges collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for badges in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-  .btn-xs & {
-    top: 0;
-    padding: 1px 5px;
-  }
-}
-
-// Hover state, but only for links
-a.badge {
-  &:hover,
-  &:focus {
-    color: @badge-link-hover-color;
-    text-decoration: none;
-    cursor: pointer;
-  }
-}
-
-// Account for counters in navs
-a.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
-  color: @badge-active-color;
-  background-color: @badge-active-bg;
-}
-.nav-pills > li > a > .badge {
-  margin-left: 3px;
-}
diff --git a/dashboard/lib/less/bootstrap/bootstrap.less b/dashboard/lib/less/bootstrap/bootstrap.less
deleted file mode 100644
index b368b87..0000000
--- a/dashboard/lib/less/bootstrap/bootstrap.less
+++ /dev/null
@@ -1,49 +0,0 @@
-// Core variables and mixins
-@import "variables.less";
-@import "mixins.less";
-
-// Reset
-@import "normalize.less";
-@import "print.less";
-
-// Core CSS
-@import "scaffolding.less";
-@import "type.less";
-@import "code.less";
-@import "grid.less";
-@import "tables.less";
-@import "forms.less";
-@import "buttons.less";
-
-// Components
-@import "component-animations.less";
-@import "glyphicons.less";
-@import "dropdowns.less";
-@import "button-groups.less";
-@import "input-groups.less";
-@import "navs.less";
-@import "navbar.less";
-@import "breadcrumbs.less";
-@import "pagination.less";
-@import "pager.less";
-@import "labels.less";
-@import "badges.less";
-@import "jumbotron.less";
-@import "thumbnails.less";
-@import "alerts.less";
-@import "progress-bars.less";
-@import "media.less";
-@import "list-group.less";
-@import "panels.less";
-@import "wells.less";
-@import "close.less";
-
-// Components w/ JavaScript
-@import "modals.less";
-@import "tooltip.less";
-@import "popovers.less";
-@import "carousel.less";
-
-// Utility classes
-@import "utilities.less";
-@import "responsive-utilities.less";
diff --git a/dashboard/lib/less/bootstrap/breadcrumbs.less b/dashboard/lib/less/bootstrap/breadcrumbs.less
deleted file mode 100644
index cb01d50..0000000
--- a/dashboard/lib/less/bootstrap/breadcrumbs.less
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Breadcrumbs
-// --------------------------------------------------
-
-
-.breadcrumb {
-  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
-  margin-bottom: @line-height-computed;
-  list-style: none;
-  background-color: @breadcrumb-bg;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline-block;
-
-    + li:before {
-      content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
-      padding: 0 5px;
-      color: @breadcrumb-color;
-    }
-  }
-
-  > .active {
-    color: @breadcrumb-active-color;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/button-groups.less b/dashboard/lib/less/bootstrap/button-groups.less
deleted file mode 100644
index 27eb796..0000000
--- a/dashboard/lib/less/bootstrap/button-groups.less
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-// Button groups
-// --------------------------------------------------
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle; // match .btn alignment given font-size hack above
-  > .btn {
-    position: relative;
-    float: left;
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active,
-    &.active {
-      z-index: 2;
-    }
-    &:focus {
-      // Remove focus outline when dropdown JS adds it after closing the menu
-      outline: none;
-    }
-  }
-}
-
-// Prevent double borders when buttons are next to each other
-.btn-group {
-  .btn + .btn,
-  .btn + .btn-group,
-  .btn-group + .btn,
-  .btn-group + .btn-group {
-    margin-left: -1px;
-  }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
-  margin-left: -5px; // Offset the first child's margin
-  &:extend(.clearfix all);
-
-  .btn-group,
-  .input-group {
-    float: left;
-  }
-  > .btn,
-  > .btn-group,
-  > .input-group {
-    margin-left: 5px;
-  }
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-
-// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  &:not(:last-child):not(.dropdown-toggle) {
-    .border-right-radius(0);
-  }
-}
-// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  .border-left-radius(0);
-}
-
-// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
-.btn-group > .btn-group {
-  float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group > .btn-group:first-child {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-right-radius(0);
-  }
-}
-.btn-group > .btn-group:last-child > .btn:first-child {
-  .border-left-radius(0);
-}
-
-// On active and open, don't show outline
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-xs > .btn { &:extend(.btn-xs); }
-.btn-group-sm > .btn { &:extend(.btn-sm); }
-.btn-group-lg > .btn { &:extend(.btn-lg); }
-
-
-// Split button dropdowns
-// ----------------------
-
-// Give the line between buttons some depth
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-}
-
-// The clickable button for toggling the menu
-// Remove the gradient and set the same inset shadow as the :active state
-.btn-group.open .dropdown-toggle {
-  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-
-  // Show no shadow for `.btn-link` since it has no other button styles.
-  &.btn-link {
-    .box-shadow(none);
-  }
-}
-
-
-// Reposition the caret
-.btn .caret {
-  margin-left: 0;
-}
-// Carets in other button sizes
-.btn-lg .caret {
-  border-width: @caret-width-large @caret-width-large 0;
-  border-bottom-width: 0;
-}
-// Upside down carets for .dropup
-.dropup .btn-lg .caret {
-  border-width: 0 @caret-width-large @caret-width-large;
-}
-
-
-// Vertical button groups
-// ----------------------
-
-.btn-group-vertical {
-  > .btn,
-  > .btn-group,
-  > .btn-group > .btn {
-    display: block;
-    float: none;
-    width: 100%;
-    max-width: 100%;
-  }
-
-  // Clear floats so dropdown menus can be properly placed
-  > .btn-group {
-    &:extend(.clearfix all);
-    > .btn {
-      float: none;
-    }
-  }
-
-  > .btn + .btn,
-  > .btn + .btn-group,
-  > .btn-group + .btn,
-  > .btn-group + .btn-group {
-    margin-top: -1px;
-    margin-left: 0;
-  }
-}
-
-.btn-group-vertical > .btn {
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-  &:first-child:not(:last-child) {
-    border-top-right-radius: @border-radius-base;
-    .border-bottom-radius(0);
-  }
-  &:last-child:not(:first-child) {
-    border-bottom-left-radius: @border-radius-base;
-    .border-top-radius(0);
-  }
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-bottom-radius(0);
-  }
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  .border-top-radius(0);
-}
-
-
-
-// Justified button groups
-// ----------------------
-
-.btn-group-justified {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-  border-collapse: separate;
-  > .btn,
-  > .btn-group {
-    float: none;
-    display: table-cell;
-    width: 1%;
-  }
-  > .btn-group .btn {
-    width: 100%;
-  }
-}
-
-
-// Checkbox and radio options
-[data-toggle="buttons"] > .btn > input[type="radio"],
-[data-toggle="buttons"] > .btn > input[type="checkbox"] {
-  display: none;
-}
diff --git a/dashboard/lib/less/bootstrap/buttons.less b/dashboard/lib/less/bootstrap/buttons.less
deleted file mode 100644
index d4fc156..0000000
--- a/dashboard/lib/less/bootstrap/buttons.less
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// Buttons
-// --------------------------------------------------
-
-
-// Base styles
-// --------------------------------------------------
-
-.btn {
-  display: inline-block;
-  margin-bottom: 0; // For input.btn
-  font-weight: @btn-font-weight;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  white-space: nowrap;
-  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
-  .user-select(none);
-
-  &,
-  &:active,
-  &.active {
-    &:focus {
-      .tab-focus();
-    }
-  }
-
-  &:hover,
-  &:focus {
-    color: @btn-default-color;
-    text-decoration: none;
-  }
-
-  &:active,
-  &.active {
-    outline: 0;
-    background-image: none;
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-    pointer-events: none; // Future-proof disabling of clicks
-    .opacity(.65);
-    .box-shadow(none);
-  }
-}
-
-
-// Alternate buttons
-// --------------------------------------------------
-
-.btn-default {
-  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
-}
-.btn-primary {
-  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
-}
-// Success appears as green
-.btn-success {
-  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
-}
-// Info appears as blue-green
-.btn-info {
-  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
-}
-// Warning appears as orange
-.btn-warning {
-  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
-}
-// Danger and error appear as red
-.btn-danger {
-  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
-}
-
-
-// Link buttons
-// -------------------------
-
-// Make a button look and behave like a link
-.btn-link {
-  color: @link-color;
-  font-weight: normal;
-  cursor: pointer;
-  border-radius: 0;
-
-  &,
-  &:active,
-  &[disabled],
-  fieldset[disabled] & {
-    background-color: transparent;
-    .box-shadow(none);
-  }
-  &,
-  &:hover,
-  &:focus,
-  &:active {
-    border-color: transparent;
-  }
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: underline;
-    background-color: transparent;
-  }
-  &[disabled],
-  fieldset[disabled] & {
-    &:hover,
-    &:focus {
-      color: @btn-link-disabled-color;
-      text-decoration: none;
-    }
-  }
-}
-
-
-// Button Sizes
-// --------------------------------------------------
-
-.btn-lg {
-  // line-height: ensure even-numbered height of button next to large input
-  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
-}
-.btn-sm {
-  // line-height: ensure proper height of button next to small input
-  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-.btn-xs {
-  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-
-
-// Block button
-// --------------------------------------------------
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-left: 0;
-  padding-right: 0;
-}
-
-// Vertically space out multiple block buttons
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-// Specificity overrides
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
-  &.btn-block {
-    width: 100%;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/carousel.less b/dashboard/lib/less/bootstrap/carousel.less
deleted file mode 100644
index e3fb8a2..0000000
--- a/dashboard/lib/less/bootstrap/carousel.less
+++ /dev/null
@@ -1,232 +0,0 @@
-//
-// Carousel
-// --------------------------------------------------
-
-
-// Wrapper for the slide container and indicators
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  overflow: hidden;
-  width: 100%;
-
-  > .item {
-    display: none;
-    position: relative;
-    .transition(.6s ease-in-out left);
-
-    // Account for jankitude on images
-    > img,
-    > a > img {
-      &:extend(.img-responsive);
-      line-height: 1;
-    }
-  }
-
-  > .active,
-  > .next,
-  > .prev { display: block; }
-
-  > .active {
-    left: 0;
-  }
-
-  > .next,
-  > .prev {
-    position: absolute;
-    top: 0;
-    width: 100%;
-  }
-
-  > .next {
-    left: 100%;
-  }
-  > .prev {
-    left: -100%;
-  }
-  > .next.left,
-  > .prev.right {
-    left: 0;
-  }
-
-  > .active.left {
-    left: -100%;
-  }
-  > .active.right {
-    left: 100%;
-  }
-
-}
-
-// Left/right controls for nav
-// ---------------------------
-
-.carousel-control {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  width: @carousel-control-width;
-  .opacity(@carousel-control-opacity);
-  font-size: @carousel-control-font-size;
-  color: @carousel-control-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  // We can't have this transition here because WebKit cancels the carousel
-  // animation if you trip this while in the middle of another animation.
-
-  // Set gradients for backgrounds
-  &.left {
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
-  }
-  &.right {
-    left: auto;
-    right: 0;
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
-  }
-
-  // Hover/focus state
-  &:hover,
-  &:focus {
-    outline: none;
-    color: @carousel-control-color;
-    text-decoration: none;
-    .opacity(.9);
-  }
-
-  // Toggles
-  .icon-prev,
-  .icon-next,
-  .glyphicon-chevron-left,
-  .glyphicon-chevron-right {
-    position: absolute;
-    top: 50%;
-    z-index: 5;
-    display: inline-block;
-  }
-  .icon-prev,
-  .glyphicon-chevron-left {
-    left: 50%;
-  }
-  .icon-next,
-  .glyphicon-chevron-right {
-    right: 50%;
-  }
-  .icon-prev,
-  .icon-next {
-    width:  20px;
-    height: 20px;
-    margin-top: -10px;
-    margin-left: -10px;
-    font-family: serif;
-  }
-
-  .icon-prev {
-    &:before {
-      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
-    }
-  }
-  .icon-next {
-    &:before {
-      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
-    }
-  }
-}
-
-// Optional indicator pips
-//
-// Add an unordered list with the following class and add a list item for each
-// slide your carousel holds.
-
-.carousel-indicators {
-  position: absolute;
-  bottom: 10px;
-  left: 50%;
-  z-index: 15;
-  width: 60%;
-  margin-left: -30%;
-  padding-left: 0;
-  list-style: none;
-  text-align: center;
-
-  li {
-    display: inline-block;
-    width:  10px;
-    height: 10px;
-    margin: 1px;
-    text-indent: -999px;
-    border: 1px solid @carousel-indicator-border-color;
-    border-radius: 10px;
-    cursor: pointer;
-
-    // IE8-9 hack for event handling
-    //
-    // Internet Explorer 8-9 does not support clicks on elements without a set
-    // `background-color`. We cannot use `filter` since that's not viewed as a
-    // background color by the browser. Thus, a hack is needed.
-    //
-    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
-    // set alpha transparency for the best results possible.
-    background-color: #000 \9; // IE8
-    background-color: rgba(0,0,0,0); // IE9
-  }
-  .active {
-    margin: 0;
-    width:  12px;
-    height: 12px;
-    background-color: @carousel-indicator-active-bg;
-  }
-}
-
-// Optional captions
-// -----------------------------
-// Hidden by default for smaller viewports
-.carousel-caption {
-  position: absolute;
-  left: 15%;
-  right: 15%;
-  bottom: 20px;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: @carousel-caption-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  & .btn {
-    text-shadow: none; // No shadow for button elements in carousel-caption
-  }
-}
-
-
-// Scale up controls for tablets and up
-@media screen and (min-width: @screen-sm-min) {
-
-  // Scale up the controls a smidge
-  .carousel-control {
-    .glyphicon-chevron-left,
-    .glyphicon-chevron-right,
-    .icon-prev,
-    .icon-next {
-      width: 30px;
-      height: 30px;
-      margin-top: -15px;
-      margin-left: -15px;
-      font-size: 30px;
-    }
-  }
-
-  // Show and left align the captions
-  .carousel-caption {
-    left: 20%;
-    right: 20%;
-    padding-bottom: 30px;
-  }
-
-  // Move up the indicators
-  .carousel-indicators {
-    bottom: 20px;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/close.less b/dashboard/lib/less/bootstrap/close.less
deleted file mode 100644
index 9b4e74f..0000000
--- a/dashboard/lib/less/bootstrap/close.less
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Close icons
-// --------------------------------------------------
-
-
-.close {
-  float: right;
-  font-size: (@font-size-base * 1.5);
-  font-weight: @close-font-weight;
-  line-height: 1;
-  color: @close-color;
-  text-shadow: @close-text-shadow;
-  .opacity(.2);
-
-  &:hover,
-  &:focus {
-    color: @close-color;
-    text-decoration: none;
-    cursor: pointer;
-    .opacity(.5);
-  }
-
-  // Additional properties for button version
-  // iOS requires the button element instead of an anchor tag.
-  // If you want the anchor version, it requires `href="#"`.
-  button& {
-    padding: 0;
-    cursor: pointer;
-    background: transparent;
-    border: 0;
-    -webkit-appearance: none;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/code.less b/dashboard/lib/less/bootstrap/code.less
deleted file mode 100644
index 3eed26c..0000000
--- a/dashboard/lib/less/bootstrap/code.less
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Code (inline and block)
-// --------------------------------------------------
-
-
-// Inline and block code styles
-code,
-kbd,
-pre,
-samp {
-  font-family: @font-family-monospace;
-}
-
-// Inline code
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @code-color;
-  background-color: @code-bg;
-  white-space: nowrap;
-  border-radius: @border-radius-base;
-}
-
-// User input typically entered via keyboard
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @kbd-color;
-  background-color: @kbd-bg;
-  border-radius: @border-radius-small;
-  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
-}
-
-// Blocks of code
-pre {
-  display: block;
-  padding: ((@line-height-computed - 1) / 2);
-  margin: 0 0 (@line-height-computed / 2);
-  font-size: (@font-size-base - 1); // 14px to 13px
-  line-height: @line-height-base;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: @pre-color;
-  background-color: @pre-bg;
-  border: 1px solid @pre-border-color;
-  border-radius: @border-radius-base;
-
-  // Account for some code outputs that place code tags in pre tags
-  code {
-    padding: 0;
-    font-size: inherit;
-    color: inherit;
-    white-space: pre-wrap;
-    background-color: transparent;
-    border-radius: 0;
-  }
-}
-
-// Enable scrollable blocks of code
-.pre-scrollable {
-  max-height: @pre-scrollable-max-height;
-  overflow-y: scroll;
-}
diff --git a/dashboard/lib/less/bootstrap/component-animations.less b/dashboard/lib/less/bootstrap/component-animations.less
deleted file mode 100644
index 1efe45e..0000000
--- a/dashboard/lib/less/bootstrap/component-animations.less
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Component animations
-// --------------------------------------------------
-
-// Heads up!
-//
-// We don't use the `.opacity()` mixin here since it causes a bug with text
-// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.
-
-.fade {
-  opacity: 0;
-  .transition(opacity .15s linear);
-  &.in {
-    opacity: 1;
-  }
-}
-
-.collapse {
-  display: none;
-  &.in {
-    display: block;
-  }
-}
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  .transition(height .35s ease);
-}
diff --git a/dashboard/lib/less/bootstrap/dropdowns.less b/dashboard/lib/less/bootstrap/dropdowns.less
deleted file mode 100644
index f165165..0000000
--- a/dashboard/lib/less/bootstrap/dropdowns.less
+++ /dev/null
@@ -1,213 +0,0 @@
-//
-// Dropdown menus
-// --------------------------------------------------
-
-
-// Dropdown arrow/caret
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 2px;
-  vertical-align: middle;
-  border-top:   @caret-width-base solid;
-  border-right: @caret-width-base solid transparent;
-  border-left:  @caret-width-base solid transparent;
-}
-
-// The dropdown wrapper (div)
-.dropdown {
-  position: relative;
-}
-
-// Prevent the focus on the dropdown toggle when closing dropdowns
-.dropdown-toggle:focus {
-  outline: 0;
-}
-
-// The dropdown menu (ul)
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: @zindex-dropdown;
-  display: none; // none by default, but block on "open" of the menu
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0; // override default ul
-  list-style: none;
-  font-size: @font-size-base;
-  background-color: @dropdown-bg;
-  border: 1px solid @dropdown-fallback-border; // IE8 fallback
-  border: 1px solid @dropdown-border;
-  border-radius: @border-radius-base;
-  .box-shadow(0 6px 12px rgba(0,0,0,.175));
-  background-clip: padding-box;
-
-  // Aligns the dropdown menu to right
-  //
-  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
-  &.pull-right {
-    right: 0;
-    left: auto;
-  }
-
-  // Dividers (basically an hr) within the dropdown
-  .divider {
-    .nav-divider(@dropdown-divider-bg);
-  }
-
-  // Links within the dropdown menu
-  > li > a {
-    display: block;
-    padding: 3px 20px;
-    clear: both;
-    font-weight: normal;
-    line-height: @line-height-base;
-    color: @dropdown-link-color;
-    white-space: nowrap; // prevent links from randomly breaking onto new lines
-  }
-}
-
-// Hover/Focus state
-.dropdown-menu > li > a {
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    color: @dropdown-link-hover-color;
-    background-color: @dropdown-link-hover-bg;
-  }
-}
-
-// Active state
-.dropdown-menu > .active > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-active-color;
-    text-decoration: none;
-    outline: 0;
-    background-color: @dropdown-link-active-bg;
-  }
-}
-
-// Disabled state
-//
-// Gray out text and ensure the hover/focus state remains gray
-
-.dropdown-menu > .disabled > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-disabled-color;
-  }
-}
-// Nuke hover/focus effects
-.dropdown-menu > .disabled > a {
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    background-color: transparent;
-    background-image: none; // Remove CSS gradient
-    .reset-filter();
-    cursor: not-allowed;
-  }
-}
-
-// Open state for the dropdown
-.open {
-  // Show the menu
-  > .dropdown-menu {
-    display: block;
-  }
-
-  // Remove the outline when :focus is triggered
-  > a {
-    outline: 0;
-  }
-}
-
-// Menu positioning
-//
-// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
-// menu with the parent.
-.dropdown-menu-right {
-  left: auto; // Reset the default from `.dropdown-menu`
-  right: 0;
-}
-// With v3, we enabled auto-flipping if you have a dropdown within a right
-// aligned nav component. To enable the undoing of that, we provide an override
-// to restore the default dropdown menu alignment.
-//
-// This is only for left-aligning a dropdown menu within a `.navbar-right` or
-// `.pull-right` nav component.
-.dropdown-menu-left {
-  left: 0;
-  right: auto;
-}
-
-// Dropdown section headers
-.dropdown-header {
-  display: block;
-  padding: 3px 20px;
-  font-size: @font-size-small;
-  line-height: @line-height-base;
-  color: @dropdown-header-color;
-}
-
-// Backdrop to catch body clicks on mobile, etc.
-.dropdown-backdrop {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  top: 0;
-  z-index: (@zindex-dropdown - 10);
-}
-
-// Right aligned dropdowns
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-//
-// Just add .dropup after the standard .dropdown class and you're set, bro.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
-
-.dropup,
-.navbar-fixed-bottom .dropdown {
-  // Reverse the caret
-  .caret {
-    border-top: 0;
-    border-bottom: @caret-width-base solid;
-    content: "";
-  }
-  // Different positioning for bottom up menu
-  .dropdown-menu {
-    top: auto;
-    bottom: 100%;
-    margin-bottom: 1px;
-  }
-}
-
-
-// Component alignment
-//
-// Reiterate per navbar.less and the modified component alignment there.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-right {
-    .dropdown-menu {
-      .dropdown-menu-right();
-    }
-    // Necessary for overrides of the default right aligned menu.
-    // Will remove come v4 in all likelihood.
-    .dropdown-menu-left {
-      .dropdown-menu-left();
-    }
-  }
-}
-
diff --git a/dashboard/lib/less/bootstrap/forms.less b/dashboard/lib/less/bootstrap/forms.less
deleted file mode 100644
index f607b85..0000000
--- a/dashboard/lib/less/bootstrap/forms.less
+++ /dev/null
@@ -1,438 +0,0 @@
-//
-// Forms
-// --------------------------------------------------
-
-
-// Normalize non-controls
-//
-// Restyle and baseline non-control form elements.
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,
-  // so we reset that to ensure it behaves more like a standard block element.
-  // See https://github.com/twbs/bootstrap/issues/12359.
-  min-width: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: @line-height-computed;
-  font-size: (@font-size-base * 1.5);
-  line-height: inherit;
-  color: @legend-color;
-  border: 0;
-  border-bottom: 1px solid @legend-border-color;
-}
-
-label {
-  display: inline-block;
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-
-
-// Normalize form controls
-//
-// While most of our form styles require extra classes, some basic normalization
-// is required to ensure optimum display with or without those classes to better
-// address browser inconsistencies.
-
-// Override content-box in Normalize (* isn't specific enough)
-input[type="search"] {
-  .box-sizing(border-box);
-}
-
-// Position radios and checkboxes better
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9; /* IE8-9 */
-  line-height: normal;
-}
-
-// Set the height of file controls to match text inputs
-input[type="file"] {
-  display: block;
-}
-
-// Make range inputs behave like textual form controls
-input[type="range"] {
-  display: block;
-  width: 100%;
-}
-
-// Make multiple select elements height not fixed
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-// Focus for file, radio, and checkbox
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  .tab-focus();
-}
-
-// Adjust output element
-output {
-  display: block;
-  padding-top: (@padding-base-vertical + 1);
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-}
-
-
-// Common form controls
-//
-// Shared size and type resets for form controls. Apply `.form-control` to any
-// of the following form controls:
-//
-// select
-// textarea
-// input[type="text"]
-// input[type="password"]
-// input[type="datetime"]
-// input[type="datetime-local"]
-// input[type="date"]
-// input[type="month"]
-// input[type="time"]
-// input[type="week"]
-// input[type="number"]
-// input[type="email"]
-// input[type="url"]
-// input[type="search"]
-// input[type="tel"]
-// input[type="color"]
-
-.form-control {
-  display: block;
-  width: 100%;
-  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-  background-color: @input-bg;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid @input-border;
-  border-radius: @input-border-radius;
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
-  .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
-
-  // Customize the `:focus` state to imitate native WebKit styles.
-  .form-control-focus();
-
-  // Placeholder
-  .placeholder();
-
-  // Disabled and read-only inputs
-  //
-  // HTML5 says that controls under a fieldset > legend:first-child won't be
-  // disabled if the fieldset is disabled. Due to implementation difficulty, we
-  // don't honor that edge case; we style them as disabled anyway.
-  &[disabled],
-  &[readonly],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-    background-color: @input-bg-disabled;
-    opacity: 1; // iOS fix for unreadable disabled content
-  }
-
-  // Reset height for `textarea`s
-  textarea& {
-    height: auto;
-  }
-}
-
-
-// Search inputs in iOS
-//
-// This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-
-input[type="search"] {
-  -webkit-appearance: none;
-}
-
-
-// Special styles for iOS date input
-//
-// In Mobile Safari, date inputs require a pixel line-height that matches the
-// given height of the input.
-
-input[type="date"] {
-  line-height: @input-height-base;
-}
-
-
-// Form groups
-//
-// Designed to help with the organization and spacing of vertical forms. For
-// horizontal forms, use the predefined grid classes.
-
-.form-group {
-  margin-bottom: 15px;
-}
-
-
-// Checkboxes and radios
-//
-// Indent the labels to position radios/checkboxes as hanging controls.
-
-.radio,
-.checkbox {
-  display: block;
-  min-height: @line-height-computed; // clear the floating input if there is no label text
-  margin-top: 10px;
-  margin-bottom: 10px;
-  padding-left: 20px;
-  label {
-    display: inline;
-    font-weight: normal;
-    cursor: pointer;
-  }
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  float: left;
-  margin-left: -20px;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
-}
-
-// Radios and checkboxes on same line
-.radio-inline,
-.checkbox-inline {
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  vertical-align: middle;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px; // space out consecutive inline controls
-}
-
-// Apply same disabled cursor tweak as for inputs
-//
-// Note: Neither radios nor checkboxes can be readonly.
-input[type="radio"],
-input[type="checkbox"],
-.radio,
-.radio-inline,
-.checkbox,
-.checkbox-inline {
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-  }
-}
-
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-
-.input-sm {
-  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-
-.input-lg {
-  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
-}
-
-
-// Form control feedback states
-//
-// Apply contextual and semantic states to individual form controls.
-
-.has-feedback {
-  // Enable absolute positioning
-  position: relative;
-
-  // Ensure icons don't overlap text
-  .form-control {
-    padding-right: (@input-height-base * 1.25);
-  }
-
-  // Feedback icon (requires .glyphicon classes)
-  .form-control-feedback {
-    position: absolute;
-    top: (@line-height-computed + 5); // Height of the `label` and its margin
-    right: 0;
-    display: block;
-    width: @input-height-base;
-    height: @input-height-base;
-    line-height: @input-height-base;
-    text-align: center;
-  }
-}
-
-// Feedback states
-.has-success {
-  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);
-}
-.has-warning {
-  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);
-}
-.has-error {
-  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
-}
-
-
-// Static form control text
-//
-// Apply class to a `p` element to make any string of text align with labels in
-// a horizontal form layout.
-
-.form-control-static {
-  margin-bottom: 0; // Remove default margin from `p`
-}
-
-
-// Help text
-//
-// Apply to any element you wish to create light text for placement immediately
-// below a form control. Use for general help, formatting, or instructional text.
-
-.help-block {
-  display: block; // account for any element using help-block
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: lighten(@text-color, 25%); // lighten the text some for contrast
-}
-
-
-
-// Inline forms
-//
-// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
-// forms begin stacked on extra small (mobile) devices and then go inline when
-// viewports reach <768px.
-//
-// Requires wrapping inputs and labels with `.form-group` for proper display of
-// default HTML form controls and our custom form controls (e.g., input groups).
-//
-// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
-
-.form-inline {
-
-  // Kick in the inline
-  @media (min-width: @screen-sm-min) {
-    // Inline-block all the things for "inline"
-    .form-group {
-      display: inline-block;
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // In navbar-form, allow folks to *not* use `.form-group`
-    .form-control {
-      display: inline-block;
-      width: auto; // Prevent labels from stacking above inputs in `.form-group`
-      vertical-align: middle;
-    }
-    // Input groups need that 100% width though
-    .input-group > .form-control {
-      width: 100%;
-    }
-
-    .control-label {
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // Remove default margin on radios/checkboxes that were used for stacking, and
-    // then undo the floating of radios and checkboxes to match (which also avoids
-    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
-    .radio,
-    .checkbox {
-      display: inline-block;
-      margin-top: 0;
-      margin-bottom: 0;
-      padding-left: 0;
-      vertical-align: middle;
-    }
-    .radio input[type="radio"],
-    .checkbox input[type="checkbox"] {
-      float: none;
-      margin-left: 0;
-    }
-
-    // Validation states
-    //
-    // Reposition the icon because it's now within a grid column and columns have
-    // `position: relative;` on them. Also accounts for the grid gutter padding.
-    .has-feedback .form-control-feedback {
-      top: 0;
-    }
-  }
-}
-
-
-// Horizontal forms
-//
-// Horizontal forms are built on grid classes and allow you to create forms with
-// labels on the left and inputs on the right.
-
-.form-horizontal {
-
-  // Consistent vertical alignment of labels, radios, and checkboxes
-  .control-label,
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline {
-    margin-top: 0;
-    margin-bottom: 0;
-    padding-top: (@padding-base-vertical + 1); // Default padding plus a border
-  }
-  // Account for padding we're adding to ensure the alignment and of help text
-  // and other content below items
-  .radio,
-  .checkbox {
-    min-height: (@line-height-computed + (@padding-base-vertical + 1));
-  }
-
-  // Make form groups behave like rows
-  .form-group {
-    .make-row();
-  }
-
-  .form-control-static {
-    padding-top: (@padding-base-vertical + 1);
-  }
-
-  // Only right align form labels here when the columns stop stacking
-  @media (min-width: @screen-sm-min) {
-    .control-label {
-      text-align: right;
-    }
-  }
-
-  // Validation states
-  //
-  // Reposition the icon because it's now within a grid column and columns have
-  // `position: relative;` on them. Also accounts for the grid gutter padding.
-  .has-feedback .form-control-feedback {
-    top: 0;
-    right: (@grid-gutter-width / 2);
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/glyphicons.less b/dashboard/lib/less/bootstrap/glyphicons.less
deleted file mode 100644
index 789c5e7..0000000
--- a/dashboard/lib/less/bootstrap/glyphicons.less
+++ /dev/null
@@ -1,233 +0,0 @@
-//
-// Glyphicons for Bootstrap
-//
-// Since icons are fonts, they can be placed anywhere text is placed and are
-// thus automatically sized to match the surrounding child. To use, create an
-// inline element with the appropriate classes, like so:
-//
-// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
-
-// Import the fonts
-@font-face {
-  font-family: 'Glyphicons Halflings';
-  src: ~"url('@{icon-font-path}@{icon-font-name}.eot')";
-  src: ~"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')",
-       ~"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')",
-       ~"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')",
-       ~"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')";
-}
-
-// Catchall baseclass
-.glyphicon {
-  position: relative;
-  top: 1px;
-  display: inline-block;
-  font-family: 'Glyphicons Halflings';
-  font-style: normal;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-// Individual icons
-.glyphicon-asterisk               { &:before { content: "\2a"; } }
-.glyphicon-plus                   { &:before { content: "\2b"; } }
-.glyphicon-euro                   { &:before { content: "\20ac"; } }
-.glyphicon-minus                  { &:before { content: "\2212"; } }
-.glyphicon-cloud                  { &:before { content: "\2601"; } }
-.glyphicon-envelope               { &:before { content: "\2709"; } }
-.glyphicon-pencil                 { &:before { content: "\270f"; } }
-.glyphicon-glass                  { &:before { content: "\e001"; } }
-.glyphicon-music                  { &:before { content: "\e002"; } }
-.glyphicon-search                 { &:before { content: "\e003"; } }
-.glyphicon-heart                  { &:before { content: "\e005"; } }
-.glyphicon-star                   { &:before { content: "\e006"; } }
-.glyphicon-star-empty             { &:before { content: "\e007"; } }
-.glyphicon-user                   { &:before { content: "\e008"; } }
-.glyphicon-film                   { &:before { content: "\e009"; } }
-.glyphicon-th-large               { &:before { content: "\e010"; } }
-.glyphicon-th                     { &:before { content: "\e011"; } }
-.glyphicon-th-list                { &:before { content: "\e012"; } }
-.glyphicon-ok                     { &:before { content: "\e013"; } }
-.glyphicon-remove                 { &:before { content: "\e014"; } }
-.glyphicon-zoom-in                { &:before { content: "\e015"; } }
-.glyphicon-zoom-out               { &:before { content: "\e016"; } }
-.glyphicon-off                    { &:before { content: "\e017"; } }
-.glyphicon-signal                 { &:before { content: "\e018"; } }
-.glyphicon-cog                    { &:before { content: "\e019"; } }
-.glyphicon-trash                  { &:before { content: "\e020"; } }
-.glyphicon-home                   { &:before { content: "\e021"; } }
-.glyphicon-file                   { &:before { content: "\e022"; } }
-.glyphicon-time                   { &:before { content: "\e023"; } }
-.glyphicon-road                   { &:before { content: "\e024"; } }
-.glyphicon-download-alt           { &:before { content: "\e025"; } }
-.glyphicon-download               { &:before { content: "\e026"; } }
-.glyphicon-upload                 { &:before { content: "\e027"; } }
-.glyphicon-inbox                  { &:before { content: "\e028"; } }
-.glyphicon-play-circle            { &:before { content: "\e029"; } }
-.glyphicon-repeat                 { &:before { content: "\e030"; } }
-.glyphicon-refresh                { &:before { content: "\e031"; } }
-.glyphicon-list-alt               { &:before { content: "\e032"; } }
-.glyphicon-lock                   { &:before { content: "\e033"; } }
-.glyphicon-flag                   { &:before { content: "\e034"; } }
-.glyphicon-headphones             { &:before { content: "\e035"; } }
-.glyphicon-volume-off             { &:before { content: "\e036"; } }
-.glyphicon-volume-down            { &:before { content: "\e037"; } }
-.glyphicon-volume-up              { &:before { content: "\e038"; } }
-.glyphicon-qrcode                 { &:before { content: "\e039"; } }
-.glyphicon-barcode                { &:before { content: "\e040"; } }
-.glyphicon-tag                    { &:before { content: "\e041"; } }
-.glyphicon-tags                   { &:before { content: "\e042"; } }
-.glyphicon-book                   { &:before { content: "\e043"; } }
-.glyphicon-bookmark               { &:before { content: "\e044"; } }
-.glyphicon-print                  { &:before { content: "\e045"; } }
-.glyphicon-camera                 { &:before { content: "\e046"; } }
-.glyphicon-font                   { &:before { content: "\e047"; } }
-.glyphicon-bold                   { &:before { content: "\e048"; } }
-.glyphicon-italic                 { &:before { content: "\e049"; } }
-.glyphicon-text-height            { &:before { content: "\e050"; } }
-.glyphicon-text-width             { &:before { content: "\e051"; } }
-.glyphicon-align-left             { &:before { content: "\e052"; } }
-.glyphicon-align-center           { &:before { content: "\e053"; } }
-.glyphicon-align-right            { &:before { content: "\e054"; } }
-.glyphicon-align-justify          { &:before { content: "\e055"; } }
-.glyphicon-list                   { &:before { content: "\e056"; } }
-.glyphicon-indent-left            { &:before { content: "\e057"; } }
-.glyphicon-indent-right           { &:before { content: "\e058"; } }
-.glyphicon-facetime-video         { &:before { content: "\e059"; } }
-.glyphicon-picture                { &:before { content: "\e060"; } }
-.glyphicon-map-marker             { &:before { content: "\e062"; } }
-.glyphicon-adjust                 { &:before { content: "\e063"; } }
-.glyphicon-tint                   { &:before { content: "\e064"; } }
-.glyphicon-edit                   { &:before { content: "\e065"; } }
-.glyphicon-share                  { &:before { content: "\e066"; } }
-.glyphicon-check                  { &:before { content: "\e067"; } }
-.glyphicon-move                   { &:before { content: "\e068"; } }
-.glyphicon-step-backward          { &:before { content: "\e069"; } }
-.glyphicon-fast-backward          { &:before { content: "\e070"; } }
-.glyphicon-backward               { &:before { content: "\e071"; } }
-.glyphicon-play                   { &:before { content: "\e072"; } }
-.glyphicon-pause                  { &:before { content: "\e073"; } }
-.glyphicon-stop                   { &:before { content: "\e074"; } }
-.glyphicon-forward                { &:before { content: "\e075"; } }
-.glyphicon-fast-forward           { &:before { content: "\e076"; } }
-.glyphicon-step-forward           { &:before { content: "\e077"; } }
-.glyphicon-eject                  { &:before { content: "\e078"; } }
-.glyphicon-chevron-left           { &:before { content: "\e079"; } }
-.glyphicon-chevron-right          { &:before { content: "\e080"; } }
-.glyphicon-plus-sign              { &:before { content: "\e081"; } }
-.glyphicon-minus-sign             { &:before { content: "\e082"; } }
-.glyphicon-remove-sign            { &:before { content: "\e083"; } }
-.glyphicon-ok-sign                { &:before { content: "\e084"; } }
-.glyphicon-question-sign          { &:before { content: "\e085"; } }
-.glyphicon-info-sign              { &:before { content: "\e086"; } }
-.glyphicon-screenshot             { &:before { content: "\e087"; } }
-.glyphicon-remove-circle          { &:before { content: "\e088"; } }
-.glyphicon-ok-circle              { &:before { content: "\e089"; } }
-.glyphicon-ban-circle             { &:before { content: "\e090"; } }
-.glyphicon-arrow-left             { &:before { content: "\e091"; } }
-.glyphicon-arrow-right            { &:before { content: "\e092"; } }
-.glyphicon-arrow-up               { &:before { content: "\e093"; } }
-.glyphicon-arrow-down             { &:before { content: "\e094"; } }
-.glyphicon-share-alt              { &:before { content: "\e095"; } }
-.glyphicon-resize-full            { &:before { content: "\e096"; } }
-.glyphicon-resize-small           { &:before { content: "\e097"; } }
-.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
-.glyphicon-gift                   { &:before { content: "\e102"; } }
-.glyphicon-leaf                   { &:before { content: "\e103"; } }
-.glyphicon-fire                   { &:before { content: "\e104"; } }
-.glyphicon-eye-open               { &:before { content: "\e105"; } }
-.glyphicon-eye-close              { &:before { content: "\e106"; } }
-.glyphicon-warning-sign           { &:before { content: "\e107"; } }
-.glyphicon-plane                  { &:before { content: "\e108"; } }
-.glyphicon-calendar               { &:before { content: "\e109"; } }
-.glyphicon-random                 { &:before { content: "\e110"; } }
-.glyphicon-comment                { &:before { content: "\e111"; } }
-.glyphicon-magnet                 { &:before { content: "\e112"; } }
-.glyphicon-chevron-up             { &:before { content: "\e113"; } }
-.glyphicon-chevron-down           { &:before { content: "\e114"; } }
-.glyphicon-retweet                { &:before { content: "\e115"; } }
-.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
-.glyphicon-folder-close           { &:before { content: "\e117"; } }
-.glyphicon-folder-open            { &:before { content: "\e118"; } }
-.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
-.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
-.glyphicon-hdd                    { &:before { content: "\e121"; } }
-.glyphicon-bullhorn               { &:before { content: "\e122"; } }
-.glyphicon-bell                   { &:before { content: "\e123"; } }
-.glyphicon-certificate            { &:before { content: "\e124"; } }
-.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
-.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
-.glyphicon-hand-right             { &:before { content: "\e127"; } }
-.glyphicon-hand-left              { &:before { content: "\e128"; } }
-.glyphicon-hand-up                { &:before { content: "\e129"; } }
-.glyphicon-hand-down              { &:before { content: "\e130"; } }
-.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
-.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
-.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
-.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
-.glyphicon-globe                  { &:before { content: "\e135"; } }
-.glyphicon-wrench                 { &:before { content: "\e136"; } }
-.glyphicon-tasks                  { &:before { content: "\e137"; } }
-.glyphicon-filter                 { &:before { content: "\e138"; } }
-.glyphicon-briefcase              { &:before { content: "\e139"; } }
-.glyphicon-fullscreen             { &:before { content: "\e140"; } }
-.glyphicon-dashboard              { &:before { content: "\e141"; } }
-.glyphicon-paperclip              { &:before { content: "\e142"; } }
-.glyphicon-heart-empty            { &:before { content: "\e143"; } }
-.glyphicon-link                   { &:before { content: "\e144"; } }
-.glyphicon-phone                  { &:before { content: "\e145"; } }
-.glyphicon-pushpin                { &:before { content: "\e146"; } }
-.glyphicon-usd                    { &:before { content: "\e148"; } }
-.glyphicon-gbp                    { &:before { content: "\e149"; } }
-.glyphicon-sort                   { &:before { content: "\e150"; } }
-.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
-.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
-.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
-.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
-.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
-.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
-.glyphicon-unchecked              { &:before { content: "\e157"; } }
-.glyphicon-expand                 { &:before { content: "\e158"; } }
-.glyphicon-collapse-down          { &:before { content: "\e159"; } }
-.glyphicon-collapse-up            { &:before { content: "\e160"; } }
-.glyphicon-log-in                 { &:before { content: "\e161"; } }
-.glyphicon-flash                  { &:before { content: "\e162"; } }
-.glyphicon-log-out                { &:before { content: "\e163"; } }
-.glyphicon-new-window             { &:before { content: "\e164"; } }
-.glyphicon-record                 { &:before { content: "\e165"; } }
-.glyphicon-save                   { &:before { content: "\e166"; } }
-.glyphicon-open                   { &:before { content: "\e167"; } }
-.glyphicon-saved                  { &:before { content: "\e168"; } }
-.glyphicon-import                 { &:before { content: "\e169"; } }
-.glyphicon-export                 { &:before { content: "\e170"; } }
-.glyphicon-send                   { &:before { content: "\e171"; } }
-.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
-.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
-.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
-.glyphicon-floppy-save            { &:before { content: "\e175"; } }
-.glyphicon-floppy-open            { &:before { content: "\e176"; } }
-.glyphicon-credit-card            { &:before { content: "\e177"; } }
-.glyphicon-transfer               { &:before { content: "\e178"; } }
-.glyphicon-cutlery                { &:before { content: "\e179"; } }
-.glyphicon-header                 { &:before { content: "\e180"; } }
-.glyphicon-compressed             { &:before { content: "\e181"; } }
-.glyphicon-earphone               { &:before { content: "\e182"; } }
-.glyphicon-phone-alt              { &:before { content: "\e183"; } }
-.glyphicon-tower                  { &:before { content: "\e184"; } }
-.glyphicon-stats                  { &:before { content: "\e185"; } }
-.glyphicon-sd-video               { &:before { content: "\e186"; } }
-.glyphicon-hd-video               { &:before { content: "\e187"; } }
-.glyphicon-subtitles              { &:before { content: "\e188"; } }
-.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
-.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
-.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
-.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
-.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
-.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
-.glyphicon-registration-mark      { &:before { content: "\e195"; } }
-.glyphicon-cloud-download         { &:before { content: "\e197"; } }
-.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
-.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
-.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
diff --git a/dashboard/lib/less/bootstrap/grid.less b/dashboard/lib/less/bootstrap/grid.less
deleted file mode 100644
index e100655..0000000
--- a/dashboard/lib/less/bootstrap/grid.less
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// Grid system
-// --------------------------------------------------
-
-
-// Container widths
-//
-// Set the container width, and override it for fixed navbars in media queries.
-
-.container {
-  .container-fixed();
-
-  @media (min-width: @screen-sm-min) {
-    width: @container-sm;
-  }
-  @media (min-width: @screen-md-min) {
-    width: @container-md;
-  }
-  @media (min-width: @screen-lg-min) {
-    width: @container-lg;
-  }
-}
-
-
-// Fluid container
-//
-// Utilizes the mixin meant for fixed width containers, but without any defined
-// width for fluid, full width layouts.
-
-.container-fluid {
-  .container-fixed();
-}
-
-
-// Row
-//
-// Rows contain and clear the floats of your columns.
-
-.row {
-  .make-row();
-}
-
-
-// Columns
-//
-// Common styles for small and large grid columns
-
-.make-grid-columns();
-
-
-// Extra small grid
-//
-// Columns, offsets, pushes, and pulls for extra small devices like
-// smartphones.
-
-.make-grid(xs);
-
-
-// Small grid
-//
-// Columns, offsets, pushes, and pulls for the small device range, from phones
-// to tablets.
-
-@media (min-width: @screen-sm-min) {
-  .make-grid(sm);
-}
-
-
-// Medium grid
-//
-// Columns, offsets, pushes, and pulls for the desktop device range.
-
-@media (min-width: @screen-md-min) {
-  .make-grid(md);
-}
-
-
-// Large grid
-//
-// Columns, offsets, pushes, and pulls for the large desktop device range.
-
-@media (min-width: @screen-lg-min) {
-  .make-grid(lg);
-}
diff --git a/dashboard/lib/less/bootstrap/input-groups.less b/dashboard/lib/less/bootstrap/input-groups.less
deleted file mode 100644
index a111474..0000000
--- a/dashboard/lib/less/bootstrap/input-groups.less
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// Input groups
-// --------------------------------------------------
-
-// Base styles
-// -------------------------
-.input-group {
-  position: relative; // For dropdowns
-  display: table;
-  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
-
-  // Undo padding and float of grid classes
-  &[class*="col-"] {
-    float: none;
-    padding-left: 0;
-    padding-right: 0;
-  }
-
-  .form-control {
-    // Ensure that the input is always above the *appended* addon button for
-    // proper border colors.
-    position: relative;
-    z-index: 2;
-
-    // IE9 fubars the placeholder attribute in text inputs and the arrows on
-    // select elements in input groups. To fix it, we float the input. Details:
-    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
-    float: left;
-
-    width: 100%;
-    margin-bottom: 0;
-  }
-}
-
-// Sizing options
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn { .input-lg(); }
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn { .input-sm(); }
-
-
-// Display as table-cell
-// -------------------------
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: table-cell;
-
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-}
-// Addon and addon wrapper for buttons
-.input-group-addon,
-.input-group-btn {
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: middle; // Match the inputs
-}
-
-// Text input groups
-// -------------------------
-.input-group-addon {
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  font-weight: normal;
-  line-height: 1;
-  color: @input-color;
-  text-align: center;
-  background-color: @input-group-addon-bg;
-  border: 1px solid @input-group-addon-border-color;
-  border-radius: @border-radius-base;
-
-  // Sizing
-  &.input-sm {
-    padding: @padding-small-vertical @padding-small-horizontal;
-    font-size: @font-size-small;
-    border-radius: @border-radius-small;
-  }
-  &.input-lg {
-    padding: @padding-large-vertical @padding-large-horizontal;
-    font-size: @font-size-large;
-    border-radius: @border-radius-large;
-  }
-
-  // Nuke default margins from checkboxes and radios to vertically center within.
-  input[type="radio"],
-  input[type="checkbox"] {
-    margin-top: 0;
-  }
-}
-
-// Reset rounded corners
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
-  .border-right-radius(0);
-}
-.input-group-addon:first-child {
-  border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
-  .border-left-radius(0);
-}
-.input-group-addon:last-child {
-  border-left: 0;
-}
-
-// Button input groups
-// -------------------------
-.input-group-btn {
-  position: relative;
-  // Jankily prevent input button groups from wrapping with `white-space` and
-  // `font-size` in combination with `inline-block` on buttons.
-  font-size: 0;
-  white-space: nowrap;
-
-  // Negative margin for spacing, position for bringing hovered/focused/actived
-  // element above the siblings.
-  > .btn {
-    position: relative;
-    + .btn {
-      margin-left: -1px;
-    }
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active {
-      z-index: 2;
-    }
-  }
-
-  // Negative margin to only have a 1px border between the two
-  &:first-child {
-    > .btn,
-    > .btn-group {
-      margin-right: -1px;
-    }
-  }
-  &:last-child {
-    > .btn,
-    > .btn-group {
-      margin-left: -1px;
-    }
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/jumbotron.less b/dashboard/lib/less/bootstrap/jumbotron.less
deleted file mode 100644
index a15e169..0000000
--- a/dashboard/lib/less/bootstrap/jumbotron.less
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Jumbotron
-// --------------------------------------------------
-
-
-.jumbotron {
-  padding: @jumbotron-padding;
-  margin-bottom: @jumbotron-padding;
-  color: @jumbotron-color;
-  background-color: @jumbotron-bg;
-
-  h1,
-  .h1 {
-    color: @jumbotron-heading-color;
-  }
-  p {
-    margin-bottom: (@jumbotron-padding / 2);
-    font-size: @jumbotron-font-size;
-    font-weight: 200;
-  }
-
-  .container & {
-    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
-  }
-
-  .container {
-    max-width: 100%;
-  }
-
-  @media screen and (min-width: @screen-sm-min) {
-    padding-top:    (@jumbotron-padding * 1.6);
-    padding-bottom: (@jumbotron-padding * 1.6);
-
-    .container & {
-      padding-left:  (@jumbotron-padding * 2);
-      padding-right: (@jumbotron-padding * 2);
-    }
-
-    h1,
-    .h1 {
-      font-size: (@font-size-base * 4.5);
-    }
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/labels.less b/dashboard/lib/less/bootstrap/labels.less
deleted file mode 100644
index 5db1ed1..0000000
--- a/dashboard/lib/less/bootstrap/labels.less
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// Labels
-// --------------------------------------------------
-
-.label {
-  display: inline;
-  padding: .2em .6em .3em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: @label-color;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: .25em;
-
-  // Add hover effects, but only for links
-  &[href] {
-    &:hover,
-    &:focus {
-      color: @label-link-hover-color;
-      text-decoration: none;
-      cursor: pointer;
-    }
-  }
-
-  // Empty labels collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for labels in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-}
-
-// Colors
-// Contextual variations (linked labels get darker on :hover)
-
-.label-default {
-  .label-variant(@label-default-bg);
-}
-
-.label-primary {
-  .label-variant(@label-primary-bg);
-}
-
-.label-success {
-  .label-variant(@label-success-bg);
-}
-
-.label-info {
-  .label-variant(@label-info-bg);
-}
-
-.label-warning {
-  .label-variant(@label-warning-bg);
-}
-
-.label-danger {
-  .label-variant(@label-danger-bg);
-}
diff --git a/dashboard/lib/less/bootstrap/list-group.less b/dashboard/lib/less/bootstrap/list-group.less
deleted file mode 100644
index 3343f8e..0000000
--- a/dashboard/lib/less/bootstrap/list-group.less
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// List groups
-// --------------------------------------------------
-
-
-// Base class
-//
-// Easily usable on <ul>, <ol>, or <div>.
-
-.list-group {
-  // No need to set list-style: none; since .list-group-item is block level
-  margin-bottom: 20px;
-  padding-left: 0; // reset padding because ul and ol
-}
-
-
-// Individual list items
-//
-// Use on `li`s or `div`s within the `.list-group` parent.
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  // Place the border on the list items and negative margin up for better styling
-  margin-bottom: -1px;
-  background-color: @list-group-bg;
-  border: 1px solid @list-group-border;
-
-  // Round the first and last items
-  &:first-child {
-    .border-top-radius(@list-group-border-radius);
-  }
-  &:last-child {
-    margin-bottom: 0;
-    .border-bottom-radius(@list-group-border-radius);
-  }
-
-  // Align badges within list items
-  > .badge {
-    float: right;
-  }
-  > .badge + .badge {
-    margin-right: 5px;
-  }
-}
-
-
-// Linked list items
-//
-// Use anchor elements instead of `li`s or `div`s to create linked list items.
-// Includes an extra `.active` modifier class for showing selected items.
-
-a.list-group-item {
-  color: @list-group-link-color;
-
-  .list-group-item-heading {
-    color: @list-group-link-heading-color;
-  }
-
-  // Hover state
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    background-color: @list-group-hover-bg;
-  }
-
-  // Active class on item itself, not parent
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    z-index: 2; // Place active items above their siblings for proper border styling
-    color: @list-group-active-color;
-    background-color: @list-group-active-bg;
-    border-color: @list-group-active-border;
-
-    // Force color to inherit for custom content
-    .list-group-item-heading {
-      color: inherit;
-    }
-    .list-group-item-text {
-      color: @list-group-active-text-color;
-    }
-  }
-}
-
-
-// Contextual variants
-//
-// Add modifier classes to change text and background color on individual items.
-// Organizationally, this must come after the `:hover` states.
-
-.list-group-item-variant(success; @state-success-bg; @state-success-text);
-.list-group-item-variant(info; @state-info-bg; @state-info-text);
-.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);
-.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);
-
-
-// Custom content options
-//
-// Extra classes for creating well-formatted content within `.list-group-item`s.
-
-.list-group-item-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.list-group-item-text {
-  margin-bottom: 0;
-  line-height: 1.3;
-}
diff --git a/dashboard/lib/less/bootstrap/media.less b/dashboard/lib/less/bootstrap/media.less
deleted file mode 100644
index 5ad22cd..0000000
--- a/dashboard/lib/less/bootstrap/media.less
+++ /dev/null
@@ -1,56 +0,0 @@
-// Media objects
-// Source: http://stubbornella.org/content/?p=497
-// --------------------------------------------------
-
-
-// Common styles
-// -------------------------
-
-// Clear the floats
-.media,
-.media-body {
-  overflow: hidden;
-  zoom: 1;
-}
-
-// Proper spacing between instances of .media
-.media,
-.media .media {
-  margin-top: 15px;
-}
-.media:first-child {
-  margin-top: 0;
-}
-
-// For images and videos, set to block
-.media-object {
-  display: block;
-}
-
-// Reset margins on headings for tighter default spacing
-.media-heading {
-  margin: 0 0 5px;
-}
-
-
-// Media image alignment
-// -------------------------
-
-.media {
-  > .pull-left {
-    margin-right: 10px;
-  }
-  > .pull-right {
-    margin-left: 10px;
-  }
-}
-
-
-// Media list variation
-// -------------------------
-
-// Undo default ul/ol styles
-.media-list {
-  padding-left: 0;
-  list-style: none;
-}
diff --git a/dashboard/lib/less/bootstrap/mixins.less b/dashboard/lib/less/bootstrap/mixins.less
deleted file mode 100644
index 71723db..0000000
--- a/dashboard/lib/less/bootstrap/mixins.less
+++ /dev/null
@@ -1,929 +0,0 @@
-//
-// Mixins
-// --------------------------------------------------
-
-
-// Utilities
-// -------------------------
-
-// Clearfix
-// Source: http://nicolasgallagher.com/micro-clearfix-hack/
-//
-// For modern browsers
-// 1. The space content is one way to avoid an Opera bug when the
-//    contenteditable attribute is included anywhere else in the document.
-//    Otherwise it causes space to appear at the top and bottom of elements
-//    that are clearfixed.
-// 2. The use of `table` rather than `block` is only necessary if using
-//    `:before` to contain the top-margins of child elements.
-.clearfix() {
-  &:before,
-  &:after {
-    content: " "; // 1
-    display: table; // 2
-  }
-  &:after {
-    clear: both;
-  }
-}
-
-// WebKit-style focus
-.tab-focus() {
-  // Default
-  outline: thin dotted;
-  // WebKit
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-// Center-align a block level element
-.center-block() {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-// Sizing shortcuts
-.size(@width; @height) {
-  width: @width;
-  height: @height;
-}
-.square(@size) {
-  .size(@size; @size);
-}
-
-// Placeholder text
-.placeholder(@color: @input-color-placeholder) {
-  &::-moz-placeholder           { color: @color;   // Firefox
-                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
-  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+
-  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
-}
-
-// Text overflow
-// Requires inline-block or block for proper styling
-.text-overflow() {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-// CSS image replacement
-//
-// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
-// mixins being reused as classes with the same name, this doesn't hold up. As
-// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
-// that we cannot chain the mixins together in Less, so they are repeated.
-//
-// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
-
-// Deprecated as of v3.0.1 (will be removed in v4)
-.hide-text() {
-  font: ~"0/0" a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-// New mixin to use as of v3.0.1
-.text-hide() {
-  .hide-text();
-}
-
-
-
-// CSS3 PROPERTIES
-// --------------------------------------------------
-
-// Single side border-radius
-.border-top-radius(@radius) {
-  border-top-right-radius: @radius;
-   border-top-left-radius: @radius;
-}
-.border-right-radius(@radius) {
-  border-bottom-right-radius: @radius;
-     border-top-right-radius: @radius;
-}
-.border-bottom-radius(@radius) {
-  border-bottom-right-radius: @radius;
-   border-bottom-left-radius: @radius;
-}
-.border-left-radius(@radius) {
-  border-bottom-left-radius: @radius;
-     border-top-left-radius: @radius;
-}
-
-// Drop shadows
-//
-// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
-//   supported browsers that have box shadow capabilities now support the
-//   standard `box-shadow` property.
-.box-shadow(@shadow) {
-  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
-          box-shadow: @shadow;
-}
-
-// Transitions
-.transition(@transition) {
-  -webkit-transition: @transition;
-          transition: @transition;
-}
-.transition-property(@transition-property) {
-  -webkit-transition-property: @transition-property;
-          transition-property: @transition-property;
-}
-.transition-delay(@transition-delay) {
-  -webkit-transition-delay: @transition-delay;
-          transition-delay: @transition-delay;
-}
-.transition-duration(@transition-duration) {
-  -webkit-transition-duration: @transition-duration;
-          transition-duration: @transition-duration;
-}
-.transition-transform(@transition) {
-  -webkit-transition: -webkit-transform @transition;
-     -moz-transition: -moz-transform @transition;
-       -o-transition: -o-transform @transition;
-          transition: transform @transition;
-}
-
-// Transformations
-.rotate(@degrees) {
-  -webkit-transform: rotate(@degrees);
-      -ms-transform: rotate(@degrees); // IE9 only
-          transform: rotate(@degrees);
-}
-.scale(@ratio; @ratio-y...) {
-  -webkit-transform: scale(@ratio, @ratio-y);
-      -ms-transform: scale(@ratio, @ratio-y); // IE9 only
-          transform: scale(@ratio, @ratio-y);
-}
-.translate(@x; @y) {
-  -webkit-transform: translate(@x, @y);
-      -ms-transform: translate(@x, @y); // IE9 only
-          transform: translate(@x, @y);
-}
-.skew(@x; @y) {
-  -webkit-transform: skew(@x, @y);
-      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
-          transform: skew(@x, @y);
-}
-.translate3d(@x; @y; @z) {
-  -webkit-transform: translate3d(@x, @y, @z);
-          transform: translate3d(@x, @y, @z);
-}
-
-.rotateX(@degrees) {
-  -webkit-transform: rotateX(@degrees);
-      -ms-transform: rotateX(@degrees); // IE9 only
-          transform: rotateX(@degrees);
-}
-.rotateY(@degrees) {
-  -webkit-transform: rotateY(@degrees);
-      -ms-transform: rotateY(@degrees); // IE9 only
-          transform: rotateY(@degrees);
-}
-.perspective(@perspective) {
-  -webkit-perspective: @perspective;
-     -moz-perspective: @perspective;
-          perspective: @perspective;
-}
-.perspective-origin(@perspective) {
-  -webkit-perspective-origin: @perspective;
-     -moz-perspective-origin: @perspective;
-          perspective-origin: @perspective;
-}
-.transform-origin(@origin) {
-  -webkit-transform-origin: @origin;
-     -moz-transform-origin: @origin;
-      -ms-transform-origin: @origin; // IE9 only
-          transform-origin: @origin;
-}
-
-// Animations
-.animation(@animation) {
-  -webkit-animation: @animation;
-          animation: @animation;
-}
-.animation-name(@name) {
-  -webkit-animation-name: @name;
-          animation-name: @name;
-}
-.animation-duration(@duration) {
-  -webkit-animation-duration: @duration;
-          animation-duration: @duration;
-}
-.animation-timing-function(@timing-function) {
-  -webkit-animation-timing-function: @timing-function;
-          animation-timing-function: @timing-function;
-}
-.animation-delay(@delay) {
-  -webkit-animation-delay: @delay;
-          animation-delay: @delay;
-}
-.animation-iteration-count(@iteration-count) {
-  -webkit-animation-iteration-count: @iteration-count;
-          animation-iteration-count: @iteration-count;
-}
-.animation-direction(@direction) {
-  -webkit-animation-direction: @direction;
-          animation-direction: @direction;
-}
-
-// Backface visibility
-// Prevent browsers from flickering when using CSS 3D transforms.
-// Default value is `visible`, but can be changed to `hidden`
-.backface-visibility(@visibility){
-  -webkit-backface-visibility: @visibility;
-     -moz-backface-visibility: @visibility;
-          backface-visibility: @visibility;
-}
-
-// Box sizing
-.box-sizing(@boxmodel) {
-  -webkit-box-sizing: @boxmodel;
-     -moz-box-sizing: @boxmodel;
-          box-sizing: @boxmodel;
-}
-
-// User select
-// For selecting text on the page
-.user-select(@select) {
-  -webkit-user-select: @select;
-     -moz-user-select: @select;
-      -ms-user-select: @select; // IE10+
-          user-select: @select;
-}
-
-// Resize anything
-.resizable(@direction) {
-  resize: @direction; // Options: horizontal, vertical, both
-  overflow: auto; // Safari fix
-}
-
-// CSS3 Content Columns
-.content-columns(@column-count; @column-gap: @grid-gutter-width) {
-  -webkit-column-count: @column-count;
-     -moz-column-count: @column-count;
-          column-count: @column-count;
-  -webkit-column-gap: @column-gap;
-     -moz-column-gap: @column-gap;
-          column-gap: @column-gap;
-}
-
-// Optional hyphenation
-.hyphens(@mode: auto) {
-  word-wrap: break-word;
-  -webkit-hyphens: @mode;
-     -moz-hyphens: @mode;
-      -ms-hyphens: @mode; // IE10+
-       -o-hyphens: @mode;
-          hyphens: @mode;
-}
-
-// Opacity
-.opacity(@opacity) {
-  opacity: @opacity;
-  // IE8 filter
-  @opacity-ie: (@opacity * 100);
-  filter: ~"alpha(opacity=@{opacity-ie})";
-}
-
-
-
-// GRADIENTS
-// --------------------------------------------------
-
-#gradient {
-
-  // Horizontal gradient, from left to right
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+
-    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  // Vertical gradient, from top to bottom
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+
-    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
-    background-repeat: repeat-x;
-    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
-    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-  }
-  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .radial(@inner-color: #555; @outer-color: #333) {
-    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
-    background-image: radial-gradient(circle, @inner-color, @outer-color);
-    background-repeat: no-repeat;
-  }
-  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
-    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-  }
-}
-
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9 and below.
-.reset-filter() {
-  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
-}
-
-
-
-// Retina images
-//
-// Short retina mixin for setting background-image and -size
-
-.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
-  background-image: url("@{file-1x}");
-
-  @media
-  only screen and (-webkit-min-device-pixel-ratio: 2),
-  only screen and (   min--moz-device-pixel-ratio: 2),
-  only screen and (     -o-min-device-pixel-ratio: 2/1),
-  only screen and (        min-device-pixel-ratio: 2),
-  only screen and (                min-resolution: 192dpi),
-  only screen and (                min-resolution: 2dppx) {
-    background-image: url("@{file-2x}");
-    background-size: @width-1x @height-1x;
-  }
-}
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-
-.img-responsive(@display: block) {
-  display: @display;
-  max-width: 100%; // Part 1: Set a maximum relative to the parent
-  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
-}
-
-
-// COMPONENT MIXINS
-// --------------------------------------------------
-
-// Horizontal dividers
-// -------------------------
-// Dividers (basically an hr) within dropdowns and nav lists
-.nav-divider(@color: #e5e5e5) {
-  height: 1px;
-  margin: ((@line-height-computed / 2) - 1) 0;
-  overflow: hidden;
-  background-color: @color;
-}
-
-// Panels
-// -------------------------
-.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
-  border-color: @border;
-
-  & > .panel-heading {
-    color: @heading-text-color;
-    background-color: @heading-bg-color;
-    border-color: @heading-border;
-
-    + .panel-collapse .panel-body {
-      border-top-color: @border;
-    }
-  }
-  & > .panel-footer {
-    + .panel-collapse .panel-body {
-      border-bottom-color: @border;
-    }
-  }
-}
-
-// Alerts
-// -------------------------
-.alert-variant(@background; @border; @text-color) {
-  background-color: @background;
-  border-color: @border;
-  color: @text-color;
-
-  hr {
-    border-top-color: darken(@border, 5%);
-  }
-  .alert-link {
-    color: darken(@text-color, 10%);
-  }
-}
-
-// Tables
-// -------------------------
-.table-row-variant(@state; @background) {
-  // Exact selectors below required to override `.table-striped` and prevent
-  // inheritance to nested tables.
-  .table > thead > tr,
-  .table > tbody > tr,
-  .table > tfoot > tr {
-    > td.@{state},
-    > th.@{state},
-    &.@{state} > td,
-    &.@{state} > th {
-      background-color: @background;
-    }
-  }
-
-  // Hover states for `.table-hover`
-  // Note: this is not available for cells or rows within `thead` or `tfoot`.
-  .table-hover > tbody > tr {
-    > td.@{state}:hover,
-    > th.@{state}:hover,
-    &.@{state}:hover > td,
-    &.@{state}:hover > th {
-      background-color: darken(@background, 5%);
-    }
-  }
-}
-
-// List Groups
-// -------------------------
-.list-group-item-variant(@state; @background; @color) {
-  .list-group-item-@{state} {
-    color: @color;
-    background-color: @background;
-
-    a& {
-      color: @color;
-
-      .list-group-item-heading { color: inherit; }
-
-      &:hover,
-      &:focus {
-        color: @color;
-        background-color: darken(@background, 5%);
-      }
-      &.active,
-      &.active:hover,
-      &.active:focus {
-        color: #fff;
-        background-color: @color;
-        border-color: @color;
-      }
-    }
-  }
-}
-
-// Button variants
-// -------------------------
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-.button-variant(@color; @background; @border) {
-  color: @color;
-  background-color: @background;
-  border-color: @border;
-
-  &:hover,
-  &:focus,
-  &:active,
-  &.active,
-  .open .dropdown-toggle& {
-    color: @color;
-    background-color: darken(@background, 8%);
-        border-color: darken(@border, 12%);
-  }
-  &:active,
-  &.active,
-  .open .dropdown-toggle& {
-    background-image: none;
-  }
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    &,
-    &:hover,
-    &:focus,
-    &:active,
-    &.active {
-      background-color: @background;
-          border-color: @border;
-    }
-  }
-
-  .badge {
-    color: @background;
-    background-color: @color;
-  }
-}
-
-// Button sizes
-// -------------------------
-.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-}
-
-// Pagination
-// -------------------------
-.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
-  > li {
-    > a,
-    > span {
-      padding: @padding-vertical @padding-horizontal;
-      font-size: @font-size;
-    }
-    &:first-child {
-      > a,
-      > span {
-        .border-left-radius(@border-radius);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius);
-      }
-    }
-  }
-}
-
-// Labels
-// -------------------------
-.label-variant(@color) {
-  background-color: @color;
-  &[href] {
-    &:hover,
-    &:focus {
-      background-color: darken(@color, 10%);
-    }
-  }
-}
-
-// Contextual backgrounds
-// -------------------------
-.bg-variant(@color) {
-  background-color: @color;
-  a&:hover {
-    background-color: darken(@color, 10%);
-  }
-}
-
-// Typography
-// -------------------------
-.text-emphasis-variant(@color) {
-  color: @color;
-  a&:hover {
-    color: darken(@color, 10%);
-  }
-}
-
-// Navbar vertical align
-// -------------------------
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
-.navbar-vertical-align(@element-height) {
-  margin-top: ((@navbar-height - @element-height) / 2);
-  margin-bottom: ((@navbar-height - @element-height) / 2);
-}
-
-// Progress bars
-// -------------------------
-.progress-bar-variant(@color) {
-  background-color: @color;
-  .progress-striped & {
-    #gradient > .striped();
-  }
-}
-
-// Responsive utilities
-// -------------------------
-// More easily include all the states for responsive-utilities.less.
-.responsive-visibility() {
-  display: block !important;
-  table&  { display: table; }
-  tr&     { display: table-row !important; }
-  th&,
-  td&     { display: table-cell !important; }
-}
-
-.responsive-invisibility() {
-  display: none !important;
-}
-
-
-// Grid System
-// -----------
-
-// Centered container element
-.container-fixed() {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left:  (@grid-gutter-width / 2);
-  padding-right: (@grid-gutter-width / 2);
-  &:extend(.clearfix all);
-}
-
-// Creates a wrapper for a series of columns
-.make-row(@gutter: @grid-gutter-width) {
-  margin-left:  (@gutter / -2);
-  margin-right: (@gutter / -2);
-  &:extend(.clearfix all);
-}
-
-// Generate the extra small columns
-.make-xs-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  float: left;
-  width: percentage((@columns / @grid-columns));
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-}
-.make-xs-column-offset(@columns) {
-  @media (min-width: @screen-xs-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-xs-column-push(@columns) {
-  @media (min-width: @screen-xs-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-xs-column-pull(@columns) {
-  @media (min-width: @screen-xs-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the small columns
-.make-sm-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-sm-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-offset(@columns) {
-  @media (min-width: @screen-sm-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-push(@columns) {
-  @media (min-width: @screen-sm-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-pull(@columns) {
-  @media (min-width: @screen-sm-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the medium columns
-.make-md-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-md-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-offset(@columns) {
-  @media (min-width: @screen-md-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-push(@columns) {
-  @media (min-width: @screen-md-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-pull(@columns) {
-  @media (min-width: @screen-md-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the large columns
-.make-lg-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-lg-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-offset(@columns) {
-  @media (min-width: @screen-lg-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-push(@columns) {
-  @media (min-width: @screen-lg-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-pull(@columns) {
-  @media (min-width: @screen-lg-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `@grid-columns`.
-
-.make-grid-columns() {
-  // Common styles for all sizes of grid columns, widths 1-12
-  .col(@index) when (@index = 1) { // initial
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      position: relative;
-      // Prevent columns from collapsing when empty
-      min-height: 1px;
-      // Inner gutter via padding
-      padding-left:  (@grid-gutter-width / 2);
-      padding-right: (@grid-gutter-width / 2);
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.float-grid-columns(@class) {
-  .col(@index) when (@index = 1) { // initial
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      float: left;
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
-  .col-@{class}-@{index} {
-    width: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = push) {
-  .col-@{class}-push-@{index} {
-    left: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = pull) {
-  .col-@{class}-pull-@{index} {
-    right: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = offset) {
-  .col-@{class}-offset-@{index} {
-    margin-left: percentage((@index / @grid-columns));
-  }
-}
-
-// Basic looping in LESS
-.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
-  .calc-grid-column(@index, @class, @type);
-  // next iteration
-  .loop-grid-columns((@index - 1), @class, @type);
-}
-
-// Create grid for specific class
-.make-grid(@class) {
-  .float-grid-columns(@class);
-  .loop-grid-columns(@grid-columns, @class, width);
-  .loop-grid-columns(@grid-columns, @class, pull);
-  .loop-grid-columns(@grid-columns, @class, push);
-  .loop-grid-columns(@grid-columns, @class, offset);
-}
-
-// Form validation states
-//
-// Used in forms.less to generate the form validation CSS for warnings, errors,
-// and successes.
-
-.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
-  // Color the label and help text
-  .help-block,
-  .control-label,
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline  {
-    color: @text-color;
-  }
-  // Set the border and box shadow on specific inputs to match
-  .form-control {
-    border-color: @border-color;
-    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
-    &:focus {
-      border-color: darken(@border-color, 10%);
-      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
-      .box-shadow(@shadow);
-    }
-  }
-  // Set validation states also for addons
-  .input-group-addon {
-    color: @text-color;
-    border-color: @border-color;
-    background-color: @background-color;
-  }
-  // Optional feedback icon
-  .form-control-feedback {
-    color: @text-color;
-  }
-}
-
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `@input-focus-border` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
-
-.form-control-focus(@color: @input-border-focus) {
-  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
-  &:focus {
-    border-color: @color;
-    outline: 0;
-    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
-  }
-}
-
-// Form control sizing
-//
-// Relative text size, padding, and border-radii changes for form controls. For
-// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
-// element gets special love because it's special, and that's a fact!
-
-.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  height: @input-height;
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-
-  select& {
-    height: @input-height;
-    line-height: @input-height;
-  }
-
-  textarea&,
-  select[multiple]& {
-    height: auto;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/modals.less b/dashboard/lib/less/bootstrap/modals.less
deleted file mode 100644
index 21cdee0..0000000
--- a/dashboard/lib/less/bootstrap/modals.less
+++ /dev/null
@@ -1,139 +0,0 @@
-//
-// Modals
-// --------------------------------------------------
-
-// .modal-open      - body class for killing the scroll
-// .modal           - container to scroll within
-// .modal-dialog    - positioning shell for the actual modal
-// .modal-content   - actual modal w/ bg and corners and shit
-
-// Kill the scroll on the body
-.modal-open {
-  overflow: hidden;
-}
-
-// Container that the modal scrolls within
-.modal {
-  display: none;
-  overflow: auto;
-  overflow-y: scroll;
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal;
-  -webkit-overflow-scrolling: touch;
-
-  // Prevent Chrome on Windows from adding a focus outline. For details, see
-  // https://github.com/twbs/bootstrap/pull/10951.
-  outline: 0;
-
-  // When fading in the modal, animate it to slide down
-  &.fade .modal-dialog {
-    .translate(0, -25%);
-    .transition-transform(~"0.3s ease-out");
-  }
-  &.in .modal-dialog { .translate(0, 0)}
-}
-
-// Shell div to position the modal with bottom padding
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-
-// Actual modal
-.modal-content {
-  position: relative;
-  background-color: @modal-content-bg;
-  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
-  border: 1px solid @modal-content-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 3px 9px rgba(0,0,0,.5));
-  background-clip: padding-box;
-  // Remove focus outline from opened modal
-  outline: none;
-}
-
-// Modal background
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal-background;
-  background-color: @modal-backdrop-bg;
-  // Fade for backdrop
-  &.fade { .opacity(0); }
-  &.in { .opacity(@modal-backdrop-opacity); }
-}
-
-// Modal header
-// Top section of the modal w/ title and dismiss
-.modal-header {
-  padding: @modal-title-padding;
-  border-bottom: 1px solid @modal-header-border-color;
-  min-height: (@modal-title-padding + @modal-title-line-height);
-}
-// Close icon
-.modal-header .close {
-  margin-top: -2px;
-}
-
-// Title text within header
-.modal-title {
-  margin: 0;
-  line-height: @modal-title-line-height;
-}
-
-// Modal body
-// Where all modal content resides (sibling of .modal-header and .modal-footer)
-.modal-body {
-  position: relative;
-  padding: @modal-inner-padding;
-}
-
-// Footer (for actions)
-.modal-footer {
-  margin-top: 15px;
-  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;
-  text-align: right; // right align buttons
-  border-top: 1px solid @modal-footer-border-color;
-  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons
-
-  // Properly space out buttons
-  .btn + .btn {
-    margin-left: 5px;
-    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
-  }
-  // but override that for button groups
-  .btn-group .btn + .btn {
-    margin-left: -1px;
-  }
-  // and override it for block buttons as well
-  .btn-block + .btn-block {
-    margin-left: 0;
-  }
-}
-
-// Scale up the modal
-@media (min-width: @screen-sm-min) {
-  // Automatically set modal's width for larger viewports
-  .modal-dialog {
-    width: @modal-md;
-    margin: 30px auto;
-  }
-  .modal-content {
-    .box-shadow(0 5px 15px rgba(0,0,0,.5));
-  }
-
-  // Modal sizes
-  .modal-sm { width: @modal-sm; }
-}
-
-@media (min-width: @screen-md-min) {
-  .modal-lg { width: @modal-lg; }
-}
diff --git a/dashboard/lib/less/bootstrap/navbar.less b/dashboard/lib/less/bootstrap/navbar.less
deleted file mode 100644
index 8c4c210..0000000
--- a/dashboard/lib/less/bootstrap/navbar.less
+++ /dev/null
@@ -1,616 +0,0 @@
-//
-// Navbars
-// --------------------------------------------------
-
-
-// Wrapper and base class
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
-  position: relative;
-  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
-  margin-bottom: @navbar-margin-bottom;
-  border: 1px solid transparent;
-
-  // Prevent floats from breaking the navbar
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: @navbar-border-radius;
-  }
-}
-
-
-// Navbar heading
-//
-// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
-// styling of responsive aspects.
-
-.navbar-header {
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-  }
-}
-
-
-// Navbar collapse (body)
-//
-// Group your navbar content into this for easy collapsing and expanding across
-// various device sizes. By default, this content is collapsed when <768px, but
-// will expand past that for a horizontal display.
-//
-// To start (on mobile devices) the navbar links, forms, and buttons are stacked
-// vertically and include a `max-height` to overflow in case you have too much
-// content for the user's viewport.
-
-.navbar-collapse {
-  max-height: @navbar-collapse-max-height;
-  overflow-x: visible;
-  padding-right: @navbar-padding-horizontal;
-  padding-left:  @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
-  &:extend(.clearfix all);
-  -webkit-overflow-scrolling: touch;
-
-  &.in {
-    overflow-y: auto;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border-top: 0;
-    box-shadow: none;
-
-    &.collapse {
-      display: block !important;
-      height: auto !important;
-      padding-bottom: 0; // Override default setting
-      overflow: visible !important;
-    }
-
-    &.in {
-      overflow-y: visible;
-    }
-
-    // Undo the collapse side padding for navbars with containers to ensure
-    // alignment of right-aligned contents.
-    .navbar-fixed-top &,
-    .navbar-static-top &,
-    .navbar-fixed-bottom & {
-      padding-left: 0;
-      padding-right: 0;
-    }
-  }
-}
-
-
-// Both navbar header and collapse
-//
-// When a container is present, change the behavior of the header and collapse.
-
-.container,
-.container-fluid {
-  > .navbar-header,
-  > .navbar-collapse {
-    margin-right: -@navbar-padding-horizontal;
-    margin-left:  -@navbar-padding-horizontal;
-
-    @media (min-width: @grid-float-breakpoint) {
-      margin-right: 0;
-      margin-left:  0;
-    }
-  }
-}
-
-
-//
-// Navbar alignment options
-//
-// Display the navbar across the entirety of the page or fixed it to the top or
-// bottom of the page.
-
-// Static top (unfixed, but 100% wide) navbar
-.navbar-static-top {
-  z-index: @zindex-navbar;
-  border-width: 0 0 1px;
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-
-// Fix the top/bottom navbars when screen real estate supports it
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: @zindex-navbar-fixed;
-
-  // Undo the rounded corners
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0; // override .navbar defaults
-  border-width: 1px 0 0;
-}
-
-
-// Brand/project name
-
-.navbar-brand {
-  float: left;
-  padding: @navbar-padding-vertical @navbar-padding-horizontal;
-  font-size: @font-size-large;
-  line-height: @line-height-computed;
-  height: @navbar-height;
-
-  &:hover,
-  &:focus {
-    text-decoration: none;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    .navbar > .container &,
-    .navbar > .container-fluid & {
-      margin-left: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Navbar toggle
-//
-// Custom button for toggling the `.navbar-collapse`, powered by the collapse
-// JavaScript plugin.
-
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: @navbar-padding-horizontal;
-  padding: 9px 10px;
-  .navbar-vertical-align(34px);
-  background-color: transparent;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  border-radius: @border-radius-base;
-
-  // We remove the `outline` here, but later compensate by attaching `:hover`
-  // styles to `:focus`.
-  &:focus {
-    outline: none;
-  }
-
-  // Bars
-  .icon-bar {
-    display: block;
-    width: 22px;
-    height: 2px;
-    border-radius: 1px;
-  }
-  .icon-bar + .icon-bar {
-    margin-top: 4px;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    display: none;
-  }
-}
-
-
-// Navbar nav links
-//
-// Builds on top of the `.nav` components with its own modifier class to make
-// the nav the full height of the horizontal nav (above 768px).
-
-.navbar-nav {
-  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
-
-  > li > a {
-    padding-top:    10px;
-    padding-bottom: 10px;
-    line-height: @line-height-computed;
-  }
-
-  @media (max-width: @grid-float-breakpoint-max) {
-    // Dropdowns get custom display when collapsed
-    .open .dropdown-menu {
-      position: static;
-      float: none;
-      width: auto;
-      margin-top: 0;
-      background-color: transparent;
-      border: 0;
-      box-shadow: none;
-      > li > a,
-      .dropdown-header {
-        padding: 5px 15px 5px 25px;
-      }
-      > li > a {
-        line-height: @line-height-computed;
-        &:hover,
-        &:focus {
-          background-image: none;
-        }
-      }
-    }
-  }
-
-  // Uncollapse the nav
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin: 0;
-
-    > li {
-      float: left;
-      > a {
-        padding-top:    @navbar-padding-vertical;
-        padding-bottom: @navbar-padding-vertical;
-      }
-    }
-
-    &.navbar-right:last-child {
-      margin-right: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Component alignment
-//
-// Repurpose the pull utilities as their own navbar utilities to avoid specificity
-// issues with parents and chaining. Only do this when the navbar is uncollapsed
-// though so that navbar contents properly stack and align in mobile.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-left  { .pull-left(); }
-  .navbar-right { .pull-right(); }
-}
-
-
-// Navbar form
-//
-// Extension of the `.form-inline` with some extra flavor for optimum display in
-// our navbars.
-
-.navbar-form {
-  margin-left: -@navbar-padding-horizontal;
-  margin-right: -@navbar-padding-horizontal;
-  padding: 10px @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-
-  // Mixin behavior for optimum display
-  .form-inline();
-
-  .form-group {
-    @media (max-width: @grid-float-breakpoint-max) {
-      margin-bottom: 5px;
-    }
-  }
-
-  // Vertically center in expanded, horizontal navbar
-  .navbar-vertical-align(@input-height-base);
-
-  // Undo 100% width for pull classes
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border: 0;
-    margin-left: 0;
-    margin-right: 0;
-    padding-top: 0;
-    padding-bottom: 0;
-    .box-shadow(none);
-
-    // Outdent the form if last child to line up with content down the page
-    &.navbar-right:last-child {
-      margin-right: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Dropdown menus
-
-// Menu position and menu carets
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  .border-top-radius(0);
-}
-// Menu position and menu caret support for dropups via extra dropup class
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  .border-bottom-radius(0);
-}
-
-
-// Buttons in navbars
-//
-// Vertically center a button within a navbar (when *not* in a form).
-
-.navbar-btn {
-  .navbar-vertical-align(@input-height-base);
-
-  &.btn-sm {
-    .navbar-vertical-align(@input-height-small);
-  }
-  &.btn-xs {
-    .navbar-vertical-align(22);
-  }
-}
-
-
-// Text in navbars
-//
-// Add a class to make any element properly align itself vertically within the navbars.
-
-.navbar-text {
-  .navbar-vertical-align(@line-height-computed);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin-left: @navbar-padding-horizontal;
-    margin-right: @navbar-padding-horizontal;
-
-    // Outdent the form if last child to line up with content down the page
-    &.navbar-right:last-child {
-      margin-right: 0;
-    }
-  }
-}
-
-// Alternate navbars
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  background-color: @navbar-default-bg;
-  border-color: @navbar-default-border;
-
-  .navbar-brand {
-    color: @navbar-default-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-default-brand-hover-color;
-      background-color: @navbar-default-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-default-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-default-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-hover-color;
-        background-color: @navbar-default-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-active-color;
-        background-color: @navbar-default-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-disabled-color;
-        background-color: @navbar-default-link-disabled-bg;
-      }
-    }
-  }
-
-  .navbar-toggle {
-    border-color: @navbar-default-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-default-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-default-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: @navbar-default-border;
-  }
-
-  // Dropdown menu items
-  .navbar-nav {
-    // Remove background color from open dropdown
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-default-link-active-bg;
-        color: @navbar-default-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display when collapsed
-      .open .dropdown-menu {
-        > li > a {
-          color: @navbar-default-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-hover-color;
-            background-color: @navbar-default-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-active-color;
-            background-color: @navbar-default-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-disabled-color;
-            background-color: @navbar-default-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-
-  // Links in navbars
-  //
-  // Add a class to ensure links outside the navbar nav are colored correctly.
-
-  .navbar-link {
-    color: @navbar-default-link-color;
-    &:hover {
-      color: @navbar-default-link-hover-color;
-    }
-  }
-
-}
-
-// Inverse navbar
-
-.navbar-inverse {
-  background-color: @navbar-inverse-bg;
-  border-color: @navbar-inverse-border;
-
-  .navbar-brand {
-    color: @navbar-inverse-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-inverse-brand-hover-color;
-      background-color: @navbar-inverse-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-inverse-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-inverse-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-hover-color;
-        background-color: @navbar-inverse-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-active-color;
-        background-color: @navbar-inverse-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-disabled-color;
-        background-color: @navbar-inverse-link-disabled-bg;
-      }
-    }
-  }
-
-  // Darken the responsive nav toggle
-  .navbar-toggle {
-    border-color: @navbar-inverse-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-inverse-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-inverse-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: darken(@navbar-inverse-bg, 7%);
-  }
-
-  // Dropdowns
-  .navbar-nav {
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-inverse-link-active-bg;
-        color: @navbar-inverse-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display
-      .open .dropdown-menu {
-        > .dropdown-header {
-          border-color: @navbar-inverse-border;
-        }
-        .divider {
-          background-color: @navbar-inverse-border;
-        }
-        > li > a {
-          color: @navbar-inverse-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-hover-color;
-            background-color: @navbar-inverse-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-active-color;
-            background-color: @navbar-inverse-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-disabled-color;
-            background-color: @navbar-inverse-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-  .navbar-link {
-    color: @navbar-inverse-link-color;
-    &:hover {
-      color: @navbar-inverse-link-hover-color;
-    }
-  }
-
-}
diff --git a/dashboard/lib/less/bootstrap/navs.less b/dashboard/lib/less/bootstrap/navs.less
deleted file mode 100644
index 9e729b3..0000000
--- a/dashboard/lib/less/bootstrap/navs.less
+++ /dev/null
@@ -1,242 +0,0 @@
-//
-// Navs
-// --------------------------------------------------
-
-
-// Base class
-// --------------------------------------------------
-
-.nav {
-  margin-bottom: 0;
-  padding-left: 0; // Override default ul/ol
-  list-style: none;
-  &:extend(.clearfix all);
-
-  > li {
-    position: relative;
-    display: block;
-
-    > a {
-      position: relative;
-      display: block;
-      padding: @nav-link-padding;
-      &:hover,
-      &:focus {
-        text-decoration: none;
-        background-color: @nav-link-hover-bg;
-      }
-    }
-
-    // Disabled state sets text to gray and nukes hover/tab effects
-    &.disabled > a {
-      color: @nav-disabled-link-color;
-
-      &:hover,
-      &:focus {
-        color: @nav-disabled-link-hover-color;
-        text-decoration: none;
-        background-color: transparent;
-        cursor: not-allowed;
-      }
-    }
-  }
-
-  // Open dropdowns
-  .open > a {
-    &,
-    &:hover,
-    &:focus {
-      background-color: @nav-link-hover-bg;
-      border-color: @link-color;
-    }
-  }
-
-  // Nav dividers (deprecated with v3.0.1)
-  //
-  // This should have been removed in v3 with the dropping of `.nav-list`, but
-  // we missed it. We don't currently support this anywhere, but in the interest
-  // of maintaining backward compatibility in case you use it, it's deprecated.
-  .nav-divider {
-    .nav-divider();
-  }
-
-  // Prevent IE8 from misplacing imgs
-  //
-  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
-  > li > a > img {
-    max-width: none;
-  }
-}
-
-
-// Tabs
-// -------------------------
-
-// Give the tabs something to sit on
-.nav-tabs {
-  border-bottom: 1px solid @nav-tabs-border-color;
-  > li {
-    float: left;
-    // Make the list-items overlay the bottom border
-    margin-bottom: -1px;
-
-    // Actual tabs (as links)
-    > a {
-      margin-right: 2px;
-      line-height: @line-height-base;
-      border: 1px solid transparent;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-      &:hover {
-        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
-      }
-    }
-
-    // Active state, and its :hover to override normal :hover
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-tabs-active-link-hover-color;
-        background-color: @nav-tabs-active-link-hover-bg;
-        border: 1px solid @nav-tabs-active-link-hover-border-color;
-        border-bottom-color: transparent;
-        cursor: default;
-      }
-    }
-  }
-  // pulling this in mainly for less shorthand
-  &.nav-justified {
-    .nav-justified();
-    .nav-tabs-justified();
-  }
-}
-
-
-// Pills
-// -------------------------
-.nav-pills {
-  > li {
-    float: left;
-
-    // Links rendered as pills
-    > a {
-      border-radius: @nav-pills-border-radius;
-    }
-    + li {
-      margin-left: 2px;
-    }
-
-    // Active state
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-pills-active-link-hover-color;
-        background-color: @nav-pills-active-link-hover-bg;
-      }
-    }
-  }
-}
-
-
-// Stacked pills
-.nav-stacked {
-  > li {
-    float: none;
-    + li {
-      margin-top: 2px;
-      margin-left: 0; // no need for this gap between nav items
-    }
-  }
-}
-
-
-// Nav variations
-// --------------------------------------------------
-
-// Justified nav links
-// -------------------------
-
-.nav-justified {
-  width: 100%;
-
-  > li {
-    float: none;
-     > a {
-      text-align: center;
-      margin-bottom: 5px;
-    }
-  }
-
-  > .dropdown .dropdown-menu {
-    top: auto;
-    left: auto;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li {
-      display: table-cell;
-      width: 1%;
-      > a {
-        margin-bottom: 0;
-      }
-    }
-  }
-}
-
-// Move borders to anchors instead of bottom of list
-//
-// Mixin for adding on top the shared `.nav-justified` styles for our tabs
-.nav-tabs-justified {
-  border-bottom: 0;
-
-  > li > a {
-    // Override margin from .nav-tabs
-    margin-right: 0;
-    border-radius: @border-radius-base;
-  }
-
-  > .active > a,
-  > .active > a:hover,
-  > .active > a:focus {
-    border: 1px solid @nav-tabs-justified-link-border-color;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li > a {
-      border-bottom: 1px solid @nav-tabs-justified-link-border-color;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-    }
-    > .active > a,
-    > .active > a:hover,
-    > .active > a:focus {
-      border-bottom-color: @nav-tabs-justified-active-link-border-color;
-    }
-  }
-}
-
-
-// Tabbable tabs
-// -------------------------
-
-// Hide tabbable panes to start, show them when `.active`
-.tab-content {
-  > .tab-pane {
-    display: none;
-  }
-  > .active {
-    display: block;
-  }
-}
-
-
-// Dropdowns
-// -------------------------
-
-// Specific dropdowns
-.nav-tabs .dropdown-menu {
-  // make dropdown border overlap tab border
-  margin-top: -1px;
-  // Remove the top rounded corners here since there is a hard edge above the menu
-  .border-top-radius(0);
-}
diff --git a/dashboard/lib/less/bootstrap/normalize.less b/dashboard/lib/less/bootstrap/normalize.less
deleted file mode 100644
index 024e257..0000000
--- a/dashboard/lib/less/bootstrap/normalize.less
+++ /dev/null
@@ -1,423 +0,0 @@
-/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
-
-//
-// 1. Set default font family to sans-serif.
-// 2. Prevent iOS text size adjust after orientation change, without disabling
-//    user zoom.
-//
-
-html {
-  font-family: sans-serif; // 1
-  -ms-text-size-adjust: 100%; // 2
-  -webkit-text-size-adjust: 100%; // 2
-}
-
-//
-// Remove default margin.
-//
-
-body {
-  margin: 0;
-}
-
-// HTML5 display definitions
-// ==========================================================================
-
-//
-// Correct `block` display not defined in IE 8/9.
-//
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
-  display: block;
-}
-
-//
-// 1. Correct `inline-block` display not defined in IE 8/9.
-// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
-//
-
-audio,
-canvas,
-progress,
-video {
-  display: inline-block; // 1
-  vertical-align: baseline; // 2
-}
-
-//
-// Prevent modern browsers from displaying `audio` without controls.
-// Remove excess height in iOS 5 devices.
-//
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-//
-// Address `[hidden]` styling not present in IE 8/9.
-// Hide the `template` element in IE, Safari, and Firefox < 22.
-//
-
-[hidden],
-template {
-  display: none;
-}
-
-// Links
-// ==========================================================================
-
-//
-// Remove the gray background color from active links in IE 10.
-//
-
-a {
-  background: transparent;
-}
-
-//
-// Improve readability when focused and also mouse hovered in all browsers.
-//
-
-a:active,
-a:hover {
-  outline: 0;
-}
-
-// Text-level semantics
-// ==========================================================================
-
-//
-// Address styling not present in IE 8/9, Safari 5, and Chrome.
-//
-
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-
-//
-// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
-//
-
-b,
-strong {
-  font-weight: bold;
-}
-
-//
-// Address styling not present in Safari 5 and Chrome.
-//
-
-dfn {
-  font-style: italic;
-}
-
-//
-// Address variable `h1` font-size and margin within `section` and `article`
-// contexts in Firefox 4+, Safari 5, and Chrome.
-//
-
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-//
-// Address styling not present in IE 8/9.
-//
-
-mark {
-  background: #ff0;
-  color: #000;
-}
-
-//
-// Address inconsistent and variable font size in all browsers.
-//
-
-small {
-  font-size: 80%;
-}
-
-//
-// Prevent `sub` and `sup` affecting `line-height` in all browsers.
-//
-
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-// Embedded content
-// ==========================================================================
-
-//
-// Remove border when inside `a` element in IE 8/9.
-//
-
-img {
-  border: 0;
-}
-
-//
-// Correct overflow displayed oddly in IE 9.
-//
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
-// Grouping content
-// ==========================================================================
-
-//
-// Address margin not present in IE 8/9 and Safari 5.
-//
-
-figure {
-  margin: 1em 40px;
-}
-
-//
-// Address differences between Firefox and other browsers.
-//
-
-hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-//
-// Contain overflow in all browsers.
-//
-
-pre {
-  overflow: auto;
-}
-
-//
-// Address odd `em`-unit font size rendering in all browsers.
-//
-
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-// Forms
-// ==========================================================================
-
-//
-// Known limitation: by default, Chrome and Safari on OS X allow very limited
-// styling of `select`, unless a `border` property is set.
-//
-
-//
-// 1. Correct color not being inherited.
-//    Known issue: affects color of disabled elements.
-// 2. Correct font properties not being inherited.
-// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
-//
-
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit; // 1
-  font: inherit; // 2
-  margin: 0; // 3
-}
-
-//
-// Address `overflow` set to `hidden` in IE 8/9/10.
-//
-
-button {
-  overflow: visible;
-}
-
-//
-// Address inconsistent `text-transform` inheritance for `button` and `select`.
-// All other form control elements do not inherit `text-transform` values.
-// Correct `button` style inheritance in Firefox, IE 8+, and Opera
-// Correct `select` style inheritance in Firefox.
-//
-
-button,
-select {
-  text-transform: none;
-}
-
-//
-// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
-//    and `video` controls.
-// 2. Correct inability to style clickable `input` types in iOS.
-// 3. Improve usability and consistency of cursor style between image-type
-//    `input` and others.
-//
-
-button,
-html input[type="button"], // 1
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button; // 2
-  cursor: pointer; // 3
-}
-
-//
-// Re-set default cursor for disabled elements.
-//
-
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-
-//
-// Remove inner padding and border in Firefox 4+.
-//
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-
-//
-// Address Firefox 4+ setting `line-height` on `input` using `!important` in
-// the UA stylesheet.
-//
-
-input {
-  line-height: normal;
-}
-
-//
-// It's recommended that you don't attempt to style these elements.
-// Firefox's implementation doesn't respect box-sizing, padding, or width.
-//
-// 1. Address box sizing set to `content-box` in IE 8/9/10.
-// 2. Remove excess padding in IE 8/9/10.
-//
-
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box; // 1
-  padding: 0; // 2
-}
-
-//
-// Fix the cursor style for Chrome's increment/decrement buttons. For certain
-// `font-size` values of the `input`, it causes the cursor style of the
-// decrement button to change from `default` to `text`.
-//
-
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-//
-// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
-// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
-//    (include `-moz` to future-proof).
-//
-
-input[type="search"] {
-  -webkit-appearance: textfield; // 1
-  -moz-box-sizing: content-box;
-  -webkit-box-sizing: content-box; // 2
-  box-sizing: content-box;
-}
-
-//
-// Remove inner padding and search cancel button in Safari and Chrome on OS X.
-// Safari (but not Chrome) clips the cancel button when the search input has
-// padding (and `textfield` appearance).
-//
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-//
-// Define consistent border, margin, and padding.
-//
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-//
-// 1. Correct `color` not being inherited in IE 8/9.
-// 2. Remove padding so people aren't caught out if they zero out fieldsets.
-//
-
-legend {
-  border: 0; // 1
-  padding: 0; // 2
-}
-
-//
-// Remove default vertical scrollbar in IE 8/9.
-//
-
-textarea {
-  overflow: auto;
-}
-
-//
-// Don't inherit the `font-weight` (applied by a rule above).
-// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
-//
-
-optgroup {
-  font-weight: bold;
-}
-
-// Tables
-// ==========================================================================
-
-//
-// Remove most spacing between table cells.
-//
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-}
\ No newline at end of file
diff --git a/dashboard/lib/less/bootstrap/pager.less b/dashboard/lib/less/bootstrap/pager.less
deleted file mode 100644
index 59103f4..0000000
--- a/dashboard/lib/less/bootstrap/pager.less
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Pager pagination
-// --------------------------------------------------
-
-
-.pager {
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  list-style: none;
-  text-align: center;
-  &:extend(.clearfix all);
-  li {
-    display: inline;
-    > a,
-    > span {
-      display: inline-block;
-      padding: 5px 14px;
-      background-color: @pager-bg;
-      border: 1px solid @pager-border;
-      border-radius: @pager-border-radius;
-    }
-
-    > a:hover,
-    > a:focus {
-      text-decoration: none;
-      background-color: @pager-hover-bg;
-    }
-  }
-
-  .next {
-    > a,
-    > span {
-      float: right;
-    }
-  }
-
-  .previous {
-    > a,
-    > span {
-      float: left;
-    }
-  }
-
-  .disabled {
-    > a,
-    > a:hover,
-    > a:focus,
-    > span {
-      color: @pager-disabled-color;
-      background-color: @pager-bg;
-      cursor: not-allowed;
-    }
-  }
-
-}
diff --git a/dashboard/lib/less/bootstrap/pagination.less b/dashboard/lib/less/bootstrap/pagination.less
deleted file mode 100644
index b2856ae..0000000
--- a/dashboard/lib/less/bootstrap/pagination.less
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Pagination (multiple pages)
-// --------------------------------------------------
-.pagination {
-  display: inline-block;
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline; // Remove list-style and block-level defaults
-    > a,
-    > span {
-      position: relative;
-      float: left; // Collapse white-space
-      padding: @padding-base-vertical @padding-base-horizontal;
-      line-height: @line-height-base;
-      text-decoration: none;
-      color: @pagination-color;
-      background-color: @pagination-bg;
-      border: 1px solid @pagination-border;
-      margin-left: -1px;
-    }
-    &:first-child {
-      > a,
-      > span {
-        margin-left: 0;
-        .border-left-radius(@border-radius-base);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius-base);
-      }
-    }
-  }
-
-  > li > a,
-  > li > span {
-    &:hover,
-    &:focus {
-      color: @pagination-hover-color;
-      background-color: @pagination-hover-bg;
-      border-color: @pagination-hover-border;
-    }
-  }
-
-  > .active > a,
-  > .active > span {
-    &,
-    &:hover,
-    &:focus {
-      z-index: 2;
-      color: @pagination-active-color;
-      background-color: @pagination-active-bg;
-      border-color: @pagination-active-border;
-      cursor: default;
-    }
-  }
-
-  > .disabled {
-    > span,
-    > span:hover,
-    > span:focus,
-    > a,
-    > a:hover,
-    > a:focus {
-      color: @pagination-disabled-color;
-      background-color: @pagination-disabled-bg;
-      border-color: @pagination-disabled-border;
-      cursor: not-allowed;
-    }
-  }
-}
-
-// Sizing
-// --------------------------------------------------
-
-// Large
-.pagination-lg {
-  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);
-}
-
-// Small
-.pagination-sm {
-  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);
-}
diff --git a/dashboard/lib/less/bootstrap/panels.less b/dashboard/lib/less/bootstrap/panels.less
deleted file mode 100644
index 20dd149..0000000
--- a/dashboard/lib/less/bootstrap/panels.less
+++ /dev/null
@@ -1,241 +0,0 @@
-//
-// Panels
-// --------------------------------------------------
-
-
-// Base class
-.panel {
-  margin-bottom: @line-height-computed;
-  background-color: @panel-bg;
-  border: 1px solid transparent;
-  border-radius: @panel-border-radius;
-  .box-shadow(0 1px 1px rgba(0,0,0,.05));
-}
-
-// Panel contents
-.panel-body {
-  padding: @panel-body-padding;
-  &:extend(.clearfix all);
-}
-
-// Optional heading
-.panel-heading {
-  padding: 10px 15px;
-  border-bottom: 1px solid transparent;
-  .border-top-radius((@panel-border-radius - 1));
-
-  > .dropdown .dropdown-toggle {
-    color: inherit;
-  }
-}
-
-// Within heading, strip any `h*` tag of its default margins for spacing.
-.panel-title {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: ceil((@font-size-base * 1.125));
-  color: inherit;
-
-  > a {
-    color: inherit;
-  }
-}
-
-// Optional footer (stays gray in every modifier class)
-.panel-footer {
-  padding: 10px 15px;
-  background-color: @panel-footer-bg;
-  border-top: 1px solid @panel-inner-border;
-  .border-bottom-radius((@panel-border-radius - 1));
-}
-
-
-// List groups in panels
-//
-// By default, space out list group content from panel headings to account for
-// any kind of custom content between the two.
-
-.panel {
-  > .list-group {
-    margin-bottom: 0;
-
-    .list-group-item {
-      border-width: 1px 0;
-      border-radius: 0;
-    }
-
-    // Add border top radius for first one
-    &:first-child {
-      .list-group-item:first-child {
-        border-top: 0;
-        .border-top-radius((@panel-border-radius - 1));
-      }
-    }
-    // Add border bottom radius for last one
-    &:last-child {
-      .list-group-item:last-child {
-        border-bottom: 0;
-        .border-bottom-radius((@panel-border-radius - 1));
-      }
-    }
-  }
-}
-// Collapse space between when there's no additional content.
-.panel-heading + .list-group {
-  .list-group-item:first-child {
-    border-top-width: 0;
-  }
-}
-
-
-// Tables in panels
-//
-// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
-// watch it go full width.
-
-.panel {
-  > .table,
-  > .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  // Add border top radius for first one
-  > .table:first-child,
-  > .table-responsive:first-child > .table:first-child {
-    .border-top-radius((@panel-border-radius - 1));
-
-    > thead:first-child,
-    > tbody:first-child {
-      > tr:first-child {
-        td:first-child,
-        th:first-child {
-          border-top-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-top-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  // Add border bottom radius for last one
-  > .table:last-child,
-  > .table-responsive:last-child > .table:last-child {
-    .border-bottom-radius((@panel-border-radius - 1));
-
-    > tbody:last-child,
-    > tfoot:last-child {
-      > tr:last-child {
-        td:first-child,
-        th:first-child {
-          border-bottom-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-bottom-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  > .panel-body + .table,
-  > .panel-body + .table-responsive {
-    border-top: 1px solid @table-border-color;
-  }
-  > .table > tbody:first-child > tr:first-child th,
-  > .table > tbody:first-child > tr:first-child td {
-    border-top: 0;
-  }
-  > .table-bordered,
-  > .table-responsive > .table-bordered {
-    border: 0;
-    > thead,
-    > tbody,
-    > tfoot {
-      > tr {
-        > th:first-child,
-        > td:first-child {
-          border-left: 0;
-        }
-        > th:last-child,
-        > td:last-child {
-          border-right: 0;
-        }
-      }
-    }
-    > thead,
-    > tbody {
-      > tr:first-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-    > tbody,
-    > tfoot {
-      > tr:last-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-  }
-  > .table-responsive {
-    border: 0;
-    margin-bottom: 0;
-  }
-}
-
-
-// Collapsable panels (aka, accordion)
-//
-// Wrap a series of panels in `.panel-group` to turn them into an accordion with
-// the help of our collapse JavaScript plugin.
-
-.panel-group {
-  margin-bottom: @line-height-computed;
-
-  // Tighten up margin so it's only between panels
-  .panel {
-    margin-bottom: 0;
-    border-radius: @panel-border-radius;
-    overflow: hidden; // crop contents when collapsed
-    + .panel {
-      margin-top: 5px;
-    }
-  }
-
-  .panel-heading {
-    border-bottom: 0;
-    + .panel-collapse .panel-body {
-      border-top: 1px solid @panel-inner-border;
-    }
-  }
-  .panel-footer {
-    border-top: 0;
-    + .panel-collapse .panel-body {
-      border-bottom: 1px solid @panel-inner-border;
-    }
-  }
-}
-
-
-// Contextual variations
-.panel-default {
-  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
-}
-.panel-primary {
-  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
-}
-.panel-success {
-  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
-}
-.panel-info {
-  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
-}
-.panel-warning {
-  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
-}
-.panel-danger {
-  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
-}
diff --git a/dashboard/lib/less/bootstrap/popovers.less b/dashboard/lib/less/bootstrap/popovers.less
deleted file mode 100644
index 696d74c..0000000
--- a/dashboard/lib/less/bootstrap/popovers.less
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// Popovers
-// --------------------------------------------------
-
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: @zindex-popover;
-  display: none;
-  max-width: @popover-max-width;
-  padding: 1px;
-  text-align: left; // Reset given new insertion method
-  background-color: @popover-bg;
-  background-clip: padding-box;
-  border: 1px solid @popover-fallback-border-color;
-  border: 1px solid @popover-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 5px 10px rgba(0,0,0,.2));
-
-  // Overrides for proper insertion
-  white-space: normal;
-
-  // Offset the popover to account for the popover arrow
-  &.top     { margin-top: -@popover-arrow-width; }
-  &.right   { margin-left: @popover-arrow-width; }
-  &.bottom  { margin-top: @popover-arrow-width; }
-  &.left    { margin-left: -@popover-arrow-width; }
-}
-
-.popover-title {
-  margin: 0; // reset heading margin
-  padding: 8px 14px;
-  font-size: @font-size-base;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: @popover-title-bg;
-  border-bottom: 1px solid darken(@popover-title-bg, 5%);
-  border-radius: 5px 5px 0 0;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-// Arrows
-//
-// .arrow is outer, .arrow:after is inner
-
-.popover > .arrow {
-  &,
-  &:after {
-    position: absolute;
-    display: block;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
-  }
-}
-.popover > .arrow {
-  border-width: @popover-arrow-outer-width;
-}
-.popover > .arrow:after {
-  border-width: @popover-arrow-width;
-  content: "";
-}
-
-.popover {
-  &.top > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-bottom-width: 0;
-    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-top-color: @popover-arrow-outer-color;
-    bottom: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      bottom: 1px;
-      margin-left: -@popover-arrow-width;
-      border-bottom-width: 0;
-      border-top-color: @popover-arrow-color;
-    }
-  }
-  &.right > .arrow {
-    top: 50%;
-    left: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-left-width: 0;
-    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-right-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      left: 1px;
-      bottom: -@popover-arrow-width;
-      border-left-width: 0;
-      border-right-color: @popover-arrow-color;
-    }
-  }
-  &.bottom > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-top-width: 0;
-    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-bottom-color: @popover-arrow-outer-color;
-    top: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      top: 1px;
-      margin-left: -@popover-arrow-width;
-      border-top-width: 0;
-      border-bottom-color: @popover-arrow-color;
-    }
-  }
-
-  &.left > .arrow {
-    top: 50%;
-    right: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-right-width: 0;
-    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-left-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      right: 1px;
-      border-right-width: 0;
-      border-left-color: @popover-arrow-color;
-      bottom: -@popover-arrow-width;
-    }
-  }
-
-}
diff --git a/dashboard/lib/less/bootstrap/print.less b/dashboard/lib/less/bootstrap/print.less
deleted file mode 100644
index 3655d03..0000000
--- a/dashboard/lib/less/bootstrap/print.less
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Basic print styles
-// --------------------------------------------------
-// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
-
-@media print {
-
-  * {
-    text-shadow: none !important;
-    color: #000 !important; // Black prints faster: h5bp.com/s
-    background: transparent !important;
-    box-shadow: none !important;
-  }
-
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-
-  // Don't show links for images, or javascript/internal links
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-
-  thead {
-    display: table-header-group; // h5bp.com/t
-  }
-
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-
-  img {
-    max-width: 100% !important;
-  }
-
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-
-  // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
-  // Once fixed, we can just straight up remove this.
-  select {
-    background: #fff !important;
-  }
-
-  // Bootstrap components
-  .navbar {
-    display: none;
-  }
-  .table {
-    td,
-    th {
-      background-color: #fff !important;
-    }
-  }
-  .btn,
-  .dropup > .btn {
-    > .caret {
-      border-top-color: #000 !important;
-    }
-  }
-  .label {
-    border: 1px solid #000;
-  }
-
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table-bordered {
-    th,
-    td {
-      border: 1px solid #ddd !important;
-    }
-  }
-
-}
diff --git a/dashboard/lib/less/bootstrap/progress-bars.less b/dashboard/lib/less/bootstrap/progress-bars.less
deleted file mode 100644
index 76c87be..0000000
--- a/dashboard/lib/less/bootstrap/progress-bars.less
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// Progress bars
-// --------------------------------------------------
-
-
-// Bar animations
-// -------------------------
-
-// WebKit
-@-webkit-keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-// Spec and IE10+
-@keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-
-
-// Bar itself
-// -------------------------
-
-// Outer container
-.progress {
-  overflow: hidden;
-  height: @line-height-computed;
-  margin-bottom: @line-height-computed;
-  background-color: @progress-bg;
-  border-radius: @border-radius-base;
-  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
-}
-
-// Bar of progress
-.progress-bar {
-  float: left;
-  width: 0%;
-  height: 100%;
-  font-size: @font-size-small;
-  line-height: @line-height-computed;
-  color: @progress-bar-color;
-  text-align: center;
-  background-color: @progress-bar-bg;
-  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
-  .transition(width .6s ease);
-}
-
-// Striped bars
-.progress-striped .progress-bar {
-  #gradient > .striped();
-  background-size: 40px 40px;
-}
-
-// Call animation for the active one
-.progress.active .progress-bar {
-  .animation(progress-bar-stripes 2s linear infinite);
-}
-
-
-
-// Variations
-// -------------------------
-
-.progress-bar-success {
-  .progress-bar-variant(@progress-bar-success-bg);
-}
-
-.progress-bar-info {
-  .progress-bar-variant(@progress-bar-info-bg);
-}
-
-.progress-bar-warning {
-  .progress-bar-variant(@progress-bar-warning-bg);
-}
-
-.progress-bar-danger {
-  .progress-bar-variant(@progress-bar-danger-bg);
-}
diff --git a/dashboard/lib/less/bootstrap/responsive-utilities.less b/dashboard/lib/less/bootstrap/responsive-utilities.less
deleted file mode 100644
index 027a264..0000000
--- a/dashboard/lib/less/bootstrap/responsive-utilities.less
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-// Responsive: Utility classes
-// --------------------------------------------------
-
-
-// IE10 in Windows (Phone) 8
-//
-// Support for responsive views via media queries is kind of borked in IE10, for
-// Surface/desktop in split view and for Windows Phone 8. This particular fix
-// must be accompanied by a snippet of JavaScript to sniff the user agent and
-// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
-// our Getting Started page for more information on this bug.
-//
-// For more information, see the following:
-//
-// Issue: https://github.com/twbs/bootstrap/issues/10497
-// Docs: http://getbootstrap.com/getting-started/#browsers
-// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
-
-@-ms-viewport {
-  width: device-width;
-}
-
-
-// Visibility utilities
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  .responsive-invisibility();
-}
-
-.visible-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-visibility();
-  }
-}
-.visible-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-visibility();
-  }
-}
-.visible-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-visibility();
-  }
-}
-.visible-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-visibility();
-  }
-}
-
-.hidden-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-invisibility();
-  }
-}
-
-
-// Print utilities
-//
-// Media queries are placed on the inside to be mixin-friendly.
-
-.visible-print {
-  .responsive-invisibility();
-
-  @media print {
-    .responsive-visibility();
-  }
-}
-
-.hidden-print {
-  @media print {
-    .responsive-invisibility();
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/scaffolding.less b/dashboard/lib/less/bootstrap/scaffolding.less
deleted file mode 100644
index fe29f2d..0000000
--- a/dashboard/lib/less/bootstrap/scaffolding.less
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-// Scaffolding
-// --------------------------------------------------
-
-
-// Reset the box-sizing
-//
-// Heads up! This reset may cause conflicts with some third-party widgets.
-// For recommendations on resolving such conflicts, see
-// http://getbootstrap.com/getting-started/#third-box-sizing
-* {
-  .box-sizing(border-box);
-}
-*:before,
-*:after {
-  .box-sizing(border-box);
-}
-
-
-// Body reset
-
-html {
-  font-size: 62.5%;
-  -webkit-tap-highlight-color: rgba(0,0,0,0);
-}
-
-body {
-  font-family: @font-family-base;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @text-color;
-  background-color: @body-bg;
-}
-
-// Reset fonts for relevant elements
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-
-// Links
-
-a {
-  color: @link-color;
-  text-decoration: none;
-
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: underline;
-  }
-
-  &:focus {
-    .tab-focus();
-  }
-}
-
-
-// Figures
-//
-// We reset this here because previously Normalize had no `figure` margins. This
-// ensures we don't break anyone's use of the element.
-
-figure {
-  margin: 0;
-}
-
-
-// Images
-
-img {
-  vertical-align: middle;
-}
-
-// Responsive images (ensure images don't scale beyond their parents)
-.img-responsive {
-  .img-responsive();
-}
-
-// Rounded corners
-.img-rounded {
-  border-radius: @border-radius-large;
-}
-
-// Image thumbnails
-//
-// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
-.img-thumbnail {
-  padding: @thumbnail-padding;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(all .2s ease-in-out);
-
-  // Keep them at most 100% wide
-  .img-responsive(inline-block);
-}
-
-// Perfect circle
-.img-circle {
-  border-radius: 50%; // set radius in percents
-}
-
-
-// Horizontal rules
-
-hr {
-  margin-top:    @line-height-computed;
-  margin-bottom: @line-height-computed;
-  border: 0;
-  border-top: 1px solid @hr-border;
-}
-
-
-// Only display content to screen readers
-//
-// See: http://a11yproject.com/posts/how-to-hide-content/
-
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  margin: -1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0,0,0,0);
-  border: 0;
-}
diff --git a/dashboard/lib/less/bootstrap/tables.less b/dashboard/lib/less/bootstrap/tables.less
deleted file mode 100644
index c41989c..0000000
--- a/dashboard/lib/less/bootstrap/tables.less
+++ /dev/null
@@ -1,233 +0,0 @@
-//
-// Tables
-// --------------------------------------------------
-
-
-table {
-  max-width: 100%;
-  background-color: @table-bg;
-}
-th {
-  text-align: left;
-}
-
-
-// Baseline styles
-
-.table {
-  width: 100%;
-  margin-bottom: @line-height-computed;
-  // Cells
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-cell-padding;
-        line-height: @line-height-base;
-        vertical-align: top;
-        border-top: 1px solid @table-border-color;
-      }
-    }
-  }
-  // Bottom align for column headings
-  > thead > tr > th {
-    vertical-align: bottom;
-    border-bottom: 2px solid @table-border-color;
-  }
-  // Remove top border from thead by default
-  > caption + thead,
-  > colgroup + thead,
-  > thead:first-child {
-    > tr:first-child {
-      > th,
-      > td {
-        border-top: 0;
-      }
-    }
-  }
-  // Account for multiple tbody instances
-  > tbody + tbody {
-    border-top: 2px solid @table-border-color;
-  }
-
-  // Nesting
-  .table {
-    background-color: @body-bg;
-  }
-}
-
-
-// Condensed table w/ half padding
-
-.table-condensed {
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-condensed-cell-padding;
-      }
-    }
-  }
-}
-
-
-// Bordered version
-//
-// Add borders all around the table and between all the columns.
-
-.table-bordered {
-  border: 1px solid @table-border-color;
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        border: 1px solid @table-border-color;
-      }
-    }
-  }
-  > thead > tr {
-    > th,
-    > td {
-      border-bottom-width: 2px;
-    }
-  }
-}
-
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
-  > tbody > tr:nth-child(odd) {
-    > td,
-    > th {
-      background-color: @table-bg-accent;
-    }
-  }
-}
-
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
-  > tbody > tr:hover {
-    > td,
-    > th {
-      background-color: @table-bg-hover;
-    }
-  }
-}
-
-
-// Table cell sizing
-//
-// Reset default table behavior
-
-table col[class*="col-"] {
-  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
-  float: none;
-  display: table-column;
-}
-table {
-  td,
-  th {
-    &[class*="col-"] {
-      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
-      float: none;
-      display: table-cell;
-    }
-  }
-}
-
-
-// Table backgrounds
-//
-// Exact selectors below required to override `.table-striped` and prevent
-// inheritance to nested tables.
-
-// Generate the contextual variants
-.table-row-variant(active; @table-bg-active);
-.table-row-variant(success; @state-success-bg);
-.table-row-variant(info; @state-info-bg);
-.table-row-variant(warning; @state-warning-bg);
-.table-row-variant(danger; @state-danger-bg);
-
-
-// Responsive tables
-//
-// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
-// by enabling horizontal scrolling. Only applies <768px. Everything above that
-// will display normally.
-
-@media (max-width: @screen-xs-max) {
-  .table-responsive {
-    width: 100%;
-    margin-bottom: (@line-height-computed * 0.75);
-    overflow-y: hidden;
-    overflow-x: scroll;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid @table-border-color;
-    -webkit-overflow-scrolling: touch;
-
-    // Tighten up spacing
-    > .table {
-      margin-bottom: 0;
-
-      // Ensure the content doesn't wrap
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th,
-          > td {
-            white-space: nowrap;
-          }
-        }
-      }
-    }
-
-    // Special overrides for the bordered tables
-    > .table-bordered {
-      border: 0;
-
-      // Nuke the appropriate borders so that the parent can handle them
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th:first-child,
-          > td:first-child {
-            border-left: 0;
-          }
-          > th:last-child,
-          > td:last-child {
-            border-right: 0;
-          }
-        }
-      }
-
-      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
-      // chances are there will be only one `tr` in a `thead` and that would
-      // remove the border altogether.
-      > tbody,
-      > tfoot {
-        > tr:last-child {
-          > th,
-          > td {
-            border-bottom: 0;
-          }
-        }
-      }
-
-    }
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/theme.less b/dashboard/lib/less/bootstrap/theme.less
deleted file mode 100644
index 6f957fb..0000000
--- a/dashboard/lib/less/bootstrap/theme.less
+++ /dev/null
@@ -1,247 +0,0 @@
-
-//
-// Load core variables and mixins
-// --------------------------------------------------
-
-@import "variables.less";
-@import "mixins.less";
-
-
-
-//
-// Buttons
-// --------------------------------------------------
-
-// Common styles
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
-  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  // Reset the shadow
-  &:active,
-  &.active {
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-}
-
-// Mixin for generating new styles
-.btn-styles(@btn-color: #555) {
-  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));
-  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners
-  background-repeat: repeat-x;
-  border-color: darken(@btn-color, 14%);
-
-  &:hover,
-  &:focus  {
-    background-color: darken(@btn-color, 12%);
-    background-position: 0 -15px;
-  }
-
-  &:active,
-  &.active {
-    background-color: darken(@btn-color, 12%);
-    border-color: darken(@btn-color, 14%);
-  }
-}
-
-// Common styles
-.btn {
-  // Remove the gradient for the pressed/active state
-  &:active,
-  &.active {
-    background-image: none;
-  }
-}
-
-// Apply the mixin to the buttons
-.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
-.btn-primary { .btn-styles(@btn-primary-bg); }
-.btn-success { .btn-styles(@btn-success-bg); }
-.btn-info    { .btn-styles(@btn-info-bg); }
-.btn-warning { .btn-styles(@btn-warning-bg); }
-.btn-danger  { .btn-styles(@btn-danger-bg); }
-
-
-
-//
-// Images
-// --------------------------------------------------
-
-.thumbnail,
-.img-thumbnail {
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-
-
-
-//
-// Dropdowns
-// --------------------------------------------------
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
-  background-color: darken(@dropdown-link-hover-bg, 5%);
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
-  background-color: darken(@dropdown-link-active-bg, 5%);
-}
-
-
-
-//
-// Navbar
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-  border-radius: @navbar-border-radius;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
-  }
-}
-.navbar-brand,
-.navbar-nav > li > a {
-  text-shadow: 0 1px 0 rgba(255,255,255,.25);
-}
-
-// Inverted navbar
-.navbar-inverse {
-  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
-  }
-
-  .navbar-brand,
-  .navbar-nav > li > a {
-    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
-  }
-}
-
-// Undo rounded corners in static and fixed navbars
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  border-radius: 0;
-}
-
-
-
-//
-// Alerts
-// --------------------------------------------------
-
-// Common styles
-.alert {
-  text-shadow: 0 1px 0 rgba(255,255,255,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
-  .box-shadow(@shadow);
-}
-
-// Mixin for generating new styles
-.alert-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
-  border-color: darken(@color, 15%);
-}
-
-// Apply the mixin to the alerts
-.alert-success    { .alert-styles(@alert-success-bg); }
-.alert-info       { .alert-styles(@alert-info-bg); }
-.alert-warning    { .alert-styles(@alert-warning-bg); }
-.alert-danger     { .alert-styles(@alert-danger-bg); }
-
-
-
-//
-// Progress bars
-// --------------------------------------------------
-
-// Give the progress background some depth
-.progress {
-  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)
-}
-
-// Mixin for generating new styles
-.progress-bar-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
-}
-
-// Apply the mixin to the progress bars
-.progress-bar            { .progress-bar-styles(@progress-bar-bg); }
-.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }
-.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }
-.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }
-.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }
-
-
-
-//
-// List groups
-// --------------------------------------------------
-
-.list-group {
-  border-radius: @border-radius-base;
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
-  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
-  border-color: darken(@list-group-active-border, 7.5%);
-}
-
-
-
-//
-// Panels
-// --------------------------------------------------
-
-// Common styles
-.panel {
-  .box-shadow(0 1px 2px rgba(0,0,0,.05));
-}
-
-// Mixin for generating new styles
-.panel-heading-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
-}
-
-// Apply the mixin to the panel headings only
-.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }
-.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }
-.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }
-.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }
-.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }
-.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }
-
-
-
-//
-// Wells
-// --------------------------------------------------
-
-.well {
-  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);
-  border-color: darken(@well-bg, 10%);
-  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-}
diff --git a/dashboard/lib/less/bootstrap/thumbnails.less b/dashboard/lib/less/bootstrap/thumbnails.less
deleted file mode 100644
index c428920..0000000
--- a/dashboard/lib/less/bootstrap/thumbnails.less
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Thumbnails
-// --------------------------------------------------
-
-
-// Mixin and adjust the regular image class
-.thumbnail {
-  display: block;
-  padding: @thumbnail-padding;
-  margin-bottom: @line-height-computed;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(all .2s ease-in-out);
-
-  > img,
-  a > img {
-    &:extend(.img-responsive);
-    margin-left: auto;
-    margin-right: auto;
-  }
-
-  // Add a hover state for linked versions only
-  a&:hover,
-  a&:focus,
-  a&.active {
-    border-color: @link-color;
-  }
-
-  // Image captions
-  .caption {
-    padding: @thumbnail-caption-padding;
-    color: @thumbnail-caption-color;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/tooltip.less b/dashboard/lib/less/bootstrap/tooltip.less
deleted file mode 100644
index bd62699..0000000
--- a/dashboard/lib/less/bootstrap/tooltip.less
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Tooltips
-// --------------------------------------------------
-
-
-// Base class
-.tooltip {
-  position: absolute;
-  z-index: @zindex-tooltip;
-  display: block;
-  visibility: visible;
-  font-size: @font-size-small;
-  line-height: 1.4;
-  .opacity(0);
-
-  &.in     { .opacity(@tooltip-opacity); }
-  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }
-  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }
-  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }
-  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
-  max-width: @tooltip-max-width;
-  padding: 3px 8px;
-  color: @tooltip-color;
-  text-align: center;
-  text-decoration: none;
-  background-color: @tooltip-bg;
-  border-radius: @border-radius-base;
-}
-
-// Arrows
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip {
-  &.top .tooltip-arrow {
-    bottom: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-left .tooltip-arrow {
-    bottom: 0;
-    left: @tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-right .tooltip-arrow {
-    bottom: 0;
-    right: @tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.right .tooltip-arrow {
-    top: 50%;
-    left: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-right-color: @tooltip-arrow-color;
-  }
-  &.left .tooltip-arrow {
-    top: 50%;
-    right: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-left-color: @tooltip-arrow-color;
-  }
-  &.bottom .tooltip-arrow {
-    top: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-left .tooltip-arrow {
-    top: 0;
-    left: @tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-right .tooltip-arrow {
-    top: 0;
-    right: @tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-}
diff --git a/dashboard/lib/less/bootstrap/type.less b/dashboard/lib/less/bootstrap/type.less
deleted file mode 100644
index 5e2a219..0000000
--- a/dashboard/lib/less/bootstrap/type.less
+++ /dev/null
@@ -1,293 +0,0 @@
-//
-// Typography
-// --------------------------------------------------
-
-
-// Headings
-// -------------------------
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  font-family: @headings-font-family;
-  font-weight: @headings-font-weight;
-  line-height: @headings-line-height;
-  color: @headings-color;
-
-  small,
-  .small {
-    font-weight: normal;
-    line-height: 1;
-    color: @headings-small-color;
-  }
-}
-
-h1, .h1,
-h2, .h2,
-h3, .h3 {
-  margin-top: @line-height-computed;
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 65%;
-  }
-}
-h4, .h4,
-h5, .h5,
-h6, .h6 {
-  margin-top: (@line-height-computed / 2);
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 75%;
-  }
-}
-
-h1, .h1 { font-size: @font-size-h1; }
-h2, .h2 { font-size: @font-size-h2; }
-h3, .h3 { font-size: @font-size-h3; }
-h4, .h4 { font-size: @font-size-h4; }
-h5, .h5 { font-size: @font-size-h5; }
-h6, .h6 { font-size: @font-size-h6; }
-
-
-// Body text
-// -------------------------
-
-p {
-  margin: 0 0 (@line-height-computed / 2);
-}
-
-.lead {
-  margin-bottom: @line-height-computed;
-  font-size: floor((@font-size-base * 1.15));
-  font-weight: 200;
-  line-height: 1.4;
-
-  @media (min-width: @screen-sm-min) {
-    font-size: (@font-size-base * 1.5);
-  }
-}
-
-
-// Emphasis & misc
-// -------------------------
-
-// Ex: 14px base font * 85% = about 12px
-small,
-.small  { font-size: 85%; }
-
-// Undo browser default styling
-cite    { font-style: normal; }
-
-// Alignment
-.text-left           { text-align: left; }
-.text-right          { text-align: right; }
-.text-center         { text-align: center; }
-.text-justify        { text-align: justify; }
-
-// Contextual colors
-.text-muted {
-  color: @text-muted;
-}
-.text-primary {
-  .text-emphasis-variant(@brand-primary);
-}
-.text-success {
-  .text-emphasis-variant(@state-success-text);
-}
-.text-info {
-  .text-emphasis-variant(@state-info-text);
-}
-.text-warning {
-  .text-emphasis-variant(@state-warning-text);
-}
-.text-danger {
-  .text-emphasis-variant(@state-danger-text);
-}
-
-// Contextual backgrounds
-// For now we'll leave these alongside the text classes until v4 when we can
-// safely shift things around (per SemVer rules).
-.bg-primary {
-  // Given the contrast here, this is the only class to have its color inverted
-  // automatically.
-  color: #fff;
-  .bg-variant(@brand-primary);
-}
-.bg-success {
-  .bg-variant(@state-success-bg);
-}
-.bg-info {
-  .bg-variant(@state-info-bg);
-}
-.bg-warning {
-  .bg-variant(@state-warning-bg);
-}
-.bg-danger {
-  .bg-variant(@state-danger-bg);
-}
-
-
-// Page header
-// -------------------------
-
-.page-header {
-  padding-bottom: ((@line-height-computed / 2) - 1);
-  margin: (@line-height-computed * 2) 0 @line-height-computed;
-  border-bottom: 1px solid @page-header-border-color;
-}
-
-
-// Lists
-// --------------------------------------------------
-
-// Unordered and Ordered lists
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: (@line-height-computed / 2);
-  ul,
-  ol {
-    margin-bottom: 0;
-  }
-}
-
-// List options
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-
-// Inline turns list items into inline-block
-.list-inline {
-  .list-unstyled();
-  margin-left: -5px;
-
-  > li {
-    display: inline-block;
-    padding-left: 5px;
-    padding-right: 5px;
-  }
-}
-
-// Description Lists
-dl {
-  margin-top: 0; // Remove browser default
-  margin-bottom: @line-height-computed;
-}
-dt,
-dd {
-  line-height: @line-height-base;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0; // Undo browser default
-}
-
-// Horizontal description lists
-//
-// Defaults to being stacked without any of the below styles applied, until the
-// grid breakpoint is reached (default of ~768px).
-
-@media (min-width: @grid-float-breakpoint) {
-  .dl-horizontal {
-    dt {
-      float: left;
-      width: (@component-offset-horizontal - 20);
-      clear: left;
-      text-align: right;
-      .text-overflow();
-    }
-    dd {
-      margin-left: @component-offset-horizontal;
-      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
-    }
-  }
-}
-
-// MISC
-// ----
-
-// Abbreviations and acronyms
-abbr[title],
-// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted @abbr-border-color;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-// Blockquotes
-blockquote {
-  padding: (@line-height-computed / 2) @line-height-computed;
-  margin: 0 0 @line-height-computed;
-  font-size: @blockquote-font-size;
-  border-left: 5px solid @blockquote-border-color;
-
-  p,
-  ul,
-  ol {
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  // Note: Deprecated small and .small as of v3.1.0
-  // Context: https://github.com/twbs/bootstrap/issues/11660
-  footer,
-  small,
-  .small {
-    display: block;
-    font-size: 80%; // back to default font-size
-    line-height: @line-height-base;
-    color: @blockquote-small-color;
-
-    &:before {
-      content: '\2014 \00A0'; // em dash, nbsp
-    }
-  }
-}
-
-// Opposite alignment of blockquote
-//
-// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid @blockquote-border-color;
-  border-left: 0;
-  text-align: right;
-
-  // Account for citation
-  footer,
-  small,
-  .small {
-    &:before { content: ''; }
-    &:after {
-      content: '\00A0 \2014'; // nbsp, em dash
-    }
-  }
-}
-
-// Quotes
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-// Addresses
-address {
-  margin-bottom: @line-height-computed;
-  font-style: normal;
-  line-height: @line-height-base;
-}
diff --git a/dashboard/lib/less/bootstrap/utilities.less b/dashboard/lib/less/bootstrap/utilities.less
deleted file mode 100644
index a260312..0000000
--- a/dashboard/lib/less/bootstrap/utilities.less
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Utility classes
-// --------------------------------------------------
-
-
-// Floats
-// -------------------------
-
-.clearfix {
-  .clearfix();
-}
-.center-block {
-  .center-block();
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-
-
-// Toggling content
-// -------------------------
-
-// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  .text-hide();
-}
-
-
-// Hide from screenreaders and browsers
-//
-// Credit: HTML5 Boilerplate
-
-.hidden {
-  display: none !important;
-  visibility: hidden !important;
-}
-
-
-// For Affix plugin
-// -------------------------
-
-.affix {
-  position: fixed;
-}
diff --git a/dashboard/lib/less/bootstrap/variables.less b/dashboard/lib/less/bootstrap/variables.less
deleted file mode 100644
index 75268a1..0000000
--- a/dashboard/lib/less/bootstrap/variables.less
+++ /dev/null
@@ -1,830 +0,0 @@
-//
-// Variables
-// --------------------------------------------------
-
-
-//== Colors
-//
-//## Gray and brand colors for use across Bootstrap.
-
-@gray-darker:            lighten(#000, 13.5%); // #222
-@gray-dark:              lighten(#000, 20%);   // #333
-@gray:                   lighten(#000, 33.5%); // #555
-@gray-light:             lighten(#000, 60%);   // #999
-@gray-lighter:           lighten(#000, 93.5%); // #eee
-
-@brand-primary:         #428bca;
-@brand-success:         #5cb85c;
-@brand-info:            #5bc0de;
-@brand-warning:         #f0ad4e;
-@brand-danger:          #d9534f;
-
-
-//== Scaffolding
-//
-// ## Settings for some of the most global styles.
-
-//** Background color for `<body>`.
-@body-bg:               #fff;
-//** Global text color on `<body>`.
-@text-color:            @gray-dark;
-
-//** Global textual link color.
-@link-color:            @brand-primary;
-//** Link hover color set via `darken()` function.
-@link-hover-color:      darken(@link-color, 15%);
-
-
-//== Typography
-//
-//## Font, line-height, and color for body text, headings, and more.
-
-@font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif;
-@font-family-serif:       Georgia, "Times New Roman", Times, serif;
-//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
-@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
-@font-family-base:        @font-family-sans-serif;
-
-@font-size-base:          14px;
-@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
-@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
-
-@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
-@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
-@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
-@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
-@font-size-h5:            @font-size-base;
-@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-@line-height-base:        1.428571429; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
-
-//** By default, this inherits from the `<body>`.
-@headings-font-family:    inherit;
-@headings-font-weight:    500;
-@headings-line-height:    1.1;
-@headings-color:          inherit;
-
-
-//-- Iconography
-//
-//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-@icon-font-path:          "../fonts/";
-@icon-font-name:          "glyphicons-halflings-regular";
-@icon-font-svg-id:        "glyphicons_halflingsregular";
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-@padding-base-vertical:     6px;
-@padding-base-horizontal:   12px;
-
-@padding-large-vertical:    10px;
-@padding-large-horizontal:  16px;
-
-@padding-small-vertical:    5px;
-@padding-small-horizontal:  10px;
-
-@padding-xs-vertical:       1px;
-@padding-xs-horizontal:     5px;
-
-@line-height-large:         1.33;
-@line-height-small:         1.5;
-
-@border-radius-base:        4px;
-@border-radius-large:       6px;
-@border-radius-small:       3px;
-
-//** Global color for active items (e.g., navs or dropdowns).
-@component-active-color:    #fff;
-//** Global background color for active items (e.g., navs or dropdowns).
-@component-active-bg:       @brand-primary;
-
-//** Width of the `border` for generating carets that indicator dropdowns.
-@caret-width-base:          4px;
-//** Carets increase slightly in size for larger components.
-@caret-width-large:         5px;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for `<th>`s and `<td>`s.
-@table-cell-padding:            8px;
-//** Padding for cells in `.table-condensed`.
-@table-condensed-cell-padding:  5px;
-
-//** Default background color used for all tables.
-@table-bg:                      transparent;
-//** Background color used for `.table-striped`.
-@table-bg-accent:               #f9f9f9;
-//** Background color used for `.table-hover`.
-@table-bg-hover:                #f5f5f5;
-@table-bg-active:               @table-bg-hover;
-
-//** Border color for table and cell borders.
-@table-border-color:            #ddd;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-@btn-font-weight:                normal;
-
-@btn-default-color:              #333;
-@btn-default-bg:                 #fff;
-@btn-default-border:             #ccc;
-
-@btn-primary-color:              #fff;
-@btn-primary-bg:                 @brand-primary;
-@btn-primary-border:             darken(@btn-primary-bg, 5%);
-
-@btn-success-color:              #fff;
-@btn-success-bg:                 @brand-success;
-@btn-success-border:             darken(@btn-success-bg, 5%);
-
-@btn-info-color:                 #fff;
-@btn-info-bg:                    @brand-info;
-@btn-info-border:                darken(@btn-info-bg, 5%);
-
-@btn-warning-color:              #fff;
-@btn-warning-bg:                 @brand-warning;
-@btn-warning-border:             darken(@btn-warning-bg, 5%);
-
-@btn-danger-color:               #fff;
-@btn-danger-bg:                  @brand-danger;
-@btn-danger-border:              darken(@btn-danger-bg, 5%);
-
-@btn-link-disabled-color:        @gray-light;
-
-
-//== Forms
-//
-//##
-
-//** `<input>` background color
-@input-bg:                       #fff;
-//** `<input disabled>` background color
-@input-bg-disabled:              @gray-lighter;
-
-//** Text color for `<input>`s
-@input-color:                    @gray;
-//** `<input>` border color
-@input-border:                   #ccc;
-//** `<input>` border radius
-@input-border-radius:            @border-radius-base;
-//** Border color for inputs on focus
-@input-border-focus:             #66afe9;
-
-//** Placeholder text color
-@input-color-placeholder:        @gray-light;
-
-//** Default `.form-control` height
-@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
-//** Large `.form-control` height
-@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
-//** Small `.form-control` height
-@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
-
-@legend-color:                   @gray-dark;
-@legend-border-color:            #e5e5e5;
-
-//** Background color for textual input addons
-@input-group-addon-bg:           @gray-lighter;
-//** Border color for textual input addons
-@input-group-addon-border-color: @input-border;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-@dropdown-bg:                    #fff;
-//** Dropdown menu `border-color`.
-@dropdown-border:                rgba(0,0,0,.15);
-//** Dropdown menu `border-color` **for IE8**.
-@dropdown-fallback-border:       #ccc;
-//** Divider color for between dropdown items.
-@dropdown-divider-bg:            #e5e5e5;
-
-//** Dropdown link text color.
-@dropdown-link-color:            @gray-dark;
-//** Hover color for dropdown links.
-@dropdown-link-hover-color:      darken(@gray-dark, 5%);
-//** Hover background for dropdown links.
-@dropdown-link-hover-bg:         #f5f5f5;
-
-//** Active dropdown menu item text color.
-@dropdown-link-active-color:     @component-active-color;
-//** Active dropdown menu item background color.
-@dropdown-link-active-bg:        @component-active-bg;
-
-//** Disabled dropdown menu item background color.
-@dropdown-link-disabled-color:   @gray-light;
-
-//** Text color for headers within dropdown menus.
-@dropdown-header-color:          @gray-light;
-
-// Note: Deprecated @dropdown-caret-color as of v3.1.0
-@dropdown-caret-color:           #000;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-@zindex-navbar:            1000;
-@zindex-dropdown:          1000;
-@zindex-popover:           1010;
-@zindex-tooltip:           1030;
-@zindex-navbar-fixed:      1030;
-@zindex-modal-background:  1040;
-@zindex-modal:             1050;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1
-@screen-xs:                  480px;
-@screen-xs-min:              @screen-xs;
-@screen-phone:               @screen-xs-min;
-
-// Small screen / tablet
-// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1
-@screen-sm:                  768px;
-@screen-sm-min:              @screen-sm;
-@screen-tablet:              @screen-sm-min;
-
-// Medium screen / desktop
-// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1
-@screen-md:                  992px;
-@screen-md-min:              @screen-md;
-@screen-desktop:             @screen-md-min;
-
-// Large screen / wide desktop
-// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1
-@screen-lg:                  1200px;
-@screen-lg-min:              @screen-lg;
-@screen-lg-desktop:          @screen-lg-min;
-
-// So media queries don't overlap when required, provide a maximum
-@screen-xs-max:              (@screen-sm-min - 1);
-@screen-sm-max:              (@screen-md-min - 1);
-@screen-md-max:              (@screen-lg-min - 1);
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-@grid-columns:              12;
-//** Padding between columns. Gets divided in half for the left and right.
-@grid-gutter-width:         30px;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-@grid-float-breakpoint:     @screen-sm-min;
-//** Point at which the navbar begins collapsing.
-@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-@container-tablet:             ((720px + @grid-gutter-width));
-//** For `@screen-sm-min` and up.
-@container-sm:                 @container-tablet;
-
-// Medium screen / desktop
-@container-desktop:            ((940px + @grid-gutter-width));
-//** For `@screen-md-min` and up.
-@container-md:                 @container-desktop;
-
-// Large screen / wide desktop
-@container-large-desktop:      ((1140px + @grid-gutter-width));
-//** For `@screen-lg-min` and up.
-@container-lg:                 @container-large-desktop;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-// @navbar-height:                    50px;
-@navbar-height:                    66px;
-@navbar-margin-bottom:             @line-height-computed;
-@navbar-border-radius:             @border-radius-base;
-@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
-@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
-@navbar-collapse-max-height:       340px;
-
-@navbar-default-color:             #777;
-@navbar-default-bg:                #f8f8f8;
-@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
-
-// Navbar links
-@navbar-default-link-color:                #777;
-@navbar-default-link-hover-color:          #333;
-@navbar-default-link-hover-bg:             transparent;
-@navbar-default-link-active-color:         #555;
-@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
-@navbar-default-link-disabled-color:       #ccc;
-@navbar-default-link-disabled-bg:          transparent;
-
-// Navbar brand label
-@navbar-default-brand-color:               @navbar-default-link-color;
-@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
-@navbar-default-brand-hover-bg:            transparent;
-
-// Navbar toggle
-@navbar-default-toggle-hover-bg:           #ddd;
-@navbar-default-toggle-icon-bar-bg:        #888;
-@navbar-default-toggle-border-color:       #ddd;
-
-
-// Inverted navbar
-// Reset inverted navbar basics
-@navbar-inverse-color:                      @gray-light;
-@navbar-inverse-bg:                         #222;
-@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
-
-// Inverted navbar links
-@navbar-inverse-link-color:                 @gray-light;
-@navbar-inverse-link-hover-color:           #fff;
-@navbar-inverse-link-hover-bg:              transparent;
-@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
-@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
-@navbar-inverse-link-disabled-color:        #444;
-@navbar-inverse-link-disabled-bg:           transparent;
-
-// Inverted navbar brand label
-@navbar-inverse-brand-color:                @navbar-inverse-link-color;
-@navbar-inverse-brand-hover-color:          #fff;
-@navbar-inverse-brand-hover-bg:             transparent;
-
-// Inverted navbar toggle
-@navbar-inverse-toggle-hover-bg:            #333;
-@navbar-inverse-toggle-icon-bar-bg:         #fff;
-@navbar-inverse-toggle-border-color:        #333;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-@nav-link-padding:                          10px 15px;
-@nav-link-hover-bg:                         @gray-lighter;
-
-@nav-disabled-link-color:                   @gray-light;
-@nav-disabled-link-hover-color:             @gray-light;
-
-@nav-open-link-hover-color:                 #fff;
-
-//== Tabs
-@nav-tabs-border-color:                     #ddd;
-
-@nav-tabs-link-hover-border-color:          @gray-lighter;
-
-@nav-tabs-active-link-hover-bg:             @body-bg;
-@nav-tabs-active-link-hover-color:          @gray;
-@nav-tabs-active-link-hover-border-color:   #ddd;
-
-@nav-tabs-justified-link-border-color:            #ddd;
-@nav-tabs-justified-active-link-border-color:     @body-bg;
-
-//== Pills
-@nav-pills-border-radius:                   @border-radius-base;
-@nav-pills-active-link-hover-bg:            @component-active-bg;
-@nav-pills-active-link-hover-color:         @component-active-color;
-
-
-//== Pagination
-//
-//##
-
-@pagination-color:                     @link-color;
-@pagination-bg:                        #fff;
-@pagination-border:                    #ddd;
-
-@pagination-hover-color:               @link-hover-color;
-@pagination-hover-bg:                  @gray-lighter;
-@pagination-hover-border:              #ddd;
-
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 @brand-primary;
-@pagination-active-border:             @brand-primary;
-
-@pagination-disabled-color:            @gray-light;
-@pagination-disabled-bg:               #fff;
-@pagination-disabled-border:           #ddd;
-
-
-//== Pager
-//
-//##
-
-@pager-bg:                             @pagination-bg;
-@pager-border:                         @pagination-border;
-@pager-border-radius:                  15px;
-
-@pager-hover-bg:                       @pagination-hover-bg;
-
-@pager-active-bg:                      @pagination-active-bg;
-@pager-active-color:                   @pagination-active-color;
-
-@pager-disabled-color:                 @pagination-disabled-color;
-
-
-//== Jumbotron
-//
-//##
-
-@jumbotron-padding:              30px;
-@jumbotron-color:                inherit;
-@jumbotron-bg:                   @gray-lighter;
-@jumbotron-heading-color:        inherit;
-@jumbotron-font-size:            ceil((@font-size-base * 1.5));
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-@state-success-text:             #3c763d;
-@state-success-bg:               #dff0d8;
-@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
-
-@state-info-text:                #31708f;
-@state-info-bg:                  #d9edf7;
-@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
-
-@state-warning-text:             #8a6d3b;
-@state-warning-bg:               #fcf8e3;
-@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
-
-@state-danger-text:              #a94442;
-@state-danger-bg:                #f2dede;
-@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-@tooltip-max-width:           200px;
-//** Tooltip text color
-@tooltip-color:               #fff;
-//** Tooltip background color
-@tooltip-bg:                  #000;
-@tooltip-opacity:             .9;
-
-//** Tooltip arrow width
-@tooltip-arrow-width:         5px;
-//** Tooltip arrow color
-@tooltip-arrow-color:         @tooltip-bg;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-@popover-bg:                          #fff;
-//** Popover maximum width
-@popover-max-width:                   276px;
-//** Popover border color
-@popover-border-color:                rgba(0,0,0,.2);
-//** Popover fallback border color
-@popover-fallback-border-color:       #ccc;
-
-//** Popover title background color
-@popover-title-bg:                    darken(@popover-bg, 3%);
-
-//** Popover arrow width
-@popover-arrow-width:                 10px;
-//** Popover arrow color
-@popover-arrow-color:                 #fff;
-
-//** Popover outer arrow width
-@popover-arrow-outer-width:           (@popover-arrow-width + 1);
-//** Popover outer arrow color
-@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
-//** Popover outer arrow fallback color
-@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-@label-default-bg:            @gray-light;
-//** Primary label background color
-@label-primary-bg:            @brand-primary;
-//** Success label background color
-@label-success-bg:            @brand-success;
-//** Info label background color
-@label-info-bg:               @brand-info;
-//** Warning label background color
-@label-warning-bg:            @brand-warning;
-//** Danger label background color
-@label-danger-bg:             @brand-danger;
-
-//** Default label text color
-@label-color:                 #fff;
-//** Default text color of a linked label
-@label-link-hover-color:      #fff;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-@modal-inner-padding:         20px;
-
-//** Padding applied to the modal title
-@modal-title-padding:         15px;
-//** Modal title line-height
-@modal-title-line-height:     @line-height-base;
-
-//** Background color of modal content area
-@modal-content-bg:                             #fff;
-//** Modal content border color
-@modal-content-border-color:                   rgba(0,0,0,.2);
-//** Modal content border color **for IE8**
-@modal-content-fallback-border-color:          #999;
-
-//** Modal backdrop background color
-@modal-backdrop-bg:           #000;
-//** Modal backdrop opacity
-@modal-backdrop-opacity:      .5;
-//** Modal header border color
-@modal-header-border-color:   #e5e5e5;
-//** Modal footer border color
-@modal-footer-border-color:   @modal-header-border-color;
-
-@modal-lg:                    900px;
-@modal-md:                    600px;
-@modal-sm:                    300px;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-@alert-padding:               15px;
-@alert-border-radius:         @border-radius-base;
-@alert-link-font-weight:      bold;
-
-@alert-success-bg:            @state-success-bg;
-@alert-success-text:          @state-success-text;
-@alert-success-border:        @state-success-border;
-
-@alert-info-bg:               @state-info-bg;
-@alert-info-text:             @state-info-text;
-@alert-info-border:           @state-info-border;
-
-@alert-warning-bg:            @state-warning-bg;
-@alert-warning-text:          @state-warning-text;
-@alert-warning-border:        @state-warning-border;
-
-@alert-danger-bg:             @state-danger-bg;
-@alert-danger-text:           @state-danger-text;
-@alert-danger-border:         @state-danger-border;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-@progress-bg:                 #f5f5f5;
-//** Progress bar text color
-@progress-bar-color:          #fff;
-
-//** Default progress bar color
-@progress-bar-bg:             @brand-primary;
-//** Success progress bar color
-@progress-bar-success-bg:     @brand-success;
-//** Warning progress bar color
-@progress-bar-warning-bg:     @brand-warning;
-//** Danger progress bar color
-@progress-bar-danger-bg:      @brand-danger;
-//** Info progress bar color
-@progress-bar-info-bg:        @brand-info;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-@list-group-bg:                 #fff;
-//** `.list-group-item` border color
-@list-group-border:             #ddd;
-//** List group border radius
-@list-group-border-radius:      @border-radius-base;
-
-//** Background color of single list elements on hover
-@list-group-hover-bg:           #f5f5f5;
-//** Text color of active list elements
-@list-group-active-color:       @component-active-color;
-//** Background color of active list elements
-@list-group-active-bg:          @component-active-bg;
-//** Border color of active list elements
-@list-group-active-border:      @list-group-active-bg;
-@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
-
-@list-group-link-color:         #555;
-@list-group-link-heading-color: #333;
-
-
-//== Panels
-//
-//##
-
-@panel-bg:                    #fff;
-@panel-body-padding:          15px;
-@panel-border-radius:         @border-radius-base;
-
-//** Border color for elements within panels
-@panel-inner-border:          #ddd;
-@panel-footer-bg:             #f5f5f5;
-
-@panel-default-text:          @gray-dark;
-@panel-default-border:        #ddd;
-@panel-default-heading-bg:    #f5f5f5;
-
-@panel-primary-text:          #fff;
-@panel-primary-border:        @brand-primary;
-@panel-primary-heading-bg:    @brand-primary;
-
-@panel-success-text:          @state-success-text;
-@panel-success-border:        @state-success-border;
-@panel-success-heading-bg:    @state-success-bg;
-
-@panel-info-text:             @state-info-text;
-@panel-info-border:           @state-info-border;
-@panel-info-heading-bg:       @state-info-bg;
-
-@panel-warning-text:          @state-warning-text;
-@panel-warning-border:        @state-warning-border;
-@panel-warning-heading-bg:    @state-warning-bg;
-
-@panel-danger-text:           @state-danger-text;
-@panel-danger-border:         @state-danger-border;
-@panel-danger-heading-bg:     @state-danger-bg;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-@thumbnail-padding:           4px;
-//** Thumbnail background color
-@thumbnail-bg:                @body-bg;
-//** Thumbnail border color
-@thumbnail-border:            #ddd;
-//** Thumbnail border radius
-@thumbnail-border-radius:     @border-radius-base;
-
-//** Custom text color for thumbnail captions
-@thumbnail-caption-color:     @text-color;
-//** Padding around the thumbnail caption
-@thumbnail-caption-padding:   9px;
-
-
-//== Wells
-//
-//##
-
-@well-bg:                     #f5f5f5;
-@well-border:                 darken(@well-bg, 7%);
-
-
-//== Badges
-//
-//##
-
-@badge-color:                 #fff;
-//** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
-@badge-bg:                    @gray-light;
-
-//** Badge text color in active nav link
-@badge-active-color:          @link-color;
-//** Badge background color in active nav link
-@badge-active-bg:             #fff;
-
-@badge-font-weight:           bold;
-@badge-line-height:           1;
-@badge-border-radius:         10px;
-
-
-//== Breadcrumbs
-//
-//##
-
-@breadcrumb-padding-vertical:   8px;
-@breadcrumb-padding-horizontal: 15px;
-//** Breadcrumb background color
-@breadcrumb-bg:                 #f5f5f5;
-//** Breadcrumb text color
-@breadcrumb-color:              #ccc;
-//** Text color of current page in the breadcrumb
-@breadcrumb-active-color:       @gray-light;
-//** Textual separator for between breadcrumb elements
-@breadcrumb-separator:          "/";
-
-
-//== Carousel
-//
-//##
-
-@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
-
-@carousel-control-color:                      #fff;
-@carousel-control-width:                      15%;
-@carousel-control-opacity:                    .5;
-@carousel-control-font-size:                  20px;
-
-@carousel-indicator-active-bg:                #fff;
-@carousel-indicator-border-color:             #fff;
-
-@carousel-caption-color:                      #fff;
-
-
-//== Close
-//
-//##
-
-@close-font-weight:           bold;
-@close-color:                 #000;
-@close-text-shadow:           0 1px 0 #fff;
-
-
-//== Code
-//
-//##
-
-@code-color:                  #c7254e;
-@code-bg:                     #f9f2f4;
-
-@kbd-color:                   #fff;
-@kbd-bg:                      #333;
-
-@pre-bg:                      #f5f5f5;
-@pre-color:                   @gray-dark;
-@pre-border-color:            #ccc;
-@pre-scrollable-max-height:   340px;
-
-
-//== Type
-//
-//##
-
-//** Text muted color
-@text-muted:                  @gray-light;
-//** Abbreviations and acronyms border color
-@abbr-border-color:           @gray-light;
-//** Headings small color
-@headings-small-color:        @gray-light;
-//** Blockquote small color
-@blockquote-small-color:      @gray-light;
-//** Blockquote font size
-@blockquote-font-size:        (@font-size-base * 1.25);
-//** Blockquote border color
-@blockquote-border-color:     @gray-lighter;
-//** Page header border color
-@page-header-border-color:    @gray-lighter;
-
-
-//== Miscellaneous
-//
-//##
-
-//** Horizontal line color.
-@hr-border:                   @gray-lighter;
-
-//** Horizontal offset for forms and lists.
-@component-offset-horizontal: 180px;
diff --git a/dashboard/lib/less/bootstrap/wells.less b/dashboard/lib/less/bootstrap/wells.less
deleted file mode 100644
index 15d072b..0000000
--- a/dashboard/lib/less/bootstrap/wells.less
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Wells
-// --------------------------------------------------
-
-
-// Base class
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: @well-bg;
-  border: 1px solid @well-border;
-  border-radius: @border-radius-base;
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
-  blockquote {
-    border-color: #ddd;
-    border-color: rgba(0,0,0,.15);
-  }
-}
-
-// Sizes
-.well-lg {
-  padding: 24px;
-  border-radius: @border-radius-large;
-}
-.well-sm {
-  padding: 9px;
-  border-radius: @border-radius-small;
-}
diff --git a/dashboard/lib/less/logo.less b/dashboard/lib/less/logo.less
deleted file mode 100644
index e711a43..0000000
--- a/dashboard/lib/less/logo.less
+++ /dev/null
@@ -1,181 +0,0 @@
-.draperA {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #000000;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  left: 0px;
-}
-.draperB {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #ffffff;
-  width: 48px;
-  height: 48px;
-  top: 6px;
-  left: 6px;
-}
-.draperC {
-  position: absolute;
-  background-color: #000000;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  left: 0px;
-  width: 28px;
-}
-.draperD {
-  position: absolute;
-  background-color: #ffffff;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  height: 3px;
-  width: 63px;
-  top: 28.5px;
-  left: 0px;
-}
-.rot1,
-.rot2 {
-  opacity: 0;
-}
-.draper.rot1.active {
-  position: absolute;
-  background-color: #ffffff;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  left: 0px;
-  height: 4px;
-  width: 44px;
-  top: 28.5px;
-  left: 8px;
-  opacity: 1;
-  -webkit-animation: rota 2s infinite linear;
-}
-.draper.rot2.active {
-  position: absolute;
-  background-color: #ffffff;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  left: 0px;
-  height: 4px;
-  width: 30px;
-  top: 28.5px;
-  left: 15px;
-  opacity: 1;
-  -webkit-animation: rotb 1s infinite linear;
-}
-@-webkit-keyframes rota {
-  100% {
-    -webkit-transform: rotate(-360deg);
-  }
-}
-@-webkit-keyframes rotb {
-  100% {
-    -webkit-transform: rotate(360deg);
-  }
-}
-.draperE {
-  position: absolute;
-  background-color: #ffffff;
-  width: 60px;
-  height: 60px;
-  top: 0px;
-  left: 0px;
-  width: 3px;
-  left: 28.5px;
-}
-.hover-box {
-  width: 100%;
-  height: 100%;
-  background-color: #000000;
-}
-.draper.c6 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #ffffff;
-  width: 6px;
-  height: 6px;
-  top: 27px;
-  left: 27px;
-}
-.draper.c5 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #000000;
-  width: 14px;
-  height: 14px;
-  top: 23px;
-  left: 23px;
-}
-@-webkit-keyframes "draper6" {
-  
-}
-@-webkit-keyframes "draper5" {
-  50% {
-    opacity: 0;
-  }
-}
-.draper.c4 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #ffffff;
-  width: 20px;
-  height: 20px;
-  top: 20px;
-  left: 20px;
-}
-.draper.c3 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #000000;
-  width: 28px;
-  height: 28px;
-  top: 16px;
-  left: 16px;
-}
-@-webkit-keyframes "draper4" {
-  
-}
-@-webkit-keyframes "draper3" {
-  50% {
-    opacity: 0;
-  }
-}
-.draper.c2 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #ffffff;
-  width: 34px;
-  height: 34px;
-  top: 13px;
-  left: 13px;
-}
-.draper.c1 {
-  border-radius: 50%;
-  opacity: 1;
-  position: absolute;
-  background-color: #000000;
-  width: 42px;
-  height: 42px;
-  top: 9px;
-  left: 9px;
-}
-@-webkit-keyframes "draper2" {
-  
-}
-@-webkit-keyframes "draper1" {
-  50% {
-    opacity: 0;
-  }
-}
\ No newline at end of file
diff --git a/dashboard/lib/less/style.less b/dashboard/lib/less/style.less
deleted file mode 100644
index 3201258..0000000
--- a/dashboard/lib/less/style.less
+++ /dev/null
@@ -1,73 +0,0 @@
-wf-state-chart, wf-legend {
-    width: 100%;
-  // height: 400px;
-  /*background-color: blue;*/
-  overflow: hidden;
-  display: block;
-}
-
-.animate.ng-enter, .animate.ng-leave {
-  -webkit-transition: all 0.3s ease-in-out;
-  -moz-transition: all 0.3s ease-in-out;
-  -o-transition: all 0.3s ease-in-out;
-  transition: all 0.3s ease-in-out;
-}
-.animate.ng-enter, .animate.ng-leave.ng-leave-active {
-  line-height: 0;
-  opacity: 0;
-}
-.animate.ng-leave, .animate.ng-enter.ng-enter-active {
-  // line-height: 30px;
-  opacity: 1;
-}
-
-.brush .extent {
-  stroke: #222;
-  fill-opacity: .125;
-  shape-rendering: crispEdges;
-}
-
-.dr.wf.marker {
-    // float: left;
-    width: 10px;
-    padding: 0;
-    // display: inline-block;
-    // height: 37px;
-    // background-color: red;
-}
-
-.generate-widths(100);
-
-.generate-widths(@n, @i: 1) when (@i =< @n) {
-  .dr.width@{i} {
-    width: (@i * 1%);
-  }
-  .generate-widths(@n, (@i + 1));
-}
-
-.axis path,
-.axis line {
-  fill: none;
-  stroke: #000;
-  shape-rendering: crispEdges;
-}
-
-.wfState:hover {
-  cursor: pointer;
-}
-
-.table-order .glyphicon {
-  margin-left: 5px;
-  color: rgb(162, 162, 162);
-  font-size: 0.8em;
-}
-
-.table-order {
-  -webkit-touch-callout: none;
--webkit-user-select: none;
--khtml-user-select: none;
--moz-user-select: none;
--ms-user-select: none;
-user-select: none;
-cursor: pointer;
-}
\ No newline at end of file
diff --git a/dashboard/lib/less/wfColor.less b/dashboard/lib/less/wfColor.less
deleted file mode 100644
index 1595134..0000000
--- a/dashboard/lib/less/wfColor.less
+++ /dev/null
@@ -1,109 +0,0 @@
-@other_fg: #aaa;
-@other_bg: #EEEEEE;
-
-@define_fg: #984ea3;
-@define_bg: #F8D0FD;
-
-@getdata_fg: #d7191c;
-@getdata_bg: rgb(255, 192, 192);
-
-@explore_fg: #fdae61;
-@explore_bg: #AF6013;
-
-@create_fg: #f1b6da;
-@create_bg: #cc4037;
-
-@enrich_fg: #abdda4;
-@enrich_bg: #4F8348;
-
-@transform_fg: #2b83ba;
-@transform_bg: #0B3D5C;
-
-@unk_fg: #000;
-@unk_bg: #C9C9C9;
-
-@colors: 'other', 'define', 'getdata', 'explore', 'create', 'enrich', 'transform', 'unk';
-
-.-(@i: length(@colors)) when (@i > 0) {
-    @name: e(extract(@colors, @i));
-    @fg: "@{name}_fg";
-    @bg: "@{name}_bg";
-    .wf_@{name}.light {
-    	background: @@bg;
-    	color: @@fg;
-    }
-    .wf_@{name}.dark {
-    	background: @@fg;
-    	color: @@bg;
-    }
-    .wf_@{name}.fill-light {
-        fill: @@fg;
-    }
-    .wf_@{name}.fill-dark {
-        fill: @@bg;
-    }
-    .wf_@{name}.stroke-light {
-        stroke: @@fg;
-    }
-    .wf_@{name}.stroke-dark {
-        stroke: @@bg;
-    }
-    .-((@i - 1));
-} .-;
-
-.under-text {
-    stroke: white;
-    stroke-width: 2;
-}
-
-.fixed-info {
-    position: absolute;
-    margin-top: 30px;
-    top: 0;
-    width: 100%;
-    height: 100px;
-    background: rgba(255, 255, 255, 0.9);
-    border-bottom: 1px solid #ddd;
-    z-index: 2;
-}
-
-.fixed-info .axis{
-    position: absolute;
-    bottom: 0;
-}
-
-.canvas {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    overflow-y: auto;
-    z-index: 1;
-    margin-top: 105px;
-}
-
-.sw2 {
-    stroke-width: 2;
-}
-
-.wfTitle {
-    font: 30px sans-serif;
-  }
-
-  .canvas text {
-    font: 18px sans-serif;
-  }
-
-  .axis {
-    font: 14px sans-serif;
-  }
-
-  .axis path,
-  .axis line {
-    fill: none;
-    stroke: #000;
-    shape-rendering: crispEdges;
-  }
-
-  .bar {
-    shape-rendering: crispEdges;
-  }
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/ActivityLogger.js b/dashboard/lib/static/HospitalCosts/ActivityLogger.js
deleted file mode 100755
index b90ceb1..0000000
--- a/dashboard/lib/static/HospitalCosts/ActivityLogger.js
+++ /dev/null
@@ -1,627 +0,0 @@
-/*======================================================================
-*======================JAVASCRIPT ACTIVITY LOGGER=======================
-*=====================Draper Laboratory, June 2013======================
-*
-* This library is intended for use for javascrip software component and 
-* webapp developers implemnting the XDATA Activity Logging API. To send 
-* activity log messages using this libary, components must:
-*          1) Instantiate an ActivityLogger object
-*          2) Call registerActivityLogger(...) to pass in required networking 
-*             and version information.
-*          3) Call one of the logging functions:
-*               logSystemActivity(...)
-*               logUser(...)
-*               logUILayout(...)
-*
-* An example use of this library is included below:
-     
-     <script src="ActivityLogger.js"></script>
-     <script>
-        //Instantiate the Activity Logger
-        var ac = new activityLogger();
-
-
-        //Register the logger.
-        //In this case, we register the logger to look for the logging server
-        //on port 1337 of the machine "localhost". The component name is 
-        //left blank, so it will default to the address of this web app. 
-        //The software component version is 3.04  and the session ID is 
-        //"AC34523452345"
-          ac.registerActivityLogger("http://localhost:1337", "", "3.04", 
-        "AC34523452345");
-
-          //Re-register the logger.
-          //In this case, we register the logger to look for the logger on 
-          //port 1337 of the machine "localhost", telling it that this 
-          //software component is version 3.04 of the software named "Draper
-          //Test Component" and that the session ID is "AC34523452345"
-          ac.registerActivityLogger("http://localhost:1337", 
-               "Draper Test Component", "3.04", "AC34523452345");
-          
-          //Send a System Activity Message with optional metadata included.
-          //In this case, we send a System Activity message with the 
-          //action description 'Testing System Activity Message' and optional
-          //metadata with two key-value pairs of:
-          // 'Test Window Val'='Main
-          // 'Data Source'='healthcare'
-          ac.logSystemActivity('Testing System Activity Message',  
-               {'Test Window Val':'Main', 'Data Source':'healthCare'});
-          
-          //Send a System Activity Message
-          //In this case, we send a System Activity message with the 
-          //action description 'Testing System Activity Message'
-          ac.logSystemActivity('Testing System Activity Message');
-          
-          //Send a User Activity Message
-          //In this case, we send a User Activity message with the 
-          //action description 'Testing User Activity Message', a 
-          //developer-defined user action "watch", and the 
-          //workflow constant WF_EXAMINE, defined in the Activity
-          //Log API.
-          ac.logUserActivity('Testing User Activity Message', 'Watch', ac.WF_EXAMINE );
-          
-          //Send a User Activity Message with optional metadata included
-          //In this case, we send a User Activity message with the 
-          //action description 'Testing User Activity Message', a 
-          //developer-defined user action "watch", and a
-          //the workflow constant WF_EXAMINE, defined in the Activity
-          //Log API. This message also contains optional
-          //metadata with two key-value pairs of:
-          // 'Test Window Val'='Main
-          // 'Data Source'='healthcare'
-          ac.logUserActivity('Testing User Activity Message', 'watch', ac.WF_EXAMINE, 
-               {'Test Window Val':'Main', 'Data Source':'healthCare'});
-          
-          //Send a UI Layout Message
-          //In this case, we send a UI Layout message with action description of
-          //'Testing User Activity Message'. The name of the UI element is 
-          //'SearchWindow A', visibility=true, meaning SearchWindow A is currently
-          //visible. The left, right, top and bottom bounds of the UI element are 
-          // 234px, 256px, 33px, and 500px from the top right of the screen. 
-          ac.logUILayout('Testing User Activity Message', 'SearchWindow A', true, 
-               234, 256, 33, 500);
-          
-          //Send a UI Layout Message with optional metadata included
-          //In this case, we send a UI Layout message with action description of
-          //'Testing User Activity Message'. The name of the UI element is 
-          //'SearchWindow A', visibility=true, meaning SearchWindow A is currently
-          //visible. The left, right, top and bottom bounds of the UI element are 
-          // 234px, 256px, 33px, and 500px from the top right of the screen. This 
-          //message also contains optional metadata with two key-value pairs of:
-          //    'Test Window Val'='Main
-          //    'Data Source'='healthcare'
-          ac.logUILayout('Testing User Activity Message', 'SearchWindow A', true, 
-               234, 256, 33, 500, {'Test Window Val':'Main', 'Data Source':'healthCare'});
-*
-*/
-
-function activityLogger()
-{
-     /*========================INTERNAL CONSTANTS========================
-     *
-     * These constant define values associated with this specific version
-     * of this library, and should not be changed by the implementor.
-     */
-
-     // The version number of the Draper Activity Logging API implemented
-     // by this library.
-     var apiVersion = 2;
-
-     //The workflow coding version used by this Activity Logging API. 
-     var workflowCodingVersion = 1;
-     
-     /*      WORKFLOW CODES
-     * These constants specify the workflow codes defined in the Draper
-     * Activity Logging API version <apiVersion>. One of these
-     * constants must be passed in the parameter <userWorkflowState>
-     * in the function <logUserActivity> below. 
-     */
-     this.WF_OTHER       = 0;
-     this.WF_PLAN        = 1;
-     this.WF_SEARCH      = 2;
-     this.WF_EXAMINE     = 3;
-     this.WF_MARSHAL     = 4;
-     this.WF_REASON      = 5;
-     this.WF_COLLABORATE = 6;
-     this.WF_REPORT      = 7;
-
-
-     // The domain for all structured data elements necessary to send
-     // IETF RCF 5424 compliant Syslog messages. 15038 is Draper Lab's 
-     // IANA Private Enterprise Number.
-     var structuredDataDomain = 15038;
-
-     // The language in which this helper library is implemented
-     var implementationLanguage = "JavaScript";
-
-     // If true, this library has updated the IP address of the 
-     // Computer on which it is running with information from 
-     // the Activity Logging Server, or <registerActivityLogger>. 
-     var clientsHostnameUpdated = false;
-
-     //====================END INTERNAL CONSTANTS========================
-
-
-     /*======================== REGISTRATION ============================
-     * These variables are assigned by calling the 
-     * <registerActivityLogger> function below. They are persistent until
-     * a new ActivityLogger object is instantiated, or until modification
-     * by the <registerActivityLogger> function. 
-     */
-
-     /* Register this event logger. <registerActivityLogger> MUST be 
-     * called before log messages can be sent with this library. 
-     * 
-     * PARAMETERS:
-     *  @activityLogServerIN: String. The address of the logging server.           
-     *    See documentation for <activityLogServerURL> below. 
-     *  @componentNameIN: String. The name of the app or component using 
-     *    this library. See documentation for <componentName> below. If 
-    *    the empty string, defaults to the hostname of the web app that 
-    *    loaded this library
-     *  @componentVersionIN String. The version of this app or 
-       *    component. See documentation for <componentVersion> below. 
-    *    If the empty string, defaults to 'unknown'.
-     *  @sessionIdIN String. A unique ID for the current user session. 
-     *    See documentation for <sessionID> below.  If the empty string, 
-    *    defaults to a random integer.
-     *  @clientHostnameIN: Optional. String. The hostname or IP address 
-          of this machine or VM. See documentation for 
-          <clientHostname> below. 
-     */
-     this.registerActivityLogger = registerActivityLogger;
-     function registerActivityLogger(activityLogServerIN, componentNameIN, componentVersionIN, sessionIdIN, clientHostnameIN)
-     {
-          activityLogServerURL = activityLogServerIN;
-          if(componentNameIN != "")
-          {
-                   componentName= componentNameIN;
-          }
-
-          if(componentVersionIN != "")
-          {
-                   componentVersion = componentVersionIN;
-          }
-
-          if(sessionIdIN != "")
-          {
-                   sessionID = sessionIdIN;
-          }
-
-          if (clientHostnameIN) 
-          {
-              clientHostname = clientHostnameIN;
-              clientsHostnameUpdated = true;
-          }
-     }
-
-     /* The fully-qualified address of the logging server that will 
-     * collect messages dispatched by this library.
-     *
-     * Example: "http://example.com:1337"
-     * 
-     * During XDATA Summer Camp 2013, contact James Remeika at 
-     * jremeika@draper.com for the address of the Activity Log Server
-     */
-     var activityLogServerURL;
-
-     /* The hostname of the computer or VM on which the software 
-     * component using this library is runing. In the case of a web-            
-     * based user interface component, this should be the host name of
-     * the computer on which the web browser displaying the UI is
-     * running. By default, this field will be populated with the 
-        * IP address of the client machine as seen by the Logging Server.
-     *
-     * Ideally, this hostname should describe a physical terminal or 
-     * experimental setup as persistently as possible.
-      */
-     var clientHostname = "xdataClient";
-
-     // The name of the software component or application sending log 
-     // messages from this library. Defaults to the location of the 
-         // web app loading this library.
-     var componentName = location.host;
-
-     // The version number of the software component or application 
-     // specified in <clientHostname> that is sending log  messages from 
-     // this library.
-     var componentVersion = "unknown";
-
-     /* The unique session ID used for communication between client and
-     * sever-side software components during use of this component. 
-     * Defaults to a random integer.
-     *
-     * Ideally, this session ID will identify log messages from all
-     * software components used to execute a unique user session.
-     */ 
-     var sessionID = Math.floor(Math.random() * 10,000 );
-
-     //========================END REGISTRATION==========================
-
-     /*====================DEVELOPMENT FUNCTIONALITY=====================
-     * The properties and function in this section allow developers to 
-     * echo log messages to the console, and disable the generation and 
-     * transmission of logging messages by this library. 
-     */
-     
-     //Set to <true> to echo log messages to the console, even if they 
-     //are sent sucessfully to the Logging Server.
-     var echoLogsToConsole = false;
-
-     this.echo = function(_) {
-          if (!arguments.length) return echoLogsToConsole;
-          echoLogsToConsole = _;
-          return this;
-     };
-     // var echoLogsToConsole = false;
-
-     //Set to <true> to disable System Activity log messages.
-     this.muteSystemActivityLogging = muteSystemActivityLogging;
-     var muteSystemActivityLogging = false;
-
-     //Set to <true> to disable User Activity log messages
-     this.muteUserActivityLogging = muteUserActivityLogging;
-     var muteUserActivityLogging = false;
-
-     //Set to <true> to disable UI Layout log messages
-     this.muteUILayoutLogging = muteUILayoutLogging;
-     var muteUILayoutLogging = true;
-
-     // Disable all log messages
-     this.muteAllLogging = muteAllLogging;
-     function muteAllLogging()
-     {
-          muteSystemActivityLogging = true;
-          muteUserActivityLogging = true;
-          muteUILayoutLogging = true;
-     }
-
-     //Enable all log messages
-     this.unmuteAllLogging = unmuteAllLogging;
-     function unmuteAllLogging()
-     {
-          muteSystemActivityLogging = false;
-          muteUserActivityLogging = false;
-          muteUILayoutLogging = false;
-     }
-     
-     //=================END DEVELOPMENT FUNCTIONALITY====================
-
-     
-     /*==================ACTIVITY LOGGING FUNCTIONS======================
-     * The 3 functions in this section are used to send Activity Log
-     * Mesages to an Activity Logging Server. Seperate functions are used
-     * to log System Activity, User Activity, and UI Layout Events. See 
-     * the Activity Logging API by Draper Laboratory for more details 
-     * about the use of these messages.
-     */
-     
-     /* Log a System Activity. <registerActivityLogger> MUST be 
-     * called before calling this function. Use <logSystemActivity> to 
-     * log software actions that are not explicitly invoked by the user.
-     * For example, if a software component refreshes a data store after 
-     * a pre-determined time span, the refresh event should be logged as 
-     * a system activity. However, if the datastore was refreshed in 
-     * response to a user clicking a Reshresh UI element, that activity
-     * should NOT be logged as a System Activity, but rather as a User 
-     * Activity.
-     * 
-     * PARAMETERS:
-     *  @actionDescription: String. A string describing the System 
-     *    Activity performed by the component. Example: 
-          "BankAccountTableView component refreshed datasource"
-     *  @softwareMetadata: JSON String. Optional. Any key/value 
-     *    pairs that will clarify or paramterize this system activity.
-     *    Example: "{'rowsAdded':'3', 'dataSource':'CheckingAccounts'}"
-     */
-     this.logSystemActivity = logSystemActivity;
-     function logSystemActivity(actionDescription, softwareMetadata)
-     {
-          var encodedSystemActivityMessage = "";
-          if(!muteSystemActivityLogging)
-          {
-               msg = writeHead();
-               msg.type = "SYSACTION";
-               msg.parms = {
-                    desc: actionDescription
-               }
-               msg.meta = softwareMetadata;
-               sendHttpMsg(msg);
-          }
-
-          return msg;
-     }
-
-     /* Log a User Activity. <registerActivityLogger> MUST be 
-     * called before calling this function. Use <logUserActivity> to 
-     * log actions initiated by an explicit user action. For example, 
-     * if a software component refreshes a data store when the user
-     * clicks a Reshresh UI element, that activity should be logged 
-     * as a User Activity. However, if the datastore was refreshed 
-     * automatically after a certain time span, that activity should 
-     * NOT be logged as a User Activity, but rather as a System 
-     * Activity.
-     * 
-     * PARAMETERS:
-     *  @actionDescription: String. A string describing the System 
-     *    Activity performed by the component. Example: 
-     *    "BankAccountTableView component refreshed datastore."
-     *  @userActivity: String. A key word defined by each software 
-     *    component or application indicating which software-centric
-     *    function is is most likely indicated by the this user 
-     *    activity. See the Activity Logging API for a standard 
-    *    set of user activity key words. 
-     *  @userWorkflowState: Integer. This value must be one of the 
-     *    Workflow Codes defined in this library. See the Activity
-     *    Logging API for definitions of each workflow code. 
-     *    Example: 
-     *         var ac = new ActivityLogger();
-     *       ...
-     *       var userWorkflowState = ac.WF_SEARCH;
-     *  @softwareMetadata: JSON String. Optional. Any key/value 
-     *    pairs that will clarify or paramterize this system activity.
-     *    Example: "{'rowsAdded':'3', 'dataSource':'CheckingAccounts'}"
-     */
-     this.logUserActivity = logUserActivity;
-     function logUserActivity(actionDescription, userActivity, userWorkflowState, softwareMetadata)
-     {
-          var encodedSystemActivityMessage = "";
-
-          if(!muteUserActivityLogging)
-          {
-               msg = writeHead();
-               msg.type = "USERACTION";
-               msg.parms = {
-                    desc: actionDescription,
-                    activity: userActivity,
-                    wf_state: userWorkflowState,
-                    wf_version: workflowCodingVersion                     
-               }
-               msg.meta = softwareMetadata;
-               sendHttpMsg(msg);
-          }
-          return msg;
-     }
-
-     //
-     /* Log the Layout of a UI Element. <registerActivityLogger> 
-     * MUST be called before calling this function. Use 
-     * <logUILayout> to record any changes to the position or
-     * visibility of User Interface elements on screen.
-     * 
-     * PARAMETERS:
-     *  @actionDescription: String. A string describing the System 
-     *    Activity performed by the component. Example: 
-     *    "BankAccountTableView moved in User_Dashboard"
-     *  @uiElementName: String. The name of the UI component that 
-     *    has changed position or visibility.
-     *  @visibility: Boolean. True if the element is currently 
-     *    visibile. False if the element is currently hidden.
-     *  @leftBound: Integer. The absolute position on screen, in pixels
-          of the leftmost boundary of the UI element.  
-     *  @rightBound: Integer. The absolute position on screen, in pixels
-          of the rightmost boundary of the UI element. 
-     *  @topBound: Integer. The absolute position on screen, in pixels
-          of the top boundary of the UI element. 
-     *  @bottomBound: Integer. The absolute position on screen, in pixels
-          of the bottom boundary of the UI element. 
-     *  @softwareMetadata: JSON String. Optional. Any key/value 
-     *    pairs that will clarify or paramterize this system activity.
-     *    Example: "{'currentDashboardRow':'3', 'movementMode':'Snap_To_Grid'}"
-     */
-     this.logUILayout = logUILayout;
-     function logUILayout(actionDescription, uiElementName, visibility, leftBound, rightBound, topBound, bottomBound, softwareMetadata)
-     {
-          var encodedSystemActivityMessage = "";
-
-          if(!muteUILayoutLogging)
-          {
-               msg = writeHead();
-               msg.type = "UILAYOUT";
-               msg.parms = {
-                    desc: actionDescription,
-                    visibility: visibility,
-                    leftBound: leftBound,
-                    rightBound: rightBound,
-                    topBound: topBound,
-                    bottomBound: bottomBound
-               }
-               msg.meta = softwareMetadata;
-               sendHttpMsg(msg);
-          }
-          // return msg;
-     }
-
-     //=================END ACTIVITY LOGGING FUNCTIONS========================
-
-     /*=========================INTERNAL FUNCTIONS============================
-     * These functions are used internally by the Activity Logger helper 
-     * library to generate RCF5424 Syslog messages, and transmit them via 
-     * HTTP POST messages to an Activity Logging server. 
-     */
-
-     //basic class for sending HTTP messages to Activity Logging server
-     var httpConnection = new XMLHttpRequest();
-     httpConnection.timeout = 300;
-     httpConnection.addEventListener("load", doneAlert, false);
-     httpConnection.addEventListener("error", errorAlert, false);
-     httpConnection.addEventListener("abort", errorAlert, false);
-     
-     var busy = false;
-     var nextPlaceInLine = 0;
-     var ticketServed = 0;
-     var waitTimeMS = 3
-
-     var currentXHRPayload = "";
-
-     function sendHttpMsg(encodedLogMessage, placeInLine)
-     {
-          if(!placeInLine)
-          {
-               placeInLine = nextPlaceInLine++;
-          }
-
-          // console.log(echoLogsToConsole)
-          if(echoLogsToConsole){
-               console.log(encodedLogMessage);
-          }
-
-          if(busy){
-               setTimeout(function(){sendHttpMsg(encodedLogMessage, placeInLine);}, waitTimeMS);
-          }else if (placeInLine>ticketServed)
-          {
-               setTimeout(function(){sendHttpMsg(encodedLogMessage, placeInLine);}, (placeInLine-ticketServed)*waitTimeMS );
-          }else{
-
-               if (activityLogServerURL) {
-                    currentXHRPayload = encodedLogMessage;
-                    ticketServed++;
-                    busy = true;
-                    httpConnection.open("POST", activityLogServerURL, true);
-                    httpConnection.send(JSON.stringify(encodedLogMessage));
-               }
-          }
-     }
-
-     function doneAlert(evt)
-     {
-          busy = false;
-          if(!clientsHostnameUpdated)
-          {
-               var oldClientHostname = clientHostname;
-               clientHostname = this.responseText;
-               console.log(clientHostname);
-               clientsHostnameUpdated = true;
-               logSystemActivity("Client hostname changed from " + oldClientHostname + " to " + clientHostname);
-          }
-     }
-
-     function errorAlert(evt)
-     {
-          console.log(currentXHRPayload);
-          busy = false;
-     }
-
-     function writeHead() {
-          var msg = {}
-
-          msg.timestamp = new Date();
-          msg.client = clientHostname;
-          msg.component = {name:componentName, version:componentVersion};
-          msg.sessionID = sessionID;
-          msg.impLanguage = implementationLanguage;
-          msg.apiVersion = apiVersion;
-
-          return msg;
-     }
-
-     function writeHeader()
-     {
-          var currentTimestamp = new Date();
-          var encodedClientHostname = "-";
-          var encodedComponentName = "-";
-
-          var encodedSystemActivityMessage =      "<134>1 " 
-                                   + currentTimestamp.toISOString() + " "
-                                   + (clientHostname != "" ? removeWhiteSpace(clientHostname) : "-") + " " 
-                                   + (componentName != "" ? removeWhiteSpace(componentName) : "-") + " ";
-          return encodedSystemActivityMessage;
-
-     }
-
-     //Write the required API version structured data element
-     function writeVersionData()
-     {
-          var versionNumbers = new Object();
-          versionNumbers["componentVersion"] = componentVersion;
-          versionNumbers["apiVersion"] = apiVersion;
-          versionNumbers["implentationLanguage"] = implementationLanguage;
-          return writeSDE("versions", versionNumbers);
-     }
-
-     //Write the required Activity structured data element
-     function writeWorkflowCode(userActivity, userWorkflow)
-     {
-          var workflowCode = new Object();
-
-          workflowCode["USER_ACTIVITY"] = userActivity;
-          workflowCode["USER_WF"] = userWorkflow;
-          workflowCode["wfCodeVersion"] = workflowCodingVersion;
-
-          return writeSDE("USER_ACTION", workflowCode);
-     }
-
-     //Write the UI Layout structured data element
-     function writeUILayoutData(uiElementName, visibility, leftBound, rightBound, topBound, bottomBound)
-     {
-          var UILayout = new Object();
-          UILayout["uiElementName"] = uiElementName;
-          
-          if(visibility){
-               UILayout["visibility"] = "true";
-          }
-          else{
-               UILayout["visibility"] = "false";
-          }
-          UILayout["leftBound"] = leftBound;
-          UILayout["rightBound"] = rightBound;
-          UILayout["topBound"] = topBound;
-          UILayout["bottomBound"] = bottomBound;
-
-          return writeSDE("uiLayoutData", UILayout);
-     }
-
-     //Write any metadata included by the software developer
-     function writeSWMetadata(swMetadata)
-     {
-          return writeSDE(removeWhiteSpace(componentName), swMetadata);
-     }
-
-     //Internal function to encode a single structured data element
-     function writeSDE(sdeName, metaData)
-     {
-          var sdeString = "";
-          if (sdeName && metaData)
-          {
-               sdeString += "[" + sdeName + "@" + structuredDataDomain;
-
-               for (var i in Object.keys(metaData))
-               {
-                    var keyName = Object.keys(metaData)[i];
-                    sdeString += " " + removeWhiteSpace(keyName) + "=\"" + metaData[keyName] + "\"";
-               }
-               
-               sdeString += "]";
-          }
-          return sdeString;
-    }
-
-    //If the action description string is not empty, append a UTF-8 BOM.
-    //Otherwise return the empty string. 
-    function appendActionDescription(actionDescription) {
-        var encodedActionDescription = "";
-        if (actionDescription && actionDescription != "") {
-            encodedActionDescription += ' \357\273\277';
-            encodedActionDescription += actionDescription;
-        }
-
-        return encodedActionDescription;
-    }
-
-     //Internal function to remove white space from an incoming value
-     function removeWhiteSpace(inputString)
-     {
-          if(typeof inputString == 'string' || inputString instanceof String)
-          {
-               return inputString.replace(/\s/g,"");
-          } else
-          {     
-               return inputString;
-          }
-     }
-
-     //=======================END INTERNAL FUNCTIONS==========================
-     
-     
-}
-
diff --git a/dashboard/lib/static/HospitalCosts/Medicare_Provider_Charge_Inpatient_DRG100_FY2011_filtered.csv b/dashboard/lib/static/HospitalCosts/Medicare_Provider_Charge_Inpatient_DRG100_FY2011_filtered.csv
deleted file mode 100755
index 0fb2c01..0000000
--- a/dashboard/lib/static/HospitalCosts/Medicare_Provider_Charge_Inpatient_DRG100_FY2011_filtered.csv
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/HospitalCosts/Outcome of Care Measures_filtered.csv b/dashboard/lib/static/HospitalCosts/Outcome of Care Measures_filtered.csv
deleted file mode 100755
index 1322edf..0000000
--- a/dashboard/lib/static/HospitalCosts/Outcome of Care Measures_filtered.csv
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/HospitalCosts/Provider Zip.csv b/dashboard/lib/static/HospitalCosts/Provider Zip.csv
deleted file mode 100755
index a7692f3..0000000
--- a/dashboard/lib/static/HospitalCosts/Provider Zip.csv
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/HospitalCosts/README.md b/dashboard/lib/static/HospitalCosts/README.md
deleted file mode 100755
index 4b4dbda..0000000
--- a/dashboard/lib/static/HospitalCosts/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-start a server:
-
-    python -m SimpleHTTPServer 8888
-
-direct your browser to:
-
-	> localhost:8888
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/draper.activity_logger-2.1.0.js b/dashboard/lib/static/HospitalCosts/draper.activity_logger-2.1.0.js
deleted file mode 100644
index 96892ea..0000000
--- a/dashboard/lib/static/HospitalCosts/draper.activity_logger-2.1.0.js
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
-* Draper activityLogger
-*
-* The purpose of this module is allow XDATA Developers to easily add a logging
-* mechanism into their own modules for the purposes of recording the behaviors
-* of the analysists using their tools.
-*
-* @author Draper Laboratory
-* @date 2014
-*/
-
-/*jshint unused:false*/
-function activityLogger() {
-	'use strict';
-
-  var draperLog = {version: "2.1.0"}; // semver
-
-  var muteUserActivityLogging = false,
-  muteSystemActivityLogging = false,
-  logToConsole = false,
-  testing = false,
-  workflowCodingVersion = '2.0';
-
-  /**
-  * Workflow Codes
-  */
-  draperLog.WF_OTHER       = 0;
-  draperLog.WF_DEFINE      = 1;
-  draperLog.WF_GETDATA     = 2;
-  draperLog.WF_EXPLORE     = 3;
-  draperLog.WF_CREATE      = 4;
-  draperLog.WF_ENRICH      = 5;
-  draperLog.WF_TRANSFORM   = 6;
-
-	/**
-	* Registers this component with Draper's logging server.  The server creates
-	* a unique session_id, that is then used in subsequent logging messages.  This
-	* is a blocking ajax call to ensure logged messages are tagged correctly.
-	* @todo investigate the use of promises, instead of the blocking call.
-	*
-	* @method registerActivityLogger
-	* @param {String} url the url of Draper's Logging Server
-	* @param {String} componentName the name of this component
-	* @param {String} componentVersion the version of this component
-	*/
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		// get session id from url
-		function getParameterByName(name) {
-			name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-			var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
-			results = regex.exec(location.search);
-			return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-		}
-
-		draperLog.sessionID = getParameterByName('USID') || ('UNK-' + new Date().getTime());
-
-		if (logToConsole) {
-			console.log('USID: ', draperLog.sessionID);
-		}
-
-		classListener();
-
-		return draperLog;
-	};
-
-	/**
-	* Create USER activity message.
-	*
-	* @method logUserActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {String} userActivity a more generalized one word description of the current activity.
-	* @param {Integer} userWorkflowState an integer representing one of the enumerated states above.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {
-		if(!muteUserActivityLogging) {
-			var msg = {
-				type: 'USERACTION',
-				parms: {
-					desc: actionDescription,
-					activity: userActivity,
-					wf_state: userWorkflowState,
-					wf_version: workflowCodingVersion
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Create SYSTEM activity message.
-	*
-	* @method logSystemActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {
-
-		if(!muteSystemActivityLogging) {
-			var msg = {
-				type: 'SYSACTION',
-				parms: {
-					desc: actionDescription,
-				},
-				meta: softwareMetadata
-			};
-			sendMessage(msg);
-		}
-	};
-
-	/**
-	* Send activity message to Draper's logging server.  This function uses Jquery's ajax
-	* function to send the created message to draper's server.
-	*
-	* @method sendMessage
-	* @param {JSON} msg the JSON message.
-	*/
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		if (logToConsole) {
-			console.log('DRAPER LOG: Sending message to Draper server', msg);
-		}
-		if (!testing) {
-			$.ajax({
-				url: draperLog.url + '/send_log',
-				type: 'POST',
-				dataType: 'json',
-				data: msg,
-				success: function(a) {
-					if (logToConsole) {
-						console.log('DRAPER LOG: message received!');
-					}
-				},
-				error: function(){
-					console.error('DRAPER LOG: could not send activity log to Draper server!');
-				}
-			});
-		} else {
-			if (logToConsole) {
-				console.log('DRAPER LOG: (TESTING) message received!');
-			}
-		}
-	}
-
-	/**
-	* When set to true, logs messages to browser console.
-	*
-	* @method echo
-	* @param {Boolean} set to true to log to console
-	*/
-	draperLog.echo = function(d) {
-		if (!arguments.length) { return logToConsole; }
-		logToConsole = d;
-		return draperLog;
-	};
-
-  /**
-	* Accepts an array of Strings telling logger to mute those type of messages.
-	* Possible values are 'SYS' and 'USER'.  These messages will not be sent to
-	* server.
-	*
-	* @method mute
-	* @param {Array} array of strings of messages to mute.
-	*/
-	draperLog.mute = function(d) {
-		d.forEach(function(d) {
-			if(d === 'USER') { muteUserActivityLogging = true; }
-			if(d === 'SYS') { muteSystemActivityLogging = true; }
-		});
-		return draperLog;
-	};
-
-  /**
-	* When set to true, no connection will be made against logging server.
-	*
-	* @method testing
-	* @param {Boolean} set to true to disable all connection to logging server
-	*/
-	draperLog.testing = function(d) {
-		if (!arguments.length) { return testing; }
-		testing = d;
-		return draperLog;
-	};
-
-  /**
-	* DOM Listener for specific events.
-	*
-	*/
-	function classListener() {
-
-		$( document ).ready(function() {
-			$(".draper").each(function(i,d){
-				$(d).on("click", function(a){
-					draperLog.logUserActivity('User clicked element', $(this).data('activity'), $(this).data('wf'));
-				});
-			});
-
-			$(window).scroll(function() {
-				clearTimeout($.data(this, 'scrollTimer'));
-				$.data(this, 'scrollTimer', setTimeout(function() {
-					draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-				}, 500));
-			});
-		});
-	}
-
-  /**
-	* Tag specific elements
-	*
-	*/
-	draperLog.tag = function(elem, msg) {
-		$.each(msg.events, function(i, d) {
-			if (d === 'scroll') {
-				console.log('found scroll');
-				$(elem).scroll(function() {
-					clearTimeout($.data(this, 'scrollTimer'));
-					$.data(this, 'scrollTimer', setTimeout(function() {
-						draperLog.logUserActivity('User scrolled window', 'scroll', 3);
-					}, 500));
-				});
-			}else{
-				$(elem).on(d, function() {
-					draperLog.logUserActivity(msg.desc, msg.activity, msg.wf_state);
-				});
-			}
-		});
-	};
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/draper.activity_logger.js b/dashboard/lib/static/HospitalCosts/draper.activity_logger.js
deleted file mode 100755
index da44f87..0000000
--- a/dashboard/lib/static/HospitalCosts/draper.activity_logger.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
-* Draper activityLogger
-*
-* The purpose of this module is allow XDATA Developers to easily add a logging
-* mechanism into their own modules for the purposes of recording the behaviors
-* of the analysists using their tools.
-*
-* @author Draper Laboratory
-* @date 2014
-*/
-function activityLogger() {	
-  var draperLog = {version: "0.2.0"}; // semver
-
-  var muteUserActivityLogging = false;
-  var muteSystemActivityLogging = false;
-  var logToConsole = false;
-  var workflowCodingVersion = '1.0'
-
-  /**
-  * Workflow Codes
-	*/
-	draperLog.WF_OTHER       = 0;
-	draperLog.WF_PLAN        = 1;
-	draperLog.WF_SEARCH      = 2;
-	draperLog.WF_EXAMINE     = 3;
-	draperLog.WF_MARSHAL     = 4;
-	draperLog.WF_REASON      = 5;
-	draperLog.WF_COLLABORATE = 6;
-	draperLog.WF_REPORT      = 7;
-	
-
-	/**
-	* Registers this component with Draper's logging server.  The server creates
-	* a unique session_id, that is then used in subsequent logging messages.  This 
-	* is a blocking ajax call to ensure logged messages are tagged correctly.
-	* @todo investigate the use of promises, instead of the blocking call.
-	*
-	* @method registerActivityLogger
-	* @param {String} url the url of Draper's Logging Server
-	* @param {String} componentName the name of this component
-	* @param {String} componentVersion the version of this component
-	*/
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		$.ajax({
-			url: draperLog.url + '/register',
-			async: false,
-			dataType: 'json',
-			success: function(a) {
-				if (logToConsole) {
-					console.log('DRAPER LOG: Session successfully registered', a);
-				}
-				draperLog.sessionID = a.session_id;
-				draperLog.clientHostname = a.client_ip;
-			},
-			error: function(){
-				console.error('DRAPER LOG: Could not register session with Drapers server!')
-			}
-		});
-
-		return draperLog;
-	}
-
-	/**
-	* Create USER activity message.   
-	*
-	* @method logUserActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {String} userActivity a more generalized one word description of the current activity. 
-	* @param {Integer} userWorkflowState an integer representing one of the enumerated states above.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {	    
-
-	    if(!muteUserActivityLogging) {
-	    	msg = {
-	    		type: 'USERACTION',
-	    		parms: {
-	    			desc: actionDescription,
-						activity: userActivity,
-						wf_state: userWorkflowState,
-						wf_version: workflowCodingVersion 
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	/**
-	* Create SYSTEM activity message.  
-	*
-	* @method logSystemActivity
-	* @param {String} actionDescription a description of the activity in natural language.
-	* @param {JSON} softwareMetadata any arbitrary JSON that may support this activity
-	*/
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {	    
-               
-	    if(!muteSystemActivityLogging) {
-	    	msg = {
-	    		type: 'SYSACTION',
-	    		parms: {
-	    			desc: actionDescription,	          
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	/**
-	* Set Session Cookie on Client. NOT YET IMPLEMENTED.
-	*/
-	function setCookie(cname,cvalue,exdays)	{
-		var d = new Date();
-		d.setTime(d.getTime()+(exdays*24*60*60*1000));
-		var expires = "expires="+d.toGMTString();
-		document.cookie = cname + "=" + cvalue + "; " + expires;
-	}
-
-	/**
-	* Send activity message to Draper's logging server.  This function uses Jquery's ajax
-	* function to send the created message to draper's server.  
-	*
-	* @method sendMessage
-	* @param {JSON} msg the JSON message.
-	*/
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		if (logToConsole) {
-			console.log('DRAPER LOG: Sending message to Draper server', msg);
-		}
-		$.ajax({
-			url: draperLog.url + '/send_log',
-			type: 'POST',
-			dataType: 'json',
-			data: msg,
-			success: function(a) {
-				if (logToConsole) {
-					console.log('DRAPER LOG: message received!');
-				}
-			},
-			error: function(){
-				console.error('DRAPER LOG: could not send activity log to Draper server!')
-			}
-		})
-	}
-
-	draperLog.echo = function(d) {
-    if (!arguments.length) return logToConsole;
-    logToConsole = d;
-    return draperLog;
-  };
-
-  draperLog.mute = function(d) {
-  	d.forEach(function(d) {
-  		if(d == 'USER') muteUserActivityLogging = true;
-  		if(d == 'SYS') muteSystemActivityLogging = true;
-  	});  	
-    return draperLog;
-  };
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/draperLogger.js b/dashboard/lib/static/HospitalCosts/draperLogger.js
deleted file mode 100755
index 3d5397e..0000000
--- a/dashboard/lib/static/HospitalCosts/draperLogger.js
+++ /dev/null
@@ -1,112 +0,0 @@
-function activityLogger() {
-	// draperLog = (function(){
-  var draperLog = {version: "0.2.0"}; // semver
-
-  var muteUserActivityLogging = false;
-  var muteSystemActivityLogging = false;
-
-  /*      WORKFLOW CODES
-	* These constants specify the workflow codes defined in the Draper
-	* Activity Logging API version <apiVersion>. One of these
-	* constants must be passed in the parameter <userWorkflowState>
-	* in the function <logUserActivity> below. 
-	*/
-	draperLog.WF_OTHER       = 0;
-	draperLog.WF_PLAN        = 1;
-	draperLog.WF_SEARCH      = 2;
-	draperLog.WF_EXAMINE     = 3;
-	draperLog.WF_MARSHAL     = 4;
-	draperLog.WF_REASON      = 5;
-	draperLog.WF_COLLABORATE = 6;
-	draperLog.WF_REPORT      = 7;
-
-	var workflowCodingVersion = '1.0'
-
-	draperLog.registerActivityLogger = function(url, componentName, componentVersion) {
-		draperLog.url = url;
-		draperLog.componentName = componentName;
-		draperLog.componentVersion = componentVersion;
-
-		$.ajax({
-			url: draperLog.url + '/register',
-			async: false,
-			dataType: 'json',
-			success: function(a) {
-				console.log('success:', a);
-				// console.log('success2:', a);
-
-				// console.log(a, a.session_id, a["session_id"])
-
-				// console.log("SESSIONID:", draperLog);
-				draperLog.sessionID = a.session_id;
-				draperLog.clientHostname = a.client_ip;	
-				// console.log("SESSIONID:", draperLog.sessionID);	
-				// console.log(draperLog);			
-			}
-		})
-
-		console.log("SESSIONID:", draperLog.sessionID)
-	}
-
-	draperLog.logUserActivity = function (actionDescription, userActivity, userWorkflowState, softwareMetadata) {	    
-
-	    if(!muteUserActivityLogging) {
-	    	msg = {
-	    		type: 'USERACTION',
-	    		parms: {
-	    			desc: actionDescription,
-					activity: userActivity,
-					wf_state: userWorkflowState,
-					wf_version: workflowCodingVersion 
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	draperLog.logSystemActivity = function (actionDescription, softwareMetadata) {	    
-               
-	    if(!muteUserActivityLogging) {
-	    	msg = {
-	    		type: 'SYSACTION',
-	    		parms: {
-	    			desc: actionDescription,	          
-	    		},
-	    		meta: softwareMetadata
-	    	}
-	    	sendMessage(msg);         
-	    }
-	}
-
-	function setCookie(cname,cvalue,exdays)	{
-		var d = new Date();
-		d.setTime(d.getTime()+(exdays*24*60*60*1000));
-		var expires = "expires="+d.toGMTString();
-		document.cookie = cname + "=" + cvalue + "; " + expires;
-	}
-
-	function sendMessage(msg) {
-		msg.timestamp = new Date().toJSON();
-		console.log(msg.timestamp, new Date())
-		msg.client = draperLog.clientHostname;
-		msg.component = {name: draperLog.componentName, version: draperLog.componentVersion};
-		msg.sessionID = draperLog.sessionID;
-		msg.impLanguage = 'JavaScript';
-		msg.apiVersion = draperLog.version;
-
-		console.log(msg);
-		$.ajax({
-			url: draperLog.url + '/send_log',
-			type: 'POST',
-			dataType: 'json',
-			data: msg,
-			success: function(a) {
-				// console.log('success:', a)
-
-			}
-		})
-	}
-
-	return draperLog;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/hospital.js b/dashboard/lib/static/HospitalCosts/hospital.js
deleted file mode 100755
index 716821c..0000000
--- a/dashboard/lib/static/HospitalCosts/hospital.js
+++ /dev/null
@@ -1,1207 +0,0 @@
-/*jslint browser: true */
-
-/*globals $, tangelo, d3, vg, console */
-
-var state_names = {
-    "AL": "Alabama",
-    "AK": "Alaska",
-    "AS": "American Samoa",
-    "AZ": "Arizona",
-    "AR": "Arkansas",
-    "CA": "California",
-    "CO": "Colorado",
-    "CT": "Connecticut",
-    "DE": "Delaware",
-    "DC": "District Of Columbia",
-    "FM": "Federated States Of Micronesia",
-    "FL": "Florida",
-    "GA": "Georgia",
-    "GU": "Guam",
-    "HI": "Hawaii",
-    "ID": "Idaho",
-    "IL": "Illinois",
-    "IN": "Indiana",
-    "IA": "Iowa",
-    "KS": "Kansas",
-    "KY": "Kentucky",
-    "LA": "Louisiana",
-    "ME": "Maine",
-    "MH": "Marshall Islands",
-    "MD": "Maryland",
-    "MA": "Massachusetts",
-    "MI": "Michigan",
-    "MN": "Minnesota",
-    "MS": "Mississippi",
-    "MO": "Missouri",
-    "MT": "Montana",
-    "NE": "Nebraska",
-    "NV": "Nevada",
-    "NH": "New Hampshire",
-    "NJ": "New Jersey",
-    "NM": "New Mexico",
-    "NY": "New York",
-    "NC": "North Carolina",
-    "ND": "North Dakota",
-    "MP": "Northern Mariana Islands",
-    "OH": "Ohio",
-    "OK": "Oklahoma",
-    "OR": "Oregon",
-    "PW": "Palau",
-    "PA": "Pennsylvania",
-    "PR": "Puerto Rico",
-    "RI": "Rhode Island",
-    "SC": "South Carolina",
-    "SD": "South Dakota",
-    "TN": "Tennessee",
-    "TX": "Texas",
-    "UT": "Utah",
-    "VT": "Vermont",
-    "VI": "Virgin Islands",
-    "VA": "Virginia",
-    "WA": "Washington",
-    "WV": "West Virginia",
-    "WI": "Wisconsin",
-    "WY": "Wyoming"
-};
-
-var userActivities = {
-    switchChartType: 1,
-    changeXAxis:     2,
-    changeYAxis:     3,
-    changeDataScope: 4,
-    changeDataSource:5,
-    highlightData:   6,
-    summerizeData:   7
-};
-
-var updateUI =	function (element, msg, visibility) {
-			var elementAddress = "#" + element;
-			var height = d3.select(elementAddress)[0][0].offsetHeight;
-			var left = d3.select(elementAddress)[0][0].offsetLeft;
-			var top = d3.select(elementAddress)[0][0].offsetTop;
-			var width = d3.select(elementAddress)[0][0].offsetWidth;
-			// ac.logUILayout(msg, element, visibility, left, left+width, top, top+height);
-		}
-
-
-var ac = new activityLogger().testing(false).echo(true).mute(['SYS']);
-// var ac = {};
-
-var all_records, states, treatments, hospitals, outcome_map, averages, hospitals_geolocation;
-var state_set = {},
-    treatment_set = {};
-
-var home = {vis: null,
-            order: "cost",
-            scale: "cost",
-            treatment: "pneumonia",
-            scope: "nation",
-            colormap_n: 50,
-            moving_avg: false,
-            national_avg: false,
-            geom: {height: 400,
-                   width: 600,
-                   margin: {left: 75,
-                            right: 200,
-                            top: 10,
-                            bottom: 35
-                   }
-            },
-
-            setup: function () {
-                "use strict";
-
-
-                var i,
-                    positions;
-
-                home.vis = d3.select("#vis")
-                    .style("width", (home.geom.width + home.geom.margin.left + home.geom.margin.right) + "px")
-                    .style("height", (home.geom.height + home.geom.margin.top + home.geom.margin.bottom) + "px");
-
-                // Create a color legend.
-                //
-                // Create a series of rects stacked at the right of the graph.
-                positions = [];
-                for (i = 0; i < home.colormap_n; i += 1) {
-                    positions.push(i * (0.4 * home.geom.height / home.colormap_n));
-                }
-
-                home.vis.select("g.legend")
-                    .selectAll("rect")
-                    .data(positions.reverse())
-                    .enter()
-                    .append("rect")
-                    .classed("legend", true)
-                    .style("fill", "rgba(0,0,0,0)")
-                    .attr("x", home.geom.margin.left + home.geom.width + 100)
-                    .attr("y", function (d) {
-                        return home.geom.margin.top + d;
-                    })
-                    .attr("width", 40)
-                    .attr("height", 0.4*home.geom.height / home.colormap_n + 1);
-
-                d3.select("#axislabelleft")
-                    .text("Lower")
-                    .attr("x", home.geom.margin.left)
-                    .attr("y", function () {
-                        return home.geom.margin.top + home.geom.height + 1.5*this.getBBox().height;
-                    })
-                    .text("");
-                d3.select("#axislabelright")
-                    .text("Higher")
-                    .attr("x", home.geom.margin.left + home.geom.width)
-                    .attr("y", function () {
-                        return home.geom.margin.top + home.geom.height + 1.5*this.getBBox().height;
-                    })
-                    .text("");
-            },
-
-            init: function () {
-                "use strict";
-
-                var states_copy = states.slice();
-                states_copy.shift();
-                states_copy.unshift("None");
-
-                d3.select("#state").selectAll("option")
-                    .data(states_copy)
-                    .enter().append("option")
-                    .text(function (d) { return d; });
-                d3.select("#state").on("change", function () {
-                  home.select_state(this.value);
-		  if(this.value == "None")
-			{
-				ac.logUserActivity("User removed data highlighting.", "highlightData", ac.WF_EXPLORE);
-			}else{
-                  		ac.logUserActivity("User highlighted a subset of data.", "highlightData", ac.WF_EXPLORE);
-			}
-                });
-
-                d3.select("#scope").selectAll("option")
-                    .data(states)
-                    .enter().append("option")
-                    .text(function (d) { return d; });
-                d3.select("#scope").on("change", function () {
-
-                    var hospitals = [], d, hospital = $("#hospital").val(), keep_hospital, state = this.value;
-                    if (state === "Entire U.S.") {
-                        // ac.logSystemActivity("User zoomed out to entire data set.");
-                        home.scope = "nation";
-                        d3.select("#state").style("display", "inline");
-                        state = $("#state").val();
-                        for (d in state_set[state]) {
-                            if (state_set[state].hasOwnProperty(d)) {
-                                hospitals.push(d);
-                            }
-                        }
-                        hospitals.sort(d3.ascending);
-                        hospitals.unshift("ALL");
-                        d3.select("#hospital").selectAll("option").remove();
-                        d3.select("#hospital").selectAll("option")
-                            .data(hospitals)
-                            .enter().append("option")
-                            .text(function (d) { return d; });
-                        $("#hospital").val(hospital);
-                      home.update();
-                    } else {
-                        ac.logUserActivity("User zoomed to data subset.", "changeDataScope", ac.WF_EXPLORE);
-                        home.scope = "state";
-                        d3.select("#state").style("display", "none");
-                        keep_hospital = (state === $("#state").val());
-                        home.select_state(state);
-                        if (keep_hospital) {
-                          home.select_hospital(hospital);
-                        }
-                    }
-                });
-
-                d3.select("#treatment").on("change", function () {
-                    home.update();
-                    // logSystemActivity("treatment changed");
-                });
-                d3.select("#hospital").selectAll("option")
-                    .data(hospitals)
-                    .enter().append("option")
-                    .text(function (d) { return d; });
-                d3.select("#hospital")
-                    .property("value", "")
-                    .on("change", function() {home.update(); console.log("hospital change event");});
-                //d3.select("#hospital").style("display", "none");
-                d3.select("#compare").on("change", function() {home.update(); console.log("compare change event");});
-
-                d3.select("#order-cost").on("click", function () { home.order = "cost"; home.update(); ac.logUserActivity("Reorder Bar Chart by Cost", "changeXAxis",  ac.WF_EXPLORE);});
-                d3.select("#order-reimbursement").on("click", function () { home.order = "reimbursement"; home.update(); ac.logUserActivity("Reorder Bar Chart by Reimbursement", "changeXAxis",  ac.WF_EXPLORE);});
-                d3.select("#order-mortality").on("click", function () { home.order = "mortality"; home.update(); ac.logUserActivity("Reorder Bar Chart by Mortality", "changeXAxis",  ac.WF_EXPLORE);});
-
-                d3.select("#scale-cost").on("click", function () { home.scale = "cost"; home.update(); ac.logUserActivity("Set Bar Chart Scale to Cost", "changeYAxis",  ac.WF_EXPLORE);});
-                d3.select("#scale-reimbursement").on("click", function () { home.scale = "reimbursement"; home.update(); ac.logUserActivity("Set Bar Chart Scale to Reimbursement", "changeYAxis",  ac.WF_EXPLORE);});
-                d3.select("#scale-mortality").on("click", function () { home.scale = "mortality"; home.update(); ac.logUserActivity("Set Bar Chart Scale to Mortality", "changeYAxis",  ac.WF_EXPLORE);});
-
-                d3.select("#treatment-heart").on("click", function () { home.treatment = "heart failure"; home.update(); ac.logUserActivity("Data source changed to heart failure.", "changeDataSource",  ac.WF_GETDATA); });
-                d3.select("#treatment-pneumonia").on("click", function () { home.treatment = "pneumonia"; home.update(); ac.logUserActivity("Data source changed to pneumonia.", "changeDataSource",  ac.WF_GETDATA) });
-
-                d3.select("#moving-avg")
-                    .on("change", function () {
-                        home.moving_avg = this.checked;
-			var actionString = "";
-			if (home.moving_avg)
-			{
-				actionString = "added to";
-			}
-			else
-			{
-				actionString = "removed from";
-			}
-                        home.update();
-			ac.logUserActivity("Moving Average " + actionString + " Chart", "summerizeData",  ac.WF_TRANSFORM);
-                    });
-                d3.select("#national-avg")
-                    .on("change", function () {
-                        home.national_avg = this.checked;
-			var actionString = "";
-			if (home.national_avg)
-			{
-				actionString = "added to";
-			}
-			else
-			{
-				actionString = "removed from";
-			}
-                        home.update();
-			ac.logUserActivity("National Average " + actionString + " Chart", "summerizeData",  ac.WF_TRANSFORM);
-                    });
-            },
-
-            select_state: function (state) {
-              d3.select("#state").property('value', state);
-              if (home.scope === "state") {
-                d3.select("#scope").property('value', state);
-              }
-              var hospitals = [], d;
-              for (d in state_set[state]) {
-                if (state_set[state].hasOwnProperty(d)) {
-                  hospitals.push(d);
-                }
-              }
-              hospitals.sort(d3.ascending);
-              if (home.scope !== "state") {
-                hospitals.unshift("ALL");
-              }
-              d3.select("#hospital").selectAll("option").remove();
-              d3.select("#hospital").selectAll("option")
-                .data(hospitals)
-                .enter().append("option")
-                .text(function (d) { return d; })
-                .on("change", function() {home.update(); console.log("hospital change event");});
-
-              if (state === "None") {
-                d3.select("#hospital")
-                  .property("value", "");
-
-                //d3.select("#hospital").style("display", "none");
-              }
-              /*                    else {*/
-              //d3.select("#hospital").style("display", "inline");
-              //}
-
-              home.update();
-            },
-
-            select_hospital: function (provider) {
-              d3.select("#hospital").property('value', provider);
-              home.update();
-            },
-
-            update: function () {
-                "use strict";
-
-                var comparison = [],
-                state = d3.select("#state").property("value"),
-                hospital = d3.select("#hospital").property("value"),
-                cost_range,
-                cost_scale,
-                color_scale,
-                bar_scale,
-                format = d3.format(",f"),
-                g,
-                g_enter,
-                sliding,
-                moving_average,
-                circ,
-                y_axis,
-                legend_axis,
-                line,
-                selected_hospital,
-                colormap_vals,
-                i,
-                mort_label,
-                bbox;
-
-                d3.select("#chart-title").text(home.scale[0].toUpperCase() + home.scale.slice(1) + " of " + home.treatment + " treatment in " + (home.scope === "state" ? state_names[state] : "U.S.") + " hospitals, ordered by " + home.order);
-
-                selected_hospital = null;
-                all_records.forEach(function (d) {
-                    if ((home.scope === "state" && d["Provider State"] === state && d.treatment === home.treatment) || (home.scope !== "state" && d.treatment === home.treatment)) {
-                        comparison.push({
-                            cost: d["Average Covered Charges"],
-                            reimbursement: d["Average Total Payments"],
-                            mortality: outcome_map[home.treatment][d["Provider Id"]],
-                            ratio: d["Average Total Payments"] / d["Average Covered Charges"],
-                            state: d["Provider State"],
-                            hospital: d.Provider,
-                            id: d["Provider Id"]
-                        });
-                        if (d.Provider === hospital) {
-                            selected_hospital = comparison[comparison.length - 1];
-                        }
-                    }
-                });
-                comparison.sort(function (a, b) {
-                    if (home.order === "mortality") {
-                        if (a[home.order] === undefined) {
-                            return 1;
-                        }
-                        if (b[home.order] === undefined) {
-                            return -1;
-                        }
-                        return d3.descending(a[home.order], b[home.order]);
-                    }
-                    return d3.ascending(a[home.order], b[home.order]);
-                });
-
-                // Set the axis labels.
-                d3.select("#axislabelleft")
-                    .text((home.order === "mortality" ? "Higher " : "Lower ") + home.order);
-
-                d3.select("#axislabelright")
-                    .text((home.order === "mortality" ? "Lower " : "Higher ") + home.order);
-
-                sliding = [];
-                moving_average = [];
-
-                // Preload sliding window with data.
-                for (i = 0; i < comparison.length / 10; i += 1) {
-                    var d = comparison[i];
-                    var outcome = outcome_map[home.treatment][d.id];
-
-                    if (outcome !== -1 && outcome !== undefined) {
-                        sliding.push(d[home.scale]);
-                    }
-                }
-
-                // Now compute the moving average once per remaining data item.
-                for (i = i; i < comparison.length; i += 1) {
-                    d = comparison[i];
-                    outcome = outcome_map[home.treatment][d.id];
-
-                    if (outcome !== -1 && outcome !== undefined) {
-                        sliding.push(d[home.scale]);
-                        if (sliding.length > comparison.length / 10) {
-                            sliding.shift();
-                        }
-                    }
-
-                    moving_average.push({
-                        index: Math.round(i - comparison.length / 20),
-                        value: d3.sum(sliding) / sliding.length
-                    });
-                }
-
-                bar_scale = d3.scale.ordinal().domain(d3.range(comparison.length)).rangeBands([0, home.geom.width]);
-
-                var avg = averages[home.treatment][home.scale].average;
-                cost_range = [d3.min(comparison, function (d) { return d[home.scale]; }), d3.max(comparison, function (d) { return d[home.scale]; })];
-                if (avg < cost_range[0]) {
-                    cost_range[0] = avg;
-                }
-                if (avg > cost_range[1]) {
-                    cost_range[1] = avg;
-                }
-
-                color_scale = d3.scale.linear().domain([8, 15]).range(["steelblue", "firebrick"]);
-                cost_scale = d3.scale.linear().domain([0, cost_range[1]]).range([home.geom.height, 0]);
-
-                colormap_vals = [];
-                for (i = 0; i < home.colormap_n; i += 1) {
-                    colormap_vals.push(8 + i * (15 - 8) / (home.colormap_n - 1));
-                }
-                home.vis.selectAll("rect.legend")
-                    .data(colormap_vals)
-                    .style("fill", function (d) {
-                        return color_scale(d);
-                    });
-
-                legend_axis = d3.svg.axis()
-                    .scale(d3.scale.linear().domain([8, 15]).range([home.geom.margin.top + 0.4*home.geom.height, home.geom.margin.top]))
-                    .tickSize(5)
-                    .orient("left")
-                    .tickFormat(function (d) {
-                        return d + "%";
-                    });
-                home.vis.select("g#legendtext")
-                    .attr("transform", "translate(" + (home.geom.margin.left + home.geom.width + 100) + ", 0)")
-                    .call(legend_axis);
-                mort_label = home.vis.select("text#mortlabel")
-                    .attr("x", home.geom.margin.left + home.geom.width + 100)
-                    .attr("y", home.geom.margin.top + 0.4 * home.geom.height);
-                bbox = mort_label.node().getBBox();
-                mort_label.attr("x", mort_label.attr("x") - bbox.width / 2)
-                    .attr("y", +mort_label.attr("y") + bbox.height);
-
-                function highlighted(d) {
-                    return false;
-                    //return ((compare === "State to Nation" &&  d.state === state) || d.hospital === hospital);
-                }
-
-                function details(d) {
-                    d3.select("#details").html("<div>" + d.hospital + "</div>"
-                            + "<div>2011 Average cost for " + home.treatment.toLowerCase() + " treatment among Medicare patients: $" + format(d.cost) + "</div>"
-                            + "<div>2011 Average reimbursement for " + home.treatment.toLowerCase() + " treatment among Medicare patients: $" + format(d.reimbursement) + "</div>"
-                            + "<div>2012 Mortality rate for " + home.treatment.toLowerCase() + " treatment among Medicare patients: "
-                            + (d.mortality >= 0 ? (d.mortality + "%") : "unknown") + "</div>");
-		    updateUI("details", "Details about a single data point are displayed.", true);
-		//    console.log(d3.select("#details")[0][0].clientHeight);
-            //console.log(div#scatter-details.span12.clientHeight);
-            //ac.logUILayout("Details about a single data point displayed", "ScatterDetails",
-
-                }
-
-                function clearDetails() {
-                    if (selected_hospital) {
-                        details(selected_hospital);
-                    } else {
-                        d3.select("#details").html("<div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div>");
-			updateUI("details", "Details about a single data point have been cleared.", false);
-                    }
-                }
-
-                clearDetails();
-
-                // Y axis
-                y_axis = d3.svg.axis()
-                    .scale(cost_scale)
-                    .tickSize(home.geom.width)
-                    .orient("left")
-                    .tickFormat(function (d) {
-                        if (home.scale === "cost" || home.scale === "reimbursement") {
-                            return "$" + d3.format(",.0f")(d);
-                        } else {
-                            return d + "%";
-                        };
-                    });
-                home.vis.selectAll("g.chartaxis").remove();
-                home.vis.append("g")
-                    .attr("class", "axis")
-                    .classed("chartaxis", true)
-                    .attr("transform", "translate(" + (home.geom.margin.left + home.geom.width) + "," + home.geom.margin.top + ")")
-                    .call(y_axis);
-
-                // Data rectangles
-                g = home.vis.selectAll("rect.data").data(comparison, function (d) { return d.hospital; });
-                g_enter = g.enter().append("rect")
-                    .classed("data", true)
-                    .attr("x", function (d, i) { return home.geom.margin.left + bar_scale(i); })
-                    .attr("y", function (d) { return home.geom.margin.top + cost_scale(d[home.scale]); })
-                    .style("opacity", 0)
-                    .attr("height", function (d) { return home.geom.height - cost_scale(d[home.scale]); })
-                    .attr("width", function (d) { return bar_scale.rangeBand() + 1; })
-                    .style("fill", function (d) { return highlighted(d) ? "red" : (d.mortality >= 0 ? color_scale(d.mortality) : "#aaa"); })
-                    .on("mouseover", details)
-                    .on("mouseout", clearDetails);
-                g.transition().duration(1000).delay(function (d, i) { return 500 * i / comparison.length; })
-                    .attr("x", function (d, i) { return home.geom.margin.left + bar_scale(i); })
-                    .attr("y", function (d) { return home.geom.margin.top + cost_scale(d[home.scale]); })
-                    .style("opacity", 0.5)
-                    .attr("height", function (d) { return home.geom.height - cost_scale(d[home.scale]); })
-                    .attr("width", function (d) { return bar_scale.rangeBand() + 1; })
-                    .style("fill", function (d) { return highlighted(d) ? "red" : (d.mortality >= 0 ? color_scale(d.mortality) : "#aaa"); });
-                g.exit().remove();
-
-                // Selection dots
-                circ = home.vis.selectAll("circle").data(comparison, function (d) { return d.hospital; });
-                circ.enter().append("circle")
-                    .style("visibility", function (d) { return ((hospital === "ALL" && d.state === state) || d.hospital === hospital) ? "visible" : "hidden"; })
-                    .style("opacity", function (d) { return ((hospital === "ALL" && d.state === state) || d.hospital === hospital) ? 0.5 : 0; })
-                    .attr("cx", function (d, i) { return home.geom.margin.left + bar_scale(i) + bar_scale.rangeBand() / 2; })
-                    .attr("cy", home.geom.height + home.geom.margin.top + 7)
-                    .attr("r", 5)
-                    .style("fill", "steelblue")
-                    .on("mouseover", details)
-                    .on("mouseout", clearDetails);
-                circ.transition().duration(1000)
-                    .style("visibility", function (d) { return ((hospital === "ALL" && d.state === state) || d.hospital === hospital) ? "visible" : "hidden"; })
-                    .style("opacity", function (d) { return ((hospital === "ALL" && d.state === state) || d.hospital === hospital) ? 0.5 : 0; })
-                    .attr("cx", function (d, i) { return home.geom.margin.left + bar_scale(i) + bar_scale.rangeBand() / 2; });
-                circ.exit().remove();
-
-                // Moving average
-                home.vis.selectAll("path").remove();
-                if (home.moving_avg) {
-                    line = d3.svg.line()
-                        .x(function (d) { return home.geom.margin.left + bar_scale(d.index); })
-                        .y(function (d) { return home.geom.margin.top + cost_scale(d.value); });
-                    home.vis.append("path").datum(moving_average)
-                        .attr("d", line)
-                        .style("opacity", 1)
-                        .style("stroke-width", 3)
-                        .style("stroke", "black")
-                        .style("fill", "none");
-                }
-
-                // National average
-                home.vis.selectAll("line.average").remove();
-                if (home.national_avg) {
-                    home.vis.append("line")
-                        .classed("average", "true")
-                        .attr("x1", home.geom.margin.left)
-                        .attr("x2", home.geom.margin.left + home.geom.width)
-                        .attr("y1", home.geom.margin.top + cost_scale(avg))
-                        .attr("y2", home.geom.margin.top + cost_scale(avg))
-                        .style("stroke", "black")
-                        .style("stroke-width", 5)
-                        .style("stroke-opacity", 0.5);
-                }
-            },
-            highlight_closest_hospital_success_callback: function (p) {
-              // Compute the distances between the hospitals and the user
-              // This does the trick performance-wise on my laptop but there
-              // are likely faster way to do it (by lat first for example):
-              // http://stackoverflow.com/q/5031268
-              // http://stackoverflow.com/q/15736995
-              // http://mathforum.org/library/drmath/view/61573.html
-              // Actually the geolocation is the slowest part, the rest below
-              // takes only a few ms.
-              p_geo = [p.coords.longitude, p.coords.latitude];
-              distances = hospitals_geolocation.map(function(r) {
-                var r_geo = [r.zip_longitude, r.zip_latitude];
-                r.distance = d3.geo.distance(r_geo, p_geo);
-                return r;
-              });
-              // Sort to find the closest
-              distances.sort(function (a, b) {
-                return a.distance - b.distance;
-              });
-              // At this point we could highligh as many as the closest we want,
-              // maybe 5, or maybe display them in a menu, etc.
-              // Just pick the first closest to highlight.
-              var closest_hospital = distances.shift();
-              var distance_in_miles = 3949.9 * closest_hospital.distance;
-              if (distance_in_miles < 100) {
-                $.each(all_records, function(index, record) {
-                  if (record['Provider Id'] === closest_hospital.provider_id) {
-                    home.show_highlight_closest_hospital_button('Got it!', 'btn-success', 5000);
-                    closest_hospital.provider = record.Provider;
-                    //console.log(closest_hospital);
-                    home.select_state(closest_hospital.state);
-                    home.select_hospital(closest_hospital.provider);
-                    return false;
-                  }
-                });
-              } else {
-                home.show_highlight_closest_hospital_button('No Match', 'btn-warning');
-              }
-            },
-            highlight_closest_hospital_error_callback: function (p) {
-              home.show_highlight_closest_hospital_button('Ooops', 'btn-warning', 5000);
-            },
-            highlight_closest_hospital: function () {
-              home.show_highlight_closest_hospital_button('Looking...', 'btn-info');
-              geoPosition.getCurrentPosition(
-                home.highlight_closest_hospital_success_callback,
-                home.highlight_closest_hospital_error_callback,
-                { enableHighAccuracy: true }
-              );
-            },
-            show_highlight_closest_hospital_button: function (text, btn_class, revert_delay) {
-              var $button = $("#highlight-closest-hospital");
-              $button.tooltip(text === undefined ? {} : 'destroy');
-              text = text || 'Find closest';
-              btn_class = btn_class || '';
-              revert_delay = revert_delay || false;
-              $button.fadeOut('fast', function () {
-                $(this).removeClass().addClass('btn ' + btn_class).text(text).fadeIn();
-              });
-              if (revert_delay !== false) {
-                window.setTimeout(home.show_highlight_closest_hospital_button, 3000);
-              }
-            }
-        };
-
-var scatter = {
-    vis: null,
-    region: "Entire U.S.",
-    treatment: "pneumonia",
-    xvar: "cost",
-    yvar: "cost",
-
-    geom: {
-        height: 400,
-        width: 400,
-        margin: {
-            left: 80,
-            right: 40,
-            top: 20,
-            bottom: 75
-        }
-    },
-
-    setup: function () {
-        scatter.vis = d3.select("#scatter-vis")
-            .style("width", (scatter.geom.width + scatter.geom.margin.left + scatter.geom.margin.right) + "px")
-            .style("height", (scatter.geom.height + scatter.geom.margin.top + scatter.geom.margin.bottom) + "px");
-    },
-
-    init: function () {
-        var update_hl_hospitals,
-            states_copy;
-
-        update_hl_hospitals = function (that) {
-            var hospitals = [],
-                d,
-                state = that.value;
-
-                for (d in state_set[state]) {
-                    if (state_set[state].hasOwnProperty(d)) {
-                        hospitals.push(d);
-                    }
-                }
-                hospitals.sort(d3.ascending);
-                hospitals.unshift("ALL");
-                d3.select("#scatter-hl-hospital").selectAll("option").remove();
-                d3.select("#scatter-hl-hospital").selectAll("option")
-                    .data(hospitals)
-                    .enter().append("option")
-                    .text(function (d) { return d; })
-                    .on("change", function() {scatter.update(); console.log("scatter hospital change event");});
-
-        };
-
-        states_copy = states.slice();
-        states_copy.shift();
-        states_copy.unshift("None");
-
-        d3.select("#scatter-hl-state")
-            .selectAll("option")
-            .data(states_copy)
-            .enter().append("option")
-            .text(function (d) { return d; });
-        d3.select("#scatter-hl-state")
-            .on("change", function () {
-                update_hl_hospitals(this);
-		console.log("scatter hl state change event");
-                if (this.value === "None") {
-                    d3.select("#scatter-hl-hospital").property("value", "");
-                    //d3.select("#scatter-hl-hospital").style("display", "none");
-                }
-/*                else {*/
-                    //d3.select("#scatter-hl-hospital").style("display", "none");
-                //}
-
-                scatter.update();
-            });
-        d3.select("#scatter-hl-hospital")
-            .on("change", function () {
-                scatter.update();
-		console.log("scatter-hl-hospital change event2");
-            });
-
-        d3.select("#scatter-state")
-            .on("change", function () {
-                var state,
-                    hospital;
-
-                state = d3.select("#scatter-hl-state");
-                hospital = d3.select("#scatter-hl-hospital");
-
-                scatter.region = this.value;
-                state.style("display", scatter.region === "Entire U.S." ? "inline" : "none");
-
-                if (this.value !== "Entire U.S.") {
-                    $(state.node()).val(this.value);
-
-                    scatter.highlight_state = state.property("value");
-                    update_hl_hospitals(this);
-                }
-		console.log("scatter state change event.");
-                scatter.update();
-            })
-            .selectAll("option")
-            .data(states)
-            .enter()
-            .append("option")
-            .text(function (d) { return d; });
-
-        d3.select("#scatter-treatment-pneumonia")
-            .on("click", function () {
-                scatter.treatment = "pneumonia";
-                scatter.update();
-		ac.logUserActivity("Change scatterplot dataset to pneumonia", "changeDataSource",  ac.WF_GETDATA);
-            });
-        d3.select("#scatter-treatment-heart")
-            .on("click", function () {
-		ac.logUserActivity("Change scatterplot dataset to heart failure", "changeDataSource",  ac.WF_GETDATA);
-                scatter.treatment = "heart failure";
-                scatter.update();
-            });
-
-        d3.select("#scatter-x-cost")
-            .on("click", function () {
-                scatter.xvar = "cost";
-		ac.logUserActivity("Change scatterplot X-axis to treatment cost", "changeXAxis",  ac.WF_EXPLORE);
-                scatter.update();
-            });
-        d3.select("#scatter-x-reimbursement")
-            .on("click", function () {
-                scatter.xvar = "reimbursement";
-                scatter.update();
-		ac.logUserActivity("Change scatterplot X-axis to Medicare reimbursement", "changeXAxis",  ac.WF_EXPLORE);
-            });
-        d3.select("#scatter-x-mortality")
-            .on("click", function () {
-                scatter.xvar = "mortality";
-		ac.logUserActivity("Change scatterplot X-axis to mortality rate", "changeXAxis",  ac.WF_EXPLORE);
-                scatter.update();
-            });
-
-        d3.select("#scatter-y-cost")
-            .on("click", function () {
-                scatter.yvar = "cost";
-		ac.logUserActivity("Change scatterplot Y-axis to treatment cost", "changeYAxis",  ac.WF_EXPLORE);
-                scatter.update();
-            });
-        d3.select("#scatter-y-reimbursement")
-            .on("click", function () {
-                scatter.yvar = "reimbursement";
-		ac.logUserActivity("Change scatterplot Y-axis to Medicare reimbursement", "changeYAxis",  ac.WF_EXPLORE);
-                scatter.update();
-            });
-        d3.select("#scatter-y-mortality")
-            .on("click", function () {
-                scatter.yvar = "mortality";
-		ac.logUserActivity("Change scatterplot Y-axis to mortality rate", "changeYAxis",  ac.WF_EXPLORE);
-                scatter.update();
-            });
-    },
-
-    update: function () {
-        var xscale,
-            yscale,
-            duration,
-            format = d3.format(",f"),
-            data,
-            hospital,
-            state,
-            plot,
-            maxx,
-            maxy,
-            xaxis,
-            yaxis,
-            x,
-            y,
-            x_mean,
-            y_mean,
-            prod,
-            x_mom,
-            y_mom,
-            corr;
-
-        duration = 1000;
-
-        function capitalize(s) {
-            return s ? s[0].toUpperCase() + s.slice(1) : s;
-        }
-
-        d3.select("#scatter-chart-title")
-            .text(capitalize(scatter.yvar) + " vs. " + scatter.xvar + ", for " + scatter.treatment + " treatment in " + (scatter.region === "Entire U.S." ? "U.S." : state_names[scatter.region]) + " hospitals");
-
-        data = [];
-        all_records.forEach(function (d) {
-            if ((scatter.region === "Entire U.S." || d["Provider State"] === scatter.region) && scatter.treatment === d.treatment) {
-                if (scatter.xvar === "cost") {
-                    x = d["Average Covered Charges"];
-                } else if (scatter.xvar === "reimbursement") {
-                    x = d["Average Total Payments"];
-                } else if (scatter.xvar === "mortality") {
-                    x = outcome_map[scatter.treatment][d["Provider Id"]];
-                } else {
-                    throw "Illegal xvar code: " + xvar;
-                }
-
-                if (scatter.yvar === "cost") {
-                    y = d["Average Covered Charges"];
-                } else if (scatter.yvar === "reimbursement") {
-                    y = d["Average Total Payments"];
-                } else if (scatter.yvar === "mortality") {
-                    y = outcome_map[scatter.treatment][d["Provider Id"]];
-                } else {
-                    throw "Illegal yvar code: " + yvar;
-                }
-
-                if (x >= 0.0 && y >= 0.0) {
-                    data.push({
-                        x: x,
-                        y: y,
-                        hospital: d.Provider,
-                        state: d["Provider State"],
-                        id: d["Provider Id"],
-                        cost: d["Average Covered Charges"],
-                        reimbursement: d["Average Total Payments"],
-                        mortality: outcome_map[scatter.treatment][d["Provider Id"]]
-                    });
-                }
-            }
-        });
-
-        maxx = d3.max(data, function (d) {
-            return d.x;
-        });
-
-        maxy = d3.max(data, function (d) {
-            return d.y;
-        });
-
-        xscale = d3.scale.linear().domain([0, maxx]).range([0, scatter.geom.width]);
-        yscale = d3.scale.linear().domain([0, maxy]).range([scatter.geom.height, 0]).nice();
-
-        function formatter(axis) {
-            return function (d) {
-                if (scatter[axis] === "cost" || scatter[axis] === "reimbursement") {
-                    return "$" + d3.format(",.0f")(d);
-                } else {
-                    return d + "%";
-                };
-            }
-        }
-
-        xaxis = d3.svg.axis()
-            .scale(xscale)
-            .tickSize(scatter.geom.height)
-            .orient("bottom")
-            .tickFormat(formatter("xvar"));
-        scatter.vis.select("g.x.axis")
-            .attr("transform", "translate(" + (scatter.geom.margin.left) + ", " + (scatter.geom.margin.top) + ")")
-            .transition()
-            .duration(duration)
-            .call(xaxis)
-            .selectAll("text")
-            .style("text-anchor", "start")
-            .attr("dy", "0.5ex")
-            .attr("transform", function () {
-                var s = d3.select(this);
-                var r = "rotate(45, " + (s.attr("x") || 0) + ", " + s.attr("y") + ")";
-                return r;
-            });
-
-        yaxis = d3.svg.axis()
-            .scale(yscale)
-            .tickSize(scatter.geom.width)
-            .orient("left")
-            .tickFormat(formatter("yvar"));
-        scatter.vis.select("g.y.axis")
-            .attr("transform", "translate(" + (scatter.geom.margin.left + scatter.geom.width) + ", " + scatter.geom.margin.top + ")")
-            .transition()
-            .duration(duration)
-            .call(yaxis);
-
-        hospital = d3.select("#scatter-hl-hospital").property("value");
-        state = d3.select("#scatter-hl-state").property("value");
-
-        function highlight(d) {
-            return (d.hospital === hospital) ||
-                (hospital === "ALL" && scatter.region === "Entire U.S." && state === d.state);
-        }
-
-        function details(d) {
-            d3.select("#scatter-details").html("<div>" + d.hospital + "</div>"
-                    + "<div>2011 Average cost for " + scatter.treatment.toLowerCase() + " treatment among Medicare patients: $" + format(d.cost) + "</div>"
-                    + "<div>2011 Average reimbursement for " + scatter.treatment.toLowerCase() + " treatment among Medicare patients: $" + format(d.reimbursement) + "</div>"
-                    + "<div>2012 Mortality rate for " + scatter.treatment.toLowerCase() + " treatment among Medicare patients: "
-                    + (d.mortality >= 0 ? (d.mortality + "%") : "unknown") + "</div>");
-
-            console.log(d3.select("#scatter-details")[0][0].clientHeight);
-	    updateUI("scatter-details", "Details about a single data point are displayed.", true);
-            //console.log(div#scatter-details.span12.clientHeight);
-            //ac.logUILayout("Details about a single data point displayed", "ScatterDetails",
-
-
-        }
-
-        function clearDetails() {
-            d3.select("#scatter-details").html("<div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div>");
-	    updateUI("scatter-details", "Details about a single data point have been cleared.", false);
-        }
-
-        plot = scatter.vis.selectAll("circle")
-            .data(data, function (d) { return d.hospital; });
-        plot.enter()
-            .append("circle")
-            .attr("cx", function (d) {
-                return scatter.geom.margin.left + xscale(d.x);
-            })
-            .attr("cy", function (d) {
-                return scatter.geom.margin.top + yscale(d.y);
-            })
-            .attr("r", 0.0)
-            .style("fill-opacity", 0.0)
-            .style("stroke-opacity", 0.0)
-            .style("stroke", "black")
-            .style("cursor", "crosshair")
-            .on("mouseover", function (d) {
-                var col,
-                    me,
-                    r,
-                    opacity;
-
-                me = d3.select(this);
-
-                col = me.style("fill");
-                me.attr("savefill", col);
-                me.style("fill", "green");
-
-                r = me.attr("r");
-                me.attr("saver", r);
-                me.attr("r", 7);
-
-                opacity = me.style("fill-opacity");
-                me.attr("saveopacity", opacity);
-                me.style("fill-opacity", 0.8);
-
-                details(d);
-            })
-            .on("mouseout", function (d) {
-                var me;
-
-                me = d3.select(this);
-
-                me.style("fill", me.attr("savefill"));
-                me.attr("savefill", null);
-
-                me.attr("r", me.attr("saver"));
-                me.attr("saver", null);
-
-                me.style("fill-opacity", me.attr("saveopacity"));
-                me.attr("saveopacity", null);
-
-                clearDetails();
-            });
-        plot.transition()
-            .duration(duration)
-            .attr("cx", function (d) {
-                return scatter.geom.margin.left + xscale(d.x);
-            })
-            .attr("cy", function (d) {
-                return scatter.geom.margin.top + yscale(d.y);
-            })
-            .attr("r", function (d) {
-                return highlight(d) ? 5 : 1.5;
-            })
-            .style("fill-opacity", function (d) {
-                var val;
-                if (scatter.region === "Entire U.S.") {
-                    val = highlight(d) ? 0.8 : 0.2;
-                } else {
-                    val = highlight(d) ? 1.0 : 0.8;
-                }
-
-                return val;
-            })
-            .style("stroke-opacity", function (d) {
-                return highlight(d) ? 0.5 : 0.0;
-            })
-            .style("fill", function (d) {
-                return highlight(d) ? "yellow" : "blue";
-            });
-        plot.exit()
-            .transition()
-            .duration(duration)
-            .attr("cx", function (d) {
-                return scatter.geom.margin.left + xscale(d.x);
-            })
-            .attr("cy", function (d) {
-                return scatter.geom.margin.top + yscale(d.y);
-            })
-            .style("opacity", 0.0)
-            .attr("r", 7.0)
-            .remove();
-
-        // Compute the correlation.
-        //
-        // Compute the means of the two dimensions.
-        x_mean = d3.sum(data, function (d) { return d.x; }) / data.length;
-        y_mean = d3.sum(data, function (d) { return d.y; }) / data.length;
-
-        // Compute the various sums necessary for the Pearson correlation
-        // coefficient.
-        prod = 0.0;
-        x_mom = 0.0;
-        y_mom = 0.0;
-        data.forEach(function (d) {
-            prod += (d.x - x_mean) * (d.y - y_mean);
-            x_mom += (d.x - x_mean) * (d.x - x_mean);
-            y_mom += (d.y - y_mean) * (d.y - y_mean);
-        });
-
-        x_mom = Math.sqrt(x_mom);
-        y_mom = Math.sqrt(y_mom);
-
-        corr = prod / (x_mom * y_mom);
-
-        d3.select("#scatter-corr")
-            .text(corr.toPrecision(3));
-    }
-};
-
-$(function () {
-    "use strict";
-
-    // Do any static setup (setting sizes of vis elements, etc.).
-    //
-    // TODO(choudhury): automate this with a list of app names, then pack all
-    // the app objects into a master app list object.
-    home.setup();
-    scatter.setup();
-
-    // ac = draperLog;
-    ac.registerActivityLogger("http://xd-draper.xdata.data-tactics-corp.com:1337", "KitwareHospitalCosts", "0.1")
-    // ac.registerActivityLogger("http://xd-draper.xdata.data-tactics-corp.com:3000", "KitwareHospitalCosts", "0.1");
-    // ac.registerActivityLogger("http://xd-draper.xdata.data-tactics-corp.com:1337", "KitwareHospitalCosts", "0.1", Math.floor(Math.random()*10000+1));
-    // ac.registerActivityLogger("http://localhost:1337", "KitwareHospitalCosts", "0.1", Math.floor(Math.random()*10000+1));
-
-    // Load in the county, state, and initial contribution data
-    d3.csv("Medicare_Provider_Charge_Inpatient_DRG100_FY2011_filtered.csv", function (error, records) {
-        d3.csv("Outcome of Care Measures_filtered.csv", function (error, outcome) {
-            var d, val;
-
-            averages = {
-                "heart failure": {"cost": {"count": 0, "sum": 0}, "reimbursement": {"count": 0, "sum": 0}, "mortality": {"count": 0, "sum": 0}},
-                "pneumonia": {"cost": {"count": 0, "sum": 0}, "reimbursement": {"count": 0, "sum": 0}, "mortality": {"count": 0, "sum": 0}}};
-            all_records = records;
-            records.forEach(function (d) {
-                d["Average Covered Charges"] = +d["Average Covered Charges"];
-                d["Average Total Payments"] = +d["Average Total Payments"];
-                d["Total Discharges"] = +d["Total Discharges"];
-                d["Provider Zip Code"] = +d["Provider Zip Code"];
-                d["Provider Id"] = +d["Provider Id"];
-                if (state_set[d["Provider State"]] === undefined) {
-                    state_set[d["Provider State"]] = {};
-                }
-                if (treatment_set[d["DRG Definition"]] === undefined) {
-                    treatment_set[d["DRG Definition"]] = 0;
-                }
-                treatment_set[d["DRG Definition"]] += 1;
-                d.Provider = d["Provider Name"] + " - " + d["Provider City"] + ", " + d["Provider State"];
-                if (state_set[d["Provider State"]][d.Provider] === undefined) {
-                    state_set[d["Provider State"]][d.Provider] = true;
-                }
-                if (d["DRG Definition"] === "292 - HEART FAILURE & SHOCK W CC") {
-                    d.treatment = "heart failure";
-                } else if (d["DRG Definition"] === "194 - SIMPLE PNEUMONIA & PLEURISY W CC") {
-                    d.treatment = "pneumonia";
-                } else {
-                    d.treatment = undefined;
-                }
-                if (d.treatment !== undefined) {
-                    averages[d.treatment]["cost"]["count"] += 1;
-                    averages[d.treatment]["cost"]["sum"] += d["Average Covered Charges"];
-                    averages[d.treatment]["reimbursement"]["count"] += 1;
-                    averages[d.treatment]["reimbursement"]["sum"] += d["Average Total Payments"];
-                }
-            });
-            outcome_map = {"heart failure": {}, "pneumonia": {}};
-            outcome.forEach(function (d) {
-                var heart_failure = d["Hospital 30-Day Death (Mortality) Rates from Heart Failure"],
-                    pneumonia = d["Hospital 30-Day Death (Mortality) Rates from Pneumonia"];
-                outcome_map["heart failure"][+d["Provider Number"]] = (heart_failure === "Not Available") ? -1 : +heart_failure;
-                outcome_map.pneumonia[+d["Provider Number"]] = (pneumonia === "Not Available") ? -1 : +pneumonia;
-                if (heart_failure !== "Not Available") {
-                    averages["heart failure"]["mortality"]["count"] += 1;
-                    averages["heart failure"]["mortality"]["sum"] += +heart_failure;
-                }
-                if (pneumonia !== "Not Available") {
-                    averages.pneumonia["mortality"]["count"] += 1;
-                    averages.pneumonia["mortality"]["sum"] += +pneumonia;
-                }
-            });
-
-            val = averages["heart failure"]["cost"];
-            val.average = val.sum / val.count;
-            val = averages["heart failure"]["reimbursement"];
-            val.average = val.sum / val.count;
-            val = averages["heart failure"]["mortality"];
-            val.average = val.sum / val.count;
-            val = averages.pneumonia["cost"];
-            val.average = val.sum / val.count;
-            val = averages.pneumonia["reimbursement"];
-            val.average = val.sum / val.count;
-            val = averages.pneumonia["mortality"];
-            val.average = val.sum / val.count;
-
-            states = [];
-            for (d in state_set) {
-                if (state_set.hasOwnProperty(d)) {
-                    states.push(d);
-                }
-            }
-            states.sort(d3.ascending);
-            states.unshift("Entire U.S.");
-
-            treatments = [];
-            for (d in treatment_set) {
-                if (treatment_set.hasOwnProperty(d)) {
-                    treatments.push({name: d, count: treatment_set[d]});
-                }
-            }
-
-            hospitals = [];
-            for (d in state_set.AK) {
-                if (state_set.AK.hasOwnProperty(d)) {
-                    hospitals.push(d);
-                }
-            }
-            hospitals.sort(d3.ascending);
-            hospitals.unshift("ALL");
-
-            // Initialize and bootstrap the "home" screen vis.
-            home.init();
-            home.update();
-
-            // Initialize the scatter plot app.
-            scatter.init();
-            scatter.update();
-
-            d3.select("#scatter-link").on("click", function () {
-		ac.logUserActivity("Change plot type to Scatter Plot", "switchChartType",  ac.WF_EXPLORE);
-                d3.select("#home").style("display", "none");
-                d3.select("#scatter").style("display", "inline");
-            });
-            d3.select("#home-link").on("click", function () {
-		ac.logUserActivity("Change plot type to Bar Graph Plot", "switchChartType",  ac.WF_EXPLORE);
-                d3.select("#scatter").style("display", "none");
-                d3.select("#home").style("display", "inline");
-            });
-
-            // Get hospitals geolocation, but only if that functionality
-            // is supported, and after the rest has been done, since it is
-            // not that critical
-            hospitals_geolocation = [];
-            if (geoPosition.init()) {
-              d3.csv("Provider Zip.csv",
-                     function(d) {
-                       return {
-                         provider_id: +d['Provider Id'],
-                         state: d['Provider State'],
-                         zip: +d['Provider Zip Code'],
-                         zip_latitude: +d['Zip Latitude'],
-                         zip_longitude: +d['Zip Longitude']
-                         };
-                     },
-                     function (error, rows) {
-                       hospitals_geolocation = rows;
-                       home.show_highlight_closest_hospital_button();
-                       $("#highlight-closest-hospital").on("click", home.highlight_closest_hospital);
-                     });
-            }
-        });
-    });
-});
diff --git a/dashboard/lib/static/HospitalCosts/index.html b/dashboard/lib/static/HospitalCosts/index.html
deleted file mode 100644
index 216eeb2..0000000
--- a/dashboard/lib/static/HospitalCosts/index.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-	<meta charset="UTF-8">
-	<title>Document</title>
-	<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
-</head>
-<body>
-<h1>TESTING</h1>
-	
-	<script>
-	// $.getJSON('http://localhost:8080/awesome?PHPSESSID=72aa95axyz6cd67d82ba0f809277326dd', function(a,b) {
-	// 	console.log(a,b);
-	// })
-	function getParameterByName(name) {
-    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
-        results = regex.exec(location.search);
-    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-	}
-
-	function getCookie(cname){
-		var name = cname + "=";
-		var ca = document.cookie.split(';');
-		for(var i=0; i<ca.length; i++) {
-		  var c = ca[i].trim();
-		  if (c.indexOf(name)==0) {
-		  	var tmp = c.substring(name.length,c.length);
-		  	return tmp.replace(/"/g, "")
-		  }
-		}
-		return "";
-	}
-
-	var a = getCookie('USID');
-	var b = getParameterByName('USID')
-
-	console.log(a,b,typeof a,typeof b, a==b)
-	</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/index2.html b/dashboard/lib/static/HospitalCosts/index2.html
deleted file mode 100644
index a8da930..0000000
--- a/dashboard/lib/static/HospitalCosts/index2.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<html>
-    <head>
-        <link rel="icon" type="image/png" href="favicon.png">
-        <link href="lib/tangelo.css" rel=stylesheet type="text/css">
-        <title>Hospital Costs</title/>
-        <script src="lib/jquery-1.8.2.min.js"></script>
-        <script src="lib/tangelo.min.js"></script>
-        <script src="lib/bootstrap.js"></script>
-        <script src="lib/d3.v3.min.js"></script>
-        <script src="lib/geoPosition.min.js"></script>
-    	<!-- // <script src="ActivityLogger.js"></script> -->
-        <script src="draper.activity_logger-2.1.0.js"></script>
-        <script src="hospital.js"></script>
-
-        <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-6042509-20', 'kitware.com');
-  ga('send', 'pageview');
-        </script>
-
-        <style>
-
-/* Sticky footer styles
--------------------------------------------------- */
-
-html,
-body {
-  height: 100%;
-  /* The html and body elements cannot have any padding or margin. */
-}
-
-/* Wrapper for page content to push down footer */
-#wrap {
-  min-height: 100%;
-  height: auto !important;
-  height: 100%;
-  /* Negative indent footer by it's height */
-  margin: 0 auto -50px;
-}
-
-/* Set the fixed height of the footer here */
-#push,
-#footer {
-  height: 50px;
-}
-#footer {
-  background-color: #f5f5f5;
-}
-
-/* Lastly, apply responsive CSS fixes as necessary */
-@media (max-width: 767px) {
-  #footer {
-    margin-left: -20px;
-    margin-right: -20px;
-    padding-left: 20px;
-    padding-right: 20px;
-  }
-}
-
-/* Custom page CSS
--------------------------------------------------- */
-/* Not required for template or sticky footer method. */
-
-.container .credit {
-  margin: 10px 0 0 0;
-}
-
-    body {
-        background-color: #eee;
-    }
-    .axis path,
-    .axis line {
-        fill: none;
-        stroke: #888;
-        opacity: 0.5;
-        shape-rendering: crispEdges;
-    }
-        </style>
-    </head>
-    <body>
-        <div id="wrap">
-        <div class="container">
-            <h1>Hospital Costs</h1>
-<!--            <p>-->
-                <!--Compare your hospital to state or national averages.-->
-                <!--Data obtained from-->
-                <!--<a href="https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Medicare-Provider-Charge-Data/index.html">CMS.gov</a>.-->
-            <!--</p>-->
-
-            <p>The federal government recently <a
-                href=https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Medicare-Provider-Charge-Data/index.html>released
-                data</a> about what hospitals charge for procedures, and how
-                much Medicare reimburses them.  We have visualized some of this
-                data, along with publicly available data about <a href="https://data.medicare.gov/Hospital-Compare/Hospital-Outcome-Of-Care-Measures/f24z-mvb9">mortality rates</a>
-                under these same procedures.  How does your hospital stack up
-                against national averages?
-            </p>
-
-<!--
-            <ul class="nav nav-tabs">
-                <li class=active><a href=#home data-toggle=tab>Home</a>
-                <li><a href=#scatter data-toggle=tab>Scatter Plot</a>
-            </ul>
--->
-
-<!--
-            <div class=tab-content>
--->
-                <div id="home">
-                    <h4 id="chart-title">&nbsp;</h4>
-                    <div class="row">
-                        <div class="span12">
-                            <svg id="vis">
-                                <g id=legendtext class=axis></g>
-                                <g class=legend></g>
-                                <text id=mortlabel>Mortality rate</text>
-                                <text id=axislabelleft style="text-anchor:start;"></text>
-                                <text id=axislabelright style="text-anchor:end;"></text>
-                            </svg>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div id="details" class="span12">
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Show</h5>
-                            <select id="scope" class="span2"></select>
-                            <label class=checkbox>
-                                <input type=checkbox id=national-avg> National average
-                            </label>
-                            <label class=checkbox>
-                                <input type=checkbox id=moving-avg> Moving average
-                            </label>
-                        </div>
-                        <div class="span8">
-                            <h5>Highlight<svg width=15 height=10><circle cx=10 cy=5 r=5 style="fill:steelblue; opacity:0.5;"></svg></h5>
-                            <div class="row">
-                                <div class="span8">
-                                  <div class="form-inline">
-                                    <select id="state" class="span2"></select>
-                                    <select id="hospital" class="span3"></select>
-                                    <button id="highlight-closest-hospital" style="display:none" class="btn" data-placement="top" data-animation="true" data-toggle="tooltip" title="You will be prompted to share your current location."></button>
-                                  </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Condition</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="treatment-pneumonia" class="btn btn-small active">Pneumonia</button>
-                                <button id="treatment-heart" class="btn btn-small">Heart Failure</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Vertical Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scale-cost" class="btn btn-small active">Cost</button>
-                                <button id="scale-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scale-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Sort Horizontally By</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="order-cost" class="btn btn-small active">Cost</button>
-                                <button id="order-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="order-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                    </div>
-                    <div>&nbsp;</div>
-                    Go to <a id="scatter-link" href="#">scatterplot</a>.
-                    <div>&nbsp;</div>
-                </div>
-
-                <div id="scatter" style="display:none">
-                    <h4 id=scatter-chart-title></h4>
-                    <div class="row">
-                        <div class="span12">
-                            <svg id="scatter-vis">
-                                <g class="x axis"></g>
-                                <g class="y axis"></g>
-                            </svg>
-                        </div>
-                    </div>
-                    <div class=row>
-                        <div class="offset3 span9">
-                            <p><strong>Correlation:</strong> <span id="scatter-corr"></span></p>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div id="scatter-details" class="span12">
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Show</h5>
-                            <select id="scatter-state"></select>
-                        </div>
-                        <div class="span8">
-                            <h5>Highlight</h5>
-                            <div class="row">
-                                <div class="span8">
-                                    <select id="scatter-hl-state" class="span2"></select>
-                                    <select id="scatter-hl-hospital" class="span3"></select>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Condition</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-treatment-pneumonia" class="btn btn-small active">Pneumonia</button>
-                                <button id="scatter-treatment-heart" class="btn btn-small">Heart Failure</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Horizontal Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-x-cost" class="btn btn-small active">Cost</button>
-                                <button id="scatter-x-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scatter-x-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Vertical Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-y-cost" class="btn btn-small active">Cost</button>
-                                <button id="scatter-y-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scatter-y-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                    </div>
-                    <div>&nbsp;</div>
-                    Go to <a id="home-link" href="#">bar chart</a>.
-                    <div>&nbsp;</div>
-                </div>
-            </div>
-<!--
-        </div>
--->
-
-<!--
-        <div class="row">
-            <div class="span4">
-                <h5>Vertical Axis</h5>
-                <div class="btn-group" data-toggle="buttons-radio">
-                    <button id="scatter-y-cost" class="btn btn-small active">Cost</button>
-                    <button id="scatter-y-reimbursement" class="btn btn-small">Reimbursement</button>
-                    <button id="scatter-y-mortality" class="btn btn-small">Mortality</button>
-                </div>
-            </div>
-        </div>
--->
-        <div id="push"></div>
-    </div>
-    <div id="footer">
-        <div class="container">
-            <p class="muted credit pull-right">
-            Created by
-            <a href="http://www.kitware.com/solutions/informatics/informatics.html">Kitware, Inc.</a>
-            This effort is sponsored by the Air Force Research Laboratory and DARPA XDATA program.
-            </p>
-        </div>
-    </div>
-</body>
-</html>
diff --git a/dashboard/lib/static/HospitalCosts/index3.html b/dashboard/lib/static/HospitalCosts/index3.html
deleted file mode 100755
index 6380c45..0000000
--- a/dashboard/lib/static/HospitalCosts/index3.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<html>
-    <head>
-        <link rel="icon" type="image/png" href="favicon.png">
-        <link href="lib/tangelo.css" rel=stylesheet type="text/css">
-        <title>Hospital Costs</title/>
-        <script src="lib/jquery-1.8.2.min.js"></script>
-        <script src="lib/tangelo.min.js"></script>
-        <script src="lib/bootstrap.js"></script>
-        <script src="lib/d3.v3.min.js"></script>
-        <script src="lib/geoPosition.min.js"></script>
-    	<!-- // <script src="ActivityLogger.js"></script> -->
-        <script src="draper.activity_logger.js"></script>
-        <script src="hospital.js"></script>
-
-        <script>
-  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-
-  ga('create', 'UA-6042509-20', 'kitware.com');
-  ga('send', 'pageview');
-        </script>
-
-        <style>
-
-/* Sticky footer styles
--------------------------------------------------- */
-
-html,
-body {
-  height: 100%;
-  /* The html and body elements cannot have any padding or margin. */
-}
-
-/* Wrapper for page content to push down footer */
-#wrap {
-  min-height: 100%;
-  height: auto !important;
-  height: 100%;
-  /* Negative indent footer by it's height */
-  margin: 0 auto -50px;
-}
-
-/* Set the fixed height of the footer here */
-#push,
-#footer {
-  height: 50px;
-}
-#footer {
-  background-color: #f5f5f5;
-}
-
-/* Lastly, apply responsive CSS fixes as necessary */
-@media (max-width: 767px) {
-  #footer {
-    margin-left: -20px;
-    margin-right: -20px;
-    padding-left: 20px;
-    padding-right: 20px;
-  }
-}
-
-/* Custom page CSS
--------------------------------------------------- */
-/* Not required for template or sticky footer method. */
-
-.container .credit {
-  margin: 10px 0 0 0;
-}
-
-    body {
-        background-color: #eee;
-    }
-    .axis path,
-    .axis line {
-        fill: none;
-        stroke: #888;
-        opacity: 0.5;
-        shape-rendering: crispEdges;
-    }
-        </style>
-    </head>
-    <body>
-        <div id="wrap">
-        <div class="container">
-            <h1>Hospital Costs</h1>
-<!--            <p>-->
-                <!--Compare your hospital to state or national averages.-->
-                <!--Data obtained from-->
-                <!--<a href="https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Medicare-Provider-Charge-Data/index.html">CMS.gov</a>.-->
-            <!--</p>-->
-
-            <p>The federal government recently <a
-                href=https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Medicare-Provider-Charge-Data/index.html>released
-                data</a> about what hospitals charge for procedures, and how
-                much Medicare reimburses them.  We have visualized some of this
-                data, along with publicly available data about <a href="https://data.medicare.gov/Hospital-Compare/Hospital-Outcome-Of-Care-Measures/f24z-mvb9">mortality rates</a>
-                under these same procedures.  How does your hospital stack up
-                against national averages?
-            </p>
-
-<!--
-            <ul class="nav nav-tabs">
-                <li class=active><a href=#home data-toggle=tab>Home</a>
-                <li><a href=#scatter data-toggle=tab>Scatter Plot</a>
-            </ul>
--->
-
-<!--
-            <div class=tab-content>
--->
-                <div id="home">
-                    <h4 id="chart-title">&nbsp;</h4>
-                    <div class="row">
-                        <div class="span12">
-                            <svg id="vis">
-                                <g id=legendtext class=axis></g>
-                                <g class=legend></g>
-                                <text id=mortlabel>Mortality rate</text>
-                                <text id=axislabelleft style="text-anchor:start;"></text>
-                                <text id=axislabelright style="text-anchor:end;"></text>
-                            </svg>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div id="details" class="span12">
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Show</h5>
-                            <select id="scope" class="span2"></select>
-                            <label class=checkbox>
-                                <input type=checkbox id=national-avg> National average
-                            </label>
-                            <label class=checkbox>
-                                <input type=checkbox id=moving-avg> Moving average
-                            </label>
-                        </div>
-                        <div class="span8">
-                            <h5>Highlight<svg width=15 height=10><circle cx=10 cy=5 r=5 style="fill:steelblue; opacity:0.5;"></svg></h5>
-                            <div class="row">
-                                <div class="span8">
-                                  <div class="form-inline">
-                                    <select id="state" class="span2"></select>
-                                    <select id="hospital" class="span3"></select>
-                                    <button id="highlight-closest-hospital" style="display:none" class="btn" data-placement="top" data-animation="true" data-toggle="tooltip" title="You will be prompted to share your current location."></button>
-                                  </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Condition</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="treatment-pneumonia" class="btn btn-small active">Pneumonia</button>
-                                <button id="treatment-heart" class="btn btn-small">Heart Failure</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Vertical Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scale-cost" class="btn btn-small active">Cost</button>
-                                <button id="scale-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scale-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Sort Horizontally By</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="order-cost" class="btn btn-small active">Cost</button>
-                                <button id="order-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="order-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                    </div>
-                    <div>&nbsp;</div>
-                    Go to <a id="scatter-link" href="#">scatterplot</a>.
-                    <div>&nbsp;</div>
-                </div>
-
-                <div id="scatter" style="display:none">
-                    <h4 id=scatter-chart-title></h4>
-                    <div class="row">
-                        <div class="span12">
-                            <svg id="scatter-vis">
-                                <g class="x axis"></g>
-                                <g class="y axis"></g>
-                            </svg>
-                        </div>
-                    </div>
-                    <div class=row>
-                        <div class="offset3 span9">
-                            <p><strong>Correlation:</strong> <span id="scatter-corr"></span></p>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div id="scatter-details" class="span12">
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                            <div>&nbsp;</div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Show</h5>
-                            <select id="scatter-state"></select>
-                        </div>
-                        <div class="span8">
-                            <h5>Highlight</h5>
-                            <div class="row">
-                                <div class="span8">
-                                    <select id="scatter-hl-state" class="span2"></select>
-                                    <select id="scatter-hl-hospital" class="span3"></select>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="row">
-                        <div class="span4">
-                            <h5>Condition</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-treatment-pneumonia" class="btn btn-small active">Pneumonia</button>
-                                <button id="scatter-treatment-heart" class="btn btn-small">Heart Failure</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Horizontal Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-x-cost" class="btn btn-small active">Cost</button>
-                                <button id="scatter-x-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scatter-x-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                        <div class="span4">
-                            <h5>Vertical Axis</h5>
-                            <div class="btn-group" data-toggle="buttons-radio">
-                                <button id="scatter-y-cost" class="btn btn-small active">Cost</button>
-                                <button id="scatter-y-reimbursement" class="btn btn-small">Reimbursement</button>
-                                <button id="scatter-y-mortality" class="btn btn-small">Mortality</button>
-                            </div>
-                        </div>
-                    </div>
-                    <div>&nbsp;</div>
-                    Go to <a id="home-link" href="#">bar chart</a>.
-                    <div>&nbsp;</div>
-                </div>
-            </div>
-<!--
-        </div>
--->
-
-<!--
-        <div class="row">
-            <div class="span4">
-                <h5>Vertical Axis</h5>
-                <div class="btn-group" data-toggle="buttons-radio">
-                    <button id="scatter-y-cost" class="btn btn-small active">Cost</button>
-                    <button id="scatter-y-reimbursement" class="btn btn-small">Reimbursement</button>
-                    <button id="scatter-y-mortality" class="btn btn-small">Mortality</button>
-                </div>
-            </div>
-        </div>
--->
-        <div id="push"></div>
-    </div>
-    <div id="footer">
-        <div class="container">
-            <p class="muted credit pull-right">
-            Created by
-            <a href="http://www.kitware.com/solutions/informatics/informatics.html">Kitware, Inc.</a>
-            This effort is sponsored by the Air Force Research Laboratory and DARPA XDATA program.
-            </p>
-        </div>
-    </div>
-</body>
-</html>
diff --git a/dashboard/lib/static/HospitalCosts/lib/bootstrap-readable.css b/dashboard/lib/static/HospitalCosts/lib/bootstrap-readable.css
deleted file mode 100755
index 8b32a62..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/bootstrap-readable.css
+++ /dev/null
@@ -1,6203 +0,0 @@
-@import url('//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic');
-
-/*!
- * Bootstrap v2.3.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
-  *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.clearfix:after {
-  clear: both;
-}
-
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 36px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-
-audio:not([controls]) {
-  display: none;
-}
-
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-      -ms-text-size-adjust: 100%;
-}
-
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-a:hover,
-a:active {
-  outline: 0;
-}
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-img {
-  width: auto\9;
-  height: auto;
-  max-width: 100%;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img,
-.google-maps img {
-  max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
-  cursor: pointer;
-}
-
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-
-@media print {
-  * {
-    color: #000 !important;
-    text-shadow: none !important;
-    background: transparent !important;
-    box-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  .ir a:after,
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  @page  {
-    margin: 0.5cm;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-}
-
-body {
-  margin: 0;
-  font-family: "Lora", Georgia, "Times New Roman", Times, serif;
-  font-size: 17px;
-  line-height: 26px;
-  color: #333333;
-  background-color: #f6f6f6;
-}
-
-a {
-  color: #9c0001;
-  text-decoration: none;
-}
-
-a:hover,
-a:focus {
-  color: #830001;
-  text-decoration: underline;
-}
-
-.img-rounded {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
-  -webkit-border-radius: 500px;
-     -moz-border-radius: 500px;
-          border-radius: 500px;
-}
-
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-
-.row:before,
-.row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row:after {
-  clear: both;
-}
-
-[class*="span"] {
-  float: left;
-  min-height: 1px;
-  margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.span12 {
-  width: 940px;
-}
-
-.span11 {
-  width: 860px;
-}
-
-.span10 {
-  width: 780px;
-}
-
-.span9 {
-  width: 700px;
-}
-
-.span8 {
-  width: 620px;
-}
-
-.span7 {
-  width: 540px;
-}
-
-.span6 {
-  width: 460px;
-}
-
-.span5 {
-  width: 380px;
-}
-
-.span4 {
-  width: 300px;
-}
-
-.span3 {
-  width: 220px;
-}
-
-.span2 {
-  width: 140px;
-}
-
-.span1 {
-  width: 60px;
-}
-
-.offset12 {
-  margin-left: 980px;
-}
-
-.offset11 {
-  margin-left: 900px;
-}
-
-.offset10 {
-  margin-left: 820px;
-}
-
-.offset9 {
-  margin-left: 740px;
-}
-
-.offset8 {
-  margin-left: 660px;
-}
-
-.offset7 {
-  margin-left: 580px;
-}
-
-.offset6 {
-  margin-left: 500px;
-}
-
-.offset5 {
-  margin-left: 420px;
-}
-
-.offset4 {
-  margin-left: 340px;
-}
-
-.offset3 {
-  margin-left: 260px;
-}
-
-.offset2 {
-  margin-left: 180px;
-}
-
-.offset1 {
-  margin-left: 100px;
-}
-
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row-fluid:after {
-  clear: both;
-}
-
-.row-fluid [class*="span"] {
-  display: block;
-  float: left;
-  width: 100%;
-  min-height: 36px;
-  margin-left: 2.127659574468085%;
-  *margin-left: 2.074468085106383%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
-  margin-left: 2.127659574468085%;
-}
-
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
-  width: 82.97872340425532%;
-  *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
-  width: 74.46808510638297%;
-  *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
-  width: 65.95744680851064%;
-  *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {
-  width: 57.44680851063829%;
-  *width: 57.39361702127659%;
-}
-
-.row-fluid .span6 {
-  width: 48.93617021276595%;
-  *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
-  width: 40.42553191489362%;
-  *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {
-  width: 31.914893617021278%;
-  *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
-  width: 23.404255319148934%;
-  *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-
-.container:before,
-.container:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container:after {
-  clear: both;
-}
-
-.container-fluid {
-  padding-right: 20px;
-  padding-left: 20px;
-  *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container-fluid:after {
-  clear: both;
-}
-
-p {
-  margin: 0 0 13px;
-}
-
-.lead {
-  margin-bottom: 26px;
-  font-size: 25.5px;
-  font-weight: 200;
-  line-height: 39px;
-}
-
-small {
-  font-size: 85%;
-}
-
-strong {
-  font-weight: bold;
-}
-
-em {
-  font-style: italic;
-}
-
-cite {
-  font-style: normal;
-}
-
-.muted {
-  color: #999999;
-}
-
-a.muted:hover,
-a.muted:focus {
-  color: #808080;
-}
-
-.text-warning {
-  color: #c09853;
-}
-
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #a47e3c;
-}
-
-.text-error {
-  color: #b94a48;
-}
-
-a.text-error:hover,
-a.text-error:focus {
-  color: #953b39;
-}
-
-.text-info {
-  color: #3a87ad;
-}
-
-a.text-info:hover,
-a.text-info:focus {
-  color: #2d6987;
-}
-
-.text-success {
-  color: #468847;
-}
-
-a.text-success:hover,
-a.text-success:focus {
-  color: #356635;
-}
-
-.text-left {
-  text-align: left;
-}
-
-.text-right {
-  text-align: right;
-}
-
-.text-center {
-  text-align: center;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 13px 0;
-  font-family: inherit;
-  font-weight: bold;
-  line-height: 26px;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-
-h1,
-h2,
-h3 {
-  line-height: 52px;
-}
-
-h1 {
-  font-size: 46.75px;
-}
-
-h2 {
-  font-size: 38.25px;
-}
-
-h3 {
-  font-size: 29.75px;
-}
-
-h4 {
-  font-size: 21.25px;
-}
-
-h5 {
-  font-size: 17px;
-}
-
-h6 {
-  font-size: 14.45px;
-}
-
-h1 small {
-  font-size: 29.75px;
-}
-
-h2 small {
-  font-size: 21.25px;
-}
-
-h3 small {
-  font-size: 17px;
-}
-
-h4 small {
-  font-size: 17px;
-}
-
-.page-header {
-  padding-bottom: 12px;
-  margin: 26px 0 39px;
-  border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 13px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-
-li {
-  line-height: 26px;
-}
-
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  *display: inline;
-  padding-right: 5px;
-  padding-left: 5px;
-  *zoom: 1;
-}
-
-dl {
-  margin-bottom: 26px;
-}
-
-dt,
-dd {
-  line-height: 26px;
-}
-
-dt {
-  font-weight: bold;
-}
-
-dd {
-  margin-left: 13px;
-}
-
-.dl-horizontal {
-  *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.dl-horizontal:after {
-  clear: both;
-}
-
-.dl-horizontal dt {
-  float: left;
-  width: 160px;
-  overflow: hidden;
-  clear: left;
-  text-align: right;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.dl-horizontal dd {
-  margin-left: 180px;
-}
-
-hr {
-  margin: 26px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 26px;
-  border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
-  margin-bottom: 0;
-  font-size: 21.25px;
-  font-weight: 300;
-  line-height: 1.25;
-}
-
-blockquote small {
-  display: block;
-  line-height: 26px;
-  color: #999999;
-}
-
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-
-blockquote.pull-right small:before {
-  content: '';
-}
-
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-address {
-  display: block;
-  margin-bottom: 26px;
-  font-style: normal;
-  line-height: 26px;
-}
-
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 15px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-code {
-  padding: 2px 4px;
-  color: #d14;
-  white-space: nowrap;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-
-pre {
-  display: block;
-  padding: 12.5px;
-  margin: 0 0 13px;
-  font-size: 16px;
-  line-height: 26px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-pre.prettyprint {
-  margin-bottom: 26px;
-}
-
-pre code {
-  padding: 0;
-  color: inherit;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border: 0;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-form {
-  margin: 0 0 26px;
-}
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 26px;
-  font-size: 25.5px;
-  line-height: 52px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
-  font-size: 19.5px;
-  color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 17px;
-  font-weight: normal;
-  line-height: 26px;
-}
-
-input,
-button,
-select,
-textarea {
-  font-family: "Lora", Georgia, "Times New Roman", Times, serif;
-}
-
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 26px;
-  padding: 4px 6px;
-  margin-bottom: 13px;
-  font-size: 17px;
-  line-height: 26px;
-  color: #555555;
-  vertical-align: middle;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-input,
-textarea,
-.uneditable-input {
-  width: 206px;
-}
-
-textarea {
-  height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-          transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9;
-  *margin-top: 0;
-  line-height: normal;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-
-select,
-input[type="file"] {
-  height: 36px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 36px;
-}
-
-select {
-  width: 220px;
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  cursor: not-allowed;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-
-.radio,
-.checkbox {
-  min-height: 26px;
-  padding-left: 20px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-  margin-left: -20px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-
-.input-mini {
-  width: 60px;
-}
-
-.input-small {
-  width: 90px;
-}
-
-.input-medium {
-  width: 150px;
-}
-
-.input-large {
-  width: 210px;
-}
-
-.input-xlarge {
-  width: 270px;
-}
-
-.input-xxlarge {
-  width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
-  width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
-  width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
-  width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
-  width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
-  width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
-  width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
-  width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
-  width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
-  width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
-  width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
-  width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
-  width: 46px;
-}
-
-.controls-row {
-  *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.controls-row:after {
-  clear: both;
-}
-
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
-  float: left;
-}
-
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
-  padding-top: 5px;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
-  color: #3a87ad;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  color: #3a87ad;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  border-color: #3a87ad;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
-  border-color: #2d6987;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #3a87ad;
-}
-
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-     -moz-box-shadow: 0 0 6px #f8b9b7;
-          box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
-  padding: 25px 20px 26px;
-  margin-top: 26px;
-  margin-bottom: 26px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-actions:after {
-  clear: both;
-}
-
-.help-block,
-.help-inline {
-  color: #595959;
-}
-
-.help-block {
-  display: block;
-  margin-bottom: 13px;
-}
-
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  padding-left: 5px;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
-  display: inline-block;
-  margin-bottom: 13px;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
-  font-size: 17px;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  vertical-align: top;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 26px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 17px;
-  font-weight: normal;
-  line-height: 26px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
-  vertical-align: top;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
-  background-color: #6ce495;
-  border-color: #1c9b47;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input + .btn-group .btn:last-child,
-.input-append select + .btn-group .btn:last-child,
-.input-append .uneditable-input + .btn-group .btn:last-child {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
-  margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child,
-.input-append .btn-group:last-child > .dropdown-toggle {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .btn-group:first-child {
-  margin-left: 0;
-}
-
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-
-.control-group {
-  margin-bottom: 13px;
-}
-
-legend + .control-group {
-  margin-top: 26px;
-  -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
-  margin-bottom: 26px;
-  *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-horizontal .control-group:after {
-  clear: both;
-}
-
-.form-horizontal .control-label {
-  float: left;
-  width: 160px;
-  padding-top: 5px;
-  text-align: right;
-}
-
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 180px;
-  *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
-  *padding-left: 180px;
-}
-
-.form-horizontal .help-block {
-  margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
-  margin-top: 13px;
-}
-
-.form-horizontal .form-actions {
-  padding-left: 180px;
-}
-
-table {
-  max-width: 100%;
-  background-color: transparent;
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.table {
-  width: 100%;
-  margin-bottom: 26px;
-}
-
-.table th,
-.table td {
-  padding: 8px;
-  line-height: 26px;
-  text-align: left;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-
-.table th {
-  font-weight: bold;
-}
-
-.table thead th {
-  vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-
-.table .table {
-  background-color: #f6f6f6;
-}
-
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:first-child,
-.table-bordered tbody:first-child tr:first-child > td:first-child,
-.table-bordered tbody:first-child tr:first-child > th:first-child {
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered thead:first-child tr:first-child > th:last-child,
-.table-bordered tbody:first-child tr:first-child > td:last-child,
-.table-bordered tbody:first-child tr:first-child > th:last-child {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child > th:first-child,
-.table-bordered tbody:last-child tr:last-child > td:first-child,
-.table-bordered tbody:last-child tr:last-child > th:first-child,
-.table-bordered tfoot:last-child tr:last-child > td:first-child,
-.table-bordered tfoot:last-child tr:last-child > th:first-child {
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child > th:last-child,
-.table-bordered tbody:last-child tr:last-child > td:last-child,
-.table-bordered tbody:last-child tr:last-child > th:last-child,
-.table-bordered tfoot:last-child tr:last-child > td:last-child,
-.table-bordered tfoot:last-child tr:last-child > th:last-child {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
-  -webkit-border-bottom-left-radius: 0;
-          border-bottom-left-radius: 0;
-  -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 0;
-          border-bottom-right-radius: 0;
-  -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-}
-
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
-  background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
-  background-color: #f5f5f5;
-}
-
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-
-.table td.span1,
-.table th.span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-
-.table td.span2,
-.table th.span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-
-.table td.span3,
-.table th.span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-
-.table td.span4,
-.table th.span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-
-.table td.span5,
-.table th.span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-
-.table td.span6,
-.table th.span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-
-.table td.span7,
-.table th.span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-
-.table td.span8,
-.table th.span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-
-.table td.span9,
-.table th.span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-
-.table td.span10,
-.table th.span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-
-.table td.span11,
-.table th.span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-
-.table td.span12,
-.table th.span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-
-.table tbody tr.success > td {
-  background-color: #dff0d8;
-}
-
-.table tbody tr.error > td {
-  background-color: #f2dede;
-}
-
-.table tbody tr.warning > td {
-  background-color: #fcf8e3;
-}
-
-.table tbody tr.info > td {
-  background-color: #d9edf7;
-}
-
-.table-hover tbody tr.success:hover > td {
-  background-color: #d0e9c6;
-}
-
-.table-hover tbody tr.error:hover > td {
-  background-color: #ebcccc;
-}
-
-.table-hover tbody tr.warning:hover > td {
-  background-color: #faf2cc;
-}
-
-.table-hover tbody tr.info:hover > td {
-  background-color: #c4e3f3;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  margin-top: 1px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
-  background-position: 0      0;
-}
-
-.icon-music {
-  background-position: -24px 0;
-}
-
-.icon-search {
-  background-position: -48px 0;
-}
-
-.icon-envelope {
-  background-position: -72px 0;
-}
-
-.icon-heart {
-  background-position: -96px 0;
-}
-
-.icon-star {
-  background-position: -120px 0;
-}
-
-.icon-star-empty {
-  background-position: -144px 0;
-}
-
-.icon-user {
-  background-position: -168px 0;
-}
-
-.icon-film {
-  background-position: -192px 0;
-}
-
-.icon-th-large {
-  background-position: -216px 0;
-}
-
-.icon-th {
-  background-position: -240px 0;
-}
-
-.icon-th-list {
-  background-position: -264px 0;
-}
-
-.icon-ok {
-  background-position: -288px 0;
-}
-
-.icon-remove {
-  background-position: -312px 0;
-}
-
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-
-.icon-off {
-  background-position: -384px 0;
-}
-
-.icon-signal {
-  background-position: -408px 0;
-}
-
-.icon-cog {
-  background-position: -432px 0;
-}
-
-.icon-trash {
-  background-position: -456px 0;
-}
-
-.icon-home {
-  background-position: 0 -24px;
-}
-
-.icon-file {
-  background-position: -24px -24px;
-}
-
-.icon-time {
-  background-position: -48px -24px;
-}
-
-.icon-road {
-  background-position: -72px -24px;
-}
-
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-
-.icon-download {
-  background-position: -120px -24px;
-}
-
-.icon-upload {
-  background-position: -144px -24px;
-}
-
-.icon-inbox {
-  background-position: -168px -24px;
-}
-
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-
-.icon-repeat {
-  background-position: -216px -24px;
-}
-
-.icon-refresh {
-  background-position: -240px -24px;
-}
-
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-
-.icon-lock {
-  background-position: -287px -24px;
-}
-
-.icon-flag {
-  background-position: -312px -24px;
-}
-
-.icon-headphones {
-  background-position: -336px -24px;
-}
-
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-
-.icon-barcode {
-  background-position: -456px -24px;
-}
-
-.icon-tag {
-  background-position: 0 -48px;
-}
-
-.icon-tags {
-  background-position: -25px -48px;
-}
-
-.icon-book {
-  background-position: -48px -48px;
-}
-
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-
-.icon-print {
-  background-position: -96px -48px;
-}
-
-.icon-camera {
-  background-position: -120px -48px;
-}
-
-.icon-font {
-  background-position: -144px -48px;
-}
-
-.icon-bold {
-  background-position: -167px -48px;
-}
-
-.icon-italic {
-  background-position: -192px -48px;
-}
-
-.icon-text-height {
-  background-position: -216px -48px;
-}
-
-.icon-text-width {
-  background-position: -240px -48px;
-}
-
-.icon-align-left {
-  background-position: -264px -48px;
-}
-
-.icon-align-center {
-  background-position: -288px -48px;
-}
-
-.icon-align-right {
-  background-position: -312px -48px;
-}
-
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-
-.icon-list {
-  background-position: -360px -48px;
-}
-
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-
-.icon-picture {
-  background-position: -456px -48px;
-}
-
-.icon-pencil {
-  background-position: 0 -72px;
-}
-
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-
-.icon-adjust {
-  background-position: -48px -72px;
-}
-
-.icon-tint {
-  background-position: -72px -72px;
-}
-
-.icon-edit {
-  background-position: -96px -72px;
-}
-
-.icon-share {
-  background-position: -120px -72px;
-}
-
-.icon-check {
-  background-position: -144px -72px;
-}
-
-.icon-move {
-  background-position: -168px -72px;
-}
-
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-
-.icon-backward {
-  background-position: -240px -72px;
-}
-
-.icon-play {
-  background-position: -264px -72px;
-}
-
-.icon-pause {
-  background-position: -288px -72px;
-}
-
-.icon-stop {
-  background-position: -312px -72px;
-}
-
-.icon-forward {
-  background-position: -336px -72px;
-}
-
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-
-.icon-eject {
-  background-position: -408px -72px;
-}
-
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-
-.icon-plus {
-  background-position: -408px -96px;
-}
-
-.icon-minus {
-  background-position: -433px -96px;
-}
-
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-
-.icon-gift {
-  background-position: -24px -120px;
-}
-
-.icon-leaf {
-  background-position: -48px -120px;
-}
-
-.icon-fire {
-  background-position: -72px -120px;
-}
-
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-
-.icon-plane {
-  background-position: -168px -120px;
-}
-
-.icon-calendar {
-  background-position: -192px -120px;
-}
-
-.icon-random {
-  width: 16px;
-  background-position: -216px -120px;
-}
-
-.icon-comment {
-  background-position: -240px -120px;
-}
-
-.icon-magnet {
-  background-position: -264px -120px;
-}
-
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-
-.icon-retweet {
-  background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-
-.icon-folder-close {
-  width: 16px;
-  background-position: -384px -120px;
-}
-
-.icon-folder-open {
-  width: 16px;
-  background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-
-.icon-hdd {
-  background-position: 0 -144px;
-}
-
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-
-.icon-bell {
-  background-position: -48px -144px;
-}
-
-.icon-certificate {
-  background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-
-.icon-globe {
-  background-position: -336px -144px;
-}
-
-.icon-wrench {
-  background-position: -360px -144px;
-}
-
-.icon-tasks {
-  background-position: -384px -144px;
-}
-
-.icon-filter {
-  background-position: -408px -144px;
-}
-
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #f6f6f6;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 12px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu > li > a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 26px;
-  color: #333333;
-  white-space: nowrap;
-}
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #920001;
-  background-image: -moz-linear-gradient(top, #9c0001, #830001);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#9c0001), to(#830001));
-  background-image: -webkit-linear-gradient(top, #9c0001, #830001);
-  background-image: -o-linear-gradient(top, #9c0001, #830001);
-  background-image: linear-gradient(to bottom, #9c0001, #830001);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9c0001', endColorstr='#ff830001', GradientType=0);
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #920001;
-  background-image: -moz-linear-gradient(top, #9c0001, #830001);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#9c0001), to(#830001));
-  background-image: -webkit-linear-gradient(top, #9c0001, #830001);
-  background-image: -o-linear-gradient(top, #9c0001, #830001);
-  background-image: linear-gradient(to bottom, #9c0001, #830001);
-  background-repeat: repeat-x;
-  outline: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9c0001', endColorstr='#ff830001', GradientType=0);
-}
-
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  color: #999999;
-}
-
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.open {
-  *z-index: 1000;
-}
-
-.open > .dropdown-menu {
-  display: block;
-}
-
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-
-.dropdown-submenu {
-  position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-     -moz-border-radius: 0 6px 6px 6px;
-          border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
-  display: block;
-}
-
-.dropup .dropdown-submenu > .dropdown-menu {
-  top: auto;
-  bottom: 0;
-  margin-top: 0;
-  margin-bottom: -2px;
-  -webkit-border-radius: 5px 5px 5px 0;
-     -moz-border-radius: 5px 5px 5px 0;
-          border-radius: 5px 5px 5px 0;
-}
-
-.dropdown-submenu > a:after {
-  display: block;
-  float: right;
-  width: 0;
-  height: 0;
-  margin-top: 5px;
-  margin-right: -10px;
-  border-color: transparent;
-  border-left-color: #c3c3c3;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-
-.dropdown-submenu.pull-left {
-  float: none;
-}
-
-.dropdown-submenu.pull-left > .dropdown-menu {
-  left: -100%;
-  margin-left: 10px;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.dropdown .dropdown-menu .nav-header {
-  padding-right: 20px;
-  padding-left: 20px;
-}
-
-.typeahead {
-  z-index: 1051;
-  margin-top: 2px;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-     -moz-transition: opacity 0.15s linear;
-       -o-transition: opacity 0.15s linear;
-          transition: opacity 0.15s linear;
-}
-
-.fade.in {
-  opacity: 1;
-}
-
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition: height 0.35s ease;
-     -moz-transition: height 0.35s ease;
-       -o-transition: height 0.35s ease;
-          transition: height 0.35s ease;
-}
-
-.collapse.in {
-  height: auto;
-}
-
-.close {
-  float: right;
-  font-size: 20px;
-  font-weight: bold;
-  line-height: 26px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-
-.close:hover,
-.close:focus {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.btn {
-  display: inline-block;
-  *display: inline;
-  padding: 4px 12px;
-  margin-bottom: 0;
-  *margin-left: .3em;
-  font-size: 17px;
-  line-height: 26px;
-  color: #333333;
-  text-align: center;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  vertical-align: middle;
-  cursor: pointer;
-  background-color: #f5f5f5;
-  *background-color: #e6e6e6;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border: 1px solid #cccccc;
-  *border: 0;
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border-bottom-color: #b3b3b3;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:focus,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-
-.btn:first-child {
-  *margin-left: 0;
-}
-
-.btn:hover,
-.btn:focus {
-  color: #333333;
-  text-decoration: none;
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-     -moz-transition: background-position 0.1s linear;
-       -o-transition: background-position 0.1s linear;
-          transition: background-position 0.1s linear;
-}
-
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-large {
-  padding: 11px 19px;
-  font-size: 21.25px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
-  margin-top: 4px;
-}
-
-.btn-small {
-  padding: 2px 10px;
-  font-size: 14.45px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
-  margin-top: 0;
-}
-
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
-  margin-top: -1px;
-}
-
-.btn-mini {
-  padding: 0 6px;
-  font-size: 12.75px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #ab0001;
-  *background-color: #9c0001;
-  background-image: -moz-linear-gradient(top, #b60001, #9c0001);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b60001), to(#9c0001));
-  background-image: -webkit-linear-gradient(top, #b60001, #9c0001);
-  background-image: -o-linear-gradient(top, #b60001, #9c0001);
-  background-image: linear-gradient(to bottom, #b60001, #9c0001);
-  background-repeat: repeat-x;
-  border-color: #9c0001 #9c0001 #500001;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb60001', endColorstr='#ff9c0001', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #9c0001;
-  *background-color: #830001;
-}
-
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #690001 \9;
-}
-
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #f99a14;
-  *background-color: #f89406;
-  background-image: -moz-linear-gradient(top, #fa9f1e, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fa9f1e), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fa9f1e, #f89406);
-  background-image: -o-linear-gradient(top, #fa9f1e, #f89406);
-  background-image: linear-gradient(to bottom, #fa9f1e, #f89406);
-  background-repeat: repeat-x;
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffa9f1e', endColorstr='#fff89406', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #ab0001;
-  *background-color: #9c0001;
-  background-image: -moz-linear-gradient(top, #b60001, #9c0001);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b60001), to(#9c0001));
-  background-image: -webkit-linear-gradient(top, #b60001, #9c0001);
-  background-image: -o-linear-gradient(top, #b60001, #9c0001);
-  background-image: linear-gradient(to bottom, #b60001, #9c0001);
-  background-repeat: repeat-x;
-  border-color: #9c0001 #9c0001 #500001;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb60001', endColorstr='#ff9c0001', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #9c0001;
-  *background-color: #830001;
-}
-
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #690001 \9;
-}
-
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #1ea84d;
-  *background-color: #1c9b47;
-  background-image: -moz-linear-gradient(top, #20b151, #1c9b47);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#20b151), to(#1c9b47));
-  background-image: -webkit-linear-gradient(top, #20b151, #1c9b47);
-  background-image: -o-linear-gradient(top, #20b151, #1c9b47);
-  background-image: linear-gradient(to bottom, #20b151, #1c9b47);
-  background-repeat: repeat-x;
-  border-color: #1c9b47 #1c9b47 #105a29;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff20b151', endColorstr='#ff1c9b47', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #1c9b47;
-  *background-color: #18853d;
-}
-
-.btn-success:active,
-.btn-success.active {
-  background-color: #147033 \9;
-}
-
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006cbb;
-  *background-color: #0063ac;
-  background-image: -moz-linear-gradient(top, #0072c6, #0063ac);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0072c6), to(#0063ac));
-  background-image: -webkit-linear-gradient(top, #0072c6, #0063ac);
-  background-image: -o-linear-gradient(top, #0072c6, #0063ac);
-  background-image: linear-gradient(to bottom, #0072c6, #0063ac);
-  background-repeat: repeat-x;
-  border-color: #0063ac #0063ac #003760;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0072c6', endColorstr='#ff0063ac', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #0063ac;
-  *background-color: #005493;
-}
-
-.btn-info:active,
-.btn-info.active {
-  background-color: #004679 \9;
-}
-
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #3b3b3b;
-  *background-color: #333333;
-  background-image: -moz-linear-gradient(top, #404040, #333333);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#404040), to(#333333));
-  background-image: -webkit-linear-gradient(top, #404040, #333333);
-  background-image: -o-linear-gradient(top, #404040, #333333);
-  background-image: linear-gradient(to bottom, #404040, #333333);
-  background-repeat: repeat-x;
-  border-color: #333333 #333333 #0d0d0d;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff404040', endColorstr='#ff333333', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #333333;
-  *background-color: #262626;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #1a1a1a \9;
-}
-
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-link {
-  color: #9c0001;
-  cursor: pointer;
-  border-color: transparent;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-link:hover,
-.btn-link:focus {
-  color: #830001;
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
-  color: #333333;
-  text-decoration: none;
-}
-
-.btn-group {
-  position: relative;
-  display: inline-block;
-  *display: inline;
-  *margin-left: .3em;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.btn-group:first-child {
-  *margin-left: 0;
-}
-
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-toolbar {
-  margin-top: 13px;
-  margin-bottom: 13px;
-  font-size: 0;
-}
-
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
-  font-size: 17px;
-}
-
-.btn-group > .btn-mini {
-  font-size: 12.75px;
-}
-
-.btn-group > .btn-small {
-  font-size: 14.45px;
-}
-
-.btn-group > .btn-large {
-  font-size: 21.25px;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
-  *padding-top: 5px;
-  padding-right: 8px;
-  *padding-bottom: 5px;
-  padding-left: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
-  *padding-top: 2px;
-  padding-right: 5px;
-  *padding-bottom: 2px;
-  padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
-  *padding-top: 7px;
-  padding-right: 12px;
-  *padding-bottom: 7px;
-  padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #9c0001;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #9c0001;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #1c9b47;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #0063ac;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #333333;
-}
-
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-
-.btn-large .caret {
-  margin-top: 6px;
-}
-
-.btn-large .caret {
-  border-top-width: 5px;
-  border-right-width: 5px;
-  border-left-width: 5px;
-}
-
-.btn-mini .caret,
-.btn-small .caret {
-  margin-top: 8px;
-}
-
-.dropup .btn-large .caret {
-  border-bottom-width: 5px;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-
-.btn-group-vertical > .btn {
-  display: block;
-  float: none;
-  max-width: 100%;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group-vertical > .btn + .btn {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-vertical > .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical > .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical > .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-     -moz-border-radius: 6px 6px 0 0;
-          border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical > .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.alert {
-  padding: 8px 35px 8px 14px;
-  margin-bottom: 26px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.alert,
-.alert h4 {
-  color: #c09853;
-}
-
-.alert h4 {
-  margin: 0;
-}
-
-.alert .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  line-height: 26px;
-}
-
-.alert-success {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-
-.alert-success h4 {
-  color: #468847;
-}
-
-.alert-danger,
-.alert-error {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #eed3d7;
-}
-
-.alert-danger h4,
-.alert-error h4 {
-  color: #b94a48;
-}
-
-.alert-info {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-
-.alert-info h4 {
-  color: #3a87ad;
-}
-
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-
-.alert-block p + p {
-  margin-top: 5px;
-}
-
-.nav {
-  margin-bottom: 26px;
-  margin-left: 0;
-  list-style: none;
-}
-
-.nav > li > a {
-  display: block;
-}
-
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-
-.nav > li > a > img {
-  max-width: none;
-}
-
-.nav > .pull-right {
-  float: right;
-}
-
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 26px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-
-.nav-list {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-right: -15px;
-  margin-left: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #9c0001;
-}
-
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
-  margin-right: 2px;
-}
-
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 12px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  line-height: 26px;
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
-  color: #555555;
-  cursor: default;
-  background-color: #f6f6f6;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  -webkit-border-radius: 5px;
-     -moz-border-radius: 5px;
-          border-radius: 5px;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
-  color: #ffffff;
-  background-color: #9c0001;
-}
-
-.nav-stacked > li {
-  float: none;
-}
-
-.nav-stacked > li > a {
-  margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
-  z-index: 2;
-  border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
-  margin-top: 6px;
-  border-top-color: #9c0001;
-  border-bottom-color: #9c0001;
-}
-
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
-  border-top-color: #830001;
-  border-bottom-color: #830001;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
-  cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
-  border-color: #999999;
-}
-
-.tabbable {
-  *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.tabbable:after {
-  clear: both;
-}
-
-.tab-content {
-  overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
-  border-top-color: #ddd;
-  border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
-  border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 3px;
-}
-
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 19px;
-  border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
-  color: #999999;
-}
-
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-}
-
-.navbar {
-  *position: relative;
-  *z-index: 2;
-  margin-bottom: 26px;
-  overflow: visible;
-}
-
-.navbar-inner {
-  min-height: 60px;
-  padding-right: 20px;
-  padding-left: 20px;
-  background-color: #f6f6f6;
-  background-image: -moz-linear-gradient(top, #f6f6f6, #f6f6f6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f6f6f6), to(#f6f6f6));
-  background-image: -webkit-linear-gradient(top, #f6f6f6, #f6f6f6);
-  background-image: -o-linear-gradient(top, #f6f6f6, #f6f6f6);
-  background-image: linear-gradient(to bottom, #f6f6f6, #f6f6f6);
-  background-repeat: repeat-x;
-  border: 1px solid #d7d7d7;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#fff6f6f6', GradientType=0);
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-inner:after {
-  clear: both;
-}
-
-.navbar .container {
-  width: auto;
-}
-
-.nav-collapse.collapse {
-  height: auto;
-  overflow: visible;
-}
-
-.navbar .brand {
-  display: block;
-  float: left;
-  padding: 17px 20px 17px;
-  margin-left: -20px;
-  font-size: 20px;
-  font-weight: 200;
-  color: #333333;
-  text-shadow: 0 1px 0 #f6f6f6;
-}
-
-.navbar .brand:hover,
-.navbar .brand:focus {
-  text-decoration: none;
-}
-
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 60px;
-  color: #333333;
-}
-
-.navbar-link {
-  color: #333333;
-}
-
-.navbar-link:hover,
-.navbar-link:focus {
-  color: #333333;
-}
-
-.navbar .divider-vertical {
-  height: 60px;
-  margin: 0 9px;
-  border-right: 1px solid #f6f6f6;
-  border-left: 1px solid #f6f6f6;
-}
-
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 15px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
-  margin-top: 0;
-}
-
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-form:after {
-  clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 15px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 5px;
-  white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 15px;
-  margin-bottom: 0;
-}
-
-.navbar-search .search-query {
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.navbar-static-top {
-  position: static;
-  margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border-width: 0 0 1px;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  border-width: 1px 0 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.navbar-fixed-top {
-  top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
-  float: right;
-  margin-right: 0;
-}
-
-.navbar .nav > li {
-  float: left;
-}
-
-.navbar .nav > li > a {
-  float: none;
-  padding: 17px 15px 17px;
-  color: #333333;
-  text-decoration: none;
-  text-shadow: 0 1px 0 #f6f6f6;
-}
-
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #333333;
-  text-decoration: none;
-  background-color: #e9e9e9;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-right: 5px;
-  margin-left: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #e9e9e9;
-  *background-color: #e9e9e9;
-  background-image: -moz-linear-gradient(top, #e9e9e9, #e9e9e9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e9e9e9), to(#e9e9e9));
-  background-image: -webkit-linear-gradient(top, #e9e9e9, #e9e9e9);
-  background-image: -o-linear-gradient(top, #e9e9e9, #e9e9e9);
-  background-image: linear-gradient(to bottom, #e9e9e9, #e9e9e9);
-  background-repeat: repeat-x;
-  border-color: #e9e9e9 #e9e9e9 #c3c3c3;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe9e9e9', endColorstr='#ffe9e9e9', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #e9e9e9;
-  *background-color: #dcdcdc;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #d0d0d0 \9;
-}
-
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-     -moz-border-radius: 1px;
-          border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
-  position: absolute;
-  top: -7px;
-  left: 9px;
-  display: inline-block;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-left: 7px solid transparent;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
-  position: absolute;
-  top: -6px;
-  left: 10px;
-  display: inline-block;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #f6f6f6;
-  border-left: 6px solid transparent;
-  content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  top: auto;
-  bottom: -7px;
-  border-top: 7px solid #ccc;
-  border-bottom: 0;
-  border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  top: auto;
-  bottom: -6px;
-  border-top: 6px solid #f6f6f6;
-  border-bottom: 0;
-}
-
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
-  border-top-color: #333333;
-  border-bottom-color: #333333;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #333333;
-  background-color: #e9e9e9;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #333333;
-  border-bottom-color: #333333;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #333333;
-  border-bottom-color: #333333;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  right: 12px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  right: 13px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  right: 100%;
-  left: auto;
-  margin-right: -1px;
-  margin-left: 0;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse .navbar-inner {
-  background-color: #333333;
-  background-image: -moz-linear-gradient(top, #333333, #333333);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#333333));
-  background-image: -webkit-linear-gradient(top, #333333, #333333);
-  background-image: -o-linear-gradient(top, #333333, #333333);
-  background-image: linear-gradient(to bottom, #333333, #333333);
-  background-repeat: repeat-x;
-  border-color: #252525;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff333333', endColorstr='#ff333333', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .brand {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-text {
-  color: #999999;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-  background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #333333;
-}
-
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
-  border-right-color: #333333;
-  border-left-color: #333333;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #ffffff;
-  background-color: #333333;
-}
-
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #737373;
-  border-color: #333333;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-  -webkit-transition: none;
-     -moz-transition: none;
-       -o-transition: none;
-          transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  outline: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #262626;
-  *background-color: #262626;
-  background-image: -moz-linear-gradient(top, #262626, #262626);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#262626), to(#262626));
-  background-image: -webkit-linear-gradient(top, #262626, #262626);
-  background-image: -o-linear-gradient(top, #262626, #262626);
-  background-image: linear-gradient(to bottom, #262626, #262626);
-  background-repeat: repeat-x;
-  border-color: #262626 #262626 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626', endColorstr='#ff262626', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #262626;
-  *background-color: #1a1a1a;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #0d0d0d \9;
-}
-
-.breadcrumb {
-  padding: 8px 15px;
-  margin: 0 0 26px;
-  list-style: none;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.breadcrumb > li {
-  display: inline-block;
-  *display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-
-.breadcrumb > li > .divider {
-  padding: 0 5px;
-  color: #ccc;
-}
-
-.breadcrumb > .active {
-  color: #999999;
-}
-
-.pagination {
-  margin: 26px 0;
-}
-
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  margin-left: 0;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
-  display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
-  float: left;
-  padding: 4px 12px;
-  line-height: 26px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  color: #999999;
-  cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
-  color: #999999;
-  cursor: default;
-  background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
-  border-left-width: 1px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.pagination-centered {
-  text-align: center;
-}
-
-.pagination-right {
-  text-align: right;
-}
-
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
-  padding: 11px 19px;
-  font-size: 21.25px;
-}
-
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;
-}
-
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
-  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;
-}
-
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 3px;
-          border-bottom-left-radius: 3px;
-  -webkit-border-top-left-radius: 3px;
-          border-top-left-radius: 3px;
-  -moz-border-radius-bottomleft: 3px;
-  -moz-border-radius-topleft: 3px;
-}
-
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
-  -webkit-border-top-right-radius: 3px;
-          border-top-right-radius: 3px;
-  -webkit-border-bottom-right-radius: 3px;
-          border-bottom-right-radius: 3px;
-  -moz-border-radius-topright: 3px;
-  -moz-border-radius-bottomright: 3px;
-}
-
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
-  padding: 2px 10px;
-  font-size: 14.45px;
-}
-
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
-  padding: 0 6px;
-  font-size: 12.75px;
-}
-
-.pager {
-  margin: 26px 0;
-  text-align: center;
-  list-style: none;
-  *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.pager:after {
-  clear: both;
-}
-
-.pager li {
-  display: inline;
-}
-
-.pager li > a,
-.pager li > span {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.pager li > a:hover,
-.pager li > a:focus {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-
-.pager .next > a,
-.pager .next > span {
-  float: right;
-}
-
-.pager .previous > a,
-.pager .previous > span {
-  float: left;
-}
-
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
-  color: #999999;
-  cursor: default;
-  background-color: #fff;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.modal {
-  position: fixed;
-  top: 10%;
-  left: 50%;
-  z-index: 1050;
-  width: 560px;
-  margin-left: -280px;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-
-.modal.fade {
-  top: -25%;
-  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
-     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
-       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
-          transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
-  top: 10%;
-}
-
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
-  margin-top: 2px;
-}
-
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-
-.modal-body {
-  position: relative;
-  max-height: 400px;
-  padding: 15px;
-  overflow-y: auto;
-}
-
-.modal-form {
-  margin-bottom: 0;
-}
-
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-     -moz-box-shadow: inset 0 1px 0 #ffffff;
-          box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.modal-footer:after {
-  clear: both;
-}
-
-.modal-footer .btn + .btn {
-  margin-bottom: 0;
-  margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-
-.modal-footer .btn-block + .btn-block {
-  margin-left: 0;
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  font-size: 11px;
-  line-height: 1.4;
-  opacity: 0;
-  filter: alpha(opacity=0);
-  visibility: visible;
-}
-
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.tooltip.top {
-  padding: 5px 0;
-  margin-top: -3px;
-}
-
-.tooltip.right {
-  padding: 0 5px;
-  margin-left: 3px;
-}
-
-.tooltip.bottom {
-  padding: 5px 0;
-  margin-top: 3px;
-}
-
-.tooltip.left {
-  padding: 0 5px;
-  margin-left: -3px;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-top-color: #000000;
-  border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-right-color: #000000;
-  border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-left-color: #000000;
-  border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-bottom-color: #000000;
-  border-width: 0 5px 5px;
-}
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1010;
-  display: none;
-  max-width: 276px;
-  padding: 1px;
-  text-align: left;
-  white-space: normal;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.popover.top {
-  margin-top: -10px;
-}
-
-.popover.right {
-  margin-left: 10px;
-}
-
-.popover.bottom {
-  margin-top: 10px;
-}
-
-.popover.left {
-  margin-left: -10px;
-}
-
-.popover-title {
-  padding: 8px 14px;
-  margin: 0;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-     -moz-border-radius: 5px 5px 0 0;
-          border-radius: 5px 5px 0 0;
-}
-
-.popover-title:empty {
-  display: none;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover .arrow {
-  border-width: 11px;
-}
-
-.popover .arrow:after {
-  border-width: 10px;
-  content: "";
-}
-
-.popover.top .arrow {
-  bottom: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-top-color: #999;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  border-bottom-width: 0;
-}
-
-.popover.top .arrow:after {
-  bottom: 1px;
-  margin-left: -10px;
-  border-top-color: #ffffff;
-  border-bottom-width: 0;
-}
-
-.popover.right .arrow {
-  top: 50%;
-  left: -11px;
-  margin-top: -11px;
-  border-right-color: #999;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  border-left-width: 0;
-}
-
-.popover.right .arrow:after {
-  bottom: -10px;
-  left: 1px;
-  border-right-color: #ffffff;
-  border-left-width: 0;
-}
-
-.popover.bottom .arrow {
-  top: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-bottom-color: #999;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  border-top-width: 0;
-}
-
-.popover.bottom .arrow:after {
-  top: 1px;
-  margin-left: -10px;
-  border-bottom-color: #ffffff;
-  border-top-width: 0;
-}
-
-.popover.left .arrow {
-  top: 50%;
-  right: -11px;
-  margin-top: -11px;
-  border-left-color: #999;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  border-right-width: 0;
-}
-
-.popover.left .arrow:after {
-  right: 1px;
-  bottom: -10px;
-  border-left-color: #ffffff;
-  border-right-width: 0;
-}
-
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.thumbnails:after {
-  clear: both;
-}
-
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-
-.thumbnails > li {
-  float: left;
-  margin-bottom: 26px;
-  margin-left: 20px;
-}
-
-.thumbnail {
-  display: block;
-  padding: 4px;
-  line-height: 26px;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-     -moz-transition: all 0.2s ease-in-out;
-       -o-transition: all 0.2s ease-in-out;
-          transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover,
-a.thumbnail:focus {
-  border-color: #9c0001;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.thumbnail .caption {
-  padding: 9px;
-  color: #555555;
-}
-
-.media,
-.media-body {
-  overflow: hidden;
-  *overflow: visible;
-  zoom: 1;
-}
-
-.media,
-.media .media {
-  margin-top: 15px;
-}
-
-.media:first-child {
-  margin-top: 0;
-}
-
-.media-object {
-  display: block;
-}
-
-.media-heading {
-  margin: 0 0 5px;
-}
-
-.media > .pull-left {
-  margin-right: 10px;
-}
-
-.media > .pull-right {
-  margin-left: 10px;
-}
-
-.media-list {
-  margin-left: 0;
-  list-style: none;
-}
-
-.label,
-.badge {
-  display: inline-block;
-  padding: 2px 4px;
-  font-size: 14.382px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  white-space: nowrap;
-  vertical-align: baseline;
-  background-color: #999999;
-}
-
-.label {
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.badge {
-  padding-right: 9px;
-  padding-left: 9px;
-  -webkit-border-radius: 9px;
-     -moz-border-radius: 9px;
-          border-radius: 9px;
-}
-
-.label:empty,
-.badge:empty {
-  display: none;
-}
-
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
-
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-.progress {
-  height: 26px;
-  margin-bottom: 26px;
-  overflow: hidden;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
-  float: left;
-  width: 0;
-  height: 100%;
-  font-size: 12px;
-  color: #ffffff;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-     -moz-transition: width 0.6s ease;
-       -o-transition: width 0.6s ease;
-          transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-     -moz-background-size: 40px 40px;
-       -o-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-     -moz-animation: progress-bar-stripes 2s linear infinite;
-      -ms-animation: progress-bar-stripes 2s linear infinite;
-       -o-animation: progress-bar-stripes 2s linear infinite;
-          animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.accordion {
-  margin-bottom: 26px;
-}
-
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.accordion-heading {
-  border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-
-.accordion-toggle {
-  cursor: pointer;
-}
-
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
-  position: relative;
-  margin-bottom: 26px;
-  line-height: 1;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-inner > .item {
-  position: relative;
-  display: none;
-  -webkit-transition: 0.6s ease-in-out left;
-     -moz-transition: 0.6s ease-in-out left;
-       -o-transition: 0.6s ease-in-out left;
-          transition: 0.6s ease-in-out left;
-}
-
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
-  display: block;
-  line-height: 1;
-}
-
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  display: block;
-}
-
-.carousel-inner > .active {
-  left: 0;
-}
-
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-
-.carousel-inner > .next {
-  left: 100%;
-}
-
-.carousel-inner > .prev {
-  left: -100%;
-}
-
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
-  left: 0;
-}
-
-.carousel-inner > .active.left {
-  left: -100%;
-}
-
-.carousel-inner > .active.right {
-  left: 100%;
-}
-
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-     -moz-border-radius: 23px;
-          border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
-  right: 15px;
-  left: auto;
-}
-
-.carousel-control:hover,
-.carousel-control:focus {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-
-.carousel-indicators {
-  position: absolute;
-  top: 15px;
-  right: 15px;
-  z-index: 5;
-  margin: 0;
-  list-style: none;
-}
-
-.carousel-indicators li {
-  display: block;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin-left: 5px;
-  text-indent: -999px;
-  background-color: #ccc;
-  background-color: rgba(255, 255, 255, 0.25);
-  border-radius: 5px;
-}
-
-.carousel-indicators .active {
-  background-color: #fff;
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
-  line-height: 26px;
-  color: #ffffff;
-}
-
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-
-.carousel-caption p {
-  margin-bottom: 0;
-}
-
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 39px;
-  color: inherit;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  letter-spacing: -1px;
-  color: inherit;
-}
-
-.hero-unit li {
-  line-height: 39px;
-}
-
-.pull-right {
-  float: right;
-}
-
-.pull-left {
-  float: left;
-}
-
-.hide {
-  display: none;
-}
-
-.show {
-  display: block;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-.affix {
-  position: fixed;
-}
-
-div.subnav .nav > li > a,
-div.subnav .nav > .active > a,
-div.subnav .nav > .active > a:hover {
-  color: #333333;
-}
-
-div.subnav-fixed {
-  top: 61px;
-}
-
-.hero-unit h1,
-.hero-unit h2,
-.hero-unit h3,
-.hero-unit h4,
-.hero-unit h5,
-.hero-unit h6 {
-  margin: 13px 0;
-}
-
-.pull-right {
-  float: right;
-}
-
-.pull-left {
-  float: left;
-}
-
-.hide {
-  display: none;
-}
-
-.show {
-  display: block;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-.affix {
-  position: fixed;
-}
diff --git a/dashboard/lib/static/HospitalCosts/lib/bootstrap.js b/dashboard/lib/static/HospitalCosts/lib/bootstrap.js
deleted file mode 100755
index a81171b..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/bootstrap.js
+++ /dev/null
@@ -1,2268 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
-  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
-   * ======================================================= */
-
-  $(function () {
-
-    $.support.transition = (function () {
-
-      var transitionEnd = (function () {
-
-        var el = document.createElement('bootstrap')
-          , transEndEventNames = {
-               'WebkitTransition' : 'webkitTransitionEnd'
-            ,  'MozTransition'    : 'transitionend'
-            ,  'OTransition'      : 'oTransitionEnd otransitionend'
-            ,  'transition'       : 'transitionend'
-            }
-          , name
-
-        for (name in transEndEventNames){
-          if (el.style[name] !== undefined) {
-            return transEndEventNames[name]
-          }
-        }
-
-      }())
-
-      return transitionEnd && {
-        end: transitionEnd
-      }
-
-    })()
-
-  })
-
-}(window.jQuery);/* ==========================================================
- * bootstrap-alert.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* ALERT CLASS DEFINITION
-  * ====================== */
-
-  var dismiss = '[data-dismiss="alert"]'
-    , Alert = function (el) {
-        $(el).on('click', dismiss, this.close)
-      }
-
-  Alert.prototype.close = function (e) {
-    var $this = $(this)
-      , selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = $(selector)
-
-    e && e.preventDefault()
-
-    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
-
-    $parent.trigger(e = $.Event('close'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      $parent
-        .trigger('closed')
-        .remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent.on($.support.transition.end, removeElement) :
-      removeElement()
-  }
-
-
- /* ALERT PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.alert
-
-  $.fn.alert = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('alert')
-      if (!data) $this.data('alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.alert.Constructor = Alert
-
-
- /* ALERT NO CONFLICT
-  * ================= */
-
-  $.fn.alert.noConflict = function () {
-    $.fn.alert = old
-    return this
-  }
-
-
- /* ALERT DATA-API
-  * ============== */
-
-  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
-
-}(window.jQuery);/* ============================================================
- * bootstrap-button.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* BUTTON PUBLIC CLASS DEFINITION
-  * ============================== */
-
-  var Button = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.button.defaults, options)
-  }
-
-  Button.prototype.setState = function (state) {
-    var d = 'disabled'
-      , $el = this.$element
-      , data = $el.data()
-      , val = $el.is('input') ? 'val' : 'html'
-
-    state = state + 'Text'
-    data.resetText || $el.data('resetText', $el[val]())
-
-    $el[val](data[state] || this.options[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout(function () {
-      state == 'loadingText' ?
-        $el.addClass(d).attr(d, d) :
-        $el.removeClass(d).removeAttr(d)
-    }, 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
-
-    $parent && $parent
-      .find('.active')
-      .removeClass('active')
-
-    this.$element.toggleClass('active')
-  }
-
-
- /* BUTTON PLUGIN DEFINITION
-  * ======================== */
-
-  var old = $.fn.button
-
-  $.fn.button = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('button')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('button', (data = new Button(this, options)))
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  $.fn.button.defaults = {
-    loadingText: 'loading...'
-  }
-
-  $.fn.button.Constructor = Button
-
-
- /* BUTTON NO CONFLICT
-  * ================== */
-
-  $.fn.button.noConflict = function () {
-    $.fn.button = old
-    return this
-  }
-
-
- /* BUTTON DATA-API
-  * =============== */
-
-  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
-    var $btn = $(e.target)
-    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-    $btn.button('toggle')
-  })
-
-}(window.jQuery);/* ==========================================================
- * bootstrap-carousel.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* CAROUSEL CLASS DEFINITION
-  * ========================= */
-
-  var Carousel = function (element, options) {
-    this.$element = $(element)
-    this.$indicators = this.$element.find('.carousel-indicators')
-    this.options = options
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter', $.proxy(this.pause, this))
-      .on('mouseleave', $.proxy(this.cycle, this))
-  }
-
-  Carousel.prototype = {
-
-    cycle: function (e) {
-      if (!e) this.paused = false
-      if (this.interval) clearInterval(this.interval);
-      this.options.interval
-        && !this.paused
-        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-      return this
-    }
-
-  , getActiveIndex: function () {
-      this.$active = this.$element.find('.item.active')
-      this.$items = this.$active.parent().children()
-      return this.$items.index(this.$active)
-    }
-
-  , to: function (pos) {
-      var activeIndex = this.getActiveIndex()
-        , that = this
-
-      if (pos > (this.$items.length - 1) || pos < 0) return
-
-      if (this.sliding) {
-        return this.$element.one('slid', function () {
-          that.to(pos)
-        })
-      }
-
-      if (activeIndex == pos) {
-        return this.pause().cycle()
-      }
-
-      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
-    }
-
-  , pause: function (e) {
-      if (!e) this.paused = true
-      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
-        this.$element.trigger($.support.transition.end)
-        this.cycle()
-      }
-      clearInterval(this.interval)
-      this.interval = null
-      return this
-    }
-
-  , next: function () {
-      if (this.sliding) return
-      return this.slide('next')
-    }
-
-  , prev: function () {
-      if (this.sliding) return
-      return this.slide('prev')
-    }
-
-  , slide: function (type, next) {
-      var $active = this.$element.find('.item.active')
-        , $next = next || $active[type]()
-        , isCycling = this.interval
-        , direction = type == 'next' ? 'left' : 'right'
-        , fallback  = type == 'next' ? 'first' : 'last'
-        , that = this
-        , e
-
-      this.sliding = true
-
-      isCycling && this.pause()
-
-      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
-
-      e = $.Event('slide', {
-        relatedTarget: $next[0]
-      , direction: direction
-      })
-
-      if ($next.hasClass('active')) return
-
-      if (this.$indicators.length) {
-        this.$indicators.find('.active').removeClass('active')
-        this.$element.one('slid', function () {
-          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
-          $nextIndicator && $nextIndicator.addClass('active')
-        })
-      }
-
-      if ($.support.transition && this.$element.hasClass('slide')) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $next.addClass(type)
-        $next[0].offsetWidth // force reflow
-        $active.addClass(direction)
-        $next.addClass(direction)
-        this.$element.one($.support.transition.end, function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () { that.$element.trigger('slid') }, 0)
-        })
-      } else {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $active.removeClass('active')
-        $next.addClass('active')
-        this.sliding = false
-        this.$element.trigger('slid')
-      }
-
-      isCycling && this.cycle()
-
-      return this
-    }
-
-  }
-
-
- /* CAROUSEL PLUGIN DEFINITION
-  * ========================== */
-
-  var old = $.fn.carousel
-
-  $.fn.carousel = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('carousel')
-        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
-        , action = typeof option == 'string' ? option : options.slide
-      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (action) data[action]()
-      else if (options.interval) data.pause().cycle()
-    })
-  }
-
-  $.fn.carousel.defaults = {
-    interval: 5000
-  , pause: 'hover'
-  }
-
-  $.fn.carousel.Constructor = Carousel
-
-
- /* CAROUSEL NO CONFLICT
-  * ==================== */
-
-  $.fn.carousel.noConflict = function () {
-    $.fn.carousel = old
-    return this
-  }
-
- /* CAROUSEL DATA-API
-  * ================= */
-
-  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
-    var $this = $(this), href
-      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      , options = $.extend({}, $target.data(), $this.data())
-      , slideIndex
-
-    $target.carousel(options)
-
-    if (slideIndex = $this.attr('data-slide-to')) {
-      $target.data('carousel').pause().to(slideIndex).cycle()
-    }
-
-    e.preventDefault()
-  })
-
-}(window.jQuery);/* =============================================================
- * bootstrap-collapse.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
-  * ================================ */
-
-  var Collapse = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.collapse.defaults, options)
-
-    if (this.options.parent) {
-      this.$parent = $(this.options.parent)
-    }
-
-    this.options.toggle && this.toggle()
-  }
-
-  Collapse.prototype = {
-
-    constructor: Collapse
-
-  , dimension: function () {
-      var hasWidth = this.$element.hasClass('width')
-      return hasWidth ? 'width' : 'height'
-    }
-
-  , show: function () {
-      var dimension
-        , scroll
-        , actives
-        , hasData
-
-      if (this.transitioning || this.$element.hasClass('in')) return
-
-      dimension = this.dimension()
-      scroll = $.camelCase(['scroll', dimension].join('-'))
-      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
-
-      if (actives && actives.length) {
-        hasData = actives.data('collapse')
-        if (hasData && hasData.transitioning) return
-        actives.collapse('hide')
-        hasData || actives.data('collapse', null)
-      }
-
-      this.$element[dimension](0)
-      this.transition('addClass', $.Event('show'), 'shown')
-      $.support.transition && this.$element[dimension](this.$element[0][scroll])
-    }
-
-  , hide: function () {
-      var dimension
-      if (this.transitioning || !this.$element.hasClass('in')) return
-      dimension = this.dimension()
-      this.reset(this.$element[dimension]())
-      this.transition('removeClass', $.Event('hide'), 'hidden')
-      this.$element[dimension](0)
-    }
-
-  , reset: function (size) {
-      var dimension = this.dimension()
-
-      this.$element
-        .removeClass('collapse')
-        [dimension](size || 'auto')
-        [0].offsetWidth
-
-      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
-
-      return this
-    }
-
-  , transition: function (method, startEvent, completeEvent) {
-      var that = this
-        , complete = function () {
-            if (startEvent.type == 'show') that.reset()
-            that.transitioning = 0
-            that.$element.trigger(completeEvent)
-          }
-
-      this.$element.trigger(startEvent)
-
-      if (startEvent.isDefaultPrevented()) return
-
-      this.transitioning = 1
-
-      this.$element[method]('in')
-
-      $.support.transition && this.$element.hasClass('collapse') ?
-        this.$element.one($.support.transition.end, complete) :
-        complete()
-    }
-
-  , toggle: function () {
-      this[this.$element.hasClass('in') ? 'hide' : 'show']()
-    }
-
-  }
-
-
- /* COLLAPSE PLUGIN DEFINITION
-  * ========================== */
-
-  var old = $.fn.collapse
-
-  $.fn.collapse = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('collapse')
-        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.collapse.defaults = {
-    toggle: true
-  }
-
-  $.fn.collapse.Constructor = Collapse
-
-
- /* COLLAPSE NO CONFLICT
-  * ==================== */
-
-  $.fn.collapse.noConflict = function () {
-    $.fn.collapse = old
-    return this
-  }
-
-
- /* COLLAPSE DATA-API
-  * ================= */
-
-  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
-    var $this = $(this), href
-      , target = $this.attr('data-target')
-        || e.preventDefault()
-        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
-      , option = $(target).data('collapse') ? 'toggle' : $this.data()
-    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
-    $(target).collapse(option)
-  })
-
-}(window.jQuery);/* ============================================================
- * bootstrap-dropdown.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* DROPDOWN CLASS DEFINITION
-  * ========================= */
-
-  var toggle = '[data-toggle=dropdown]'
-    , Dropdown = function (element) {
-        var $el = $(element).on('click.dropdown.data-api', this.toggle)
-        $('html').on('click.dropdown.data-api', function () {
-          $el.parent().removeClass('open')
-        })
-      }
-
-  Dropdown.prototype = {
-
-    constructor: Dropdown
-
-  , toggle: function (e) {
-      var $this = $(this)
-        , $parent
-        , isActive
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      clearMenus()
-
-      if (!isActive) {
-        $parent.toggleClass('open')
-      }
-
-      $this.focus()
-
-      return false
-    }
-
-  , keydown: function (e) {
-      var $this
-        , $items
-        , $active
-        , $parent
-        , isActive
-        , index
-
-      if (!/(38|40|27)/.test(e.keyCode)) return
-
-      $this = $(this)
-
-      e.preventDefault()
-      e.stopPropagation()
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      if (!isActive || (isActive && e.keyCode == 27)) {
-        if (e.which == 27) $parent.find(toggle).focus()
-        return $this.click()
-      }
-
-      $items = $('[role=menu] li:not(.divider):visible a', $parent)
-
-      if (!$items.length) return
-
-      index = $items.index($items.filter(':focus'))
-
-      if (e.keyCode == 38 && index > 0) index--                                        // up
-      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
-      if (!~index) index = 0
-
-      $items
-        .eq(index)
-        .focus()
-    }
-
-  }
-
-  function clearMenus() {
-    $(toggle).each(function () {
-      getParent($(this)).removeClass('open')
-    })
-  }
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = selector && $(selector)
-
-    if (!$parent || !$parent.length) $parent = $this.parent()
-
-    return $parent
-  }
-
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  var old = $.fn.dropdown
-
-  $.fn.dropdown = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('dropdown')
-      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
- /* DROPDOWN NO CONFLICT
-  * ==================== */
-
-  $.fn.dropdown.noConflict = function () {
-    $.fn.dropdown = old
-    return this
-  }
-
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  $(document)
-    .on('click.dropdown.data-api', clearMenus)
-    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
-    .on('.dropdown-menu', function (e) { e.stopPropagation() })
-    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
-    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
-
-}(window.jQuery);
-/* =========================================================
- * bootstrap-modal.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* MODAL CLASS DEFINITION
-  * ====================== */
-
-  var Modal = function (element, options) {
-    this.options = options
-    this.$element = $(element)
-      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
-    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
-  }
-
-  Modal.prototype = {
-
-      constructor: Modal
-
-    , toggle: function () {
-        return this[!this.isShown ? 'show' : 'hide']()
-      }
-
-    , show: function () {
-        var that = this
-          , e = $.Event('show')
-
-        this.$element.trigger(e)
-
-        if (this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = true
-
-        this.escape()
-
-        this.backdrop(function () {
-          var transition = $.support.transition && that.$element.hasClass('fade')
-
-          if (!that.$element.parent().length) {
-            that.$element.appendTo(document.body) //don't move modals dom position
-          }
-
-          that.$element.show()
-
-          if (transition) {
-            that.$element[0].offsetWidth // force reflow
-          }
-
-          that.$element
-            .addClass('in')
-            .attr('aria-hidden', false)
-
-          that.enforceFocus()
-
-          transition ?
-            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
-            that.$element.focus().trigger('shown')
-
-        })
-      }
-
-    , hide: function (e) {
-        e && e.preventDefault()
-
-        var that = this
-
-        e = $.Event('hide')
-
-        this.$element.trigger(e)
-
-        if (!this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = false
-
-        this.escape()
-
-        $(document).off('focusin.modal')
-
-        this.$element
-          .removeClass('in')
-          .attr('aria-hidden', true)
-
-        $.support.transition && this.$element.hasClass('fade') ?
-          this.hideWithTransition() :
-          this.hideModal()
-      }
-
-    , enforceFocus: function () {
-        var that = this
-        $(document).on('focusin.modal', function (e) {
-          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
-            that.$element.focus()
-          }
-        })
-      }
-
-    , escape: function () {
-        var that = this
-        if (this.isShown && this.options.keyboard) {
-          this.$element.on('keyup.dismiss.modal', function ( e ) {
-            e.which == 27 && that.hide()
-          })
-        } else if (!this.isShown) {
-          this.$element.off('keyup.dismiss.modal')
-        }
-      }
-
-    , hideWithTransition: function () {
-        var that = this
-          , timeout = setTimeout(function () {
-              that.$element.off($.support.transition.end)
-              that.hideModal()
-            }, 500)
-
-        this.$element.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          that.hideModal()
-        })
-      }
-
-    , hideModal: function () {
-        var that = this
-        this.$element.hide()
-        this.backdrop(function () {
-          that.removeBackdrop()
-          that.$element.trigger('hidden')
-        })
-      }
-
-    , removeBackdrop: function () {
-        this.$backdrop.remove()
-        this.$backdrop = null
-      }
-
-    , backdrop: function (callback) {
-        var that = this
-          , animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-        if (this.isShown && this.options.backdrop) {
-          var doAnimate = $.support.transition && animate
-
-          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-            .appendTo(document.body)
-
-          this.$backdrop.click(
-            this.options.backdrop == 'static' ?
-              $.proxy(this.$element[0].focus, this.$element[0])
-            : $.proxy(this.hide, this)
-          )
-
-          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-          this.$backdrop.addClass('in')
-
-          if (!callback) return
-
-          doAnimate ?
-            this.$backdrop.one($.support.transition.end, callback) :
-            callback()
-
-        } else if (!this.isShown && this.$backdrop) {
-          this.$backdrop.removeClass('in')
-
-          $.support.transition && this.$element.hasClass('fade')?
-            this.$backdrop.one($.support.transition.end, callback) :
-            callback()
-
-        } else if (callback) {
-          callback()
-        }
-      }
-  }
-
-
- /* MODAL PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.modal
-
-  $.fn.modal = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('modal')
-        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option]()
-      else if (options.show) data.show()
-    })
-  }
-
-  $.fn.modal.defaults = {
-      backdrop: true
-    , keyboard: true
-    , show: true
-  }
-
-  $.fn.modal.Constructor = Modal
-
-
- /* MODAL NO CONFLICT
-  * ================= */
-
-  $.fn.modal.noConflict = function () {
-    $.fn.modal = old
-    return this
-  }
-
-
- /* MODAL DATA-API
-  * ============== */
-
-  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
-    var $this = $(this)
-      , href = $this.attr('href')
-      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
-      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
-
-    e.preventDefault()
-
-    $target
-      .modal(option)
-      .one('hide', function () {
-        $this.focus()
-      })
-  })
-
-}(window.jQuery);
-/* ===========================================================
- * bootstrap-tooltip.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Tooltip = function (element, options) {
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.prototype = {
-
-    constructor: Tooltip
-
-  , init: function (type, element, options) {
-      var eventIn
-        , eventOut
-        , triggers
-        , trigger
-        , i
-
-      this.type = type
-      this.$element = $(element)
-      this.options = this.getOptions(options)
-      this.enabled = true
-
-      triggers = this.options.trigger.split(' ')
-
-      for (i = triggers.length; i--;) {
-        trigger = triggers[i]
-        if (trigger == 'click') {
-          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-        } else if (trigger != 'manual') {
-          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
-          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
-          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-        }
-      }
-
-      this.options.selector ?
-        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-        this.fixTitle()
-    }
-
-  , getOptions: function (options) {
-      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
-
-      if (options.delay && typeof options.delay == 'number') {
-        options.delay = {
-          show: options.delay
-        , hide: options.delay
-        }
-      }
-
-      return options
-    }
-
-  , enter: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (!self.options.delay || !self.options.delay.show) return self.show()
-
-      clearTimeout(this.timeout)
-      self.hoverState = 'in'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'in') self.show()
-      }, self.options.delay.show)
-    }
-
-  , leave: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (this.timeout) clearTimeout(this.timeout)
-      if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-      self.hoverState = 'out'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'out') self.hide()
-      }, self.options.delay.hide)
-    }
-
-  , show: function () {
-      var $tip
-        , pos
-        , actualWidth
-        , actualHeight
-        , placement
-        , tp
-        , e = $.Event('show')
-
-      if (this.hasContent() && this.enabled) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $tip = this.tip()
-        this.setContent()
-
-        if (this.options.animation) {
-          $tip.addClass('fade')
-        }
-
-        placement = typeof this.options.placement == 'function' ?
-          this.options.placement.call(this, $tip[0], this.$element[0]) :
-          this.options.placement
-
-        $tip
-          .detach()
-          .css({ top: 0, left: 0, display: 'block' })
-
-        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
-        pos = this.getPosition()
-
-        actualWidth = $tip[0].offsetWidth
-        actualHeight = $tip[0].offsetHeight
-
-        switch (placement) {
-          case 'bottom':
-            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'top':
-            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'left':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
-            break
-          case 'right':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
-            break
-        }
-
-        this.applyPlacement(tp, placement)
-        this.$element.trigger('shown')
-      }
-    }
-
-  , applyPlacement: function(offset, placement){
-      var $tip = this.tip()
-        , width = $tip[0].offsetWidth
-        , height = $tip[0].offsetHeight
-        , actualWidth
-        , actualHeight
-        , delta
-        , replace
-
-      $tip
-        .offset(offset)
-        .addClass(placement)
-        .addClass('in')
-
-      actualWidth = $tip[0].offsetWidth
-      actualHeight = $tip[0].offsetHeight
-
-      if (placement == 'top' && actualHeight != height) {
-        offset.top = offset.top + height - actualHeight
-        replace = true
-      }
-
-      if (placement == 'bottom' || placement == 'top') {
-        delta = 0
-
-        if (offset.left < 0){
-          delta = offset.left * -2
-          offset.left = 0
-          $tip.offset(offset)
-          actualWidth = $tip[0].offsetWidth
-          actualHeight = $tip[0].offsetHeight
-        }
-
-        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
-      } else {
-        this.replaceArrow(actualHeight - height, actualHeight, 'top')
-      }
-
-      if (replace) $tip.offset(offset)
-    }
-
-  , replaceArrow: function(delta, dimension, position){
-      this
-        .arrow()
-        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
-    }
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-
-      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-      $tip.removeClass('fade in top bottom left right')
-    }
-
-  , hide: function () {
-      var that = this
-        , $tip = this.tip()
-        , e = $.Event('hide')
-
-      this.$element.trigger(e)
-      if (e.isDefaultPrevented()) return
-
-      $tip.removeClass('in')
-
-      function removeWithAnimation() {
-        var timeout = setTimeout(function () {
-          $tip.off($.support.transition.end).detach()
-        }, 500)
-
-        $tip.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          $tip.detach()
-        })
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        removeWithAnimation() :
-        $tip.detach()
-
-      this.$element.trigger('hidden')
-
-      return this
-    }
-
-  , fixTitle: function () {
-      var $e = this.$element
-      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
-        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
-      }
-    }
-
-  , hasContent: function () {
-      return this.getTitle()
-    }
-
-  , getPosition: function () {
-      var el = this.$element[0]
-      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
-        width: el.offsetWidth
-      , height: el.offsetHeight
-      }, this.$element.offset())
-    }
-
-  , getTitle: function () {
-      var title
-        , $e = this.$element
-        , o = this.options
-
-      title = $e.attr('data-original-title')
-        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-      return title
-    }
-
-  , tip: function () {
-      return this.$tip = this.$tip || $(this.options.template)
-    }
-
-  , arrow: function(){
-      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
-    }
-
-  , validate: function () {
-      if (!this.$element[0].parentNode) {
-        this.hide()
-        this.$element = null
-        this.options = null
-      }
-    }
-
-  , enable: function () {
-      this.enabled = true
-    }
-
-  , disable: function () {
-      this.enabled = false
-    }
-
-  , toggleEnabled: function () {
-      this.enabled = !this.enabled
-    }
-
-  , toggle: function (e) {
-      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
-      self.tip().hasClass('in') ? self.hide() : self.show()
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  }
-
-
- /* TOOLTIP PLUGIN DEFINITION
-  * ========================= */
-
-  var old = $.fn.tooltip
-
-  $.fn.tooltip = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tooltip')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tooltip.Constructor = Tooltip
-
-  $.fn.tooltip.defaults = {
-    animation: true
-  , placement: 'top'
-  , selector: false
-  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
-  , trigger: 'hover focus'
-  , title: ''
-  , delay: 0
-  , html: false
-  , container: false
-  }
-
-
- /* TOOLTIP NO CONFLICT
-  * =================== */
-
-  $.fn.tooltip.noConflict = function () {
-    $.fn.tooltip = old
-    return this
-  }
-
-}(window.jQuery);
-/* ===========================================================
- * bootstrap-popover.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* POPOVER PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-
-  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
-     ========================================== */
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
-
-    constructor: Popover
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-        , content = this.getContent()
-
-      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
-
-      $tip.removeClass('fade top bottom left right in')
-    }
-
-  , hasContent: function () {
-      return this.getTitle() || this.getContent()
-    }
-
-  , getContent: function () {
-      var content
-        , $e = this.$element
-        , o = this.options
-
-      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
-        || $e.attr('data-content')
-
-      return content
-    }
-
-  , tip: function () {
-      if (!this.$tip) {
-        this.$tip = $(this.options.template)
-      }
-      return this.$tip
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  })
-
-
- /* POPOVER PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.popover
-
-  $.fn.popover = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('popover')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.popover.Constructor = Popover
-
-  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
-    placement: 'right'
-  , trigger: 'click'
-  , content: ''
-  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
-  })
-
-
- /* POPOVER NO CONFLICT
-  * =================== */
-
-  $.fn.popover.noConflict = function () {
-    $.fn.popover = old
-    return this
-  }
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-scrollspy.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* SCROLLSPY CLASS DEFINITION
-  * ========================== */
-
-  function ScrollSpy(element, options) {
-    var process = $.proxy(this.process, this)
-      , $element = $(element).is('body') ? $(window) : $(element)
-      , href
-    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
-    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
-    this.selector = (this.options.target
-      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      || '') + ' .nav li > a'
-    this.$body = $('body')
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.prototype = {
-
-      constructor: ScrollSpy
-
-    , refresh: function () {
-        var self = this
-          , $targets
-
-        this.offsets = $([])
-        this.targets = $([])
-
-        $targets = this.$body
-          .find(this.selector)
-          .map(function () {
-            var $el = $(this)
-              , href = $el.data('target') || $el.attr('href')
-              , $href = /^#\w/.test(href) && $(href)
-            return ( $href
-              && $href.length
-              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
-          })
-          .sort(function (a, b) { return a[0] - b[0] })
-          .each(function () {
-            self.offsets.push(this[0])
-            self.targets.push(this[1])
-          })
-      }
-
-    , process: function () {
-        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
-          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
-          , maxScroll = scrollHeight - this.$scrollElement.height()
-          , offsets = this.offsets
-          , targets = this.targets
-          , activeTarget = this.activeTarget
-          , i
-
-        if (scrollTop >= maxScroll) {
-          return activeTarget != (i = targets.last()[0])
-            && this.activate ( i )
-        }
-
-        for (i = offsets.length; i--;) {
-          activeTarget != targets[i]
-            && scrollTop >= offsets[i]
-            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-            && this.activate( targets[i] )
-        }
-      }
-
-    , activate: function (target) {
-        var active
-          , selector
-
-        this.activeTarget = target
-
-        $(this.selector)
-          .parent('.active')
-          .removeClass('active')
-
-        selector = this.selector
-          + '[data-target="' + target + '"],'
-          + this.selector + '[href="' + target + '"]'
-
-        active = $(selector)
-          .parent('li')
-          .addClass('active')
-
-        if (active.parent('.dropdown-menu').length)  {
-          active = active.closest('li.dropdown').addClass('active')
-        }
-
-        active.trigger('activate')
-      }
-
-  }
-
-
- /* SCROLLSPY PLUGIN DEFINITION
-  * =========================== */
-
-  var old = $.fn.scrollspy
-
-  $.fn.scrollspy = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('scrollspy')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-  $.fn.scrollspy.defaults = {
-    offset: 10
-  }
-
-
- /* SCROLLSPY NO CONFLICT
-  * ===================== */
-
-  $.fn.scrollspy.noConflict = function () {
-    $.fn.scrollspy = old
-    return this
-  }
-
-
- /* SCROLLSPY DATA-API
-  * ================== */
-
-  $(window).on('load', function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      $spy.scrollspy($spy.data())
-    })
-  })
-
-}(window.jQuery);/* ========================================================
- * bootstrap-tab.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TAB CLASS DEFINITION
-  * ==================== */
-
-  var Tab = function (element) {
-    this.element = $(element)
-  }
-
-  Tab.prototype = {
-
-    constructor: Tab
-
-  , show: function () {
-      var $this = this.element
-        , $ul = $this.closest('ul:not(.dropdown-menu)')
-        , selector = $this.attr('data-target')
-        , previous
-        , $target
-        , e
-
-      if (!selector) {
-        selector = $this.attr('href')
-        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-      }
-
-      if ( $this.parent('li').hasClass('active') ) return
-
-      previous = $ul.find('.active:last a')[0]
-
-      e = $.Event('show', {
-        relatedTarget: previous
-      })
-
-      $this.trigger(e)
-
-      if (e.isDefaultPrevented()) return
-
-      $target = $(selector)
-
-      this.activate($this.parent('li'), $ul)
-      this.activate($target, $target.parent(), function () {
-        $this.trigger({
-          type: 'shown'
-        , relatedTarget: previous
-        })
-      })
-    }
-
-  , activate: function ( element, container, callback) {
-      var $active = container.find('> .active')
-        , transition = callback
-            && $.support.transition
-            && $active.hasClass('fade')
-
-      function next() {
-        $active
-          .removeClass('active')
-          .find('> .dropdown-menu > .active')
-          .removeClass('active')
-
-        element.addClass('active')
-
-        if (transition) {
-          element[0].offsetWidth // reflow for transition
-          element.addClass('in')
-        } else {
-          element.removeClass('fade')
-        }
-
-        if ( element.parent('.dropdown-menu') ) {
-          element.closest('li.dropdown').addClass('active')
-        }
-
-        callback && callback()
-      }
-
-      transition ?
-        $active.one($.support.transition.end, next) :
-        next()
-
-      $active.removeClass('in')
-    }
-  }
-
-
- /* TAB PLUGIN DEFINITION
-  * ===================== */
-
-  var old = $.fn.tab
-
-  $.fn.tab = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tab')
-      if (!data) $this.data('tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tab.Constructor = Tab
-
-
- /* TAB NO CONFLICT
-  * =============== */
-
-  $.fn.tab.noConflict = function () {
-    $.fn.tab = old
-    return this
-  }
-
-
- /* TAB DATA-API
-  * ============ */
-
-  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-    e.preventDefault()
-    $(this).tab('show')
-  })
-
-}(window.jQuery);/* =============================================================
- * bootstrap-typeahead.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function($){
-
-  "use strict"; // jshint ;_;
-
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
-  * ================================= */
-
-  var Typeahead = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.typeahead.defaults, options)
-    this.matcher = this.options.matcher || this.matcher
-    this.sorter = this.options.sorter || this.sorter
-    this.highlighter = this.options.highlighter || this.highlighter
-    this.updater = this.options.updater || this.updater
-    this.source = this.options.source
-    this.$menu = $(this.options.menu)
-    this.shown = false
-    this.listen()
-  }
-
-  Typeahead.prototype = {
-
-    constructor: Typeahead
-
-  , select: function () {
-      var val = this.$menu.find('.active').attr('data-value')
-      this.$element
-        .val(this.updater(val))
-        .change()
-      return this.hide()
-    }
-
-  , updater: function (item) {
-      return item
-    }
-
-  , show: function () {
-      var pos = $.extend({}, this.$element.position(), {
-        height: this.$element[0].offsetHeight
-      })
-
-      this.$menu
-        .insertAfter(this.$element)
-        .css({
-          top: pos.top + pos.height
-        , left: pos.left
-        })
-        .show()
-
-      this.shown = true
-      return this
-    }
-
-  , hide: function () {
-      this.$menu.hide()
-      this.shown = false
-      return this
-    }
-
-  , lookup: function (event) {
-      var items
-
-      this.query = this.$element.val()
-
-      if (!this.query || this.query.length < this.options.minLength) {
-        return this.shown ? this.hide() : this
-      }
-
-      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
-
-      return items ? this.process(items) : this
-    }
-
-  , process: function (items) {
-      var that = this
-
-      items = $.grep(items, function (item) {
-        return that.matcher(item)
-      })
-
-      items = this.sorter(items)
-
-      if (!items.length) {
-        return this.shown ? this.hide() : this
-      }
-
-      return this.render(items.slice(0, this.options.items)).show()
-    }
-
-  , matcher: function (item) {
-      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
-    }
-
-  , sorter: function (items) {
-      var beginswith = []
-        , caseSensitive = []
-        , caseInsensitive = []
-        , item
-
-      while (item = items.shift()) {
-        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
-        else if (~item.indexOf(this.query)) caseSensitive.push(item)
-        else caseInsensitive.push(item)
-      }
-
-      return beginswith.concat(caseSensitive, caseInsensitive)
-    }
-
-  , highlighter: function (item) {
-      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
-      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
-        return '<strong>' + match + '</strong>'
-      })
-    }
-
-  , render: function (items) {
-      var that = this
-
-      items = $(items).map(function (i, item) {
-        i = $(that.options.item).attr('data-value', item)
-        i.find('a').html(that.highlighter(item))
-        return i[0]
-      })
-
-      items.first().addClass('active')
-      this.$menu.html(items)
-      return this
-    }
-
-  , next: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , next = active.next()
-
-      if (!next.length) {
-        next = $(this.$menu.find('li')[0])
-      }
-
-      next.addClass('active')
-    }
-
-  , prev: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , prev = active.prev()
-
-      if (!prev.length) {
-        prev = this.$menu.find('li').last()
-      }
-
-      prev.addClass('active')
-    }
-
-  , listen: function () {
-      this.$element
-        .on('focus',    $.proxy(this.focus, this))
-        .on('blur',     $.proxy(this.blur, this))
-        .on('keypress', $.proxy(this.keypress, this))
-        .on('keyup',    $.proxy(this.keyup, this))
-
-      if (this.eventSupported('keydown')) {
-        this.$element.on('keydown', $.proxy(this.keydown, this))
-      }
-
-      this.$menu
-        .on('click', $.proxy(this.click, this))
-        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
-        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
-    }
-
-  , eventSupported: function(eventName) {
-      var isSupported = eventName in this.$element
-      if (!isSupported) {
-        this.$element.setAttribute(eventName, 'return;')
-        isSupported = typeof this.$element[eventName] === 'function'
-      }
-      return isSupported
-    }
-
-  , move: function (e) {
-      if (!this.shown) return
-
-      switch(e.keyCode) {
-        case 9: // tab
-        case 13: // enter
-        case 27: // escape
-          e.preventDefault()
-          break
-
-        case 38: // up arrow
-          e.preventDefault()
-          this.prev()
-          break
-
-        case 40: // down arrow
-          e.preventDefault()
-          this.next()
-          break
-      }
-
-      e.stopPropagation()
-    }
-
-  , keydown: function (e) {
-      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
-      this.move(e)
-    }
-
-  , keypress: function (e) {
-      if (this.suppressKeyPressRepeat) return
-      this.move(e)
-    }
-
-  , keyup: function (e) {
-      switch(e.keyCode) {
-        case 40: // down arrow
-        case 38: // up arrow
-        case 16: // shift
-        case 17: // ctrl
-        case 18: // alt
-          break
-
-        case 9: // tab
-        case 13: // enter
-          if (!this.shown) return
-          this.select()
-          break
-
-        case 27: // escape
-          if (!this.shown) return
-          this.hide()
-          break
-
-        default:
-          this.lookup()
-      }
-
-      e.stopPropagation()
-      e.preventDefault()
-  }
-
-  , focus: function (e) {
-      this.focused = true
-    }
-
-  , blur: function (e) {
-      this.focused = false
-      if (!this.mousedover && this.shown) this.hide()
-    }
-
-  , click: function (e) {
-      e.stopPropagation()
-      e.preventDefault()
-      this.select()
-      this.$element.focus()
-    }
-
-  , mouseenter: function (e) {
-      this.mousedover = true
-      this.$menu.find('.active').removeClass('active')
-      $(e.currentTarget).addClass('active')
-    }
-
-  , mouseleave: function (e) {
-      this.mousedover = false
-      if (!this.focused && this.shown) this.hide()
-    }
-
-  }
-
-
-  /* TYPEAHEAD PLUGIN DEFINITION
-   * =========================== */
-
-  var old = $.fn.typeahead
-
-  $.fn.typeahead = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('typeahead')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.typeahead.defaults = {
-    source: []
-  , items: 8
-  , menu: '<ul class="typeahead dropdown-menu"></ul>'
-  , item: '<li><a href="#"></a></li>'
-  , minLength: 1
-  }
-
-  $.fn.typeahead.Constructor = Typeahead
-
-
- /* TYPEAHEAD NO CONFLICT
-  * =================== */
-
-  $.fn.typeahead.noConflict = function () {
-    $.fn.typeahead = old
-    return this
-  }
-
-
- /* TYPEAHEAD DATA-API
-  * ================== */
-
-  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
-    var $this = $(this)
-    if ($this.data('typeahead')) return
-    $this.typeahead($this.data())
-  })
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-affix.js v2.3.0
- * http://twitter.github.com/bootstrap/javascript.html#affix
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* AFFIX CLASS DEFINITION
-  * ====================== */
-
-  var Affix = function (element, options) {
-    this.options = $.extend({}, $.fn.affix.defaults, options)
-    this.$window = $(window)
-      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
-      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
-    this.$element = $(element)
-    this.checkPosition()
-  }
-
-  Affix.prototype.checkPosition = function () {
-    if (!this.$element.is(':visible')) return
-
-    var scrollHeight = $(document).height()
-      , scrollTop = this.$window.scrollTop()
-      , position = this.$element.offset()
-      , offset = this.options.offset
-      , offsetBottom = offset.bottom
-      , offsetTop = offset.top
-      , reset = 'affix affix-top affix-bottom'
-      , affix
-
-    if (typeof offset != 'object') offsetBottom = offsetTop = offset
-    if (typeof offsetTop == 'function') offsetTop = offset.top()
-    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
-    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
-      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
-      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
-      'top'    : false
-
-    if (this.affixed === affix) return
-
-    this.affixed = affix
-    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
-
-    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
-  }
-
-
- /* AFFIX PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.affix
-
-  $.fn.affix = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('affix')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('affix', (data = new Affix(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.affix.Constructor = Affix
-
-  $.fn.affix.defaults = {
-    offset: 0
-  }
-
-
- /* AFFIX NO CONFLICT
-  * ================= */
-
-  $.fn.affix.noConflict = function () {
-    $.fn.affix = old
-    return this
-  }
-
-
- /* AFFIX DATA-API
-  * ============== */
-
-  $(window).on('load', function () {
-    $('[data-spy="affix"]').each(function () {
-      var $spy = $(this)
-        , data = $spy.data()
-
-      data.offset = data.offset || {}
-
-      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
-      data.offsetTop && (data.offset.top = data.offsetTop)
-
-      $spy.affix(data)
-    })
-  })
-
-
-}(window.jQuery);
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/lib/d3.v3.min.js b/dashboard/lib/static/HospitalCosts/lib/d3.v3.min.js
deleted file mode 100755
index b3a2968..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/d3.v3.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function a(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function o(){}function c(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function l(){oa.event.stopPropagation(),oa.event.preventDefault()}function f(){for(var n,t=oa.event;n=t.sourceEvent;)t=n;return t}function s(n){for(var t=new o,e=0,r=arguments.length;++e<r;)t[arguments[e]]=c(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=oa.event;u.target=n,oa.event=u,t[u.type].apply(e,r)}finally{oa.event=i}}},t}function h(n,t){var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>ma&&(la.scrollX||la.scrollY)){e=oa.select(ca.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();ma=!(u.f||u.e),e.remove()}return ma?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function g(n){for(var t=-1,e=n.length,r=[];++t<e;)r.push(n[t]);return r}function p(n){return Array.prototype.slice.call(n)}function d(n){return Ma(n,Ea),n}function m(n){return function(){return xa(n,this)}}function v(n){return function(){return ba(n,this)}}function y(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=oa.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?o:a:n.local?i:u}function M(n){return n.trim().replace(/\s+/g," ")}function x(n){return RegExp("(?:^|\\s+)"+oa.requote(n)+"(?:\\s+|$)","g")}function _(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\s+/).map(w);var u=n.length;return"function"==typeof t?r:e}function w(n){var t=x(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",M(u+" "+n))):e.setAttribute("class",M(u.replace(t," ")))}}function S(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function E(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function k(n){return{__data__:n}}function A(n){return function(){return Sa(this,n)}}function q(n){return arguments.length||(n=oa.ascending),function(t,e){return!t-!e||n(t.__data__,e.__data__)}}function N(){}function T(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function u(){var u=c(t,va(arguments));r.call(this),this.addEventListener(n,this[a]=u,u.$=e),u._=t}function i(){var t,e=RegExp("^__on([^.]+)"+oa.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var a="__on"+n,o=n.indexOf("."),c=C;o>0&&(n=n.substring(0,o));var l=qa.get(n);return l&&(n=l,c=z),o?t?u:r:t?N:i}function C(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function z(n,t){var e=C(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||r.compareDocumentPosition(t)&8)||e.call(t,n)}}function D(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function j(n){return Ma(n,Na),n}function L(){}function F(n,t,e){return new H(n,t,e)}function H(n,t,e){this.h=n,this.s=t,this.l=e}function P(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(r(n)*255)}var i,a;return n%=360,0>n&&(n+=360),t=0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,tt(u(n+120),u(n),u(n-120))}function R(n){return n>0?1:0>n?-1:0}function O(n){return Math.acos(Math.max(-1,Math.min(1,n)))}function Y(n){return n>1?La/2:-1>n?-La/2:Math.asin(n)}function U(n){return(Math.exp(n)-Math.exp(-n))/2}function I(n){return(Math.exp(n)+Math.exp(-n))/2}function V(n){return(n=Math.sin(n/2))*n}function X(n,t,e){return new Z(n,t,e)}function Z(n,t,e){this.h=n,this.c=t,this.l=e}function B(n,t,e){return $(e,Math.cos(n*=Ha)*t,Math.sin(n)*t)}function $(n,t,e){return new J(n,t,e)}function J(n,t,e){this.l=n,this.a=t,this.b=e}function G(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=W(u)*Ya,r=W(r)*Ua,i=W(i)*Ia,tt(nt(3.2404542*u-1.5371385*r-.4985314*i),nt(-.969266*u+1.8760108*r+.041556*i),nt(.0556434*u-.2040259*r+1.0572252*i))}function K(n,t,e){return X(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n)}function W(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function Q(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function nt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.r=n,this.g=t,this.b=e}function rt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function ut(n,t,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(ct(u[0]),ct(u[1]),ct(u[2]))}return(i=Za.get(n))?t(i.r,i.g,i.b):(null!=n&&n.charAt(0)==="#"&&(n.length===4?(a=n.charAt(1),a+=a,o=n.charAt(2),o+=o,c=n.charAt(3),c+=c):n.length===7&&(a=n.substring(1,3),o=n.substring(3,5),c=n.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),t(a,o,c))}function it(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):u=r=0,F(r,u,c)}function at(n,t,e){n=ot(n),t=ot(t),e=ot(e);var r=Q((.4124564*n+.3575761*t+.1804375*e)/Ya),u=Q((.2126729*n+.7151522*t+.072175*e)/Ua),i=Q((.0193339*n+.119192*t+.9503041*e)/Ia);return $(116*u-16,500*(r-u),200*(u-i))}function ot(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function ct(n){var t=parseFloat(n);return n.charAt(n.length-1)==="%"?Math.round(2.55*t):t}function lt(n){return"function"==typeof n?n:function(){return n}}function ft(n){return n}function st(n){return n.length===1?function(t,e){n(null==t?e:null)}:n}function ht(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=oa.xhr(n,t,i);return a.row=function(n){return arguments.length?a.response((e=n)==null?r:u(n)):e},a.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function a(t){return t.map(o).join(n)}function o(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(f>=c)return a;if(u)return u=!1,i;var t=f;if(n.charCodeAt(t)===34){for(var e=t;e++<c;)if(n.charCodeAt(e)===34){if(n.charCodeAt(e+1)!==34)break;++e}f=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,n.charCodeAt(e+2)===10&&++f):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>f;){var r=n.charCodeAt(f++),o=1;if(10===r)u=!0;else if(13===r)u=!0,n.charCodeAt(f)===10&&(++f,++o);else if(r!==l)continue;return n.substring(t,f-o)}return n.substring(t)}for(var r,u,i={},a={},o=[],c=n.length,f=0,s=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!t||(h=t(h,s++)))&&o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(a).join("\n")},e}function gt(){for(var n,t=Date.now(),e=Ka;e;)n=t-e.then,n>=e.delay&&(e.flush=e.callback(n)),e=e.next;var r=pt()-t;r>24?(isFinite(r)&&(clearTimeout($a),$a=setTimeout(gt,r)),Ba=0):(Ba=1,Wa(gt))}function pt(){for(var n=null,t=Ka,e=1/0;t;)t.flush?(delete Ga[t.callback.id],t=n?n.next=t.next:Ka=t.next):(e=Math.min(e,t.then+t.delay),t=(n=t).next);return e}function dt(n,t){var e=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function mt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function vt(n){return n+""}function yt(n,t){co.hasOwnProperty(n.type)&&co[n.type](n,t)}function Mt(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1]);t.lineEnd()}function xt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Mt(n[e],t,1);t.polygonEnd()}function bt(){function n(n,t){n*=Ha,t=t*Ha/2+La/4;var e=n-r,a=Math.cos(t),o=Math.sin(t),c=i*o,l=fo,f=so,s=u*a+c*Math.cos(e),h=c*Math.sin(e);fo=l*s-f*h,so=f*s+l*h,r=n,u=a,i=o}var t,e,r,u,i;ho.point=function(a,o){ho.point=n,r=(t=a)*Ha,u=Math.cos(o=(e=o)*Ha/2+La/4),i=Math.sin(o)},ho.lineEnd=function(){n(t,e)}}function _t(n){function t(n,t){r>n&&(r=n),n>i&&(i=n),u>t&&(u=t),t>a&&(a=t)}function e(){o.point=o.lineEnd=N}var r,u,i,a,o={point:t,lineStart:N,lineEnd:N,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=t}};return function(t){return a=i=-(r=u=1/0),oa.geo.stream(t,n(o)),[[r,u],[i,a]]}}function wt(n,t){if(!go){++po,n*=Ha;var e=Math.cos(t*=Ha);mo+=(e*Math.cos(n)-mo)/po,vo+=(e*Math.sin(n)-vo)/po,yo+=(Math.sin(t)-yo)/po}}function St(){var n,t;go=1,Et(),go=2;var e=Mo.point;Mo.point=function(r,u){e(n=r,t=u)},Mo.lineEnd=function(){Mo.point(n,t),kt(),Mo.lineEnd=kt}}function Et(){function n(n,u){n*=Ha;var i=Math.cos(u*=Ha),a=i*Math.cos(n),o=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-t*c)*l+(l=t*o-e*a)*l),t*a+e*o+r*c);po+=l,mo+=l*(t+(t=a)),vo+=l*(e+(e=o)),yo+=l*(r+(r=c))}var t,e,r;go>1||(1>go&&(go=1,po=mo=vo=yo=0),Mo.point=function(u,i){u*=Ha;var a=Math.cos(i*=Ha);t=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),Mo.point=n})}function kt(){Mo.point=wt}function At(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function qt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function Nt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Tt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Ct(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function zt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Dt(){return!0}function jt(n){return[Math.atan2(n[1],n[0]),Math.asin(Math.max(-1,Math.min(1,n[2])))]}function Lt(n,t){return Math.abs(n[0]-t[0])<Fa&&Math.abs(n[1]-t[1])<Fa}function Ft(n,t,e,r,u){var i=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(Lt(e,r)){u.lineStart();for(var o=0;t>o;++o)u.point((e=n[o])[0],e[1]);return u.lineEnd(),void 0}var c={point:e,points:n,other:null,visited:!1,entry:!0,subject:!0},l={point:e,points:[e],other:c,visited:!1,entry:!1,subject:!1};c.other=l,i.push(c),a.push(l),c={point:r,points:[r],other:null,visited:!1,entry:!1,subject:!0},l={point:r,points:[r],other:c,visited:!1,entry:!0,subject:!1},c.other=l,i.push(c),a.push(l)}}),a.sort(t),Ht(i),Ht(a),i.length){if(e)for(var o=1,c=!e(a[0].point),l=a.length;l>o;++o)a[o].entry=c=!c;for(var f,s,h,g=i[0];;){for(f=g;f.visited;)if((f=f.next)===g)return;s=f.points,u.lineStart();do{if(f.visited=f.other.visited=!0,f.entry){if(f.subject)for(var o=0;o<s.length;o++)u.point((h=s[o])[0],h[1]);else r(f.point,f.next.point,1,u);f=f.next}else{if(f.subject){s=f.prev.points;for(var o=s.length;--o>=0;)u.point((h=s[o])[0],h[1])}else r(f.point,f.prev.point,-1,u);f=f.prev}f=f.other,s=f.points}while(!f.visited);u.lineEnd()}}}function Ht(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.next=e=n[r],e.prev=u,u=e;u.next=e=n[0],e.prev=u}}function Pt(n,t,e){return function(r){function u(t,e){n(t,e)&&r.point(t,e)}function i(n,t){m.point(n,t)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(n,t){M.point(n,t),d.push([n,t])}function l(){M.lineStart(),d=[]}function f(){c(d[0][0],d[0][1]),M.lineEnd();var n,t=M.clean(),e=y.buffer(),u=e.length;if(!u)return p=!0,g+=Yt(d,-1),d=null,void 0;if(d=null,1&t){n=e[0],h+=Yt(n,1);var i,u=n.length-1,a=-1;for(r.lineStart();++a<u;)r.point((i=n[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&t&&e.push(e.pop().concat(e.shift())),s.push(e.filter(Rt))}var s,h,g,p,d,m=t(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=f,p=!1,g=h=0,s=[],r.polygonStart()},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,s=oa.merge(s),s.length?Ft(s,Ut,null,e,r):(-Fa>h||p&&-Fa>g)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),s=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=Ot(),M=t(y);return v}}function Rt(n){return n.length>1}function Ot(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:N,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Yt(n,t){if(!(e=n.length))return 0;for(var e,r,u,i=0,a=0,o=n[0],c=o[0],l=o[1],f=Math.cos(l),s=Math.atan2(t*Math.sin(c)*f,Math.sin(l)),h=1-t*Math.cos(c)*f,g=s;++i<e;)o=n[i],f=Math.cos(l=o[1]),r=Math.atan2(t*Math.sin(c=o[0])*f,Math.sin(l)),u=1-t*Math.cos(c)*f,Math.abs(h-2)<Fa&&Math.abs(u-2)<Fa||(Math.abs(u)<Fa||Math.abs(h)<Fa||(Math.abs(Math.abs(r-s)-La)<Fa?u+h>2&&(a+=4*(r-s)):a+=Math.abs(h-2)<Fa?4*(r-g):((3*La+r-s)%(2*La)-La)*(h+u)),g=s,s=r,h=u);return a}function Ut(n,t){return((n=n.point)[0]<0?n[1]-La/2-Fa:La/2-n[1])-((t=t.point)[0]<0?t[1]-La/2-Fa:La/2-t[1])}function It(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?La:-La,c=Math.abs(i-e);Math.abs(c-La)<Fa?(n.point(e,r=(r+a)/2>0?La/2:-La/2),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&c>=La&&(Math.abs(e-u)<Fa&&(e-=u*Fa),Math.abs(i-o)<Fa&&(i-=o*Fa),r=Vt(e,r,i,a),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=i,r=a),u=o},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Vt(n,t,e,r){var u,i,a=Math.sin(n-e);return Math.abs(a)>Fa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Xt(n,t,e,r){var u;if(null==n)u=e*La/2,r.point(-La,u),r.point(0,u),r.point(La,u),r.point(La,0),r.point(La,-u),r.point(0,-u),r.point(-La,-u),r.point(-La,0),r.point(-La,u);else if(Math.abs(n[0]-t[0])>Fa){var i=(n[0]<t[0]?1:-1)*La;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Zt(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,f;return{lineStart:function(){l=c=!1,f=1},point:function(s,h){var g,p=[s,h],d=t(s,h),m=a?d?0:u(s,h):d?u(s+(0>s?La:-La),h):0;if(!e&&(l=c=d)&&n.lineStart(),d!==c&&(g=r(e,p),(Lt(e,g)||Lt(p,g))&&(p[0]+=Fa,p[1]+=Fa,d=t(p[0],p[1]))),d!==c)f=0,d?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^d){var v;m&i||!(v=r(p,e,!0))||(f=0,a?(n.lineStart(),n.point(v[0][0],v[0][1]),n.point(v[1][0],v[1][1]),n.lineEnd()):(n.point(v[1][0],v[1][1]),n.lineEnd(),n.lineStart(),n.point(v[0][0],v[0][1])))}!d||e&&Lt(e,p)||n.point(p[0],p[1]),e=p,c=d,i=m},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return f|(l&&c)<<1}}}function r(n,t,e){var r=At(n),u=At(t),a=[1,0,0],o=Nt(r,u),c=qt(o,o),l=o[0],f=c-l*l;if(!f)return!e&&n;var s=i*c/f,h=-i*l/f,g=Nt(a,o),p=Ct(a,s),d=Ct(o,h);Tt(p,d);var m=g,v=qt(p,m),y=qt(m,m),M=v*v-y*(qt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Ct(m,(-v-x)/y);if(Tt(b,p),b=jt(b),!e)return b;var _,w=n[0],S=t[0],E=n[1],k=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,q=Math.abs(A-La)<Fa,N=q||Fa>A;if(!q&&E>k&&(_=E,E=k,k=_),N?q?E+k>0^b[1]<(Math.abs(b[0]-w)<Fa?E:k):E<=b[1]&&b[1]<=k:A>La^(w<=b[0]&&b[0]<=S)){var T=Ct(m,(-v+x)/y);return Tt(T,p),[b,jt(T)]}}}function u(t,e){var r=a?n:La-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Math.abs(i)>Fa,c=ie(n,6*Ha);return Pt(t,e,c)}function Bt(n,t,e,r){function u(r,u){return Math.abs(r[0]-n)<Fa?u>0?0:3:Math.abs(r[0]-e)<Fa?u>0?2:1:Math.abs(r[1]-t)<Fa?u>0?1:0:u>0?3:2}function i(n,t){return a(n.point,t.point)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}function o(u,i){var a=i[0]-u[0],o=i[1]-u[1],c=[0,1];return Math.abs(a)<Fa&&Math.abs(o)<Fa?n<=u[0]&&u[0]<=e&&t<=u[1]&&u[1]<=r:$t(n-u[0],a,c)&&$t(u[0]-e,-a,c)&&$t(t-u[1],o,c)&&$t(u[1]-r,-o,c)?(c[1]<1&&(i[0]=u[0]+c[1]*a,i[1]=u[1]+c[1]*o),c[0]>0&&(u[0]+=c[0]*a,u[1]+=c[0]*o),!0):!1}return function(c){function l(i){var a=u(i,-1),o=f([0===a||3===a?n:e,a>1?r:t]);return o}function f(n){for(var t=0,e=M.length,r=n[1],u=0;e>u;++u)for(var i=1,a=M[u],o=a.length,c=a[0];o>i;++i)b=a[i],c[1]<=r?b[1]>r&&s(c,b,n)>0&&++t:b[1]<=r&&s(c,b,n)<0&&--t,c=b;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function h(i,o,c,l){var f=0,s=0;if(null==i||(f=u(i,c))!==(s=u(o,c))||a(i,o)<0^c>0){do l.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+c+4)%4)!==s)}else l.point(o[0],o[1])}function g(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function p(n,t){g(n,t)&&c.point(n,t)}function d(){C.point=v,M&&M.push(x=[]),q=!0,A=!1,E=k=0/0}function m(){y&&(v(_,w),S&&A&&T.rejoin(),y.push(T.buffer())),C.point=p,A&&c.lineEnd()}function v(n,t){n=Math.max(-bo,Math.min(bo,n)),t=Math.max(-bo,Math.min(bo,t));var e=g(n,t);if(M&&x.push([n,t]),q)_=n,w=t,S=e,q=!1,e&&(c.lineStart(),c.point(n,t));else if(e&&A)c.point(n,t);else{var r=[E,k],u=[n,t];o(r,u)?(A||(c.lineStart(),c.point(r[0],r[1])),c.point(u[0],u[1]),e||c.lineEnd()):(c.lineStart(),c.point(n,t))}E=n,k=t,A=e}var y,M,x,_,w,S,E,k,A,q,N=c,T=Ot(),C={point:p,lineStart:d,lineEnd:m,polygonStart:function(){c=T,y=[],M=[]},polygonEnd:function(){c=N,(y=oa.merge(y)).length?(c.polygonStart(),Ft(y,i,l,h,c),c.polygonEnd()):f([n,t])&&(c.polygonStart(),c.lineStart(),h(null,null,1,c),c.lineEnd(),c.polygonEnd()),y=M=x=null}};return C}}function $t(n,t,e){if(Math.abs(t)<Fa)return 0>=n;var r=n/t;if(t>0){if(r>e[1])return!1;r>e[0]&&(e[0]=r)}else{if(r<e[0])return!1;r<e[1]&&(e[1]=r)}return!0}function Jt(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Gt(n){function t(t){function r(e,r){e=n(e,r),t.point(e[0],e[1])}function i(){f=0/0,d.point=a,t.lineStart()}function a(r,i){var a=At([r,i]),o=n(r,i);e(f,s,l,h,g,p,f=o[0],s=o[1],l=r,h=a[0],g=a[1],p=a[2],u,t),t.point(f,s)}function o(){d.point=r,t.lineEnd()}function c(){var n,r,c,m,v,y,M;i(),d.point=function(t,e){a(n=t,r=e),c=f,m=s,v=h,y=g,M=p,d.point=a},d.lineEnd=function(){e(f,s,l,h,g,p,c,m,n,v,y,M,u,t),d.lineEnd=o,o()}}var l,f,s,h,g,p,d={point:r,lineStart:i,lineEnd:o,polygonStart:function(){t.polygonStart(),d.lineStart=c},polygonEnd:function(){t.polygonEnd(),d.lineStart=i}};return d}function e(t,u,i,a,o,c,l,f,s,h,g,p,d,m){var v=l-t,y=f-u,M=v*v+y*y;if(M>4*r&&d--){var x=a+h,b=o+g,_=c+p,w=Math.sqrt(x*x+b*b+_*_),S=Math.asin(_/=w),E=Math.abs(Math.abs(_)-1)<Fa?(i+s)/2:Math.atan2(b,x),k=n(E,S),A=k[0],q=k[1],N=A-t,T=q-u,C=y*N-v*T;(C*C/M>r||Math.abs((v*N+y*T)/M-.5)>.3)&&(e(t,u,i,a,o,c,A,q,E,x/=w,b/=w,_,d,m),m.point(A,q),e(A,q,E,x,b,_,l,f,s,h,g,p,d,m))}}var r=.5,u=16;return t.precision=function(n){return arguments.length?(u=(r=n*n)>0&&16,t):Math.sqrt(r)},t}function Kt(n){return Wt(function(){return n})()}function Wt(n){function t(n){return n=a(n[0]*Ha,n[1]*Ha),[n[0]*f+o,c-n[1]*f]}function e(n){return n=a.invert((n[0]-o)/f,(c-n[1])/f),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Jt(i=te(d,m,v),u);var n=u(g,p);return o=s-n[0]*f,c=h+n[1]*f,t}var u,i,a,o,c,l=Gt(function(n,t){return n=u(n,t),[n[0]*f+o,c-n[1]*f]}),f=150,s=480,h=250,g=0,p=0,d=0,m=0,v=0,y=xo,M=ft,x=null,b=null;return t.stream=function(n){return Qt(i,y(l(M(n))))},t.clipAngle=function(n){return arguments.length?(y=null==n?(x=n,xo):Zt((x=+n)*Ha),t):x},t.clipExtent=function(n){return arguments.length?(b=n,M=null==n?ft:Bt(n[0][0],n[0][1],n[1][0],n[1][1]),t):b},t.scale=function(n){return arguments.length?(f=+n,r()):f},t.translate=function(n){return arguments.length?(s=+n[0],h=+n[1],r()):[s,h]},t.center=function(n){return arguments.length?(g=n[0]%360*Ha,p=n[1]%360*Ha,r()):[g*Pa,p*Pa]},t.rotate=function(n){return arguments.length?(d=n[0]%360*Ha,m=n[1]%360*Ha,v=n.length>2?n[2]%360*Ha:0,r()):[d*Pa,m*Pa,v*Pa]},oa.rebind(t,l,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function Qt(n,t){return{point:function(e,r){r=n(e*Ha,r*Ha),e=r[0],t.point(e>La?e-2*La:-La>e?e+2*La:e,r[1])},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function ne(n,t){return[n,t]}function te(n,t,e){return n?t||e?Jt(re(n),ue(t,e)):re(n):t||e?ue(t,e):ne}function ee(n){return function(t,e){return t+=n,[t>La?t-2*La:-La>t?t+2*La:t,e]}}function re(n){var t=ee(n);return t.invert=ee(-n),t}function ue(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),f=l*r+o*u;return[Math.atan2(c*i-f*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,f*i+c*a)))]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),f=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+f*u),Math.asin(Math.max(-1,Math.min(1,f*r-o*u)))]},e}function ie(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){null!=u?(u=ae(e,u),i=ae(e,i),(a>0?i>u:u>i)&&(u+=2*a*La)):(u=n+2*a*La,i=n);for(var c,l=a*t,f=u;a>0?f>i:i>f;f-=l)o.point((c=jt([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function ae(n,t){var e=At(t);e[0]-=n,zt(e);var r=O(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Fa)%(2*Math.PI)}function oe(n,t,e){var r=oa.range(n,t-Fa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ce(n,t,e){var r=oa.range(n,t-Fa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function le(n){return n.source}function fe(n){return n.target}function se(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),f=a*Math.cos(e),s=a*Math.sin(e),h=2*Math.asin(Math.sqrt(V(r-t)+u*a*V(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*f,u=e*l+t*s,a=e*i+t*o;return[Math.atan2(u,r)*Pa,Math.atan2(a,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function he(){function n(n,u){var i=Math.sin(u*=Ha),a=Math.cos(u),o=Math.abs((n*=Ha)-t),c=Math.cos(o);_o+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*c)*o),e*i+r*a*c),t=n,e=i,r=a}var t,e,r;wo.point=function(u,i){t=u*Ha,e=Math.sin(i*=Ha),r=Math.cos(i),wo.point=n},wo.lineEnd=function(){wo.point=wo.lineEnd=N}}function ge(n){var t=0,e=La/3,r=Wt(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*La/180,e=n[1]*La/180):[180*(t/La),180*(e/La)]},u}function pe(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,Math.asin((i-(n*n+e*e)*u*u)/(2*u))]},e}function de(n,t){var e=n(t[0]),r=n([.5*(t[0][0]+t[1][0]),t[0][1]]),u=n([t[1][0],t[0][1]]),i=n(t[1]),a=r[1]-e[1],o=r[0]-e[0],c=u[1]-r[1],l=u[0]-r[0],f=a/o,s=c/l,h=.5*(f*s*(e[1]-u[1])+s*(e[0]+r[0])-f*(r[0]+u[0]))/(s-f),g=(.5*(e[0]+r[0])-h)/f+.5*(e[1]+r[1]),p=i[0]-h,d=i[1]-g,m=e[0]-h,v=e[1]-g,y=p*p+d*d,M=m*m+v*v,x=Math.atan2(d,p),b=Math.atan2(v,m);return function(t){var e=t[0]-h,r=t[1]-g,u=e*e+r*r,i=Math.atan2(r,e);return u>y&&M>u&&i>x&&b>i?n.invert(t):void 0}}function me(){function n(n,t){Eo+=u*n-r*t,r=n,u=t}var t,e,r,u;ko.point=function(i,a){ko.point=n,t=r=i,e=u=a},ko.lineEnd=function(){n(t,e)}}function ve(){function n(n,t){a.push("M",n,",",t,i)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function u(){a.push("Z")}var i=we(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=we(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function ye(n,t){go||(mo+=n,vo+=t,++yo)}function Me(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);mo+=a*(t+n)/2,vo+=a*(e+r)/2,yo+=a,t=n,e=r}var t,e;if(1!==go){if(!(1>go))return;go=1,mo=vo=yo=0}Ao.point=function(r,u){Ao.point=n,t=r,e=u}}function xe(){Ao.point=ye}function be(){function n(n,t){var e=u*n-r*t;mo+=e*(r+n),vo+=e*(u+t),yo+=3*e,r=n,u=t}var t,e,r,u;2>go&&(go=2,mo=vo=yo=0),Ao.point=function(i,a){Ao.point=n,t=r=i,e=u=a},Ao.lineEnd=function(){n(t,e)}}function _e(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,a,0,2*La)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:N};return o}function we(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Se(n){var t=Gt(function(t,e){return n([t*Pa,e*Pa])});return function(n){return n=t(n),{point:function(t,e){n.point(t*Ha,e*Ha)},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}}function Ee(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function ke(n,t){function e(n,t){var e=Math.abs(Math.abs(t)-La/2)<Fa?0:a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(La/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=R(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-La/2]},e):qe}function Ae(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Math.abs(u)<Fa?ne:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-R(u)*Math.sqrt(n*n+e*e)]},e)}function qe(n,t){return[n,Math.log(Math.tan(La/4+t/2))]}function Ne(n){var t,e=Kt(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=i.apply(e,arguments);if(a===e){if(t=null==n){var o=La*r(),c=u();i([[c[0]-o,c[1]-o],[c[0]+o,c[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Te(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ce(n){function t(t){function a(){l.push("M",i(n(f),o))}for(var c,l=[],f=[],s=-1,h=t.length,g=lt(e),p=lt(r);++s<h;)u.call(this,c=t[s],s)?f.push([+g.call(this,c,s),+p.call(this,c,s)]):f.length&&(a(),f=[]);return f.length&&a(),l.length?l.join(""):null}var e=ze,r=De,u=Dt,i=je,a=i.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(a="function"==typeof n?i=n:(i=Do.get(n)||je).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function ze(n){return n[0]}function De(n){return n[1]}function je(n){return n.join("L")}function Le(n){return je(n)+"Z"}function Fe(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function He(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Pe(n,t){return n.length<4?je(n):n[1]+Ye(n.slice(1,n.length-1),Ue(n,t))}function Re(n,t){return n.length<3?je(n):n[0]+Ye((n.push(n[0]),n),Ue([n[n.length-2]].concat(n,[n[1]]),t))}function Oe(n,t){return n.length<3?je(n):n[0]+Ye(n,Ue(n,t))}function Ye(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return je(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],a=t[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-a[0]*2/3)+","+(i[1]-a[1]*2/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){o=t[1],i=n[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],o=t[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var f=n[c];r+="Q"+(i[0]+o[0]*2/3)+","+(i[1]+o[1]*2/3)+","+f[0]+","+f[1]}return r}function Ue(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],a=n[1],o=1,c=n.length;++o<c;)e=i,i=a,a=n[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function Ie(n){if(n.length<3)return je(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],a=[u,u,u,(r=n[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for($e(c,a,o);++t<e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),$e(c,a,o);for(t=-1;++t<2;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),$e(c,a,o);return c.join("")}function Ve(n){if(n.length<4)return je(n);for(var t,e=[],r=-1,u=n.length,i=[0],a=[0];++r<3;)t=n[r],i.push(t[0]),a.push(t[1]);for(e.push(Be(Fo,i)+","+Be(Fo,a)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),a.shift(),a.push(t[1]),$e(e,i,a);return e.join("")}function Xe(n){for(var t,e,r=-1,u=n.length,i=u+4,a=[],o=[];++r<4;)e=n[r%u],a.push(e[0]),o.push(e[1]);for(t=[Be(Fo,a),",",Be(Fo,o)],--r;++r<i;)e=n[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),$e(t,a,o);return t.join("")}function Ze(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],a=n[0][1],o=n[e][0]-i,c=n[e][1]-a,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*o),r[1]=t*r[1]+(1-t)*(a+u*c);return Ie(n)}function Be(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function $e(n,t,e){n.push("C",Be(jo,t),",",Be(jo,e),",",Be(Lo,t),",",Be(Lo,e),",",Be(Fo,t),",",Be(Fo,e))}function Je(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Ge(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],a=r[0]=Je(u,i);++t<e;)r[t]=(a+(a=Je(u=i,i=n[t+1])))/2;return r[t]=a,r}function Ke(n){for(var t,e,r,u,i=[],a=Ge(n),o=-1,c=n.length-1;++o<c;)t=Je(n[o],n[o+1]),Math.abs(t)<1e-6?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=c;)u=(n[Math.min(c,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function We(n){return n.length<3?je(n):n[0]+Ye(n,Ke(n))}function Qe(n,t,e,r){var u,i,a,o,c,l,f;return u=r[n],i=u[0],a=u[1],u=r[t],o=u[0],c=u[1],u=r[e],l=u[0],f=u[1],(f-a)*(o-i)-(c-a)*(l-i)>0}function nr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function tr(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,c=n[1],l=e[1],f=t[1]-c,s=r[1]-l,h=(o*(c-l)-s*(u-i))/(s*a-o*f);
-return[u+h*a,c+h*f]}function er(n,t){var e={list:n.map(function(n,t){return{index:t,x:n[0],y:n[1]}}).sort(function(n,t){return n.y<t.y?-1:n.y>t.y?1:n.x<t.x?-1:n.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(n,t){return{edge:n,side:t,vertex:null,l:null,r:null}},insert:function(n,t){t.l=n,t.r=n.r,n.r.l=t,n.r=t},leftBound:function(n){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&u.rightOf(t,n));return t=t.l},del:function(n){n.l.r=n.r,n.r.l=n.l,n.edge=null},right:function(n){return n.r},left:function(n){return n.l},leftRegion:function(n){return n.edge==null?e.bottomSite:n.edge.region[n.side]},rightRegion:function(n){return n.edge==null?e.bottomSite:n.edge.region[Ho[n.side]]}},u={bisect:function(n,t){var e={region:{l:n,r:t},ep:{l:null,r:null}},r=t.x-n.x,u=t.y-n.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=n.x*r+n.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(n,t){var e=n.edge,r=t.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(Math.abs(u)<1e-10)return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,f=r.region.r;l.y<f.y||l.y==f.y&&l.x<f.x?(i=n,a=e):(i=t,a=r);var s=o>=a.region.r.x;return s&&i.side==="l"||!s&&i.side==="r"?null:{x:o,y:c}},rightOf:function(n,t){var e=n.edge,r=e.region.r,u=t.x>r.x;if(u&&n.side==="l")return 1;if(!u&&n.side==="r")return 0;if(e.a===1){var i=t.y-r.y,a=t.x-r.x,o=0,c=0;if(!u&&e.b<0||u&&e.b>=0?c=o=i>=e.b*a:(c=t.x+t.y*e.b>e.c,e.b<0&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),e.b<0&&(c=!c)}}else{var f=e.c-e.a*t.x,s=t.y-f,h=t.x-r.x,g=f-r.y;c=s*s>h*h+g*g}return n.side==="l"?c:!c},endPoint:function(n,e,r){n.ep[e]=r,n.ep[Ho[e]]&&t(n)},distance:function(n,t){var e=n.x-t.x,r=n.y-t.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(n,t,e){n.vertex=t,n.ystar=t.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(n.ystar>o.ystar||n.ystar==o.ystar&&t.x>o.vertex.x))break}u.splice(r,0,n)},del:function(n){for(var t=0,e=i.list,r=e.length;r>t&&e[t]!=n;++t);e.splice(t,1)},empty:function(){return i.list.length===0},nextEvent:function(n){for(var t=0,e=i.list,r=e.length;r>t;++t)if(e[t]==n)return e[t+1];return null},min:function(){var n=i.list[0];return{x:n.vertex.x,y:n.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,f,s,h,g,p,d,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),s=r.createHalfEdge(v,"l"),r.insert(o,s),d=u.intersect(o,s),d&&(i.del(o),i.insert(o,d,u.distance(d,M))),o=s,s=r.createHalfEdge(v,"r"),r.insert(o,s),d=u.intersect(s,c),d&&i.insert(s,d,u.distance(d,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),f=r.right(c),h=r.leftRegion(o),g=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),v=u.bisect(h,g),s=r.createHalfEdge(v,y),r.insert(l,s),u.endPoint(v,Ho[y],m),d=u.intersect(l,s),d&&(i.del(l),i.insert(l,d,u.distance(d,h))),d=u.intersect(s,f),d&&i.insert(s,d,u.distance(d,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))t(o.edge)}function rr(n){return n.x}function ur(n){return n.y}function ir(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function ar(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=t.nodes;c[0]&&ar(n,c[0],e,r,a,o),c[1]&&ar(n,c[1],a,r,u,o),c[2]&&ar(n,c[2],e,o,a,i),c[3]&&ar(n,c[3],a,o,u,i)}}function or(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return"#"+rt(Math.round(e+i*n))+rt(Math.round(r+a*n))+rt(Math.round(u+o*n))}}function cr(n){var t=[n.a,n.b],e=[n.c,n.d],r=fr(t),u=lr(t,e),i=fr(sr(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function lr(n,t){return n[0]*t[0]+n[1]*t[1]}function fr(n){var t=Math.sqrt(lr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function sr(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function hr(n,t){return t-=n,function(e){return n+t*e}}function gr(n,t){var e,r=[],u=[],i=oa.transform(n),a=oa.transform(t),o=i.translate,c=a.translate,l=i.rotate,f=a.rotate,s=i.skew,h=a.skew,g=i.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:hr(o[0],c[0])},{i:3,x:hr(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=f?(l-f>180?f+=360:f-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:hr(l,f)})):f&&r.push(r.pop()+"rotate("+f+")"),s!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:hr(s,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:hr(g[0],p[0])},{i:e-2,x:hr(g[1],p[1])})):(p[0]!=1||p[1]!=1)&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function pr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=vr(e)(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function dr(n,t){var e,r,u,i,a,o=0,c=0,l=[],f=[];for(Ro.lastIndex=0,r=0;e=Ro.exec(t);++r)e.index&&l.push(t.substring(o,c=e.index)),f.push({i:l.length,x:e[0]}),l.push(null),o=Ro.lastIndex;for(o<t.length&&l.push(t.substring(o)),r=0,i=f.length;(e=Ro.exec(n))&&i>r;++r)if(a=f[r],a.x==e[0]){if(a.i)if(l[a.i+1]==null)for(l[a.i-1]+=a.x,l.splice(a.i,1),u=r+1;i>u;++u)f[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)f[u].i-=2;else if(l[a.i+1]==null)l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)f[u].i--;f.splice(r,1),i--,r--}else a.x=hr(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=f.pop(),l[a.i+1]==null?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return l.length===1?l[0]==null?f[0].x:function(){return t}:function(n){for(r=0;i>r;++r)l[(a=f[r]).i]=a.x(n);return l.join("")}}function mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function vr(n){return"transform"==n?gr:mr}function yr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function Mr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xr(n){return function(t){return 1-n(1-t)}}function br(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _r(n){return n*n}function wr(n){return n*n*n}function Sr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function kr(n){return 1-Math.cos(n*La/2)}function Ar(n){return Math.pow(2,10*(n-1))}function qr(n){return 1-Math.sqrt(1-n*n)}function Nr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/(2*La)*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,10*-r)*Math.sin(2*(r-e)*La/t)}}function Tr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Cr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function zr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return i>180?i-=360:-180>i&&(i+=360),function(n){return B(e+i*n,r+a*n,u+o*n)+""}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return i>180?i-=360:-180>i&&(i+=360),function(n){return P(e+i*n,r+a*n,u+o*n)+""}}function jr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return G(e+i*n,r+a*n,u+o*n)+""}}function Lr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Fr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Hr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Pr(n){for(var t=n.source,e=n.target,r=Or(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Rr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Or(n,t){if(n===t)return n;for(var e=Rr(n),r=Rr(t),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function Yr(n){n.fixed|=2}function Ur(n){n.fixed&=-7}function Ir(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Vr(n){n.fixed&=-5}function Xr(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,a=n.nodes,o=a.length,c=-1;++c<o;)i=a[c],null!=i&&(Xr(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Zr(n,t){return oa.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=Gr,n}function Br(n){return n.children}function $r(n){return n.value}function Jr(n,t){return t.value-n.value}function Gr(n){return oa.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function Kr(n){return n.x}function Wr(n){return n.y}function Qr(n,t,e){n.y0=t,n.y=e}function nu(n){return oa.range(n.length)}function tu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function eu(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ru(n){return n.reduce(uu,0)}function uu(n,t){return n+t[1]}function iu(n,t){return au(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function au(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function ou(n){return[oa.min(n),oa.max(n)]}function cu(n,t){return n.parent==t.parent?1:2}function lu(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function fu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function su(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=su(e[i],t),n)>0&&(n=r);return n}function hu(n,t){return n.x-t.x}function gu(n,t){return t.x-n.x}function pu(n,t){return n.depth-t.depth}function du(n,t){function e(n,r){var u=n.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;++c<a;)i=u[c],e(i,o),o=i;t(n,r)}e(n,null)}function mu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function vu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function yu(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Mu(n,t){return n.value-t.value}function xu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function bu(n,t){n._pack_next=t,t._pack_prev=n}function _u(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return u*u-e*e-r*r>.001}function wu(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,f=1/0,s=-1/0,h=1/0,g=-1/0;if(e.forEach(Su),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],Au(r,u,i),t(i),xu(r,i),r._pack_prev=i,xu(i,u),u=r._pack_next,a=3;l>a;a++){Au(r,u,i=e[a]);var p=0,d=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,d++)if(_u(o,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!_u(c,i);c=c._pack_prev,m++);p?(m>d||d==m&&u.r<r.r?bu(r,u=o):bu(r=c,u),a--):(xu(r,i),u=i,t(i))}var v=(f+s)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Eu)}}function Su(n){n._pack_next=n._pack_prev=n}function Eu(n){delete n._pack_next,delete n._pack_prev}function ku(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i<a;)ku(u[i],t,e,r)}function Au(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var a=t.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function qu(n){return 1+oa.max(n,function(n){return n.y})}function Nu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Tu(n){var t=n.children;return t&&t.length?Tu(t[0]):n}function Cu(n){var t,e=n.children;return e&&(t=e.length)?Cu(e[t-1]):n}function zu(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Du(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ju(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Lu(n){return n.rangeExtent?n.rangeExtent():ju(n.range())}function Fu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Hu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(t=t(a-i))&&(n[r]=t.floor(i),n[u]=t.ceil(a)),n}function Pu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)u.push(e(n[a-1],n[a])),i.push(r(t[a-1],t[a]));return function(t){var e=oa.bisect(n,t,1,o)-1;return i[e](u[e](t))}}function Ru(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Pu:Fu,c=r?Hr:Fr;return a=u(n,t,c,e),o=u(t,n,c,mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Lr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Iu(n,t)},i.tickFormat=function(t,e){return Vu(n,t,e)},i.nice=function(){return Hu(n,Yu),u()},i.copy=function(){return Ru(n,t,e,r)},u()}function Ou(n,t){return oa.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Yu(n){return n=Math.pow(10,Math.round(Math.log(n)/Math.LN10)-1),n&&{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}}function Uu(n,t){var e=ju(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Iu(n,t){return oa.range.apply(oa,Uu(n,t))}function Vu(n,t,e){var r=-Math.floor(Math.log(Uu(n,t)[2])/Math.LN10+.01);return oa.format(e?e.replace(ro,function(n,t,e,u,i,a,o,c,l,f){return[t,e,u,i,a,o,c,l||"."+(r-2*("%"===f)),f].join("")}):",."+r+"f")}function Xu(n,t,e,r){function u(t){return n(e(t))}return u.invert=function(t){return r(n.invert(t))},u.domain=function(t){return arguments.length?(t[0]<0?(e=$u,r=Ju):(e=Zu,r=Bu),n.domain(t.map(e)),u):n.domain().map(r)},u.base=function(n){return arguments.length?(t=+n,u):t},u.nice=function(){return n.domain(Hu(n.domain(),Gu(t))),u},u.ticks=function(){var u=ju(n.domain()),i=[];if(u.every(isFinite)){var a=Math.log(t),o=Math.floor(u[0]/a),c=Math.ceil(u[1]/a),l=r(u[0]),f=r(u[1]),s=t%1?2:t;if(e===$u)for(i.push(-Math.pow(t,-o));o++<c;)for(var h=s-1;h>0;h--)i.push(-Math.pow(t,-o)*h);else{for(;c>o;o++)for(var h=1;s>h;h++)i.push(Math.pow(t,o)*h);i.push(Math.pow(t,o))}for(o=0;i[o]<l;o++);for(c=i.length;i[c-1]>f;c--);i=i.slice(o,c)}return i},u.tickFormat=function(n,i){if(arguments.length<2&&(i=$o),!arguments.length)return i;var a,o=Math.log(t),c=Math.max(.1,n/u.ticks().length),l=e===$u?(a=-1e-12,Math.floor):(a=1e-12,Math.ceil);return function(n){return n/r(o*l(e(n)/o+a))<=c?i(n):""}},u.copy=function(){return Xu(n.copy(),t,e,r)},Ou(u,n)}function Zu(n){return Math.log(0>n?0:n)}function Bu(n){return Math.exp(n)}function $u(n){return-Math.log(n>0?0:-n)}function Ju(n){return-Math.exp(-n)}function Gu(n){n=Math.log(n);var t={floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}};return function(){return t}}function Ku(n,t){function e(t){return n(r(t))}var r=Wu(t),u=Wu(1/t);return e.invert=function(t){return u(n.invert(t))},e.domain=function(t){return arguments.length?(n.domain(t.map(r)),e):n.domain().map(u)},e.ticks=function(n){return Iu(e.domain(),n)},e.tickFormat=function(n,t){return Vu(e.domain(),n,t)},e.nice=function(){return e.domain(Hu(e.domain(),Yu))},e.exponent=function(n){if(!arguments.length)return t;var i=e.domain();return r=Wu(t=n),u=Wu(1/t),e.domain(i)},e.copy=function(){return Ku(n.copy(),t)},Ou(e,n)}function Wu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qu(n,t){function e(t){return a[((i.get(t)||i.set(t,n.push(t)))-1)%a.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var i,a,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var a,o=-1,c=r.length;++o<c;)i.has(a=r[o])||i.set(a,n.push(a));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(a=n,o=0,t={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],l=u[1],f=(l-c)/(Math.max(1,n.length-1)+i);return a=r(n.length<2?(c+l)/2:c+f*i/2,f),o=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=(s-f)/(n.length-i+2*c);return a=r(f+h*c,h),l&&a.reverse(),o=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=Math.floor((s-f)/(n.length-i+2*c)),g=s-f-(n.length-i)*h;return a=r(f+Math.round(g/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return ju(t.a[0])},e.copy=function(){return Qu(n,t)},e.domain(n)}function ni(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=oa.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?0/0:t[oa.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(oa.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.copy=function(){return ni(n,t)},e()}function ti(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.copy=function(){return ti(n,t,e)},u()}function ei(n,t){function e(e){return t[oa.bisect(n,e)]}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.copy=function(){return ei(n,t)},e}function ri(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Iu(n,t)},t.tickFormat=function(t,e){return Vu(n,t,e)},t.copy=function(){return ri(n)},t}function ui(n){return n.innerRadius}function ii(n){return n.outerRadius}function ai(n){return n.startAngle}function oi(n){return n.endAngle}function ci(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+Qo,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function li(n){function t(t){function c(){d.push("M",o(n(v),s),f,l(n(m.reverse()),s),"Z")}for(var h,g,p,d=[],m=[],v=[],y=-1,M=t.length,x=lt(e),b=lt(u),_=e===r?function(){return g}:lt(r),w=u===i?function(){return p}:lt(i);++y<M;)a.call(this,h=t[y],y)?(m.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),v.push([+_.call(this,h,y),+w.call(this,h,y)])):m.length&&(c(),m=[],v=[]);return m.length&&c(),d.length?d.join(""):null}var e=ze,r=ze,u=0,i=De,a=Dt,o=je,c=o.key,l=o,f="L",s=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?o=n:(o=Do.get(n)||je).key,l=o.reverse||o,f=o.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(s=n,t):s},t}function fi(n){return n.radius}function si(n){return[n.x,n.y]}function hi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+Qo;return[e*Math.cos(r),e*Math.sin(r)]}}function gi(){return 64}function pi(){return"circle"}function di(n){var t=Math.sqrt(n/La);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function mi(n,t){return Ma(n,ic),n.id=t,n}function vi(n,t,e,r){var u=n.id;return D(n,"function"==typeof e?function(n,i,a){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,a)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function yi(n){return null==n&&(n=""),function(){this.textContent=n}}function Mi(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),a=i[e];if(!a){var o=r.time;return a=i[e]={tween:new u,event:oa.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,oa.timer(function(r){function u(r){return i.active>e?l():(i.active=e,h.start.call(n,f,t),a.tween.forEach(function(e,r){(r=r.call(n,f,t))&&d.push(r)}),c(r)||oa.timer(c,0,o),1)}function c(r){if(i.active!==e)return l();for(var u=(r-g)/p,a=s(u),o=d.length;o>0;)d[--o].call(n,a);return u>=1?(l(),h.end.call(n,f,t),1):void 0}function l(){return--i.count?delete i[e]:delete n.__transition__,1}var f=n.__data__,s=a.ease,h=a.event,g=a.delay,p=a.duration,d=[];return r>=g?u(r):oa.timer(u,g,o),1},0,o),a}}function xi(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function bi(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function _i(n,t,e){if(r=[],e&&t.length>1){for(var r,u,i,a=ju(n.domain()),o=-1,c=t.length,l=(t[1]-t[0])/++e;++o<c;)for(u=e;--u>0;)(i=+t[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;++u<e&&(i=+t[o]+u*l)<a[1];)r.push(i)}return r}function wi(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Si(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new hc(e-1)),1),e}function i(n,e){return t(n=new hc(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{hc=wi;var r=new wi;return r._=n,a(r,t,e)}finally{hc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var c=n.utc=Ei(n);return c.floor=c,c.round=Ei(r),c.ceil=Ei(u),c.offset=Ei(i),c.range=o,n}function Ei(n){return function(t,e){try{hc=wi;var r=new wi;return r._=t,n(r,e)._}finally{hc=Date}}}function ki(n,t,e,r){for(var u,i,a=0,o=t.length,c=e.length;o>a;){if(r>=c)return-1;if(u=t.charCodeAt(a++),37===u){if(i=Tc[t.charAt(a++)],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Ai(n){return RegExp("^(?:"+n.map(oa.requote).join("|")+")","i")}function qi(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Ni(n,t,e){n+="";var r=n.length;return e>r?Array(e-r+1).join(t)+n:n}function Ti(n,t,e){wc.lastIndex=0;var r=wc.exec(t.substring(e));return r?e+=r[0].length:-1}function Ci(n,t,e){_c.lastIndex=0;var r=_c.exec(t.substring(e));return r?e+=r[0].length:-1}function zi(n,t,e){kc.lastIndex=0;var r=kc.exec(t.substring(e));return r?(n.m=Ac.get(r[0].toLowerCase()),e+=r[0].length):-1}function Di(n,t,e){Sc.lastIndex=0;var r=Sc.exec(t.substring(e));return r?(n.m=Ec.get(r[0].toLowerCase()),e+=r[0].length):-1}function ji(n,t,e){return ki(n,""+Nc.c,t,e)}function Li(n,t,e){return ki(n,""+Nc.x,t,e)}function Fi(n,t,e){return ki(n,""+Nc.X,t,e)}function Hi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+=r[0].length):-1}function Pi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.y=Ri(+r[0]),e+=r[0].length):-1}function Ri(n){return n+(n>68?1900:2e3)}function Oi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+=r[0].length):-1}function Yi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+=r[0].length):-1}function Ui(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+=r[0].length):-1}function Ii(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+=r[0].length):-1}function Vi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+=r[0].length):-1}function Xi(n,t,e){Cc.lastIndex=0;var r=Cc.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+=r[0].length):-1}function Zi(n,t,e){var r=zc.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function Bi(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(Math.abs(t)/60),u=Math.abs(t)%60;return e+Ni(r,"0",2)+Ni(u,"0",2)}function $i(n){return n.toISOString()}function Ji(n,t,e){function r(t){return n(t)}return r.invert=function(t){return Ki(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ki)},r.nice=function(n){return r.domain(Hu(r.domain(),function(){return n}))},r.ticks=function(e,u){var i=Gi(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=oa.bisect(jc,o);if(c==jc.length)return t.year(i,e);if(!c)return n.ticks(e).map(Ki);Math.log(o/jc[c-1])<Math.log(jc[c]/o)&&--c,e=t[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return Ji(n.copy(),t,e)},oa.rebind(r,n,"range","rangeRound","interpolate","clamp")}function Gi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ki(n){return new Date(n)}function Wi(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function Qi(n){var t=new Date(n,0,1);return t.setFullYear(n),t}function na(n){var t=n.getFullYear(),e=Qi(t),r=Qi(t+1);return t+(n-e)/(r-e)}function ta(n){var t=new Date(Date.UTC(n,0,1));return t.setUTCFullYear(n),t}function ea(n){var t=n.getUTCFullYear(),e=ta(t),r=ta(t+1);return t+(n-e)/(r-e)}function ra(n){return n.responseText}function ua(n){return JSON.parse(n.responseText)}function ia(n){var t=ca.createRange();return t.selectNode(ca.body),t.createContextualFragment(n.responseText)}function aa(n){return n.responseXML}var oa={version:"3.1.4"};Date.now||(Date.now=function(){return+new Date});var ca=document,la=window;try{ca.createElement("div").style.setProperty("opacity",0,"")}catch(fa){var sa=la.CSSStyleDeclaration.prototype,ha=sa.setProperty;sa.setProperty=function(n,t,e){ha.call(this,n,t+"",e)}}oa.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(arguments.length===1){for(;++u<i&&((e=n[u])==null||e!=e);)e=void 0;for(;++u<i;)(r=n[u])!=null&&e>r&&(e=r)}else{for(;++u<i&&((e=t.call(n,n[u],u))==null||e!=e);)e=void 0;for(;++u<i;)(r=t.call(n,n[u],u))!=null&&e>r&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(arguments.length===1){for(;++u<i&&((e=n[u])==null||e!=e);)e=void 0;for(;++u<i;)(r=n[u])!=null&&r>e&&(e=r)}else{for(;++u<i&&((e=t.call(n,n[u],u))==null||e!=e);)e=void 0;for(;++u<i;)(r=t.call(n,n[u],u))!=null&&r>e&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(arguments.length===1){for(;++i<a&&((e=u=n[i])==null||e!=e);)e=u=void 0;for(;++i<a;)(r=n[i])!=null&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<a&&((e=u=t.call(n,n[i],i))==null||e!=e);)e=void 0;for(;++i<a;)(r=t.call(n,n[i],i))!=null&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(arguments.length===1)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},oa.mean=function(t,e){var r,u=t.length,i=0,a=-1,o=0;if(arguments.length===1)for(;++a<u;)n(r=t[a])&&(i+=(r-i)/++o);else for(;++a<u;)n(r=e.call(t,t[a],a))&&(i+=(r-i)/++o);return o?i:void 0},oa.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},oa.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?oa.quantile(t.sort(oa.ascending),.5):void 0},oa.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var ga=oa.bisector(function(n){return n});oa.bisectLeft=ga.left,oa.bisect=oa.bisectRight=ga.right,oa.shuffle=function(n){for(var t,e,r=n.length;r;)e=Math.random()*r--|0,t=n[r],n[r]=n[e],n[e]=t;return n},oa.permute=function(n,t){for(var e=[],r=-1,u=t.length;++r<u;)e[r]=n[t[r]];return e},oa.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=oa.min(arguments,t),r=Array(e);++n<e;)for(var u,i=-1,a=r[n]=Array(u);++i<u;)a[i]=arguments[i][n];return r},oa.transpose=function(n){return oa.zip.apply(oa,n)},oa.keys=function(n){var t=[];for(var e in n)t.push(e);return t},oa.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},oa.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},oa.merge=function(n){return Array.prototype.concat.apply([],n)},oa.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw Error("infinite range");var u,i=[],a=e(Math.abs(r)),o=-1;if(n*=a,t*=a,r*=a,0>r)for(;(u=n+r*++o)>t;)i.push(u/a);else for(;(u=n+r*++o)<t;)i.push(u/a);return i},oa.map=function(n){var t=new u;for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return pa+n in this},get:function(n){return this[pa+n]},set:function(n,t){return this[pa+n]=t},remove:function(n){return n=pa+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===da&&n.call(this,t.substring(1),this[t])}});var pa="\0",da=pa.charCodeAt(0);oa.nest=function(){function n(t,o,c){if(c>=a.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,g=-1,p=o.length,d=a[c++],m=new u;++g<p;)(h=m.get(l=d(f=o[g])))?h.push(f):m.set(l,[f]);return t?(f=t(),s=function(e,r){f.set(e,n(t,r,c))}):(f={},s=function(e,r){f[e]=n(t,r,c)}),m.forEach(s),f}function t(n,e){if(e>=a.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},a=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(oa.map,e,0),0)},i.key=function(n){return a.push(n),i},i.sortKeys=function(n){return o[a.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},oa.set=function(n){var t=new i;if(n)for(var e=0;e<n.length;e++)t.add(n[e]);return t},r(i,{has:function(n){return pa+n in this},add:function(n){return this[pa+n]=!0,n},remove:function(n){return n=pa+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===da&&n.call(this,t.substring(1))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=a(n,t,t[e]);return n},oa.dispatch=function(){for(var n=new o,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=c(n);return n},o.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(arguments.length===2){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.mouse=function(n){return h(n,f())};var ma=/WebKit/.test(la.navigator.userAgent)?-1:0,va=p;
-try{va(ca.documentElement.childNodes)[0].nodeType}catch(ya){va=g}var Ma=[].__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]};oa.touches=function(n,t){return arguments.length<2&&(t=f().touches),t?va(t).map(function(t){var e=h(n,t);return e.identifier=t.identifier,e}):[]},oa.behavior.drag=function(){function n(){this.on("mousedown.drag",t).on("touchstart.drag",t)}function t(){function n(){var n=o.parentNode;return null!=s?oa.touches(n).filter(function(n){return n.identifier===s})[0]:oa.mouse(n)}function t(){if(!o.parentNode)return u();var t=n(),e=t[0]-h[0],r=t[1]-h[1];g|=e|r,h=t,l(),c({type:"drag",x:t[0]+a[0],y:t[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),g&&(l(),oa.event.target===f&&p.on("click.drag",i,!0)),p.on(null!=s?"touchmove.drag-"+s:"mousemove.drag",null).on(null!=s?"touchend.drag-"+s:"mouseup.drag",null)}function i(){l(),p.on("click.drag",null)}var a,o=this,c=e.of(o,arguments),f=oa.event.target,s=oa.event.touches?oa.event.changedTouches[0].identifier:null,h=n(),g=0,p=oa.select(la).on(null!=s?"touchmove.drag-"+s:"mousemove.drag",t).on(null!=s?"touchend.drag-"+s:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-h[0],a.y-h[1]]):a=[0,0],null==s&&l(),c({type:"dragstart"})}var e=s(n,"drag","dragstart","dragend"),r=null;return n.origin=function(t){return arguments.length?(r=t,n):r},oa.rebind(n,e,"on")};var xa=function(n,t){return t.querySelector(n)},ba=function(n,t){return t.querySelectorAll(n)},_a=ca.documentElement,wa=_a.matchesSelector||_a.webkitMatchesSelector||_a.mozMatchesSelector||_a.msMatchesSelector||_a.oMatchesSelector,Sa=function(n,t){return wa.call(n,t)};"function"==typeof Sizzle&&(xa=function(n,t){return Sizzle(n,t)[0]||null},ba=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},Sa=Sizzle.matchesSelector);var Ea=[];oa.selection=function(){return Ta},oa.selection.prototype=Ea,Ea.select=function(n){var t,e,r,u,i=[];"function"!=typeof n&&(n=m(n));for(var a=-1,o=this.length;++a<o;){i.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return d(i)},Ea.selectAll=function(n){var t,e,r=[];"function"!=typeof n&&(n=v(n));for(var u=-1,i=this.length;++u<i;)for(var a=this[u],o=-1,c=a.length;++o<c;)(e=a[o])&&(r.push(t=va(n.call(e,e.__data__,o))),t.parentNode=e);return d(r)};var ka={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};oa.ns={prefix:ka,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ka.hasOwnProperty(e)?{space:ka[e],local:n}:n}},Ea.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(y(t,n[t]));return this}return this.each(y(n,t))},oa.requote=function(n){return n.replace(Aa,"\\$&")};var Aa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;Ea.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!x(n[u]).test(t))return!1;return!0}for(t in n)this.each(_(t,n[t]));return this}return this.each(_(n,t))},Ea.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(S(e,n[e],t));return this}if(2>r)return la.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(S(n,t,e))},Ea.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(E(t,n[t]));return this}return this.each(E(n,t))},Ea.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Ea.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Ea.append=function(n){function t(){return this.appendChild(ca.createElementNS(this.namespaceURI,n))}function e(){return this.appendChild(ca.createElementNS(n.space,n.local))}return n=oa.ns.qualify(n),this.select(n.local?e:t)},Ea.insert=function(n,t){function e(e,r){return this.insertBefore(ca.createElementNS(this.namespaceURI,n),t.call(this,e,r))}function r(e,r){return this.insertBefore(ca.createElementNS(n.space,n.local),t.call(this,e,r))}return n=oa.ns.qualify(n),"function"!=typeof t&&(t=m(t)),this.select(n.local?r:e)},Ea.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},Ea.data=function(n,t){function e(n,e){var r,i,a,o=n.length,s=e.length,h=Math.min(o,s),g=Array(s),p=Array(s),d=Array(o);if(t){var m,v=new u,y=new u,M=[];for(r=-1;++r<o;)m=t.call(i=n[r],i.__data__,r),v.has(m)?d[r]=i:v.set(m,i),M.push(m);for(r=-1;++r<s;)m=t.call(e,a=e[r],r),(i=v.get(m))?(g[r]=i,i.__data__=a):y.has(m)||(p[r]=k(a)),y.set(m,a),v.remove(m);for(r=-1;++r<o;)v.has(M[r])&&(d[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],a=e[r],i?(i.__data__=a,g[r]=i):p[r]=k(a);for(;s>r;++r)p[r]=k(e[r]);for(;o>r;++r)d[r]=n[r]}p.update=g,p.parentNode=g.parentNode=d.parentNode=n.parentNode,c.push(p),l.push(g),f.push(d)}var r,i,a=-1,o=this.length;if(!arguments.length){for(n=Array(o=(r=this[0]).length);++a<o;)(i=r[a])&&(n[a]=i.__data__);return n}var c=j([]),l=d([]),f=d([]);if("function"==typeof n)for(;++a<o;)e(r=this[a],n.call(r,r.parentNode.__data__,a));else for(;++a<o;)e(r=this[a],n);return l.enter=function(){return c},l.exit=function(){return f},l},Ea.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Ea.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=A(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return d(u)},Ea.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ea.sort=function(n){n=q.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Ea.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(T(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(T(n,t,e))};var qa=oa.map({mouseenter:"mouseover",mouseleave:"mouseout"});qa.forEach(function(n){"on"+n in ca&&qa.remove(n)}),Ea.each=function(n){return D(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Ea.call=function(n){var t=va(arguments);return n.apply(t[0]=this,t),this},Ea.empty=function(){return!this.node()},Ea.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null};var Na=[];oa.selection.enter=j,oa.selection.enter.prototype=Na,Na.append=Ea.append,Na.insert=Ea.insert,Na.empty=Ea.empty,Na.node=Ea.node,Na.select=function(n){for(var t,e,r,u,i,a=[],o=-1,c=this.length;++o<c;){r=(u=this[o]).update,a.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,f=u.length;++l<f;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):t.push(null)}return d(a)},Ea.transition=function(){var n,t,e=ec||++ac,r=[],u=Object.create(oc);u.time=Date.now();for(var i=-1,a=this.length;++i<a;){r.push(n=[]);for(var o=this[i],c=-1,l=o.length;++c<l;)(t=o[c])&&Mi(t,c,e,u),n.push(t)}return mi(r,e)};var Ta=d([[ca]]);Ta[0].parentNode=_a,oa.select=function(n){return"string"==typeof n?Ta.select(n):d([[n]])},oa.selectAll=function(n){return"string"==typeof n?Ta.selectAll(n):d([va(n)])},oa.behavior.zoom=function(){function n(){this.on("mousedown.zoom",o).on("mousemove.zoom",f).on(Da+".zoom",c).on("dblclick.zoom",h).on("touchstart.zoom",g).on("touchmove.zoom",p).on("touchend.zoom",g)}function t(n){return[(n[0]-_[0])/w,(n[1]-_[1])/w]}function e(n){return[n[0]*w+_[0],n[1]*w+_[1]]}function r(n){w=Math.max(S[0],Math.min(S[1],n))}function u(n,t){t=e(t),_[0]+=n[0]-t[0],_[1]+=n[1]-t[1]}function i(){y&&y.domain(v.range().map(function(n){return(n-_[0])/w}).map(v.invert)),x&&x.domain(M.range().map(function(n){return(n-_[1])/w}).map(M.invert))}function a(n){i(),oa.event.preventDefault(),n({type:"zoom",scale:w,translate:_})}function o(){function n(){f=1,u(oa.mouse(i),h),a(o)}function e(){f&&l(),s.on("mousemove.zoom",null).on("mouseup.zoom",null),f&&oa.event.target===c&&s.on("click.zoom",r,!0)}function r(){l(),s.on("click.zoom",null)}var i=this,o=E.of(i,arguments),c=oa.event.target,f=0,s=oa.select(la).on("mousemove.zoom",n).on("mouseup.zoom",e),h=t(oa.mouse(i));la.focus(),l()}function c(){d||(d=t(oa.mouse(this))),r(Math.pow(2,Ca()*.002)*w),u(oa.mouse(this),d),a(E.of(this,arguments))}function f(){d=null}function h(){var n=oa.mouse(this),e=t(n),i=Math.log(w)/Math.LN2;r(Math.pow(2,oa.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(n,e),a(E.of(this,arguments))}function g(){var n=oa.touches(this),e=Date.now();if(m=w,d={},n.forEach(function(n){d[n.identifier]=t(n)}),l(),n.length===1){if(500>e-b){var i=n[0],o=t(n[0]);r(2*w),u(i,o),a(E.of(this,arguments))}b=e}}function p(){var n=oa.touches(this),t=n[0],e=d[t.identifier];if(i=n[1]){var i,o=d[i.identifier];t=[(t[0]+i[0])/2,(t[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(oa.event.scale*m)}u(t,e),b=null,a(E.of(this,arguments))}var d,m,v,y,M,x,b,_=[0,0],w=1,S=za,E=s(n,"zoom");return n.translate=function(t){return arguments.length?(_=t.map(Number),i(),n):_},n.scale=function(t){return arguments.length?(w=+t,i(),n):w},n.scaleExtent=function(t){return arguments.length?(S=null==t?za:t.map(Number),n):S},n.x=function(t){return arguments.length?(y=t,v=t.copy(),_=[0,0],w=1,n):y},n.y=function(t){return arguments.length?(x=t,M=t.copy(),_=[0,0],w=1,n):x},oa.rebind(n,E,"on")};var Ca,za=[0,1/0],Da="onwheel"in ca?(Ca=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ca?(Ca=function(){return oa.event.wheelDelta},"mousewheel"):(Ca=function(){return-oa.event.detail},"MozMousePixelScroll");L.prototype.toString=function(){return this.rgb()+""},oa.hsl=function(n,t,e){return arguments.length===1?n instanceof H?F(n.h,n.s,n.l):ut(""+n,it,F):F(+n,+t,+e)};var ja=H.prototype=new L;ja.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),F(this.h,this.s,this.l/n)},ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),F(this.h,this.s,n*this.l)},ja.rgb=function(){return P(this.h,this.s,this.l)};var La=Math.PI,Fa=1e-6,Ha=La/180,Pa=180/La;oa.hcl=function(n,t,e){return arguments.length===1?n instanceof Z?X(n.h,n.c,n.l):n instanceof J?K(n.l,n.a,n.b):K((n=at((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):X(+n,+t,+e)};var Ra=Z.prototype=new L;Ra.brighter=function(n){return X(this.h,this.c,Math.min(100,this.l+Oa*(arguments.length?n:1)))},Ra.darker=function(n){return X(this.h,this.c,Math.max(0,this.l-Oa*(arguments.length?n:1)))},Ra.rgb=function(){return B(this.h,this.c,this.l).rgb()},oa.lab=function(n,t,e){return arguments.length===1?n instanceof J?$(n.l,n.a,n.b):n instanceof Z?B(n.l,n.c,n.h):at((n=oa.rgb(n)).r,n.g,n.b):$(+n,+t,+e)};var Oa=18,Ya=.95047,Ua=1,Ia=1.08883,Va=J.prototype=new L;Va.brighter=function(n){return $(Math.min(100,this.l+Oa*(arguments.length?n:1)),this.a,this.b)},Va.darker=function(n){return $(Math.max(0,this.l-Oa*(arguments.length?n:1)),this.a,this.b)},Va.rgb=function(){return G(this.l,this.a,this.b)},oa.rgb=function(n,t,e){return arguments.length===1?n instanceof et?tt(n.r,n.g,n.b):ut(""+n,tt,P):tt(~~n,~~t,~~e)};var Xa=et.prototype=new L;Xa.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),tt(Math.min(255,Math.floor(t/n)),Math.min(255,Math.floor(e/n)),Math.min(255,Math.floor(r/n)))):tt(u,u,u)},Xa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),tt(Math.floor(n*this.r),Math.floor(n*this.g),Math.floor(n*this.b))},Xa.hsl=function(){return it(this.r,this.g,this.b)},Xa.toString=function(){return"#"+rt(this.r)+rt(this.g)+rt(this.b)};var Za=oa.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});Za.forEach(function(n,t){Za.set(n,ut(t,tt,P))}),oa.functor=lt,oa.xhr=function(n,t,e){function r(){var n=c.status;!n&&c.responseText||n>=200&&300>n||304===n?i.load.call(u,o.call(u,c)):i.error.call(u,c)}var u={},i=oa.dispatch("progress","load","error"),a={},o=ft,c=new(la.XDomainRequest&&/^(http(s)?:)?\/\//.test(n)?XDomainRequest:XMLHttpRequest);return"onload"in c?c.onload=c.onerror=r:c.onreadystatechange=function(){c.readyState>3&&r()},c.onprogress=function(n){var t=oa.event;oa.event=n;try{i.progress.call(u,c)}finally{oa.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.response=function(n){return o=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(va(arguments)))}}),u.send=function(e,r,i){if(arguments.length===2&&"function"==typeof r&&(i=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var o in a)c.setRequestHeader(o,a[o]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),c.send(null==r?null:r),u},u.abort=function(){return c.abort(),u},oa.rebind(u,i,"on"),arguments.length===2&&"function"==typeof t&&(e=t,t=null),null==e?u:u.get(st(e))},oa.csv=ht(",","text/csv"),oa.tsv=ht("	","text/tab-separated-values");var Ba,$a,Ja=0,Ga={},Ka=null;oa.timer=function(n,t,e){if(arguments.length<3){if(arguments.length<2)t=0;else if(!isFinite(t))return;e=Date.now()}var r=Ga[n.id];r&&r.callback===n?(r.then=e,r.delay=t):Ga[n.id=++Ja]=Ka={callback:n,then:e,delay:t,next:Ka},Ba||($a=clearTimeout($a),Ba=1,Wa(gt))},oa.timer.flush=function(){for(var n,t=Date.now(),e=Ka;e;)n=t-e.then,e.delay||(e.flush=e.callback(n)),e=e.next;pt()};var Wa=la.requestAnimationFrame||la.webkitRequestAnimationFrame||la.mozRequestAnimationFrame||la.oRequestAnimationFrame||la.msRequestAnimationFrame||function(n){setTimeout(n,17)},Qa=".",no=",",to=[3,3],eo=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(dt);oa.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=oa.round(n,mt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,Math.floor((0>=e?e+1:e-1)/3)*3))),eo[8+e/3]},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},oa.format=function(n){var t=ro.exec(n),e=t[1]||" ",r=t[2]||">",u=t[3]||"",i=t[4]||"",a=t[5],o=+t[6],c=t[7],l=t[8],f=t[9],s=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),f){case"n":c=!0,f="g";break;case"%":s=100,h="%",f="f";break;case"p":s=100,h="%",f="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+f.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":s=-1,f="r"}"#"===i&&(i=""),"r"!=f||l||(f="g"),null!=l&&("g"==f?l=Math.max(1,Math.min(21,l)):("e"==f||"f"==f)&&(l=Math.max(0,Math.min(20,l)))),f=uo.get(f)||vt;var p=a&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):u;if(0>s){var d=oa.formatPrefix(n,l);n=d.scale(n),h=d.symbol}else n*=s;n=f(n,l),!a&&c&&(n=io(n));var m=i.length+n.length+(p?0:t.length),v=o>m?Array(m=o-m+1).join(e):"";return p&&(n=io(v+n)),Qa&&n.replace(".",Qa),t+=i,("<"===r?t+n+v:">"===r?v+t+n:"^"===r?v.substring(0,m>>=1)+t+n+v.substring(m):t+(p?n:v+n))+h}};var ro=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,uo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,mt(n,t))).toFixed(Math.max(0,Math.min(20,mt(n*(1+1e-15),t))))}}),io=ft;if(to){var ao=to.length;io=function(n){for(var t=n.lastIndexOf("."),e=t>=0?"."+n.substring(t+1):(t=n.length,""),r=[],u=0,i=to[0];t>0&&i>0;)r.push(n.substring(t-=i,t+i)),i=to[u=(u+1)%ao];return r.reverse().join(no||"")+e}}oa.geo={},oa.geo.stream=function(n,t){oo.hasOwnProperty(n.type)?oo[n.type](n,t):yt(n,t)};var oo={Feature:function(n,t){yt(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)yt(e[r].geometry,t)}},co={Sphere:function(n,t){t.sphere()},Point:function(n,t){var e=n.coordinates;t.point(e[0],e[1])},MultiPoint:function(n,t){for(var e,r=n.coordinates,u=-1,i=r.length;++u<i;)e=r[u],t.point(e[0],e[1])},LineString:function(n,t){Mt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Mt(e[r],t,0)},Polygon:function(n,t){xt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)xt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)yt(e[r],t)}};oa.geo.area=function(n){return lo=0,oa.geo.stream(n,ho),lo};var lo,fo,so,ho={sphere:function(){lo+=4*La},point:N,lineStart:N,lineEnd:N,polygonStart:function(){fo=1,so=0,ho.lineStart=bt},polygonEnd:function(){var n=2*Math.atan2(so,fo);lo+=0>n?4*La+n:n,ho.lineStart=ho.lineEnd=ho.point=N}};oa.geo.bounds=_t(ft),oa.geo.centroid=function(n){go=po=mo=vo=yo=0,oa.geo.stream(n,Mo);var t;return po&&Math.abs(t=Math.sqrt(mo*mo+vo*vo+yo*yo))>Fa?[Math.atan2(vo,mo)*Pa,Math.asin(Math.max(-1,Math.min(1,yo/t)))*Pa]:void 0};var go,po,mo,vo,yo,Mo={sphere:function(){2>go&&(go=2,po=mo=vo=yo=0)},point:wt,lineStart:Et,lineEnd:kt,polygonStart:function(){2>go&&(go=2,po=mo=vo=yo=0),Mo.lineStart=St},polygonEnd:function(){Mo.lineStart=Et}},xo=Pt(Dt,It,Xt),bo=1e9;oa.geo.projection=Kt,oa.geo.projectionMutator=Wt,(oa.geo.equirectangular=function(){return Kt(ne)}).raw=ne.invert=ne,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Ha,t[1]*Ha),t[0]*=Pa,t[1]*=Pa,t}return n=te(n[0]%360*Ha,n[1]*Ha,n.length>2?n[2]*Ha:0),t.invert=function(t){return t=n.invert(t[0]*Ha,t[1]*Ha),t[0]*=Pa,t[1]*=Pa,t},t},oa.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=te(-n[0]*Ha,-n[1]*Ha,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ie((t=+r)*Ha,u*Ha),n):t},n.precision=function(r){return arguments.length?(e=ie(t*Ha,(u=+r)*Ha),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Ha,u=n[1]*Ha,i=t[1]*Ha,a=Math.sin(r),o=Math.cos(r),c=Math.sin(u),l=Math.cos(u),f=Math.sin(i),s=Math.cos(i);return Math.atan2(Math.sqrt((e=s*a)*e+(e=l*f-c*s*o)*e),c*f+l*s*o)},oa.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return oa.range(Math.ceil(i/m)*m,u,m).map(h).concat(oa.range(Math.ceil(l/v)*v,c,v).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Math.abs(n%m)>Fa}).map(f)).concat(oa.range(Math.ceil(o/d)*d,a,d).filter(function(n){return Math.abs(n%v)>Fa}).map(s))}var e,r,u,i,a,o,c,l,f,s,h,g,p=10,d=p,m=90,v=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(m=+t[0],v=+t[1],n):[m,v]},n.minorStep=function(t){return arguments.length?(p=+t[0],d=+t[1],n):[p,d]},n.precision=function(t){return arguments.length?(y=+t,f=oe(o,a,90),s=ce(r,e,y),h=oe(l,c,90),g=ce(i,u,y),n):y},n.majorExtent([[-180,-90+Fa],[180,90-Fa]]).minorExtent([[-180,-80-Fa],[180,80+Fa]])},oa.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=le,u=fe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return se(n[0]*Ha,n[1]*Ha,t[0]*Ha,t[1]*Ha)},oa.geo.length=function(n){return _o=0,oa.geo.stream(n,wo),_o};var _o,wo={sphere:N,point:N,lineStart:he,lineEnd:N,polygonStart:N,polygonEnd:N};(oa.geo.conicEqualArea=function(){return ge(pe)}).raw=pe,oa.geo.albersUsa=function(){function n(n){return t(n)(n)}function t(n){var t=n[0],e=n[1];return e>50?a:-140>t?o:21>e?c:i}var e,r,u,i=oa.geo.conicEqualArea().rotate([98,0]).center([0,38]).parallels([29.5,45.5]),a=oa.geo.conicEqualArea().rotate([160,0]).center([0,60]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([160,0]).center([0,20]).parallels([8,18]),c=oa.geo.conicEqualArea().rotate([60,0]).center([0,10]).parallels([8,18]);return n.invert=function(n){return e(n)||r(n)||u(n)||i.invert(n)},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.6*t),o.scale(t),c.scale(1.5*t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),f=t[0],s=t[1];return i.translate(t),a.translate([f-.4*l,s+.17*l]),o.translate([f-.19*l,s+.2*l]),c.translate([f+.58*l,s+.43*l]),e=de(a,[[-180,50],[-130,72]]),r=de(o,[[-164,18],[-154,24]]),u=de(c,[[-67.5,17.5],[-65,19]]),n},n.scale(1e3)};var So,Eo,ko={point:N,lineStart:N,lineEnd:N,polygonStart:function(){Eo=0,ko.lineStart=me},polygonEnd:function(){ko.lineStart=ko.lineEnd=ko.point=N,So+=Math.abs(Eo/2)}},Ao={point:ye,lineStart:Me,lineEnd:xe,polygonStart:function(){Ao.lineStart=be},polygonEnd:function(){Ao.point=ye,Ao.lineStart=Me,Ao.lineEnd=xe}};oa.geo.path=function(){function n(n){return n&&oa.geo.stream(n,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var t,e,r,u,i=4.5;return n.area=function(n){return So=0,oa.geo.stream(n,r(ko)),So},n.centroid=function(n){return go=mo=vo=yo=0,oa.geo.stream(n,r(Ao)),yo?[mo/yo,vo/yo]:void 0},n.bounds=function(n){return _t(r)(n)},n.projection=function(e){return arguments.length?(r=(t=e)?e.stream||Se(e):ft,n):t},n.context=function(t){return arguments.length?(u=(e=t)==null?new ve:new _e(t),n):e},n.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:+t,n):i},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.albers=function(){return oa.geo.conicEqualArea().parallels([29.5,45.5]).rotate([98,0]).center([0,38]).scale(1e3)};var qo=Ee(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return Kt(qo)}).raw=qo;var No=Ee(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},ft);(oa.geo.azimuthalEquidistant=function(){return Kt(No)}).raw=No,(oa.geo.conicConformal=function(){return ge(ke)}).raw=ke,(oa.geo.conicEquidistant=function(){return ge(Ae)}).raw=Ae;var To=Ee(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return Kt(To)}).raw=To,qe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-La/2]},(oa.geo.mercator=function(){return Ne(qe)}).raw=qe;var Co=Ee(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return Kt(Co)}).raw=Co;var zo=Ee(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return Kt(zo)}).raw=zo,Te.invert=function(n,t){return[Math.atan2(U(n),Math.cos(t)),Y(Math.sin(t)/I(n))]},(oa.geo.transverseMercator=function(){return Ne(Te)}).raw=Te,oa.geom={},oa.svg={},oa.svg.line=function(){return Ce(ft)};var Do=oa.map({linear:je,"linear-closed":Le,"step-before":Fe,"step-after":He,basis:Ie,"basis-open":Ve,"basis-closed":Xe,bundle:Ze,cardinal:Oe,"cardinal-open":Pe,"cardinal-closed":Re,monotone:We});Do.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var jo=[0,2/3,1/3,0],Lo=[0,1/3,2/3,0],Fo=[0,1/6,2/3,1/6];oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,a,o,c,l,f,s,h,g,p,d=lt(e),m=lt(r),v=n.length,y=v-1,M=[],x=[],b=0;if(d===ze&&r===De)t=n;else for(i=0,t=[];v>i;++i)t.push([+d.call(this,u=n[i],i),+m.call(this,u,i)]);for(i=1;v>i;++i)t[i][1]<t[b][1]?b=i:t[i][1]==t[b][1]&&(b=t[i][0]<t[b][0]?i:b);for(i=0;v>i;++i)i!==b&&(c=t[i][1]-t[b][1],o=t[i][0]-t[b][0],M.push({angle:Math.atan2(c,o),index:i}));for(M.sort(function(n,t){return n.angle-t.angle}),g=M[0].angle,h=M[0].index,s=0,i=1;y>i;++i)a=M[i].index,g==M[i].angle?(o=t[h][0]-t[b][0],c=t[h][1]-t[b][1],l=t[a][0]-t[b][0],f=t[a][1]-t[b][1],o*o+c*c>=l*l+f*f?M[i].index=-1:(M[s].index=-1,g=M[i].angle,s=i,h=a)):(g=M[i].angle,s=i,h=a);for(x.push(b),i=0,a=0;2>i;++a)M[a].index!==-1&&(x.push(M[a].index),i++);for(p=x.length;y>a;++a)if(M[a].index!==-1){for(;!Qe(x[p-2],x[p-1],M[a].index,t);)--p;x[p++]=M[a].index}var _=[];for(i=0;p>i;++i)_.push(n[x[i]]);return _}var e=ze,r=De;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},oa.geom.polygon=function(n){return n.area=function(){for(var t=0,e=n.length,r=n[e-1][1]*n[0][0]-n[e-1][0]*n[0][1];++t<e;)r+=n[t-1][1]*n[t][0]-n[t-1][0]*n[t][1];return.5*r},n.centroid=function(t){var e,r,u=-1,i=n.length,a=0,o=0,c=n[i-1];for(arguments.length||(t=-1/(6*n.area()));++u<i;)e=c,c=n[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*t,o*t]},n.clip=function(t){for(var e,r,u,i,a,o,c=-1,l=n.length,f=n[l-1];++c<l;){for(e=t.slice(),t.length=0,i=n[c],a=e[(u=e.length)-1],r=-1;++r<u;)o=e[r],nr(o,f,i)?(nr(a,f,i)||t.push(tr(a,o,f,i)),t.push(o)):nr(a,f,i)&&t.push(tr(a,o,f,i)),a=o;f=i}return t},n},oa.geom.delaunay=function(n){var t=n.map(function(){return[]}),e=[];return er(n,function(e){t[e.region.l.index].push(n[e.region.r.index])}),t.forEach(function(t,r){var u=n[r],i=u[0],a=u[1];t.forEach(function(n){n.angle=Math.atan2(n[0]-i,n[1]-a)}),t.sort(function(n,t){return n.angle-t.angle});for(var o=0,c=t.length-1;c>o;o++)e.push([u,t[o],t[o+1]])}),e},oa.geom.voronoi=function(n){function t(n){var t,r,a,o=n.map(function(){return[]}),c=lt(u),l=lt(i),f=n.length,s=1e6;if(c===ze&&l===De)t=n;else for(t=[],a=0;f>a;++a)t.push([+c.call(this,r=n[a],a),+l.call(this,r,a)]);if(er(t,function(n){var t,e,r,u,i,a;n.a===1&&n.b>=0?(t=n.ep.r,e=n.ep.l):(t=n.ep.l,e=n.ep.r),n.a===1?(i=t?t.y:-s,r=n.c-n.b*i,a=e?e.y:s,u=n.c-n.b*a):(r=t?t.x:-s,i=n.c-n.a*r,u=e?e.x:s,a=n.c-n.a*u);var c=[r,i],l=[u,a];o[n.region.l.index].push(c,l),o[n.region.r.index].push(c,l)}),o=o.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(n){return Math.atan2(n[0]-r,n[1]-u)}),a=oa.range(n.length).sort(function(n,t){return i[n]-i[t]});return a.filter(function(n,t){return!t||i[n]-i[a[t-1]]>Fa}).map(function(t){return n[t]})}),o.forEach(function(n,e){var r=n.length;if(!r)return n.push([-s,-s],[-s,s],[s,s],[s,-s]);if(!(r>2)){var u=t[e],i=n[0],a=n[1],o=u[0],c=u[1],l=i[0],f=i[1],h=a[0],g=a[1],p=Math.abs(h-l),d=g-f;if(Math.abs(d)<Fa){var m=f>c?-s:s;n.push([-s,m],[s,m])}else if(Fa>p){var v=l>o?-s:s;n.push([v,-s],[v,s])}else{var m=(l-o)*(g-f)>(h-l)*(f-c)?s:-s,y=Math.abs(d)-p;Math.abs(y)<Fa?n.push([0>d?m:-m,m]):(y>0&&(m*=-1),n.push([-s,m],[s,m]))}}}),e)for(a=0;f>a;++a)e(o[a]);for(a=0;f>a;++a)o[a].point=n[a];return o}var e,r=null,u=ze,i=De;return arguments.length?t(n):(t.x=function(n){return arguments.length?(u=n,t):u},t.y=function(n){return arguments.length?(i=n,t):i},t.size=function(n){return arguments.length?(null==n?e=null:(r=[+n[0],+n[1]],e=oa.geom.polygon([[0,0],[0,r[1]],r,[r[0],0]]).clip),t):r},t.links=function(n){var t,e,r,a=n.map(function(){return[]}),o=[],c=lt(u),l=lt(i),f=n.length;if(c===ze&&l===De)t=n;else for(r=0;f>r;++r)t.push([+c.call(this,e=n[r],r),+l.call(this,e,r)]);return er(t,function(t){var e=t.region.l.index,r=t.region.r.index;a[e][r]||(a[e][r]=a[r][e]=!0,o.push({source:n[e],target:n[r]}))}),o},t.triangles=function(n){if(u===ze&&i===De)return oa.geom.delaunay(n);var t,e,r,a,o,c=lt(u),l=lt(i);for(a=0,t=[],o=n.length;o>a;++a)e=[+c.call(this,r=n[a],a),+l.call(this,r,a)],e.data=r,t.push(e);return oa.geom.delaunay(t).map(function(n){return n.map(function(n){return n.data})})},t)};var Ho={l:"r",r:"l"};oa.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,f=n.y;
-if(null!=c)if(Math.abs(c-e)+Math.abs(f-r)<.01)l(n,t,e,r,u,i,a,o);else{var s=n.point;n.x=n.y=n.point=null,l(n,s,c,f,u,i,a,o),l(n,t,e,r,u,i,a,o)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,a,o)}function l(n,t,e,r,u,a,o,c){var l=.5*(u+o),f=.5*(a+c),s=e>=l,h=r>=f,g=(h<<1)+s;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=ir()),s?u=l:o=l,h?a=f:c=f,i(n,t,e,r,u,a,o,c)}var f,s,h,g,p,d,m,v,y,M=lt(o),x=lt(c);if(null!=t)d=t,m=e,v=r,y=u;else if(v=y=-(d=m=1/0),s=[],h=[],p=n.length,a)for(g=0;p>g;++g)f=n[g],f.x<d&&(d=f.x),f.y<m&&(m=f.y),f.x>v&&(v=f.x),f.y>y&&(y=f.y),s.push(f.x),h.push(f.y);else for(g=0;p>g;++g){var b=+M(f=n[g],g),_=+x(f,g);d>b&&(d=b),m>_&&(m=_),b>v&&(v=b),_>y&&(y=_),s.push(b),h.push(_)}var w=v-d,S=y-m;w>S?y=m+w:v=d+S;var E=ir();if(E.add=function(n){i(E,n,+M(n,++g),+x(n,g),d,m,v,y)},E.visit=function(n){ar(n,E,d,m,v,y)},g=-1,null==t){for(;++g<p;)i(E,n[g],s[g],h[g],d,m,v,y);--g}else n.forEach(E.add);return s=h=n=f=null,E}var a,o=ze,c=De;return(a=arguments.length)?(o=rr,c=ur,3===a&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(o=n,i):o},i.y=function(n){return arguments.length?(c=n,i):c},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r,u]},i)},oa.interpolateRgb=or,oa.transform=function(n){var t=ca.createElementNS(oa.ns.prefix.svg,"g");return(oa.transform=function(n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate();return new cr(e?e.matrix:Po)})(n)},cr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var Po={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateNumber=hr,oa.interpolateTransform=gr,oa.interpolateObject=pr,oa.interpolateString=dr;var Ro=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;oa.interpolate=mr,oa.interpolators=[pr,function(n,t){return Array.isArray(t)&&yr(n,t)},function(n,t){return("string"==typeof n||"string"==typeof t)&&dr(n+"",t+"")},function(n,t){return("string"==typeof t?Za.has(t)||/^(#|rgb\(|hsl\()/.test(t):t instanceof L)&&or(n,t)},function(n,t){return!isNaN(n=+n)&&!isNaN(t=+t)&&hr(n,t)}],oa.interpolateArray=yr;var Oo=function(){return ft},Yo=oa.map({linear:Oo,poly:Er,quad:function(){return _r},cubic:function(){return wr},sin:function(){return kr},exp:function(){return Ar},circle:function(){return qr},elastic:Nr,back:Tr,bounce:function(){return Cr}}),Uo=oa.map({"in":ft,out:xr,"in-out":br,"out-in":function(n){return br(xr(n))}});oa.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=Yo.get(e)||Oo,r=Uo.get(r)||ft,Mr(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},oa.interpolateHcl=zr,oa.interpolateHsl=Dr,oa.interpolateLab=jr,oa.interpolateRound=Lr,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Pr(n[e]));return t}},oa.layout.chord=function(){function n(){var n,l,s,h,g,p={},d=[],m=oa.range(i),v=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];d.push(l),v.push(oa.range(i)),n+=l}for(a&&m.sort(function(n,t){return a(d[n],d[t])}),o&&v.forEach(function(n,t){n.sort(function(n,e){return o(u[t][n],u[t][e])})}),n=(2*La-f*i)/n,l=0,h=-1;++h<i;){for(s=l,g=-1;++g<i;){var y=m[h],M=v[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:s,endAngle:l,value:(l-s)/n},l+=f}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,a,o,c,l={},f=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(f=n,e=r=null,l):f},l.sortGroups=function(n){return arguments.length?(a=n,e=r=null,l):a},l.sortSubgroups=function(n){return arguments.length?(o=n,e=null,l):o},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},oa.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,a=t.cy-n.y,o=1/Math.sqrt(i*i+a*a);if(d>(u-e)*o){var c=t.charge*o*o;return n.px-=i*c,n.py-=a*c,!0}if(t.point&&isFinite(o)){var c=t.pointCharge*o*o;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,o.resume()}var e,r,u,i,a,o={},c=oa.dispatch("start","tick","end"),l=[1,1],f=.9,s=Io,h=Vo,g=-30,p=.1,d=.8,m=[],v=[];return o.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,o,s,h,d,y,M,x,b=m.length,_=v.length;for(e=0;_>e;++e)o=v[e],s=o.source,h=o.target,M=h.x-s.x,x=h.y-s.y,(d=M*M+x*x)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,M*=d,x*=d,h.x-=M*(y=s.weight/(h.weight+s.weight)),h.y-=x*y,s.x+=M*(y=1-y),s.y+=x*y);if((y=r*p)&&(M=l[0]/2,x=l[1]/2,e=-1,y))for(;++e<b;)o=m[e],o.x+=(M-o.x)*y,o.y+=(x-o.y)*y;if(g)for(Xr(t=oa.geom.quadtree(m),r,a),e=-1;++e<b;)(o=m[e]).fixed||t.visit(n(o));for(e=-1;++e<b;)o=m[e],o.fixed?(o.x=o.px,o.y=o.py):(o.x-=(o.px-(o.px=o.x))*f,o.y-=(o.py-(o.py=o.y))*f);c.tick({type:"tick",alpha:r})},o.nodes=function(n){return arguments.length?(m=n,o):m},o.links=function(n){return arguments.length?(v=n,o):v},o.size=function(n){return arguments.length?(l=n,o):l},o.linkDistance=function(n){return arguments.length?(s="function"==typeof n?n:+n,o):s},o.distance=o.linkDistance,o.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,o):h},o.friction=function(n){return arguments.length?(f=+n,o):f},o.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,o):g},o.gravity=function(n){return arguments.length?(p=+n,o):p},o.theta=function(n){return arguments.length?(d=+n,o):d},o.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),oa.timer(o.tick)),o):r},o.start=function(){function n(n,r){for(var u,i=t(e),a=-1,o=i.length;++a<o;)if(!isNaN(u=i[a][n]))return u;return Math.random()*r}function t(){if(!c){for(c=[],r=0;p>r;++r)c[r]=[];for(r=0;d>r;++r){var n=v[r];c[n.source.index].push(n.target),c[n.target.index].push(n.source)}}return c[e]}var e,r,c,f,p=m.length,d=v.length,y=l[0],M=l[1];for(e=0;p>e;++e)(f=m[e]).index=e,f.weight=0;for(e=0;d>e;++e)f=v[e],typeof f.source=="number"&&(f.source=m[f.source]),typeof f.target=="number"&&(f.target=m[f.target]),++f.source.weight,++f.target.weight;for(e=0;p>e;++e)f=m[e],isNaN(f.x)&&(f.x=n("x",y)),isNaN(f.y)&&(f.y=n("y",M)),isNaN(f.px)&&(f.px=f.x),isNaN(f.py)&&(f.py=f.y);if(u=[],"function"==typeof s)for(e=0;d>e;++e)u[e]=+s.call(this,v[e],e);else for(e=0;d>e;++e)u[e]=s;if(i=[],"function"==typeof h)for(e=0;d>e;++e)i[e]=+h.call(this,v[e],e);else for(e=0;d>e;++e)i[e]=h;if(a=[],"function"==typeof g)for(e=0;p>e;++e)a[e]=+g.call(this,m[e],e);else for(e=0;p>e;++e)a[e]=g;return o.resume()},o.resume=function(){return o.alpha(.1)},o.stop=function(){return o.alpha(0)},o.drag=function(){return e||(e=oa.behavior.drag().origin(ft).on("dragstart.force",Yr).on("drag.force",t).on("dragend.force",Ur)),arguments.length?(this.on("mouseover.force",Ir).on("mouseout.force",Vr).call(e),void 0):e},oa.rebind(o,c,"on")};var Io=20,Vo=1;oa.layout.hierarchy=function(){function n(t,a,o){var c=u.call(e,t,a);if(t.depth=a,o.push(t),c&&(l=c.length)){for(var l,f,s=-1,h=t.children=[],g=0,p=a+1;++s<l;)f=n(c[s],p,o),f.parent=t,h.push(f),g+=f.value;r&&h.sort(r),i&&(t.value=g)}else i&&(t.value=+i.call(e,t,a)||0);return t}function t(n,r){var u=n.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;++c<o;)a+=t(u[c],l);else i&&(a=+i.call(e,n,r)||0);return i&&(n.value=a),a}function e(t){var e=[];return n(t,0,e),e}var r=Jr,u=Br,i=$r;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=t.value?r/t.value:0;++l<a;)n(o=i[l],e,c=o.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return n(a[0],0,u[0],u[1]/t(a[0])),a}var r=oa.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Zr(e,r)},oa.layout.pie=function(){function n(i){var a=i.map(function(e,r){return+t.call(n,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-o)/oa.sum(a),l=oa.range(i.length);null!=e&&l.sort(e===Xo?function(n,t){return a[t]-a[n]}:function(n,t){return e(i[n],i[t])});var f=[];return l.forEach(function(n){var t;f[n]={data:i[n],value:t=a[n],startAngle:o,endAngle:o+=t*c}}),f}var t=Number,e=Xo,r=0,u=2*La;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var Xo={};oa.layout.stack=function(){function n(o,c){var l=o.map(function(e,r){return t.call(n,e,r)}),f=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),s=e.call(n,f,c);l=oa.permute(l,s),f=oa.permute(f,s);var h,g,p,d=r.call(n,f,c),m=l.length,v=l[0].length;for(g=0;v>g;++g)for(u.call(n,l[0][g],p=d[g],f[0][g][1]),h=1;m>h;++h)u.call(n,l[h][g],p+=f[h-1][g][1],f[h][g][1]);return o}var t=ft,e=nu,r=tu,u=Qr,i=Kr,a=Wr;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Zo.get(t)||nu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:Bo.get(t)||tu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var Zo=oa.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(eu),i=n.map(ru),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,c=0,l=[],f=[];for(t=0;r>t;++t)e=a[t],c>o?(o+=i[e],l.push(e)):(c+=i[e],f.push(e));return f.reverse().concat(l)},reverse:function(n){return oa.range(n.length).reverse()},"default":nu}),Bo=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(n){var t,e,r,u,i,a,o,c,l,f=n.length,s=n[0],h=s.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;f>t;++t)u+=n[t][e][1];for(t=0,i=0,o=s[e][0]-s[e-1][0];f>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:tu});oa.layout.histogram=function(){function n(n,i){for(var a,o,c=[],l=n.map(e,this),f=r.call(this,l,i),s=u.call(this,f,l,i),i=-1,h=l.length,g=s.length-1,p=t?1:1/h;++i<g;)a=c[i]=[],a.dx=s[i+1]-(a.x=s[i]),a.y=0;if(g>0)for(i=-1;++i<h;)o=l[i],o>=f[0]&&o<=f[1]&&(a=c[oa.bisect(s,o,1,g)-1],a.y+=p,a.push(n[i]));return c}var t=!0,e=Number,r=ou,u=iu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=lt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return au(n,t)}:lt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.tree=function(){function n(n,u){function i(n,t){var r=n.children,u=n._tree;if(r&&(a=r.length)){for(var a,c,l,f=r[0],s=f,h=-1;++h<a;)l=r[h],i(l,c),s=o(l,c,s),c=l;mu(n);var g=.5*(f._tree.prelim+l._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function o(n,t,r){if(t){for(var u,i=n,a=n,o=t,c=n.parent.children[0],l=i._tree.mod,f=a._tree.mod,s=o._tree.mod,h=c._tree.mod;o=fu(o),i=lu(i),o&&i;)c=lu(c),a=fu(a),a._tree.ancestor=n,u=o._tree.prelim+s-i._tree.prelim-l+e(o,i),u>0&&(vu(yu(o,n,r),n,u),l+=u,f+=u),s+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,f+=a._tree.mod;o&&!fu(a)&&(a._tree.thread=o,a._tree.mod+=s-f),i&&!lu(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=n)}return r}var c=t.call(this,n,u),l=c[0];du(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var f=su(l,gu),s=su(l,hu),h=su(l,pu),g=f.x-e(f,s)/2,p=s.x+e(s,f)/2,d=h.depth||1;return du(l,function(n){n.x=(n.x-g)/(p-g)*r[0],n.y=n.depth/d*r[1],delete n._tree}),c}var t=oa.layout.hierarchy().sort(null).value(null),e=cu,r=[1,1];return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(r=t,n):r},Zr(n,t)},oa.layout.pack=function(){function n(n,u){var i=t.call(this,n,u),a=i[0];a.x=0,a.y=0,du(a,function(n){n.r=Math.sqrt(n.value)}),du(a,wu);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var f=e*l/2;du(a,function(n){n.r+=f}),du(a,wu),du(a,function(n){n.r-=f}),l=Math.max(2*a.r/o,2*a.r/c)}return ku(a,o/2,c/2,1/l),i}var t=oa.layout.hierarchy().sort(Mu),e=0,r=[1,1];return n.size=function(t){return arguments.length?(r=t,n):r},n.padding=function(t){return arguments.length?(e=+t,n):e},Zr(n,t)},oa.layout.cluster=function(){function n(n,u){var i,a=t.call(this,n,u),o=a[0],c=0;du(o,function(n){var t=n.children;t&&t.length?(n.x=Nu(t),n.y=qu(t)):(n.x=i?c+=e(n,i):0,n.y=0,i=n)});var l=Tu(o),f=Cu(o),s=l.x-e(l,f)/2,h=f.x+e(f,l)/2;return du(o,function(n){n.x=(n.x-s)/(h-s)*r[0],n.y=(1-(o.y?n.y/o.y:1))*r[1]}),a}var t=oa.layout.hierarchy().sort(null).value(null),e=cu,r=[1,1];return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(r=t,n):r},Zr(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,c,l=s(e),f=[],h=i.slice(),p=1/0,d="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?e.depth&1?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),f.area=0;(c=h.length)>0;)f.push(a=h[c-1]),f.area+=a.area,"squarify"!==g||(o=r(f,d))<=p?(h.pop(),p=o):(f.area-=f.pop().area,u(f,d,l,!1),d=Math.min(l.dx,l.dy),f.length=f.area=0,p=1/0);f.length&&(u(f,d,l,!0),f.length=f.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=s(t),o=r.slice(),c=[];for(n(o,a.dx*a.dy/t.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,i.z!=null&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,l=e.y,f=t?c(n.area/t):0;if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++i<a;)u=n[i],u.x=o,u.y=l,u.dy=f,o+=u.dx=Math.min(e.x+e.dx-o,f?c(u.area/f):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=f,e.dy-=f}else{for((r||f>e.dx)&&(f=e.dx);++i<a;)u=n[i],u.x=o,u.y=l,u.dx=f,l+=u.dy=Math.min(e.y+e.dy-l,f?c(u.area/f):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=f,e.dx-=f}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),n([i],i.dx*i.dy/i.value),(a?e:t)(i),h&&(a=u),u}var a,o=oa.layout.hierarchy(),c=Math.round,l=[1,1],f=null,s=zu,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?zu(t):Du(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Du(t,n)}if(!arguments.length)return f;var r;return s=(f=n)==null?zu:(r=typeof n)=="function"?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,a=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Zr(i,o)},oa.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=Math.random()*2-1,r=Math.random()*2-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},oa.scale={},oa.scale.linear=function(){return Ru([0,1],[0,1],mr,!1)},oa.scale.log=function(){return Xu(oa.scale.linear().domain([0,Math.LN10]),10,Zu,Bu)};var $o=oa.format(".0e");oa.scale.pow=function(){return Ku(oa.scale.linear(),1)},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return Qu([],{t:"range",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(Jo)},oa.scale.category20=function(){return oa.scale.ordinal().range(Go)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Ko)},oa.scale.category20c=function(){return oa.scale.ordinal().range(Wo)};var Jo=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Go=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Ko=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Wo=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];oa.scale.quantile=function(){return ni([],[])},oa.scale.quantize=function(){return ti(0,1,[0,1])},oa.scale.threshold=function(){return ei([.5],[0,1])},oa.scale.identity=function(){return ri([0,1])},oa.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Qo,o=u.apply(this,arguments)+Qo,c=(a>o&&(c=a,a=o,o=c),o-a),l=La>c?"0":"1",f=Math.cos(a),s=Math.sin(a),h=Math.cos(o),g=Math.sin(o);return c>=nc?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+l+",0 "+n*f+","+n*s+"Z":"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=ui,e=ii,r=ai,u=oi;return n.innerRadius=function(e){return arguments.length?(t=lt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=lt(t),n):e},n.startAngle=function(t){return arguments.length?(r=lt(t),n):r},n.endAngle=function(t){return arguments.length?(u=lt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Qo;return[Math.cos(i)*n,Math.sin(i)*n]},n};var Qo=-La/2,nc=2*La-1e-6;oa.svg.line.radial=function(){var n=Ce(ci);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},Fe.reverse=He,He.reverse=Fe,oa.svg.area=function(){return li(ft)},oa.svg.area.radial=function(){var n=li(ci);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var c=t(this,i,n,o),l=t(this,a,n,o);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=c.call(n,u,r)+Qo,f=l.call(n,u,r)+Qo;return{r:i,a0:a,a1:f,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(f),i*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>La)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=le,a=fe,o=fi,c=ai,l=oi;return n.radius=function(t){return arguments.length?(o=lt(t),n):o},n.source=function(t){return arguments.length?(i=lt(t),n):i},n.target=function(t){return arguments.length?(a=lt(t),n):a},n.startAngle=function(t){return arguments.length?(c=lt(t),n):c},n.endAngle=function(t){return arguments.length?(l=lt(t),n):l},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,c=[i,{x:i.x,y:o},{x:a.x,y:o},a];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=le,e=fe,r=si;return n.source=function(e){return arguments.length?(t=lt(e),n):t},n.target=function(t){return arguments.length?(e=lt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=si,e=n.projection;return n.projection=function(n){return arguments.length?e(hi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(tc.get(t.call(this,n,r))||di)(e.call(this,n,r))}var t=pi,e=gi;return n.type=function(e){return arguments.length?(t=lt(e),n):t},n.size=function(t){return arguments.length?(e=lt(t),n):e},n};var tc=oa.map({circle:di,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*uc)),e=t*uc;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/rc),e=t*rc/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/rc),e=t*rc/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});oa.svg.symbolTypes=tc.keys();var ec,rc=Math.sqrt(3),uc=Math.tan(30*Ha),ic=[],ac=0,oc={ease:Sr,delay:0,duration:250};ic.call=Ea.call,ic.empty=Ea.empty,ic.node=Ea.node,oa.transition=function(n){return arguments.length?ec?n.transition():n:Ta.transition()},oa.transition.prototype=ic,ic.select=function(n){var t,e,r,u=this.id,i=[];"function"!=typeof n&&(n=m(n));for(var a=-1,o=this.length;++a<o;){i.push(t=[]);for(var c=this[a],l=-1,f=c.length;++l<f;)(r=c[l])&&(e=n.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),Mi(e,l,u,r.__transition__[u]),t.push(e)):t.push(null)}return mi(i,u)},ic.selectAll=function(n){var t,e,r,u,i,a=this.id,o=[];"function"!=typeof n&&(n=v(n));for(var c=-1,l=this.length;++c<l;)for(var f=this[c],s=-1,h=f.length;++s<h;)if(r=f[s]){i=r.__transition__[a],e=n.call(r,r.__data__,s),o.push(t=[]);for(var g=-1,p=e.length;++g<p;)Mi(u=e[g],g,a,i),t.push(u)}return mi(o,a)},ic.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=A(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o)&&t.push(r)}return mi(u,this.id,this.time).ease(this.ease())},ic.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):D(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},ic.attr=function(n,t){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var u=vr(n),i=oa.ns.qualify(n);return vi(this,"attr."+n,t,function(n){function t(){var t,e=this.getAttribute(i);return e!==n&&(t=u(e,n),function(n){this.setAttribute(i,t(n))})}function a(){var t,e=this.getAttributeNS(i.space,i.local);return e!==n&&(t=u(e,n),function(n){this.setAttributeNS(i.space,i.local,t(n))})}return null==n?i.local?r:e:(n+="",i.local?a:t)})},ic.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},ic.style=function(n,t,e){function r(){this.style.removeProperty(n)}var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}var i=vr(n);return vi(this,"style."+n,t,function(t){function u(){var r,u=la.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=i(u,t),function(t){this.style.setProperty(n,r(t),e)})}return null==t?r:(t+="",u)})},ic.styleTween=function(n,t,e){return arguments.length<3&&(e=""),this.tween("style."+n,function(r,u){var i=t.call(this,r,u,la.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}})},ic.text=function(n){return vi(this,"text",n,yi)},ic.remove=function(){return this.each("end.transition",function(){var n;!this.__transition__&&(n=this.parentNode)&&n.removeChild(this)})},ic.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=oa.ease.apply(oa,arguments)),D(this,function(e){e.__transition__[t].ease=n}))},ic.delay=function(n){var t=this.id;return D(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=n.call(e,e.__data__,r,u)|0}:(n|=0,function(e){e.__transition__[t].delay=n}))},ic.duration=function(n){var t=this.id;return D(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u)|0)}:(n=Math.max(1,0|n),function(e){e.__transition__[t].duration=n}))},ic.each=function(n,t){var e=this.id;if(arguments.length<2){var r=oc,u=ec;ec=e,D(this,function(t,r,u){oc=t.__transition__[e],n.call(t,t.__data__,r,u)}),oc=r,ec=u}else D(this,function(r){r.__transition__[e].event.on(n,t)});return this},ic.transition=function(){for(var n,t,e,r,u=this.id,i=++ac,a=[],o=0,c=this.length;c>o;o++){a.push(n=[]);for(var t=this[o],l=0,f=t.length;f>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Mi(e,l,i,r)),n.push(e)}return mi(a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,s=oa.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,g=null==t?e.tickFormat?e.tickFormat.apply(e,c):String:t,p=_i(e,h,f),d=s.selectAll(".tick.minor").data(p,String),m=d.enter().insert("line",".tick").attr("class","tick minor").style("opacity",1e-6),v=oa.transition(d.exit()).style("opacity",1e-6).remove(),y=oa.transition(d).style("opacity",1),M=s.selectAll(".tick.major").data(h,String),x=M.enter().insert("g","path").attr("class","tick major").style("opacity",1e-6),b=oa.transition(M.exit()).style("opacity",1e-6).remove(),_=oa.transition(M).style("opacity",1),w=Lu(e),S=s.selectAll(".domain").data([0]),E=(S.enter().append("path").attr("class","domain"),oa.transition(S)),k=e.copy(),A=this.__chart__||k;this.__chart__=k,x.append("line"),x.append("text");var q=x.select("line"),N=_.select("line"),T=M.select("text").text(g),C=x.select("text"),z=_.select("text");switch(r){case"bottom":n=xi,m.attr("y2",i),y.attr("x2",0).attr("y2",i),q.attr("y2",u),C.attr("y",Math.max(u,0)+o),N.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),T.attr("dy",".71em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":n=xi,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),q.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),N.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),T.attr("dy","0em").style("text-anchor","middle"),E.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":n=bi,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),q.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),N.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),T.attr("dy",".32em").style("text-anchor","end"),E.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":n=bi,m.attr("x2",i),y.attr("x2",i).attr("y2",0),q.attr("x2",u),C.attr("x",Math.max(u,0)+o),N.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),T.attr("dy",".32em").style("text-anchor","start"),E.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)x.call(n,A),_.call(n,k),b.call(n,k),m.call(n,A),y.call(n,k),v.call(n,k);else{var D=k.rangeBand()/2,j=function(n){return k(n)+D};x.call(n,j),_.call(n,j)}})}var t,e=oa.scale.linear(),r=cc,u=6,i=6,a=6,o=3,c=[10],l=null,f=0;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in lc?t+"":cc,n):r},n.ticks=function(){return arguments.length?(c=arguments,n):c},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+t,i=r>1?+e:u,a=r>0?+arguments[r]:u,n},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(t){return arguments.length?(f=+t,n):f},n};var cc="bottom",lc={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(i){i.each(function(){var i,a=oa.select(this),l=a.selectAll(".background").data([0]),s=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(f,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),l.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),s.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return fc[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",n.empty()?"none":null),h.exit().remove(),o&&(i=Lu(o),l.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=Lu(c),l.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),t(a)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+h[+/e$/.test(n)][0]+","+h[+/^s/.test(n)][1]+")"})}function e(n){n.select(".extent").attr("x",h[0][0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",h[1][0]-h[0][0])}function r(n){n.select(".extent").attr("y",h[0][1]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1][1]-h[0][1])}function u(){function u(){var n=oa.event.changedTouches;return n?oa.touches(y,n)[0]:oa.mouse(y)}function f(){oa.event.keyCode==32&&(E||(m=null,k[0]-=h[1][0],k[1]-=h[1][1],E=2),l())}function s(){oa.event.keyCode==32&&2==E&&(k[0]+=h[1][0],k[1]+=h[1][1],E=0,l())}function g(){var n=u(),i=!1;v&&(n[0]+=v[0],n[1]+=v[1]),E||(oa.event.altKey?(m||(m=[(h[0][0]+h[1][0])/2,(h[0][1]+h[1][1])/2]),k[0]=h[+(n[0]<m[0])][0],k[1]=h[+(n[1]<m[1])][1]):m=null),w&&p(n,o,0)&&(e(b),i=!0),S&&p(n,c,1)&&(r(b),i=!0),i&&(t(b),x({type:"brush",mode:E?"move":"resize"}))}function p(n,t,e){var r,u,a=Lu(t),o=a[0],c=a[1],l=k[e],f=h[1][e]-h[0][e];return E&&(o-=l,c-=f+l),r=Math.max(o,Math.min(c,n[e])),E?u=(r+=l)+f:(m&&(l=Math.max(o,Math.min(c,2*m[e]-r))),r>l?(u=r,r=l):u=l),h[0][e]!==r||h[1][e]!==u?(i=null,h[0][e]=r,h[1][e]=u,!0):void 0}function d(){g(),b.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),oa.select("body").style("cursor",null),A.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),x({type:"brushend"}),l()}var m,v,y=this,M=oa.select(oa.event.target),x=a.of(y,arguments),b=oa.select(y),_=M.datum(),w=!/^(n|s)$/.test(_)&&o,S=!/^(e|w)$/.test(_)&&c,E=M.classed("extent"),k=u(),A=oa.select(la).on("mousemove.brush",g).on("mouseup.brush",d).on("touchmove.brush",g).on("touchend.brush",d).on("keydown.brush",f).on("keyup.brush",s);if(E)k[0]=h[0][0]-k[0],k[1]=h[0][1]-k[1];else if(_){var q=+/w$/.test(_),N=+/^n/.test(_);v=[h[1-q][0]-k[0],h[1-N][1]-k[1]],k[0]=h[q][0],k[1]=h[N][1]}else oa.event.altKey&&(m=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),oa.select("body").style("cursor",M.style("cursor")),x({type:"brushstart"}),g(),l()
-}var i,a=s(n,"brushstart","brush","brushend"),o=null,c=null,f=sc[0],h=[[0,0],[0,0]];return n.x=function(t){return arguments.length?(o=t,f=sc[!o<<1|!c],n):o},n.y=function(t){return arguments.length?(c=t,f=sc[!o<<1|!c],n):c},n.extent=function(t){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=t[0],r=t[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),h[0][0]=0|e,h[1][0]=0|r),c&&(u=t[0],a=t[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),h[0][1]=0|u,h[1][1]=0|a),n):(t=i||h,o&&(e=t[0][0],r=t[1][0],i||(e=h[0][0],r=h[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=t[0][1],a=t[1][1],i||(u=h[0][1],a=h[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a])},n.clear=function(){return i=null,h[0][0]=h[0][1]=h[1][0]=h[1][1]=0,n},n.empty=function(){return o&&h[0][0]===h[1][0]||c&&h[0][1]===h[1][1]},oa.rebind(n,a,"on")};var fc={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},sc=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];oa.time={};var hc=Date,gc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];wi.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){pc.setUTCDate.apply(this._,arguments)},setDay:function(){pc.setUTCDay.apply(this._,arguments)},setFullYear:function(){pc.setUTCFullYear.apply(this._,arguments)},setHours:function(){pc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){pc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){pc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){pc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){pc.setUTCSeconds.apply(this._,arguments)},setTime:function(){pc.setTime.apply(this._,arguments)}};var pc=Date.prototype,dc="%a %b %e %X %Y",mc="%m/%d/%Y",vc="%H:%M:%S",yc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Mc=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],xc=["January","February","March","April","May","June","July","August","September","October","November","December"],bc=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];oa.time.year=Si(function(n){return n=oa.time.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),oa.time.years=oa.time.year.range,oa.time.years.utc=oa.time.year.utc.range,oa.time.day=Si(function(n){var t=new hc(1970,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),oa.time.days=oa.time.day.range,oa.time.days.utc=oa.time.day.utc.range,oa.time.dayOfYear=function(n){var t=oa.time.year(n);return Math.floor((n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5)},gc.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=oa.time[n]=Si(function(n){return(n=oa.time.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+Math.floor(t)*7)},function(n){var e=oa.time.year(n).getDay();return Math.floor((oa.time.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});oa.time[n+"s"]=e.range,oa.time[n+"s"].utc=e.utc.range,oa.time[n+"OfYear"]=function(n){var e=oa.time.year(n).getDay();return Math.floor((oa.time.dayOfYear(n)+(e+t)%7)/7)}}),oa.time.week=oa.time.sunday,oa.time.weeks=oa.time.sunday.range,oa.time.weeks.utc=oa.time.sunday.utc.range,oa.time.weekOfYear=oa.time.sundayOfYear,oa.time.format=function(n){function t(t){for(var r,u,i,a=[],o=-1,c=0;++o<e;)n.charCodeAt(o)===37&&(a.push(n.substring(c,o)),(u=qc[r=n.charAt(++o)])!=null&&(r=n.charAt(++o)),(i=Nc[r])&&(r=i(t,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(n.substring(c,o)),a.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=ki(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+e.p*12);var u=new hc;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},t.toString=function(){return n},t};var _c=Ai(yc),wc=Ai(Mc),Sc=Ai(xc),Ec=qi(xc),kc=Ai(bc),Ac=qi(bc),qc={"-":"",_:" ",0:"0"},Nc={a:function(n){return Mc[n.getDay()]},A:function(n){return yc[n.getDay()]},b:function(n){return bc[n.getMonth()]},B:function(n){return xc[n.getMonth()]},c:oa.time.format(dc),d:function(n,t){return Ni(n.getDate(),t,2)},e:function(n,t){return Ni(n.getDate(),t,2)},H:function(n,t){return Ni(n.getHours(),t,2)},I:function(n,t){return Ni(n.getHours()%12||12,t,2)},j:function(n,t){return Ni(1+oa.time.dayOfYear(n),t,3)},L:function(n,t){return Ni(n.getMilliseconds(),t,3)},m:function(n,t){return Ni(n.getMonth()+1,t,2)},M:function(n,t){return Ni(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return Ni(n.getSeconds(),t,2)},U:function(n,t){return Ni(oa.time.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ni(oa.time.mondayOfYear(n),t,2)},x:oa.time.format(mc),X:oa.time.format(vc),y:function(n,t){return Ni(n.getFullYear()%100,t,2)},Y:function(n,t){return Ni(n.getFullYear()%1e4,t,4)},Z:Bi,"%":function(){return"%"}},Tc={a:Ti,A:Ci,b:zi,B:Di,c:ji,d:Yi,e:Yi,H:Ui,I:Ui,L:Xi,m:Oi,M:Ii,p:Zi,S:Vi,x:Li,X:Fi,y:Pi,Y:Hi},Cc=/^\s*\d+/,zc=oa.map({am:0,pm:1});oa.time.format.utc=function(n){function t(n){try{hc=wi;var t=new hc;return t._=n,e(t)}finally{hc=Date}}var e=oa.time.format(n);return t.parse=function(n){try{hc=wi;var t=e.parse(n);return t&&t._}finally{hc=Date}},t.toString=e.toString,t};var Dc=oa.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");oa.time.format.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?$i:Dc,$i.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},$i.toString=Dc.toString,oa.time.second=Si(function(n){return new hc(Math.floor(n/1e3)*1e3)},function(n,t){n.setTime(n.getTime()+Math.floor(t)*1e3)},function(n){return n.getSeconds()}),oa.time.seconds=oa.time.second.range,oa.time.seconds.utc=oa.time.second.utc.range,oa.time.minute=Si(function(n){return new hc(Math.floor(n/6e4)*6e4)},function(n,t){n.setTime(n.getTime()+Math.floor(t)*6e4)},function(n){return n.getMinutes()}),oa.time.minutes=oa.time.minute.range,oa.time.minutes.utc=oa.time.minute.utc.range,oa.time.hour=Si(function(n){var t=n.getTimezoneOffset()/60;return new hc((Math.floor(n/36e5-t)+t)*36e5)},function(n,t){n.setTime(n.getTime()+Math.floor(t)*36e5)},function(n){return n.getHours()}),oa.time.hours=oa.time.hour.range,oa.time.hours.utc=oa.time.hour.utc.range,oa.time.month=Si(function(n){return n=oa.time.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),oa.time.months=oa.time.month.range,oa.time.months.utc=oa.time.month.utc.range;var jc=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Lc=[[oa.time.second,1],[oa.time.second,5],[oa.time.second,15],[oa.time.second,30],[oa.time.minute,1],[oa.time.minute,5],[oa.time.minute,15],[oa.time.minute,30],[oa.time.hour,1],[oa.time.hour,3],[oa.time.hour,6],[oa.time.hour,12],[oa.time.day,1],[oa.time.day,2],[oa.time.week,1],[oa.time.month,1],[oa.time.month,3],[oa.time.year,1]],Fc=[[oa.time.format("%Y"),Dt],[oa.time.format("%B"),function(n){return n.getMonth()}],[oa.time.format("%b %d"),function(n){return n.getDate()!=1}],[oa.time.format("%a %d"),function(n){return n.getDay()&&n.getDate()!=1}],[oa.time.format("%I %p"),function(n){return n.getHours()}],[oa.time.format("%I:%M"),function(n){return n.getMinutes()}],[oa.time.format(":%S"),function(n){return n.getSeconds()}],[oa.time.format(".%L"),function(n){return n.getMilliseconds()}]],Hc=oa.scale.linear(),Pc=Wi(Fc);Lc.year=function(n,t){return Hc.domain(n.map(na)).ticks(t).map(Qi)},oa.time.scale=function(){return Ji(oa.scale.linear(),Lc,Pc)};var Rc=Lc.map(function(n){return[n[0].utc,n[1]]}),Oc=[[oa.time.format.utc("%Y"),Dt],[oa.time.format.utc("%B"),function(n){return n.getUTCMonth()}],[oa.time.format.utc("%b %d"),function(n){return n.getUTCDate()!=1}],[oa.time.format.utc("%a %d"),function(n){return n.getUTCDay()&&n.getUTCDate()!=1}],[oa.time.format.utc("%I %p"),function(n){return n.getUTCHours()}],[oa.time.format.utc("%I:%M"),function(n){return n.getUTCMinutes()}],[oa.time.format.utc(":%S"),function(n){return n.getUTCSeconds()}],[oa.time.format.utc(".%L"),function(n){return n.getUTCMilliseconds()}]],Yc=Wi(Oc);return Rc.year=function(n,t){return Hc.domain(n.map(ea)).ticks(t).map(ta)},oa.time.scale.utc=function(){return Ji(oa.scale.linear(),Rc,Yc)},oa.text=function(){return oa.xhr.apply(oa,arguments).response(ra)},oa.json=function(n,t){return oa.xhr(n,"application/json",t).response(ua)},oa.html=function(n,t){return oa.xhr(n,"text/html",t).response(ia)},oa.xml=function(){return oa.xhr.apply(oa,arguments).response(aa)},oa}();
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/lib/geoPosition.min.js b/dashboard/lib/static/HospitalCosts/lib/geoPosition.min.js
deleted file mode 100755
index 2a51c25..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/geoPosition.min.js
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// javascript-mobile-desktop-geolocation
-// https://github.com/estebanav/javascript-mobile-desktop-geolocation
-//
-// Copyright J. Esteban Acosta Villafañe
-// Licensed under the MIT licenses.
-//
-// Based on Stan Wiechers > geo-location-javascript v0.4.8 > http://code.google.com/p/geo-location-javascript/
-//
-// Revision: $Rev: 01 $:
-// Author: $Author: estebanav $:
-// Date: $Date: 2012-09-07 23:03:53 -0300 (Fri, 07 Sep 2012) $:
-
-function handleBlackBerryLocationTimeout(){if(bb.blackberryTimeoutId!=-1){bb.error({message:"Timeout error",code:3})}}function handleBlackBerryLocation(){clearTimeout(bb.blackberryTimeoutId);bb.blackberryTimeoutId=-1;if(bb.success&&bb.error){if(blackberry.location.latitude==0&&blackberry.location.longitude==0){bb.error({message:"Position unavailable",code:2})}else{var e=null;if(blackberry.location.timestamp){e=new Date(blackberry.location.timestamp)}bb.success({timestamp:e,coords:{latitude:blackberry.location.latitude,longitude:blackberry.location.longitude}})}bb.success=null;bb.error=null}}var bb={success:0,error:0,blackberryTimeoutId:-1};var geoPosition=function(){var e={};var t=null;var n="undefined";var i="http://freegeoip.net/json/?callback=JSONPCallback";e.getCurrentPosition=function(e,n,r){t.getCurrentPosition(e,n,r)};e.jsonp={callbackCounter:0,fetch:function(e,t){var n="JSONPCallback_"+this.callbackCounter++;window[n]=this.evalJSONP(t);e=e.replace("=JSONPCallback","="+n);var r=document.createElement("SCRIPT");r.src=e;document.getElementsByTagName("HEAD")[0].appendChild(r)},evalJSONP:function(e){return function(t){e(t)}}};e.confirmation=function(){return confirm("This Webpage wants to track your physical location.\nDo you allow it?")};e.init=function(){try{var s=typeof navigator.geolocation!=n;if(!s){if(!e.confirmation()){return false}}if(typeof geoPositionSimulator!=n&&geoPositionSimulator.length>0){t=geoPositionSimulator}else if(typeof bondi!=n&&typeof bondi.geolocation!=n){t=bondi.geolocation}else if(s){t=navigator.geolocation;e.getCurrentPosition=function(e,r,i){function s(t){var r;if(typeof t.latitude!=n){r={timestamp:t.timestamp,coords:{latitude:t.latitude,longitude:t.longitude}}}else{r=t}e(r)}t.getCurrentPosition(s,r,i)}}else if(typeof window.blackberry!=n&&blackberry.location.GPSSupported){if(typeof blackberry.location.setAidMode==n){return false}blackberry.location.setAidMode(2);e.getCurrentPosition=function(e,t,n){bb.success=e;bb.error=t;if(n["timeout"]){bb.blackberryTimeoutId=setTimeout("handleBlackBerryLocationTimeout()",n["timeout"])}else{bb.blackberryTimeoutId=setTimeout("handleBlackBerryLocationTimeout()",6e4)}blackberry.location.onLocationUpdate("handleBlackBerryLocation()");blackberry.location.refreshLocation()};t=blackberry.location}else if(typeof Mojo!=n&&typeof Mojo.Service.Request!="Mojo.Service.Request"){t=true;e.getCurrentPosition=function(e,t,n){parameters={};if(n){if(n.enableHighAccuracy&&n.enableHighAccuracy==true){parameters.accuracy=1}if(n.maximumAge){parameters.maximumAge=n.maximumAge}if(n.responseTime){if(n.responseTime<5){parameters.responseTime=1}else if(n.responseTime<20){parameters.responseTime=2}else{parameters.timeout=3}}}r=new Mojo.Service.Request("palm://com.palm.location",{method:"getCurrentPosition",parameters:parameters,onSuccess:function(t){e({timestamp:t.timestamp,coords:{latitude:t.latitude,longitude:t.longitude,heading:t.heading}})},onFailure:function(e){if(e.errorCode==1){t({code:3,message:"Timeout"})}else if(e.errorCode==2){t({code:2,message:"Position unavailable"})}else{t({code:0,message:"Unknown Error: webOS-code"+errorCode})}}})}}else if(typeof device!=n&&typeof device.getServiceObject!=n){t=device.getServiceObject("Service.Location","ILocation");e.getCurrentPosition=function(e,n,r){function i(t,r,i){if(r==4){n({message:"Position unavailable",code:2})}else{e({timestamp:null,coords:{latitude:i.ReturnValue.Latitude,longitude:i.ReturnValue.Longitude,altitude:i.ReturnValue.Altitude,heading:i.ReturnValue.Heading}})}}var s=new Object;s.LocationInformationClass="BasicLocationInformation";t.ILocation.GetLocation(s,i)}}else{e.getCurrentPosition=function(t,n,r){e.jsonp.fetch(i,function(e){t({timestamp:e.timestamp,coords:{latitude:e.latitude,longitude:e.longitude,heading:e.heading}})})};t=true}}catch(o){if(typeof console!=n)console.log(o);return false}return t!=null};return e}()
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/lib/jquery-1.8.2.min.js b/dashboard/lib/static/HospitalCosts/lib/jquery-1.8.2.min.js
deleted file mode 100755
index bc3fbc8..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/jquery-1.8.2.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v1.8.2 jquery.com | jquery.org/license */
-(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call("﻿ ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
diff --git a/dashboard/lib/static/HospitalCosts/lib/tangelo.css b/dashboard/lib/static/HospitalCosts/lib/tangelo.css
deleted file mode 100755
index d7c0985..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/tangelo.css
+++ /dev/null
@@ -1,138 +0,0 @@
-@import "bootstrap-readable.css";
-
-body {
-    background: white;
-}
-
-a {
-    color: #0088cc;
-}
-
-.centered {
-    margin-left: auto;
-    margin-right: auto;
-    text-align: center;
-}
-
-/* List styling */
-ul.flush {
-    margin: 0 0 0 1em;
-    padding: 0px;
-}
-
-ul.buttons {
-    list-style-type: none;
-}
-
-ul.legend {
-    list-style-type: none;
-}
-
-/* File inputs are way too big */
-input[type="file"] {
-    height: auto;
-    line-height: auto;
-    font-size: 13.2px;
-    font-weight: auto;
-}
-
-.code {
-    font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-    font-size: 15px;
-    line-height: normal;
-}
-
-.jumbotron {
-    text-align: center;
-}
-
-.jumbotron > .description {
-    text-align: left;
-}
-
-.title {
-    color: #004400;
-}
-
-/* A rounded-corner panel for printing information */
-.placard {
-    border-radius: 10px 10px 10px 10px;
-    background: #000;
-    opacity: 0.3;
-}
-
-.btn [class^="icon-"],
-.btn [class*=" icon-"] {
-    margin-top: 3px;
-}
-
-.gmap img {
-    max-width: none;
-}
-
-.gmap label {
-    width: auto; display:inline;
-}
-
-.popover-expand {
-    max-width: none;
-}
-
-/* This allows for emulating a clickable link without affecting the browser
- * history (use for popovers, etc. */
-.pointer {
-    cursor: pointer;
-}
-
-/* Use this for "drawer handles", to help the user see that clicking on the edge
- * of a div will make it roll out/in. */
-.drawer:hover {
-    background-color: gray;
-}
-
-/* Translucent control panel, fixed at bottom of window. */
-.control-panel {
-    position: fixed;
-    bottom: 0px;
-    width: 100%;
-    background: rgba(255, 255, 255, 0.7);
-}
-
-/* This causes the "brand" item in fixed-navbars to not have a negative left
- * margin. */
-.navbar-fixed-top .brand {
-    margin-left: auto;
-}
-
-/* Implement a spinning animation (for use by progress pinwheels, etc.). */
-@-moz-keyframes spin {
-    0% { -moz-transform: rotate(0deg); }
-    100% { -moz-transform: rotate(359deg); }
-}
-
-@-webkit-keyframes spin {
-    0% { -webkit-transform: rotate(0deg); }
-    100% { -webkit-transform: rotate(359deg); }
-}
-
-@-o-keyframes spin {
-    0% { -o-transform: rotate(0deg); }
-    100% { -o-transform: rotate(359deg); }
-}
-
-@-ms-keyframes spin {
-    0% { -ms-transform: rotate(0deg); }
-    100% { -ms-transform: rotate(359deg); }
-}
-
-@keyframes spin {
-    0% { transform: rotate(0deg); }
-    100% { transform: rotate(359deg); }
-}
-
-.spinning {
-    animation: 2s linear 0s normal none infinite spin;
-    -moz-animation: 2s linear 0s normal none infinite spin;
-    -webkit-animation: 2s linear 0s normal none infinite spin;
-    -o-animation: 2s linear 0s normal none infinite spin;
-}
diff --git a/dashboard/lib/static/HospitalCosts/lib/tangelo.min.js b/dashboard/lib/static/HospitalCosts/lib/tangelo.min.js
deleted file mode 100755
index 551d692..0000000
--- a/dashboard/lib/static/HospitalCosts/lib/tangelo.min.js
+++ /dev/null
@@ -1,3649 +0,0 @@
-/*jslint browser: true */
-
-/*global $, d3 */
-
-/**
- *
- * @fileOverview Defines the global namespace <i>tangelo</i> and provides a
- * top-level utilities.
- */
-
-/**
- * @namespace The global namespace for all XDATA Web javascript utilities.
- */
-var tangelo = {};
-
-(function () {
-    "use strict";
-
-    /** Creates namespaces nested within <i>tangelo</i> as appropriate.
-     *
-     * @param {string} ns_spec A string describing a namespace path, like
-     * "utilities.UI".  This path of namespaces will be created by this
-     * function, embedded implicitly within the <i>tangelo</i> namespace - i.e.,
-     * <i>tangelo.utilities.UI</i> would be a valid namespace after running this
-     * function.  If some of the namespaces in the path already exist, the
-     * function will simply continue within those namespace containers as though
-     * they had just been created by the function.
-     *
-     * @returns {namespace} The namespace container corresponding to
-     * <i>ns_spec</i>.
-     */
-    tangelo.namespace = function (ns_spec) {
-        var ns_path,
-            mod,
-            messageFunction,
-            namingFunction,
-            i,
-            path_component;
-
-        namingFunction = function (name) {
-            return function () {
-                return name;
-            };
-        };
-
-        messageFunction = function (name) {
-            return function (f, m) {
-                return "[" + name + "." + f + "] " + m;
-            };
-        };
-
-        ns_path = ns_spec.split(".");
-
-        mod = tangelo;
-        mod.name = namingFunction("tangelo");
-        mod.message = messageFunction(mod.name());
-        for (i = 0; i < ns_path.length; i += 1) {
-            path_component = ns_path[i];
-
-            mod[path_component] = mod[path_component] || {};
-            mod = mod[path_component];
-            mod.name = namingFunction("tangelo." + ns_path.slice(0, i + 1));
-            mod.message = messageFunction(mod.name());
-        }
-
-        return mod;
-    };
-
-    // Initialization function that will handle tangelo-specific elements
-    // automatically.
-    $(function () {
-        var brand,
-            i,
-            initialize_control_panel,
-            initialize_navbar,
-            item,
-            items;
-
-        // Callback specifier for clicking the "save config" button in the
-        // standard tangelo config panel.
-        tangelo.onConfigSave = function (callback) {
-            d3.select("#tangelo-config-submit")
-                .on("click.tangelo", callback);
-        };
-
-        // Callback specifier for bringing up the tangelo config panel (e.g. by
-        // clicking on the navbar item).
-        tangelo.onConfigLoad = function (callback) {
-            $("#tangelo-config-panel").on("show.tangelo", callback);
-        };
-
-        // Callback specifier for clicking the "defaults" button in the standard
-        // tangelo config panel.
-        tangelo.onConfigDefault = function (callback) {
-            d3.select("#tangelo-config-defaults")
-                .on("click.tangelo", callback);
-        };
-
-        // Create bootstrap-styled navbar at top of screen.
-        initialize_navbar = function (s) {
-            var footer,
-                navbar_inner,
-                modal,
-                oktext,
-                selection,
-                type,
-                ul,
-                x;
-
-            // Bail out if the selection is empty.
-            if (s.empty()) {
-                console.log("initialize_navbar: input selection was empty!");
-                return;
-            }
-
-            // Convert the top-level element into a bootstrap navbar element,
-            // then embed a "navbar-inner" div within it.
-            navbar_inner = s.classed("navbar", true)
-                .classed("navbar-fixed-top", true)
-                .append("div")
-                    .classed("navbar-inner", true);
-
-            // Create a "brand" item if requested.
-            brand = s.attr("data-tangelo-brand");
-            if (brand !== null) {
-                navbar_inner.append("a")
-                    .classed("brand", true)
-                    .attr("href", s.attr("data-tangelo-brand-href"))
-                    .text(brand);
-            }
-
-            // Create an unordered list for holding the navbar contents.
-            ul = navbar_inner.append("ul")
-                    .classed("nav", true);
-
-            // Create an app name item if requested.
-            if (s.attr("data-tangelo-app") !== null) {
-                ul.append("li")
-                    .classed("active", true)
-                    .append("a")
-                        .text(s.attr("data-tangelo-app"));
-            }
-
-            // Each top-level div inside the navbar div represents list-item
-            // content for the navbar.  One by one, handle them as necessary and
-            // add an appropriate li to the list.
-            //
-            // Start by forming an array of single-element selections out of the
-            // full list.
-            items = s.selectAll("[data-tangelo-type]")[0].map(d3.select);
-
-            // Go through and check the type field, taking approriate action for
-            // each.
-            for (i = 0; i < items.length; i += 1) {
-                item = items[i];
-                type = item.attr("data-tangelo-type");
-
-                if (type === "info") {
-                    ul.append("li")
-                        .append("a")
-                        .classed("pointer", true)
-                        .attr("data-toggle", "modal")
-                        .attr("data-target", "#tangelo-info-panel")
-                        .html("<i class=icon-info-sign></i> Info");
-
-                    modal = d3.select(document.body)
-                        .insert("div", ":first-child")
-                        .attr("id", "tangelo-info-panel")
-                        .classed("modal", true)
-                        .classed("hide", true)
-                        .classed("fade", true);
-
-                    x = modal.append("div")
-                        .classed("modal-header", true);
-                    x.append("button")
-                        .attr("type", "button")
-                        .classed("close", true)
-                        .attr("data-dismiss", "modal")
-                        .attr("aria-hidden", true)
-                        .html("&times;");
-                    x.append("h3")
-                        .text("Information");
-
-                    modal.append("div")
-                        .classed("modal-body", true)
-                        .html(item.html());
-
-                    oktext = item.attr("data-tangelo-ok-button") || "";
-                    modal.append("div")
-                        .classed("modal-footer", true)
-                        .append("a")
-                            .classed("btn", true)
-                            .attr("data-dismiss", "modal")
-                            .text(oktext === "" ? "OK" : oktext);
-
-                    item.remove();
-
-                } else if (type === "config") {
-                    ul.append("li")
-                        .append("a")
-                        .classed("pointer", true)
-                        .attr("data-toggle", "modal")
-                        .attr("data-target", "#tangelo-config-panel")
-                        .html("<i class=icon-cog></i> Config");
-
-                    modal = d3.select(document.body)
-                        .insert("div", ":first-child")
-                        .attr("id", "tangelo-config-panel")
-                        .classed("modal", true)
-                        .classed("hide", true)
-                        .classed("fade", true);
-
-                    x = modal.append("div")
-                        .classed("modal-header", true);
-                    x.append("button")
-                        .attr("type", "button")
-                        .classed("close", true)
-                        .attr("data-dismiss", "modal")
-                        .attr("aria-hidden", true)
-                        .html("&times;");
-                    x.append("h3")
-                        .text("Configuration");
-
-                    modal.append("div")
-                        .classed("modal-body", true)
-                        .html(item.html());
-
-                    oktext = item.attr("data-tangelo-cancel-button") || "";
-                    footer = modal.append("div")
-                        .classed("modal-footer", true);
-                    footer.append("a")
-                        .attr("id", "tangelo-config-cancel")
-                        .classed("btn", true)
-                        .attr("data-dismiss", "modal")
-                        .text(oktext === "" ? "Cancel" : oktext);
-                    footer.append("a")
-                        .attr("id", "tangelo-config-defaults")
-                        .classed("btn", true)
-                        .text("Defaults");
-                    footer.append("a")
-                        .attr("id", "tangelo-config-submit")
-                        .classed("btn", true)
-                        .classed("btn-primary", true)
-                        .attr("data-dismiss", "modal")
-                        .text(oktext === "" ? "Save changes" : oktext);
-
-                    item.remove();
-                } else if (type === "other") {
-                    // TODO(choudhury): implement this code path.
-                    throw "navbar item type 'other' currently unimplemented";
-                } else {
-                    throw "unknown navbar item type '" + type + "'";
-                }
-            }
-        };
-
-        initialize_navbar(d3.select("[data-tangelo-type=navbar]"));
-
-        // Create CSS styled control panel at bottom of screen.
-        initialize_control_panel = function (s) {
-            var toggle;
-
-            // Bail out if the selection is empty.
-            if (s.empty()) {
-                console.log("initialize_control_panel: input selection was empty!");
-                return;
-            }
-
-            // Style the control panel div appropriately, then add a div as the
-            // first child to act as the drawer handle (and place an appropriate
-            // icon in the middle of it).
-            s.attr("id", "tangelo-control-panel")
-                .classed("control-panel", true)
-                .insert("div", ":first-child")
-                    .attr("id", "tangelo-drawer-handle")
-                    .classed("centered", true)
-                    .classed("pointer", true)
-                    .classed("drawer", true)
-                    .append("i")
-                        .attr("id", "tangelo-drawer-icon")
-                        .classed("icon-chevron-down", true);
-
-            toggle = tangelo.util.drawer_toggle("#tangelo-control-panel", "#tangelo-drawer-icon");
-            d3.select("#tangelo-drawer-handle")
-                .on("click", toggle);
-        };
-
-        initialize_control_panel(d3.select("[data-tangelo-type=control-panel]"));
-    });
-}());
-/*jslint browser:true */
-
-/*global tangelo, d3 */
-
-(function () {
-    "use strict";
-
-    var mod;
-
-    mod = tangelo.namespace("util");
-
-    mod.defaults = function (inputSpec, callback) {
-        var //bad,
-            k,
-            notready,
-            good,
-            retval,
-            store,
-            populate,
-            fns;
-
-        // The hashtable to store the options.
-        store = {};
-
-        // A helper function that treats the input argument as an object and
-        // copies its properties to the store.
-        populate = function (data) {
-            var k;
-
-            for (k in data) {
-                if (data.hasOwnProperty(k)) {
-                    store[k] = data[k];
-                }
-            }
-        };
-
-        // The object methods.
-        good = {
-            set: function (key, value) {
-                store[key] = value;
-            },
-
-            get: function (key) {
-                return store[key];
-            },
-        };
-
-/*        // Dummy object methods to prevent access to the store until the ajax*/
-        //// callback in the "load from file" case finishes.
-        //bad = {};
-        //notready = function () {
-            //throw mod.message("defaults", "defaults store not ready yet!");
-        //};
-        //for (k in good) {
-            //if (good.hasOwnProperty(k)) {
-                //bad[k] = notready;
-            //}
-        //}
-
-        // Dispatch on the type of the input argument.
-        if (typeof inputSpec === "string") {
-            // A string argument - treat it as a JSON file.
-            //
-            // Initiate an ajax call to retrieve the file contents.
-            d3.json(inputSpec, function (err, json) {
-                if (err) {
-                    console.log(mod.message("defaults", "could not read JSON file '" + inputSpec + "'"));
-                }
-
-                // Fill in the store with the file data.
-                populate(json);
-
-                console.log("store: " + JSON.stringify(store));
-
-                // Convert the methods the user was given with the real methods.
-                //bad = good;
-
-                if (callback) {
-                    callback(good);
-                }
-            });
-
-            // Hand the user the dummy methods to prevent access until the data
-            // is loaded.
-            //
-            //retval = bad;
-            retval = good;
-        } else if (typeof inputSpec === "object") {
-            // An object argument - treat it as a hashtable of key/value pairs
-            // representing default config values.
-            //
-            // Fill in the store.
-            populate(inputSpec);
-
-            // Give the user a method handle.
-            retval = good;
-        } else {
-            retval = undefined;
-            throw mod.message("defaults", "unexpected type in first argument: " + typeof inputSpec);
-        }
-
-        return retval;
-    };
-}());
-/*jslint */
-
-/*global tangelo */
-
-/**
- * @fileOverview Provides a few utility functions dealing with dates - in
- * particular, an abbreviated toString() method.
- */
-
-(function () {
-    "use strict";
-
-    var mod,
-        month_names,
-        day_names,
-        toShortString;
-
-    /**
-     * @name date
-     * @memberOf tangelo
-     *
-     * @namespace Some utilities for dealing with Date objects and dates in
-     * general.
-     */
-    mod = tangelo.namespace("date");
-
-    month_names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-    day_names = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
-
-    /** Returns an array of abbreviated month names.
-     *
-     * @name monthNames
-     *
-     * @memberOf tangelo.date
-     *
-     * @function
-     *
-     * @returns {string} The array of names.
-     */
-    mod.monthNames = function () {
-        return month_names.slice();
-    };
-
-    /** Returns an array of abbreviated day names.
-     *
-     * @name dayNames
-     * @memberOf tangelo.date
-     * @function
-     *
-     * @returns {Array} The array of names.
-     */
-    mod.dayNames = function () {
-        return day_names.slice();
-    };
-
-    /** Formats a date in the form "Oct 30, 1981 (05:31:00)"
-     *
-     * @name toShortString
-     * @memberOf tangelo.date
-     * @function
-     *
-     * @param {Date} d The date to format.
-     *
-     * @return {string} The string representation of the date.
-     */
-    mod.toShortString = function (d) {
-        var day,
-            month,
-            year,
-            hour,
-            minute,
-            second;
-
-        // Grab the date.
-        day = d.getDate();
-        month = d.getMonth();
-        year = d.getFullYear();
-
-        // Grab the time.
-        hour = d.getHours();
-        minute = d.getMinutes();
-        second = d.getSeconds();
-
-        // Pad the time components with a zero if they are smaller than 10.
-        if (hour < 10) { hour = "0" + hour; }
-        if (minute < 10) { minute = "0" + minute; }
-        if (second < 10) { second = "0" + second; }
-
-        return month_names[month] + " " + day + ", " + year + " (" + hour + ":" + minute + ":" + second + ")";
-    };
-
-    Date.prototype.toString = function () {
-        return tangelo.date.toShortString(this);
-    };
-
-    Date.prototype.getMonthName = function () {
-        return month_names[this.getMonth()];
-    };
-
-    Date.prototype.getDayName = function () {
-        return day_names[this.getDay()];
-    };
-
-    mod.displayDate = function (d) {
-        return mod.monthNames()[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
-    };
-}());
-/*jslint */
-
-/*global tangelo, d3, console, window, $ */
-
-/** 
- *
- * @fileOverview Provides generic utilities.
- */
-
-(function () {
-    "use strict";
-
-    var mod;
-
-    /**
-     *
-     * @name util
-     *
-     * @memberOf tangelo
-     *
-     * @namespace General utilities cutting across several application needs.
-     */
-    mod = tangelo.namespace("util");
-
-    mod.drawer_size = function () {
-        return 23;
-    };
-
-    mod.drawer_toggle = function (divsel, buttonsel) {
-        var div,
-            button,
-            state,
-            divheight,
-            iconheight;
-
-        // Use the selectors to grab the DOM elements.
-        div = d3.select(divsel);
-        button = d3.select(buttonsel);
-
-        // Initially, the panel is open.
-        state = 'uncollapsed';
-
-        // The glyphicon halfings are around 22.875 pixels tall.
-        iconheight = mod.drawer_size() + "px";
-
-        // Save the original height of the panel.
-        // This requires a DOM update to do this correctly, so we wait a second.
-        // I have found that waiting less than 200ms can cause undefined behavior,
-        // since there may be other callback that need to populate the panel.
-        function updateHeight() {
-            divheight = $(div.node()).height() + "px";
-        }
-        window.setTimeout(updateHeight, 1000);
-
-        // This function, when called, will toggle the state of the panel.
-        return function () {
-            if (state === 'uncollapsed') {
-                div.transition()
-                    .duration(500)
-                    .style("height", iconheight);
-
-                button.classed("icon-chevron-down", false)
-                    .classed("icon-chevron-up", true);
-
-                state = 'collapsed';
-            } else if (state === 'collapsed') {
-                div.transition()
-                    .duration(500)
-                    .style("height", divheight);
-
-                button.classed("icon-chevron-down", true)
-                    .classed("icon-chevron-up", false);
-
-                state = 'uncollapsed';
-            } else {
-                throw "Illegal state: " + state;
-            }
-        };
-    };
-
-    mod.svgColorLegend = function (cfg) {
-        var bbox,
-            bg,
-            bottom,
-            height,
-            heightfunc,
-            left,
-            maxheight,
-            maxwidth,
-            right,
-            text,
-            top,
-            totalheight,
-            totalwidth,
-            width,
-            legend,
-            cmap_func,
-            xoffset,
-            yoffset,
-            categories,
-            height_padding,
-            width_padding,
-            text_spacing,
-            legend_margins,
-            clear;
-
-        // Extract arguments from the config argument.
-        legend = cfg.legend;
-        cmap_func = cfg.cmap_func;
-        xoffset = cfg.xoffset;
-        yoffset = cfg.yoffset;
-        categories = cfg.categories;
-        height_padding = cfg.height_padding;
-        width_padding = cfg.width_padding;
-        text_spacing = cfg.text_spacing;
-        legend_margins = cfg.legend_margins;
-        clear = cfg.clear;
-
-        // Create a d3 selection from the legend argument.
-        legend = d3.select(legend);
-
-        // Clear the svg element, if requested.
-        clear = clear || false;
-        if (clear) {
-            legend.selectAll("*").remove();
-        }
-
-        maxwidth = 0;
-        maxheight = 0;
-
-        // Place a rect that will serve as a container/background for the legend
-        // list items.  Leave its dimensions undefined for now (they will be
-        // computed from the size of all the elements later).
-        bg = legend.append("rect")
-            //.style("fill", "gray");
-            .style("fill", "white")
-            .style("opacity", 0.7);
-
-        $.each(categories, function (i, d) {
-            legend.append("rect")
-                .classed("colorbox", true)
-                .attr("x", xoffset)
-                // "y", "width", and "height" intentionally left unset
-                .style("fill", cmap_func(d));
-
-            text = legend.append("text")
-                .classed("legendtext", true)
-                // "x" and "y" intentionally left unset
-                .text(d);
-
-            // Compute the max height and width out of all the text bgs.
-            bbox = text[0][0].getBBox();
-
-            if (bbox.width > maxwidth) {
-                maxwidth = bbox.width;
-            }
-
-            if (bbox.height > maxheight) {
-                maxheight = bbox.height;
-            }
-        });
-
-        // Compute the height and width of each color swatch.
-        height = maxheight + height_padding;
-        width = height;
-
-        // Compute the total height and width of all the legend items together.
-        totalheight = height * categories.length;
-        totalwidth = width + width_padding + maxwidth;
-
-        // Get the user-supplied margin values.
-        left = legend_margins.left || 0;
-        top = legend_margins.top || 0;
-        right = legend_margins.right || 0;
-        bottom = legend_margins.bottom || 0;
-
-        // Set the dimensions of the container rect, based on the height/width of
-        // all the items, plus the user supplied margins.
-        bg.attr("x", xoffset - left || 0)
-            .attr("y", yoffset - top || 0)
-            .attr("width", left + totalwidth + right)
-            .attr("height", top + totalheight + bottom);
-
-        heightfunc = function (d, i) {
-            return yoffset + i * height;
-        };
-
-        legend.selectAll(".colorbox")
-            .attr("width", height)
-            .attr("height", height)
-            .attr("y", heightfunc);
-
-        legend.selectAll(".legendtext")
-            .attr("x", xoffset + width + width_padding)
-            .attr("y", function (d, i) {
-                //return 19 + heightfunc(d, i);
-                return text_spacing + heightfunc(d, i);
-            });
-    };
-
-    mod.getMongoRange = function (host, db, coll, field, callback) {
-        var min,
-            max,
-            mongourl;
-
-        // The base URL for both of the mongo service queries.
-        mongourl = "/service/mongo/" + host + "/" + db + "/" + coll;
-
-        // Fire an ajax call to retrieve the maxmimum value.
-        $.ajax({
-            url: mongourl,
-            data: {
-                sort: JSON.stringify([[field, -1]]),
-                limit: 1,
-                fields: JSON.stringify([field])
-            },
-            dataType: "json",
-            success: function (response) {
-                // If the value could not be retrieved, set it to null and print
-                // an error message on the console.
-                if (response.error !== null || response.result.data.length === 0) {
-                    max = null;
-
-                    if (response.error !== null) {
-                        console.log("[tangelo.util.getMongoRange()] error: could not retrieve max value from " + host + ":/" + db + "/" + coll + ":" + field);
-                    }
-                } else {
-                    max = response.result.data[0][field];
-                }
-
-                // Fire a second query to retrieve the minimum value.
-                $.ajax({
-                    url: mongourl,
-                    data: {
-                        sort: JSON.stringify([[field, 1]]),
-                        limit: 1,
-                        fields: JSON.stringify([field])
-                    },
-                    dataType: "json",
-                    success: function (response) {
-                        // As before, set the min value to null if it could not
-                        // be retrieved.
-                        if (response.error !== null || response.result.data.length === 0) {
-                            min = null;
-
-                            if (response.error !== null) {
-                                console.log("[tangelo.util.getMongoRange()] error: could not retrieve min value from " + host + ":/" + db + "/" + coll + ":" + field);
-                            }
-                        } else {
-                            min = response.result.data[0][field];
-                        }
-
-                        // Pass the range to the user callback.
-                        callback(min, max);
-                    }
-                });
-            }
-        });
-    };
-
-    mod.allDefined = function () {
-        // Returns true if all arguments are defined; false otherwise.
-
-        var i;
-
-        for (i = 0; i < arguments.length; i += 1) {
-            if (arguments[i] === undefined) {
-                return false;
-            }
-        }
-
-        return true;
-    };
-
-    mod.landingPage = function (cfg) {
-        var specFile,
-            appLeftSelector,
-            appRightSelector,
-            extLeftSelector,
-            extRightSelector;
-
-        // Pull values from the config object argument.
-        specFile = cfg.specFile;
-        appLeftSelector = cfg.appLeftSelector;
-        appRightSelector = cfg.appRightSelector;
-        extLeftSelector = cfg.extLeftSelector;
-        extRightSelector = cfg.extRightSelector;
-
-        // Retrieve the contents of the specification file, then build up the
-        // page.
-        d3.json(specFile, function (err, spec) {
-            var app,
-                apps,
-                col,
-                cols,
-                external,
-                i,
-                left,
-                right,
-                text;
-
-            if (err !== null) {
-                console.log("fatal error: could not load app list from " + specFile);
-                return;
-            }
-
-            // Pull out the two lists in the specification - one for the list of
-            // apps, and one for the list of external links.
-            apps = spec.apps;
-            external = spec.external;
-
-            if (apps !== undefined) {
-                if (!tangelo.util.allDefined(appLeftSelector, appRightSelector)) {
-                    throw "Required config argument property appLeftSelector or appRightSelector missing!";
-                }
-
-                // Grab a reference to each of the two index columns.
-                left = d3.select(appLeftSelector);
-                right = d3.select(appRightSelector);
-                cols = [left, right];
-
-                // Place the app info/links into the two columns, alternating
-                // between left and right.
-                for (i = 0; i < apps.length; i = i + 1) {
-                    col = cols[i % 2];
-                    app = apps[i];
-
-                    col.append("a")
-                        .attr("href", "/app/" + app.path + "/")
-                        .append("h4")
-                        .html(app.name);
-                    col.append("p")
-                        .html(app.description);
-                }
-            }
-
-            if (external !== undefined) {
-                if (!tangelo.util.allDefined(extLeftSelector, extRightSelector)) {
-                    throw "Required config argument property extLeftSelector or extRightSelector missing!";
-                }
-
-                // List out the external links in the two columns, as above.
-                left = d3.select(extLeftSelector);
-                right = d3.select(extRightSelector);
-                cols = [left, right];
-                text = function (d) {
-                    return "<a href=\"" + d.link + "\">" + "<strong>" + d.name + "</strong>" + "</a>" +
-                        " (<a href=\"" + d.institution_link + "\">" + d.institution + "</a>) - " +
-                        d.description;
-                };
-                for (i = 0; i < external.length; i = i + 1) {
-                    col = cols[i % 2];
-                    app = external[i];
-
-                    col.append("div")
-                        .html(text(app));
-                }
-            }
-        });
-    };
-}());
-(function(){
-vg = {version:"0.0.1"};
-// Logging and Error Handling
-
-vg.log = function(msg) {
-  if (console && console.log) console.log(msg);
-};
-
-vg.error = function(msg) {
-  throw new Error(msg);
-};
-
-// Type Utilities
-
-var toString = Object.prototype.toString;
-var vg_ref_char = "@";
-var vg_ref_regex = /\[|\]|\./;
-
-vg.isObject = function(obj) {
-  return obj === Object(obj);
-};
-
-vg.isFunction = function(obj) {
-  return toString.call(obj) == '[object Function]';
-};
-
-vg.isString = function(obj) {
-  return toString.call(obj) == '[object String]';
-};
-  
-vg.isArray = Array.isArray || function(obj) {
-  return toString.call(obj) == '[object Array]';
-};
-
-// Object and String Utilities
-
-vg.extend = function(obj) {
-  for (var i=1, len=arguments.length; i<len; ++i) {
-    var source = arguments[i];
-    for (var prop in source) obj[prop] = source[prop];
-  }
-  return obj;  
-};
-
-vg.clone = function(obj) {
-  if (!vg.isObject(obj)) return obj;
-  return vg.isArray(obj) ? obj.slice() : vg.extend({}, obj);
-};
-
-vg.copy = function(obj) {
-  return JSON.parse(JSON.stringify(obj));
-};
-
-vg.repeat = function(str, n) {
-  for (var s="", i=0; i<n; ++i) s += str;
-  return s;
-};
-
-vg.str = function(str) {
-  return vg.isArray(str) ? "[" + str.map(vg.str) + "]"
-       : vg.isString(str) ? ("'"+str+"'") : str;
-};
-
-// Value and Data Reference Handling
-
-vg.value = function(enc) {
-  if (enc === undefined) enc = {};
-  if (vg.isArray(enc) || !vg.isObject(enc)) { return vg.str(enc); }
-  var val = enc.value  !== undefined ? enc.value  : "d",
-      off = enc.offset !== undefined ? enc.offset : 0,
-      s;
-  if (enc.scale !== undefined) {
-    var scale = "scales['"+enc.scale+"']";
-    // if has scale, run through scale function
-    if (enc.band) {
-      s = scale + ".rangeBand()";
-    } else {
-      var d = enc.field !== undefined ? "d['"+enc.field+"']" : val;
-      s = scale+"("+d+")";
-    }
-  } else if (enc.field !== undefined) {
-    s = "d['"+enc.field+"']";
-  } else if (enc.value !== undefined) {
-    s = vg.str(val); // if has value, set directly
-  } else {
-    s = "d";
-  }
-  return s + (off ? " + "+off : ""); 
-};
-
-vg.varname = function(typestr, index) {
-  return typestr + "_" + index;
-};
-
-vg.get = function(enc, func) {
-  var cnst = vg.isArray(enc) || !vg.isObject(enc) || (enc.field===undefined),
-      val = vg.value(enc);
-  return cnst && !func ? val : "function(d,i) { return "+val+"; }";
-};
-
-vg.getv = function(obj, name) {
-  return "function(d,i) { return "+obj+(name ? "."+name : "")+"; }";
-};
-
-vg.from = function(from, resolve) {
-  resolve = (resolve === undefined ? true : resolve);
-  function wrap(d) { return "data['"+d+"']"; }
-  function f(d) {
-    d = d.split(".");
-    return wrap(d[0]) + (d.length>1 && resolve
-      ? "."+d.slice(1).join(".") : "");
-  }
-  var s = "";
-  if (vg.isArray(from)) {
-    s = "[";
-    from.forEach(function(d, i) {
-      s += (i>0 ? ", " : "") + f(d);
-    });
-    s += "]";    
-  } else {
-    s = f(from);
-  }
-  return s;
-};vg.code = function() {
-  var x = {},
-      src = [],
-      chain = [],
-      indent = "",
-      step = false,
-      cache = true,
-      debug = true;
-
-  function _indent(count) {
-    count = count || 1;
-    while (--count >= 0) indent += "  ";
-  }
-  
-  function _unindent(count) {
-    count = count || 1;
-    indent = indent.slice(0, indent.length-(2*count));
-  }
-
-  function check_step() {
-    if (step) {
-      _indent();
-      step = false;
-    }
-  }
-  
-  function is_chain() {
-    return chain.length && chain[chain.length-1] >= 0;
-  }
-  
-  x.source = function() {
-    return src.join("");
-  };
-
-  x.chain = function() {
-    chain.push(src.length);
-    step = true;
-    return x;
-  };
-  
-  x.unchain = function(parens, nosemi) {
-    parens = vg.repeat(")", parens || 0);
-    var len = src.length;
-    if (len && chain.length && chain[chain.length-1] >= 0) {
-      src[len-1] = src[len-1].slice(0,-1) + parens + (nosemi?"":";") + "\n";
-    }
-    chain.pop();
-    check_step();
-    _unindent();
-    return x;
-  };
-  
-  x.decl = function(name, expr) {
-    src.push(indent+"var "+name+" = "+expr
-      + (is_chain() ? "" : ";") + "\n");
-    check_step();
-    return x;
-  };
-
-  x.setv = function(obj, name, expr) {
-    if (arguments.length == 2) {
-      expr = name;
-      name = obj;
-      src.push(indent+name+" = "+expr+";\n");
-    } else {
-      src.push(indent+obj+"['"+name+"'] = "+expr+";\n");      
-    }
-    check_step();
-    return x;
-  };
-  
-  x.push = function(expr) {
-    expr = expr || "";
-    src.push(!expr ? "\n" : indent+expr+"\n");
-    check_step();
-    return x;
-  };
-
-  x.call = function(expr) {
-    var args = Array.prototype.slice.call(arguments, 1)
-      .map(function(x) { return vg.isArray(x) ? "["+x+"]" : x; });
-    src.push(indent + expr + "(" + args.join(", ") + ")"
-      + (is_chain() ? "" : ";") + "\n");
-    check_step();
-    return x;
-  };
-
-  x.attr = function(obj, name, value) {
-    if (arguments.length == 2) {
-      value = name;
-      name = obj;
-      obj = "sel";
-    }
-    src.push(indent +
-      obj + ".attr('" + name + "', " + value + ");\n");
-    check_step();
-    return x;
-  };
-
-  x.indent = function(count) {
-    chain.push(-1);
-    _indent(count);
-    return x;
-  };
-  
-  x.unindent = function(count) {
-    chain.pop();
-    _unindent(count);
-    return x;
-  };
-  
-  x.append = function(s) {
-    src.push(s);
-    return x;
-  };
-  
-  x.tab = function() {
-    return indent;
-  };
-  
-  x.compile = function() {
-    var src = "return " + x.source() + ";",
-        f = vg_code_cache[src];
-    if (f === undefined) {
-      if (debug) vg.log(src);
-      f = (new Function(src))();
-    }
-    if (cache) vg_code_cache[src] = f;
-    return f;
-  };
-  
-  x.clear = function() {
-    src = [];
-    chain = [];
-    step = false;
-    indent = "";
-    return x;
-  };
-  
-  return x;
-}
-
-var vg_code_cache = {};
-vg.template = function(source) {
-  var x = {
-    source: source,
-    text: source
-  };
-
-  function stringify(str) {
-    return str==undefined ? ""
-      : vg.isString(str) ? str : JSON.stringify(str);
-  }
-
-  x.set = function(name, content) {
-    var regexp = new RegExp("\{\{"+name+"\}\}", "g");
-    content = stringify(content);
-    x.text = x.text.replace(regexp, content);
-  };
-
-  x.toString = function() {
-    return x.text;
-  };
-
-  return x;
-};
-vg.spec = {
-  "@": {
-    "title": "Visualization",
-    "description": "A visualization is the top-level object in Vega, and is the container for all visual elements. A visualization consists of a rectangular canvas (the space in which the visual elements reside) and a viewport (a window on to that canvas). In most cases the two are the same size; if the viewport is smaller then the region should be scrollable.\n\nWithin the visualization is a sub-region called the _data rectangle_. All marks reside within the data rectangle. By default the data rectangle fills up the full canvas. Optional padding adds space between the borders of the canvas and data rectangle into which axes can be placed. Note that the total width and height of a visualization is determined by the data rectangle size and padding values.",
-    "version": "0.0.1-alpha",
-    "type": "object",
-    "properties": {
-      "name": {
-        "description": "A unique name for the visualization specification.",
-        "type": "string",
-        "minimum": 0
-      },
-      "width": {
-        "description": "The total width, in pixels, of the data rectangle.",
-        "type": "integer",
-        "minimum": 0,
-        "default": 500
-      },
-      "height": {
-        "description": "The total height, in pixels, of the data rectangle.",
-        "type": "integer",
-        "minimum": 0,
-        "default": 500
-      },
-      "clientWidth": {
-        "description": "The width of the on-screen viewport, in pixels. If necessary, clipping and scrolling will be applied.",
-        "type": "integer",
-        "minimum": 0
-      },
-      "clientHeight": {
-        "description": "The height of the on-screen viewport, in pixels. If necessary, clipping and scrolling will be applied.",
-        "type": "integer",
-        "minimum": 0
-      },
-      "padding": [
-        {
-          "description": "The internal padding, in pixels, from the edge of the visualization canvas to the data rectangle. If an object is provided, it must include {top, left, right, bottom} properties.",
-          "type": "integer",
-          "minimum": 0,
-        },
-        {
-          "type": "object",
-          "properties": {
-            "top": {"type": "integer", "minimum": 0},
-            "bottom": {"type": "integer", "minimum": 0},
-            "left": {"type": "integer", "minimum": 0},
-            "right": {"type": "integer", "minimum": 0}
-          }
-        }
-      ],
-      "duration": {
-        "description": "The default transition duration, in milliseconds. This value may be overridden by mark-specific transition parameters.",
-        "type": "integer",
-        "minimum": 0
-      },
-      "data": {
-        "description": "An array of data set definitions.",
-        "type": "array",
-        "items": "@data"
-      },
-      "scales": {
-        "description": "An array of scale transform definitions.",
-        "type": "array",
-        "items": "@scale"
-      },
-      "axes": {
-        "description": "An array of axis definitions.",
-        "type": "array",
-        "items": "@axis"
-      },
-      "encoders": {
-        "description": "An array of visual encoder definitions.",
-        "type": "array",
-        "items": "@encoder"
-      },
-      "marks": {
-        "description": "An array of visual mark definitions.",
-        "type": "array",
-        "items": "@mark"
-      }
-    }
-  },
-
-  "@data": {
-    "title": "Data",
-    "description": "Data is assumed to be represented in a tabular format, with data attributes accessible by name or (optionally) by integer index. The specific data formats supported may vary by runtime. In JavaScript, at minimum per-tuple JSON objects (name-value pairs) should be supported. Data bindings can be lazy (with data provided at chart instantiation time), or specified in advance (either through including the data inline or providing a URL from which to load the data).",
-    "type": "object",
-    "constraints": [{
-      "type": "oneOrZero", // TODO: name this constraint
-      "properties": ["values", "source", "url"]
-    }],
-    "properties": {
-      "name": {
-        "description": "The unique name of the data set.",
-        "type": "string",
-        "set": "$data",
-        "unique": true
-      },
-      "type": {
-        "description": "The type of data structure. One of `table` (default), `group` (a collection of tables) or `tree` (e.g., as the result of a tree transform).",
-        "type": "string",
-        "values": ["table", "group", "tree"]
-      },
-      "format": {
-        "description": "The data format specifier, such as JSON. The currently supported formats are `json` and `json-col`.",
-        "type": "string",
-        "values": ["json", "json-row", "json-col"]
-      },
-      "values": {
-        "description": "The actual data set to use. The _values_ property allows data to be inlined directly within the specification itself.",
-        "type": "object"
-      },
-      "source": {
-        "description": "The name of another data set to use as the source for this data set. The _source_ property is particularly useful in combination with a transform pipeline to derive new data.",
-        "type": "string"
-      },
-      "url": {
-        "description": "A URL from which to load the data set. Use the _type_ property to ensure the loaded data is correctly parsed. If the _type_ property is not specified, the data is assumed to be in a row-oriented JSON format.",
-        "type": "string"
-      },
-      "transform": {
-        "description": "An array of transforms to perform on the data. Transform operators will be run on the default data, as provided by late-binding or as specified the _source_, _values_, or _url_ properties.",
-        "type": "array",
-        "items": "@transform"
-      }
-    }
-  },
-
-  "@transform": {
-    "title": "Data Transforms",
-    "description": "A data transform performs operations on a data set prior to visualization. Common examples include filtering and grouping (e.g., group data points with the same stock ticker for plotting as separate lines).",
-    "type": "object",
-    "extend": {
-      "by": "type",
-      "properties": "@transforms"
-    },
-    "properties": {
-      "type": {
-        "description": "The type of transform to apply.",
-        "type": "string",
-        "values": "@transforms"
-      }
-    }
-  },
-  "@transforms": {
-    "flatten": {
-      "description": "The flatten transform takes a set of arrays and collapses them into a single array."
-    },
-    "sort": {
-      "description": "The sort transform sorts data elements based on their values.",
-      "properties": {
-        "sort": {
-          "description": "The fields by which to sort data. Field names may be prefixed by `+` or `-` to explicitly indicate ascending or descending sort, respectively. If no prefix is added, ascending order is assumed.",
-          "type": "array",
-          "items": {"type": "String"}
-        }
-      }
-    },
-    "rank": {
-      "description": "The rank transform numbers each element within a group based on their sort order",
-      "properties": {
-        "sort": {
-          "description": "The fields by which to sort data. If unspecificied, no sorting is performed. Field names may be prefixed by `+` or `-` to explicitly indicate ascending or descending sort, respectively. If no prefix is added, ascending order is assumed.",
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "field": {
-          "description": "The name of the field in which to store the rank indices (defaults to `index`).",
-          "type": "string",
-          "default": "index"
-        }
-      }
-    },
-    "group": {
-      "description": "The group transform takes a flat collection of data points and groups them into a set of collections based on the values of provided _key_ fields.",
-      "properties": {
-        "keys": {
-          "description": "The fields by which to group the data.",
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "sort": {
-          "description": "The fields by which to sort data within each collection. Field names may be prefixed by `+` or `-` to explicitly indicate ascending or descending sort, respectively. If no prefix is added, ascending order is assumed.",
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "rank": [
-          {
-            "description": "If not false, the group transform will additionally rank number elements in each group. If the provided value is a string, it will be used as the field name for storing the rank indices.",
-            "type": "boolean",
-            "default": false
-          },
-          {"type": "string"}
-        ]
-      }
-    },
-    "tree": {
-      "description": "The tree transform takes a flat collection of data points and groups them into a tree structure according to the provided _key_ fields.",
-      "properties": {
-        "keys": {
-          "description": "The fields by which to group the data. The order of the keys determines the branching criteria for each level of the tree.",
-          "type": "array",
-          "items": {"type": "String"}
-        }
-      }
-    },
-    "count": {
-      "description": "The count transform counts the number of elements in each group, as determined by the given _key_ fields.",
-      "properties": {
-        "keys": {
-          "description": "The fields by which to group the data.",
-          "type": "array",
-          "items": {"type": "String"}
-        }
-      }
-    },
-    "sum": {
-      "description": "The sum transform computes the sum of a given _value_ field, grouped by the given _key_ fields.",
-      "properties": {
-        "keys": {
-          "description": "The fields by which to group the data; values within each group are summed.",
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "value": {
-          "description": "The field containing the numbers to sum.",
-          "type": "string"
-        }
-      }
-    },
-    "average": {
-      "description": "The average transform computes the averages for a given _value_ field, grouped by the given _key_ fields.",
-      "properties": {
-        "keys": {
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "value": {
-          "description": "The field containing the numbers to average.",
-          "type": "string"
-        }
-      }
-    },
-    "median": {
-      "description": "The median transform computes the median for a given _value_ field, grouped by the given _key_ fields.",
-      "properties": {
-        "keys": {
-          "type": "array",
-          "items": {"type": "String"}
-        },
-        "value": {
-          "description": "The field containing the values for which to find the median.",
-          "type": "string"
-        }
-      }
-    }
-  },
-
-  "@scale": {
-    "title": "Scales",
-    "description": "Scales are functions that transform a _domain_ of data values (numbers, dates, strings, etc) to a _range_ of visual values (pixels, colors, sizes). A scale function takes a single data value as input and returns a visual value. Vega includes different types of scales for quantitative data or ordinal/categorical data.",
-    "type": "object",
-    "constraints": [
-      {
-        "type": "if",
-        "test": {"type":"eq", "property":"type", "value":"ordinal"},
-        "then": [{
-          "type": "exclude",
-          "properties": ["clamp", "exponent", "nice", "zero"]
-        }],
-        "else": [{
-          "type": "schema",
-          "properties": {"domain": {"type": "array", "length": 2}}
-        }]
-      },
-      {
-        "type": "if",
-        "test": {"type":"neq", "property":"type", "value":"pow"},
-        "then": [{
-          "type": "exclude",
-          "properties": ["exponent"]
-        }]
-      }
-    ],
-    "properties": {
-      "name": {
-        "description": "A unique name for the scale.",
-        "type": "string",
-        "set": "$scales"
-      },
-      "type": {
-        "description": "The type of scale. For ordinal scales, the value should be `ordinal`. The supported quantitative scale types  are `linear`, `log`, `pow`, `sqrt`, `quantile`, `quantize`, and `threshold`.",
-        "type": "string",
-        "values": [
-          "ordinal",
-          "linear",
-          "log",
-          "pow",
-          "sqrt",
-          "quantile",
-          "quantize",
-          "threshold"
-        ],
-        "default": "linear"
-      },
-      "domain": [
-        {
-          "description": "The domain of the scale, representing the set of data values. For quantitative data, this can take the form of a two-element array with minimum and maximum values. For ordinal/categorical data, this may be an array of valid input values. The domain may also be specified by a reference to a data source.",
-          "type": "array",
-          "items": {"type": "*"}
-        },
-        {"type": "%dataRef"}
-      ],
-      "domainMin": {
-        "description": "For quantitative scales only, sets the minimum value in the scale domain. domainMin can be used to override, or (with domainMax) used in lieu of, the domain property.",
-        "type": "number"
-      },
-      "domainMax": {
-        "description": "For quantitative scales only, sets the maximum value in the scale domain. domainMax can be used to override, or (with domainMin) used in lieu of, the domain property.",
-        "type": "number"
-      },
-      "range": [
-        {
-          "description": "The range of the scale, representing the set of visual values. For numeric values, the range can take the form of a two-element array with minimum and maximum values. For ordinal data, the range may by an array of desired output values, which are mapped 1-to-1 to elements in the specified domain. The string literals `width` and `height` automatically map to the ranges `[0,width]` or `[0,height]`, as defined by the data rectangle.",
-          "type": "array",
-          "items": {"type": "*"}
-        },
-        {
-          "type": "string",
-          "values":["width", "height"]
-        }
-      ],
-      "rangeMin": {
-        "description": "Sets the minimum value in the scale range. rangeMin can be used to override, or (with rangeMax) used in lieu of, the range property.",
-        "type": "*"
-      },
-      "rangeMax": {
-        "description": "Sets the maximum value in the scale range. rangeMax can be used to override, or (with rangeMin) used in lieu of, the range property.",
-        "type": "*"
-      },
-      "reverse": {
-        "description": "If true, flips the scale range.",
-        "type": "boolean"
-      },
-      "round": {
-        "description": "If true, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.",
-        "type": "boolean"
-      },
-      "clamp": {
-        "description": "If true, values that exceed the data domain are clamped to either the minimum or maximum range value.",
-        "type": "boolean"
-      },
-      "exponent": {
-        "description": "Sets the exponent of the scale transformation. For `pow` scale types only, otherwise ignored.",
-        "type": "number"
-      },
-      "nice": {
-        "description": "If true, modifies the scale domain to use more human-friendly numbers for the range (e.g., 7 instead of 6.96).",
-        "type": "boolean"
-      },
-      "zero": {
-        "description": "If true, ensures that a zero baseline value is included in the scale domain. This option is ignored for non-quantitative scales.",
-        "type": "boolean"
-      }
-    }
-  },
-
-  "@axis": {
-    "title": "Axes",
-    "description": "Axes provide gridlines, ticks and labels that convey how a spatial range represents a data range. Simply put, axes visualize scales. Vega currently supports axes for Cartesian (rectangular) coordinates. Future versions may introduce support for polar (circular) coordinates. Axes provide three types of tick marks: major, minor and end ticks. End ticks appear at the edges of the scales.",
-    "type": "object",
-    "properties": {
-      "scale": {
-        "description": "The name of the scale backing the axis component.",
-        "type": "string",
-        "values": "$scales"
-      },
-      "axis": {
-        "description": "The type of axis. One of `x` or `y`.",
-        "type": "string",
-        "values": ["x", "y"]
-      },
-      "orient": {
-        "description": "The orientation of the axis. One of `top`, `bottom`, `left` or `right`. The orientation can be used to further specialize the axis type (e.g., a `y` axis oriented for the `right` edge of the chart).",
-        "type": "string",
-        "values": ["top", "bottom", "left", "right"]
-      },
-      "format": {
-        "description": "The formatting pattern for axis labels. Vega uses [D3's format pattern](https://github.com/mbostock/d3/wiki/Formatting).",
-        "type": "string"
-      },
-      "values": {
-        "description": "Explicitly set the visible axis tick values.",
-        "type": "array"
-      },
-      "subdivide": {
-        "description": "If provided, sets the number of minor ticks between major ticks (the value 9 results in decimal subdivision).",
-        "type": "number"
-      },
-      "tickPadding": {
-        "description": "The padding, in pixels, between ticks and text labels.",
-        "type": "number",
-      },
-      "tickSize": {
-        "description": "The size, in pixels, of major, minor and end ticks.",
-        "type": "number"
-      },
-      "tickSizeMajor": {
-        "description": "The size, in pixels, of major ticks.",
-        "type": "number"
-      },
-      "tickSizeMinor": {
-        "description": "The size, in pixels, of minor ticks.",
-        "type": "number"
-      },
-      "tickSizeEnd": {
-        "description": "The size, in pixels, of end ticks.",
-        "type": "number"
-      },
-      "offset": {
-        "description": "The offset, in pixels, by which to displace the axis from the edge of the data rectangle.",
-        "type": "number"
-      }
-    }
-  },
-
-  "@encoder": {
-    "title": "Encoders",
-    "description": "Encoders are plug-ins that compute visual properties from data. Unlike scales, encoders may map one or more input values to one or more visual output values. Encoders are used to provide more sophisticated encoding algorithms, such as layouts. Given an input data set, encoders compute visual _output_ values for each element.\n\nEach individual encoder type is parameterized by a customized set of _properties_.",
-    "type": "object",
-    "extend": {
-      "title": "Encoder Types",
-      "by": "type",
-      "properties": "@encoders"
-    },
-    "properties": {
-      "name": {
-        "description": "A unique name with which to refer to the encoder.",
-        "type": "string",
-        "set": "$encoders"
-      },
-      "type": {
-        "description": "The name of the encoder to use. As encoders are intended as plug-ins, the available encoders may vary across Vega instances.",
-        "type": "string",
-        "values": "@encoders"
-      }
-    }
-  },
-  "@encoders": {
-    "geo{.*}": {
-      "title": "geo",
-      "description": "Performs a cartographic projection. Given longitude and latitude values, sets corresponding x and y properties for a mark. Invoking the encoder with type `geo` will default to a Mercator projection. For other projections, use the type string `geo.type` where `type` is any projection supported by the D3 projection plug-in (for example, `geo.albers`, `geo.hammer`, or `geo.winkel3`).",
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "set": "$geoProjections"
-        },
-        "lon": {
-          "description": "The input longitude values.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "lat": {
-          "description": "The input latitude values.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "center": {
-          "description": "The center of the projection. The value should be a two-element array of numbers.",
-          "type": "array",
-          "length": 2,
-          "items": {"type": "number"}
-        },
-        "translate": {
-          "description": "The translation of the project. The value should be a two-element array of numbers.",
-          "type": "array",
-          "length": 2,
-          "items": {"type": "number"}
-        },
-        "scale": {
-          "description": "The scale of the projection.",
-          "type": "number"
-        },
-        "rotate": {
-          "description": "The rotation of the projection.",
-          "type": "number"
-        },
-        "precision": {
-          "description": "The desired precision of the projection.",
-          "type": "number"
-        },
-        "clipAngle": {
-          "description": "The clip angle of the projection.",
-          "type": "number"
-        }
-      },
-      "output": {
-        "x": {"type": "number"},
-        "y": {"type": "number"}
-      }
-    },
-    "geojson": {
-      "title": "geojson",
-      "description": "Creates paths for geographic regions, such as countries, states and counties. Given a GeoJSON Feature data value, produces a corresponding path definition, subject to a specified cartographic projection. The __geojson__ encoder is intended for use with the __path__ mark type.",
-      "type": "object",
-      "properties": {
-        "field": {
-          "description": "The GeoJSON Feature data.",
-          "type": "%valueRef",
-          "result": "object"
-        },
-        "proj": {
-          "description": "The name of the projection to use. The projection name must correspond to a defined __geo__ encoder definition.",
-          "type": "string",
-          "values": "$geoProjections"
-        }
-      },
-      "output": {
-        "path": {"type": "string"}
-      }
-    },
-    "pie": {
-      "title": "pie",
-      "description": "Computes a pie chart layout. Given a set of data values, sets startAngle and endAngle properties for a mark. The __pie__ encoder is intended for use with the __arc__ mark type.",
-      "type": "object",
-      "properties": {
-        "field": {
-          "description": "The data values to encode as arc widths.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      },
-      "output": {
-        "startAngle": {"type": "number"},
-        "endAngle": {"type": "number"}
-      }
-    },
-    "stack": {
-      "title": "stack",
-      "description": "Computes layout values for stacked graphs, as in stacked bar charts or stream graphs.",
-      "type": "object",
-      "properties": {
-        "x": {
-          "description": "The x-values determining which elements are stacked together.",
-          "type": "%valueRef",
-          "result": "*"
-        },
-        "y": {
-          "description": "The y-values determining stack heights.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "offset": {
-          "description": "The baseline offset style. One of `zero` (default), `silhouette`, `wiggle`, or `expand`.",
-          "type": "string",
-          "values": ["zero", "silhoutte", "wiggle", "expand"]
-        },
-        "order": {
-          "description": "The sort order for each stack layer. One of `default` (default), `reverse`, or `inside-out`.",
-          "type": "string",
-          "values": ["default", "reverse", "inside-out"]
-        }
-      },
-      "output": {
-        "y": {"type": "number"},
-        "height": {"type": "number"}
-      }
-    },
-    "symbol": {
-      "title": "symbol",
-      "description": "Produces path definitions for plotting symbols. Given a symbol name, returns a path for the corresponding plotting shape. The __symbol__ encoder is intended for use with the __path__ mark type.",
-      "type": "object",
-      "properties": {
-        "shape": {
-          "description": "The plotting symbol type. Resulting strings should be one of `circle`, `square`, `cross`, `diamond`, `triangle-up`, or `triangle-down`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": [
-            "circle",
-            "square",
-            "cross",
-            "diamond",
-            "triangle-up",
-            "triangle-down"
-          ]
-        },
-        "size": {
-          "description": "The plotting symbol size. Resulting numbers determine the _area_ of the symbol.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      },
-      "output": {
-        "path": {"type": "string"}
-      }
-    },
-    "treemap": {
-      "title": "treemap",
-      "description": "Computes a treemap layout. The __treemap__ encoder is primarily intended for use with the __rect__ mark type.",
-      "type": "object",
-      "properties": {
-        "value": {
-          "description": "The values to use to determine the area of each leaf-level treemap cell.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "sticky": {
-          "description": "If true, repeated runs of the treemap will use cached partition boundaries. This results in smoother transition animations, at the cost of unoptimized aspect ratios. If _sticky_ is used, _do not_ reuse the same treemap encoder instance across data sets.",
-          "type": "boolean"
-        },
-        "size": {
-          "description": "The dimensions [width, height] of the treemap layout. Defaults to the width and height of the data rectangle.",
-          "type": "array",
-          "length": 2,
-          "items": {"type": "integer"}
-        },
-        "round": {
-          "description": "If true, treemap cell dimensions will be rounded to integer pixels.",
-          "type": "boolean"
-        },
-        "ratio": {
-          "description": "The target aspect ratio for the layout to optimize. The default value is the golden ratio, (1 + sqrt(5))/2 =~ 1.618.",
-          "type": "number"
-        },
-        "padding": [
-          {
-            "description": "The padding (in pixels) to provide around internal nodes in the treemap. For example, this might be used to create space to label the internal nodes. The padding value can either be a single number or an array of four numbers [top, right, bottom, left]. The default padding is zero pixels.",
-            "type": "array",
-            "length": 4,
-            "items": {
-              "type": "number",
-              "minimum": 0
-            }
-          },
-          {
-            "type": "number",
-            "minimum": 0
-          }
-        ]
-      },
-      "output": {
-        "x": {"type": "number"},
-        "y": {"type": "number"},
-        "width": {"type": "number"},
-        "height": {"type": "number"}
-      }
-    }
-  },
-
-  "@mark": {
-    "title": "Marks",
-    "description": "Marks are the basic visual building block of a visualization. Similar to other mark-based frameworks such as [Protovis](http://protovis.org), marks provide basic shapes whose properties can be set according to backing data. Mark properties can be simple constants, or Scales and Encoders can be used to map from data to property values. The basic supported mark types are rectangles (`rect`), general paths or polygons (`path`), circular arcs (`arc`), filled areas (`area`), lines (`line`), images (`image`) and text labels (`text`).\n\nEach mark supports a set of visual _properties_ which determine the position and appearance of mark instances. Typically one mark instance is generated per input data element; the exceptions are the `line` and `area` mark types, which represent multiple data elements as a contiguous line or area shape. There are three primary property sets: _enter_, _exit_ and _update_. _Enter_ properties are evaluated when data is processed for the first time and a mark instance is newly added to a scene. Similarly, _exit_ properties are evaluated when the data backing a mark is removed, and so the mark is leaving the visual scene. Finally, _update_ properties are evaluated for all existing mark instances.\n\nMark evaluation for a property set proceeds as follows. Given a backing data set, first all encoders are run to populate initial visual properties. Next, all explicit property definitions are evaluated, potentially overwriting the output of the encoders. Finally, the mark is rendered using the resulting visual property values.\n\n_Encoder Invocation_. Encoder invocations for a mark must at minimum include the name of the encoder. Additional encoder parameters (e.g., data fields) can also be specified here, rather than the initial encoder definition. Mark-level encoder parameters take precedence over definition-level parameters.\n\n_Mark Properties_. All visual mark property definitions are specified as name-value pairs in the `update`, `enter` or `exit` object. The name is simply the name of the visual property. The value should be a _ValueRef_. The next section describes the available mark properties in greater detail. The transition parameters _duration_, _delay_ and _ease_ can also be set on an `update` or `exit` object to specify more nuanced behaviors (i.e., to use different animation styles for updating and exiting marks).",
-    "type": "object",
-    "properties": {
-      "name": {
-        "description": "A unique name for the mark instance (optional).",
-        "type": "string"
-      },
-      "type": {
-        "description": "The mark type (`rect`, `path`, `arc`, etc).",
-        "type": "string",
-        "values": "@marks"
-      },
-      "from": [
-        {
-          "description": "The name of the data set this mark should visualize. If array-valued, specifies a collection of data sets (e.g., each line in a multi-series line chart), one for each array entry. Data references may also include a dot (.) notation for supporting data structures. For example, the `tree` data type provides both `tree.nodes` and `tree.leaves` data tables.",
-          "type": "string"
-        },
-        {
-          "type": "array",
-          "minimum-length": 1,
-          "items": {"type":"string"}
-        }
-      ],
-      "encoders": {
-        "description": "An array of encoders to apply for the mark.",
-        "type": "array",
-        "items": "@markEncoder"
-      },
-      "update": {
-        "description": "Visual property definitions for updating marks.",
-        "type": "object",
-        "properties": "@markProperties"
-      },
-      "enter": {
-        "description": "Visual property definitions for entering marks.",
-        "type": "object",
-        "properties": "@markProperties"
-      },
-      "exit": {
-        "description": "Visual property definitions for exiting marks.",
-        "type": "object",
-        "properties": "@markProperties"
-      },
-      "duration": {
-        "description": "The transition duration, in milliseconds, for mark updates.",
-        "type": "number"
-      },
-      "delay": {
-        "description": "The transition delay, in milliseconds, for mark updates. The delay can be set in conjunction with the backing data (possibly through a scale transform) to provide staggered animations.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "ease": {
-        "description": "The transition easing function for mark updates. The supported easing types are `linear`, `quad`, `cubic`, `sin`, `exp`, `circle`, and `bounce`, plus the modifiers `in`, `out`, `in-out`, and `out-in`. The default is `cubic-in-out`. For more details please see the [D3 ease function documentation](https://github.com/mbostock/d3/wiki/Transitions#wiki-d3_ease).",
-        "type": "string",
-        "values": "#ease"
-      }
-    }
-  },
-
-  "@markEncoder": {
-    "type": "object",
-    "properties": {
-      "name": {
-        "type": "string",
-        "values": "$encoders"
-      }
-    }
-  },
-
-  "@markProperties": {
-    "title": "Visual Mark Properties",
-    "description": "For marks involving Cartesian extents (e.g., __rect__ marks), the horizontal dimensions are determined by (in order of precedence) the _x1_ and _x2_ properties, the _x1_ and _width_ properties, and the _x2_ and _width_ properties. If all three of _x1_, _x2_ and _width_ are specified, the _width_ value is ignored. The _y1_, _y2_ and _height_ properties are treated similarly. For marks without Cartesian extents (e.g., __path__, __arc__, etc) the same calculations are applied, but are only used to determine the mark's ultimate _x_ and _y_ position.",
-    "type": "object",
-    "extend": {
-      "by": "type",
-      "properties": "@marks"
-    },
-    "properties": {
-      "x1": {
-        "description": "The first (typically left-most) x-coordinate.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "x2": {
-        "description": "The second (typically right-most) x-coordinate.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "y1": {
-        "description": "The first (typically top-most) y-coordinate.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "y2": {
-        "description": "The second (typically bottom-most) y-coordinate.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "width": {
-        "description": "The width of the mark (if supported).",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "height": {
-        "description": "The height of the mark (if supported).",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "opacity": {
-        "description": "The mark opacity. A number between 0 (transparent) and 1 (opaque).",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "fill": {
-        "description": "The fill color.",
-        "type": "%valueRef",
-        "result": "string"
-      },
-      "fillOpacity": {
-        "description": "The fill opacity. A number between 0 (transparent) and 1 (opaque).",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "stroke": {
-        "description": "The stroke color.",
-        "type": "%valueRef",
-        "result": "string"
-      },
-      "strokeWidth": {
-        "description": "The stroke width, in pixels.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "strokeOpacity": {
-        "description": "The stroke opacity. A number between 0 (transparent) and 1 (opaque).",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "delay": {
-        "description": "The transition delay, in milliseconds.",
-        "type": "%valueRef",
-        "result": "number"
-      },
-      "duration": {
-        "description": "The transition duration, in milliseconds.",
-        "type": "number"
-      },
-      "ease": {
-        "description": "The transition easing function.",
-        "type": "string",
-        "values": "#ease"
-      }
-    }
-  },
-  "@marks": {
-    "rect": {
-      "description": "(No additional properties)."
-    },
-    "circ": {
-      "properties": {
-        "size": {
-          "description": "The size of the circle. The square root of the size value is used to determine the circle radius.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      }
-    },
-    "path": {
-      "properties": {
-        "path": {
-          "description": "A path definition in the form of an SVG Path string.",
-          "type": "%valueRef",
-          "result": "string"
-        }
-      }
-    },
-    "arc": {
-      "properties": {
-        "innerRadius": {
-          "description": "The inner radius of the arc, in pixels.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "outerRadius": {
-          "description": "The outer radius of the arc, in pixels.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "startAngle": {
-          "description": "The start angle of the arc, in radians.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "endAngle": {
-          "description": "The end angle of the arc, in radians.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      }
-    },
-    "area": {
-      "properties": {
-        "interpolate": {
-          "description": "The line interpolation method to use. One of `linear`, `step-before`, `step-after`, `basis`, `basis-open`, `cardinal`, `cardinal-open`, `monotone`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": [
-            "linear",
-            "step-before",
-            "step-after",
-            "basis",
-            "basis-open",
-            "cardinal",
-            "cardinal-open",
-            "monotone"
-          ]
-        },
-        "tension": {
-          "description": "Depending on the interpolation type, sets the tension parameter.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      }
-    },
-    "line": {
-      "properties": {
-        "interpolate": {
-          "description": "The line interpolation method to use. One of `linear`, `step-before`, `step-after`, `basis`, `basis-open`, `basis-closed`, `bundle`, `cardinal`, `cardinal-open`, `cardinal-closed`, `monotone`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": [
-            "linear",
-            "step-before",
-            "step-after",
-            "basis",
-            "basis-open",
-            "basis-closed",
-            "bundle",
-            "cardinal",
-            "cardinal-open",
-            "cardinal-closed",
-            "monotone"
-          ]
-        },
-        "tension": {
-          "description": "Depending on the interpolation type, sets the tension parameter.",
-          "type": "%valueRef",
-          "result": "number"
-        }
-      }
-    },
-    "image": {
-      "properties": {
-        "url": {
-          "description": "The URL from which to retrieve the image.",
-          "type": "%valueRef",
-          "result": "url"
-        },
-        "ratio": {
-          "description": "If true (the default), scaling preserves the image aspect ratio.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "align": {
-          "description": "The horizontal alignment of the text. One of `left`, `right`, `center`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": ["left", "right", "center"]
-        },
-        "baseline": {
-          "description": "The vertical alignment of the text. One of `top`, `middle`, `bottom`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": ["top", "bottom", "middle"]
-        }
-      }
-    },
-    "text": {
-      "properties": {
-        "text": {
-          "description": "The text to display.",
-          "type": "%valueRef",
-          "result": "string"
-        },
-        "align": {
-          "description": "The horizontal alignment of the text. One of `left`, `right`, or `center`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": ["left", "right", "center"]
-        },
-        "baseline": {
-          "description": "The vertical alignment of the text. One of `top`, `middle`, or `bottom`.",
-          "type": "%valueRef",
-          "result": "string",
-          "values": ["top", "bottom", "middle"]
-        },
-        "xMargin": {
-          "description": "The horizontal margin, in pixels, between the text label and its anchor point. The value is ignored if the _align_ property is `center`.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "yMargin": {
-          "description": "The vertical margin, in pixels, between the text label and its anchor point. The value is ignored if the _baseline_ property is `middle`.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "angle": {
-          "description": "The rotation angle of the text, in degrees.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "font": {
-          "description": "A full font definition (e.g., `13px Helvetica Neue`).",
-          "type": "%valueRef",
-          "result": "string"
-        },
-        "fontFamily": {
-          "description": "The typeface to set the text in.",
-          "type": "%valueRef",
-          "result": "string"
-        },
-        "fontSize": {
-          "description": "The font size, in pixels.",
-          "type": "%valueRef",
-          "result": "number"
-        },
-        "fontWeight": {
-          "description": "The font weight (e.g., `bold`).",
-          "type": "%valueRef",
-          "result": "string"
-        },
-        "fontStyle": {
-          "description": "The font style (e.g., `italic`).",
-          "type": "%valueRef",
-          "result": "string"
-        }
-      }
-    }
-  },
-
-  "%dataRef": {
-    "title": "Data Reference",
-    "description": "A data reference ( _DataRef_ ) refers to a set of values within a data set. A basic data reference simply refers to a column in a data table. Values from multiple columns can be specified as an array of basic data references.",
-    "type": "object",
-    "properties": {
-      "data": {
-        "description": "The name of the data set.",
-        "type": "string",
-        "required": true
-      },
-      "field": [
-        {
-          "description": "The field (column) of data values.",
-          "type": "string"
-        },
-        {"type": "integer"}
-      ]
-    }
-  },
-
-  "%valueRef": [
-    {
-      "title": "Value Reference",
-      "description": "A value reference ( _ValueRef_ ) refers to a specific value. The value may be a constant, a value in a data set, and may include application of scale transform to either.",
-      "type": "object",
-      "properties": {
-        "value": {
-          "description": "A constant value. If _field_ is specified, this value is ignored.",
-          "type": "*"
-        },
-        "field": {
-          "description": "A field (column) from which to pull a data value. The corresponding data set is determined by the surrounding mark context.",
-          "type": "string"
-        },
-        "scale": {
-          "description": "The name of a scale transform to apply.",
-          "type": "string",
-          "values": "$scales"
-        },
-        "offset": {
-          "description": "A simple additive offset to bias the final value, equivalent to (value + offset). Offsets are added _after_ any scale transformation.",
-          "type": "number"
-        },
-        "band": {
-          "description": "If true, and _scale_ is specified, uses the range band of the scale as the retrieved value. This option is useful for determining widths with an ordinal scale.",
-          "type": "boolean"
-        }
-      }
-    },
-    {
-      "type": "$result",
-      "values": "$values"
-    }
-  ],
-
-  "#ease": [
-    "linear-in",
-    "quad-in",
-    "cubic-in",
-    "sin-in",
-    "exp-in",
-    "circle-in",
-    "bounce-in",
-    "linear-out",
-    "quad-out",
-    "cubic-out",
-    "sin-out",
-    "exp-out",
-    "circle-out",
-    "bounce-out",    
-    "linear-in-out",
-    "quad-in-out",
-    "cubic-in-out",
-    "sin-in-out",
-    "exp-in-out",
-    "circle-in-out",
-    "bounce-in-out",
-    "linear-out-in",
-    "quad-out-in",
-    "cubic-out-in",
-    "sin-out-in",
-    "exp-out-in",
-    "circle-out-in",
-    "bounce-out-in"
-  ]
-};vg.docs = function(spec) {
-  var text = [];
-
-  vg_docs_node(text, spec, "@");
-  vg_docs_node(text, spec, "@data");
-  vg_docs_node(text, spec, "@transform");
-  vg_docs_node(text, spec, "%dataRef");
-  vg_docs_node(text, spec, "%valueRef");
-  vg_docs_node(text, spec, "@scale");
-  vg_docs_node(text, spec, "@axis");
-  vg_docs_node(text, spec, "@mark");
-  vg_docs_node(text, spec, "@markProperties");
-  vg_docs_node(text, spec, "@encoder");
-  
-  return text.join("");
-};
-
-function vg_docs_node(text, spec, key) {
-  var node = vg.isArray(spec[key]) ? spec[key][0] : spec[key],
-      str, key, props, prop, type, desc;
-  
-  if (node.title) {
-    str = "## " + vg_docs_title(node.title) + "\n\n";
-    text.push(str);
-  }
-  
-  if (node.description) {
-    text.push(node.description);
-    text.push("\n\n");
-  }
-
-  if (vg.isObject(props = node.properties)) {
-    text.push("_Properties_\n");
-    vg_docs_props(text, props);
-  }
-
-  if (node.extend && (props = node.extend.properties)) {
-    props = vg.isString(props) ? spec[props] : props;
-    
-    for (key in props) {
-      prop = props[key];
-      text.push("### " + vg_docs_title(key) + "\n\n");
-      if (prop.description) {
-        text.push(prop.description);
-        text.push("\n\n");
-      }
-      if (prop.properties) {
-        vg_docs_props(text, prop.properties);
-      }
-    }
-  }
-}
-
-function vg_docs_title(title) {
-  return title.split('{')[0];
-}
-
-function vg_docs_props(text, props) {
-  var key, prop, type, desc, str;
-  
-  for (key in props) {
-    prop = props[key];
-    type = vg_doc_type(prop);
-    desc = (vg.isArray(prop) ? prop[0] : prop).description;
-    str = "* __"+key+"__ [" + type + "] " + desc + "\n";
-    text.push(str);
-  }
-  text.push("\n\n");
-}
-
-function vg_doc_type(prop) {
-  function type(p) {
-    var t = p.type, v;
-    if (t[0]==="%" || t[0]==="@") t = t.slice(1);
-    t = t[0].toUpperCase() + t.slice(1);
-    if (t==="ValueRef") t += " -> " + type({"type":p.result});
-    if (t==="Array" && p.items) {
-      v = vg.isString(p.items) ? p.items : p.items.type;
-      t += "<" + type({"type":v}) + ">";
-    }
-    return t;
-  }
-  return (vg.isArray(prop) ? prop : [prop]).map(type).join(" | ");
-}vg.scales = function(spec, sc) {
-  (spec.scales || []).forEach(function(scale, index) {
-    if (index > 0) sc.push();
-    vg.scale(scale, sc);
-  });
-};
-
-vg.scale = function(scale, sc) {
-  // determine scale type
-  var type = scale.type || "linear";
-  sc.chain().push("scales['"+scale.name+"'] = d3.scale."+type+"()");
-  (type==="ordinal" ? vg.scale.ordinal : vg.scale.quant)(scale, sc);
-  sc.unchain();
-};
-
-vg.scale.keywords = {
-  "width": "width",
-  "height": "height"
-};
-
-vg.scale.range = function(scale) {
-  var rng = [null, null];
-  
-  if (scale.range !== undefined) {
-    if (vg.isString(scale.range)) {
-      if (vg.scale.keywords[scale.range]) {
-        rng = [0, scale.range]
-      } else {
-        vg.error("Unrecogized range: "+scale.range);
-        return rng;
-      }
-    } else if (vg.isArray(scale.range)) {
-      rng = scale.range;
-    } else {
-      rng = [0, scale.range];
-    }
-  }
-  if (scale.rangeMin !== undefined) {
-    rng[0] = scale.rangeMin;
-  }
-  if (scale.rangeMax !== undefined) {
-    rng[1] = scale.rangeMax;
-  }
-  return rng;
-};vg.scale.ordinal = function(scale, sc) {
-  // init domain
-  var domain = scale.domain;
-  if (vg.isArray(domain)) {
-    sc.call(".domain", vg.str(domain));
-  } else if (vg.isObject(domain)) {
-    var ref = domain,
-        dat = "data['"+ref.data+"']",
-        get = vg.str(ref.field);
-    sc.call(".domain", "vg.unique("+dat+", "+get+")");
-  }
-
-  // init range
-  var range = vg.scale.range(scale),
-      isStr = vg.isString(range[0]);
-  if (scale.reverse) range = range.reverse();
-  range = "[" + range.map(function(r) {
-    return vg.scale.keywords[r] ? r : vg.str(r);
-  }).join(", ") + "]";
-  if (isStr) { // e.g., color or shape values
-    sc.call(".range", range); 
-  } else { // spatial values
-    sc.call(scale.round ? ".rangeRoundBands" : ".rangeBands",
-      range, scale.padding);
-  }
-};vg.scale.quant = function(scale, sc) {
-  // init domain
-  var dom = [null, null];
-  if (scale.domain !== undefined) {
-    if (vg.isArray(scale.domain)) {
-      dom = scale.domain.slice();
-    } else if (vg.isObject(scale.domain)) {
-      var ref = scale.domain,
-          dat = "data['"+ref.data+"']",
-          get = vg.get({field:ref.field});
-      dom[0] = "d3.min("+dat+", "+get+")";
-      dom[1] = "d3.max("+dat+", "+get+")";
-    } else {
-      dom = scale.domain;
-    }
-  }
-  if (scale.domainMin !== undefined) {
-    if (vg.isObject(scale.domainMin)) {
-      var ref = scale.domainMin,
-          dat = "data['"+ref.data+"']",
-          get = vg.get({field:ref.field});
-      dom[0] = "d3.min("+dat+", "+get+")";
-    } else {
-      dom[0] = scale.domainMin;
-    }
-  }
-  if (scale.domainMax !== undefined) {
-    if (vg.isObject(scale.domainMax)) {
-      var ref = scale.domainMax,
-          dat = "data['"+ref.data+"']",
-          get = vg.get({field:ref.field});
-      dom[1] = "d3.max("+dat+", "+get+")";
-    } else {
-      dom[1] = scale.domainMax;
-    }
-  }
-  if (scale.zero === undefined || scale.zero) { // default true
-    dom[0] = "Math.min(0, "+dom[0]+")";
-    dom[1] = "Math.max(0, "+dom[1]+")";
-  }
-  sc.call(".domain", "["+dom.join(", ")+"]");
-
-  // init range
-  var range = vg.scale.range(scale);
-  // vertical scales should flip by default, so use XOR here
-  if ((!!scale.reverse) != ("height"==scale.range)) range = range.reverse();
-  range = "[" + range.map(function(r) {
-    return vg.scale.keywords[r] ? r : vg.str(r);
-  }).join(", ") + "]";
-  sc.call(scale.round ? ".rangeRound" : ".range", range);
-  
-  if (scale.clamp)
-    sc.call(".clamp", "true");
-  if (scale.nice)
-    sc.call(".nice");
-  if (scale.type==="pow" && scale.exponent)
-    sc.call(".exponent", scale.exponent);  
-};vg.axes = function(spec, sc) {
-  (spec.axes || []).forEach(function(axis, index) {
-    if (index > 0) sc.push();
-    vg.axis(axis, index, sc);
-  });
-};
-
-vg.axis = function(axis, index, sc) {
-  var aname = vg.varname("axis", index);
-  sc.chain()
-    .decl(aname, "d3.svg.axis()");
-  
-  // axis scale
-  if (axis.scale !== undefined) {
-    sc.call(".scale", "scales['"+axis.scale+"']");
-  }
-
-  // axis orientation
-  var orient = axis.orient || vg_axis_orient[axis.axis];
-  sc.call(".orient", vg.str(orient));
-
-  // axis values
-  if (axis.values !== undefined) {
-    sc.call(".tickValues", axis.values);
-  }
-
-  // axis label formatting
-  if (axis.format !== undefined) {
-    sc.call(".tickFormat", "d3.format('"+axis.format+"')");
-  }
-
-  // axis tick subdivision
-  if (axis.subdivide !== undefined) {
-    sc.call(".tickSubdivide", axis.subdivide);
-  }
-  
-  // axis tick padding
-  if (axis.tickPadding !== undefined) {
-    sc.call(".tickPadding", axis.tickPadding);
-  }
-  
-  // axis tick size(s)
-  var size = [];
-  if (axis.tickSize !== undefined) {
-    for (var i=0; i<3; ++i) size.push(axis.tickSize);
-  } else {
-    size = [6, 6, 6];
-  }
-  if (axis.tickSizeMajor !== undefined) size[0] = axis.tickSizeMajor;
-  if (axis.tickSizeMinor !== undefined) size[1] = axis.tickSizeMinor;
-  if (axis.tickSizeEnd   !== undefined) size[2] = axis.tickSizeEnd;
-  if (size.length) {
-    sc.call(".tickSize", size.join(","));
-  }
-  
-  // tick arguments
-  if (axis.ticks !== undefined) {
-    var ticks = vg.isArray(axis.ticks) ? axis.ticks : [axis.ticks];
-    sc.call(".ticks", ticks.join(", "));
-  }
-  sc.unchain();
-
-  // axis offset
-  if (axis.offset) {
-    sc.push(aname + ".offset = " + axis.offset + ";");
-  }
-  
-  // cache scale name
-  sc.push(aname + ".scaleName = '" + axis.scale + "';");
-
-  sc.push("axes.push("+aname+");");
-};
-
-var vg_axis_orient = {
-  "x":      "bottom",
-  "y":      "left",
-  "top":    "top",
-  "bottom": "bottom",
-  "left":   "left",
-  "right":  "right"
-};vg.axes.update = function(spec, sc) {
-  if (!spec.axes || spec.axes.length==0) return;
-  sc.push("dur = dur!=undefined ? dur : duration;")
-    .push("var init = axes.init; axes.init = true;")
-    .decl("sel", "duration && init ? dom.transition(duration) : dom")
-    .chain()
-    .push("sel.selectAll('g.axis')")
-    .push(".attr('transform', function(axis,i) {")
-    .indent()
-      .push("var offset = axis.offset || 0, xy;")
-      .push("switch(axis.orient()) {")
-      .indent()
-        .push("case 'left':   xy = [     -offset,  0]; break;")
-        .push("case 'right':  xy = [width+offset,  0]; break;")
-        .push("case 'bottom': xy = [0, height+offset]; break;")
-        .push("case 'top':    xy = [0,       -offset]; break;")
-        .push("default: xy = [0,0];")
-      .unindent()
-      .push("}")
-      .push("return 'translate('+xy[0]+', '+xy[1]+')';")
-    .unindent()
-    .push("})")
-    .push(".each(function(axis) {")
-      .indent()
-      .push("axis.scale(scales[axis.scaleName]);")
-      .push("var s = d3.select(this);")
-      .push("(duration && init")
-        .indent()
-        .push("? s.transition().duration(duration)")
-        .push(": s).call(axis);")
-        .unindent()
-      .unindent()
-    .push("})")
-    .unchain();
-};vg.data = function(spec, sc) {
-  (spec.data || []).forEach(function(dat) {
-    vg.datum(dat, sc);
-  });
-};
-
-vg.data.load = function(spec, sc) {
-  var urls = (spec.data || []).filter(function(dat) { return dat.url; });
-  if (urls.length == 0) {
-    sc.push("callback(vis);")
-  } else {
-    sc.decl("count", urls.length);
-    urls.forEach(function(dat) { vg.datum.load(dat, sc); });
-    sc.push("if (!count) callback(vis);");
-  }
-};
-
-vg.datum = function(dat, sc) {
-  if (dat.values) {
-    sc.push(vg.from(dat.name) + " = " + JSON.stringify(dat.values) + ";");
-  } else if (dat.source) {
-    sc.push(vg.from(dat.name) + " = " + vg.from(dat.source) + ";");
-  }
-  vg.datum.transform(dat, sc);
-};
-
-vg.datum.load = function(dat, sc) {
-  var fmt = vg.data.format[dat.format || "json"];
-  sc.push("d3.xhr(" + vg.str(dat.url) + ", function(err, resp) {")
-    .indent()
-      .push("if (err) {")
-        .indent()
-        .push("alert(err);")
-        .unindent()
-      .push("} else {")
-        .indent()
-        .push(vg.from(dat.name) + " = " + fmt("resp.response") + ";")
-        .unindent()
-      .push("}")
-      .push("if (!(--count)) callback(vis);")
-    .unindent()
-    .push("});");
-};
-
-vg.datum.transform = function(dat, sc) {
-  (dat.transform || []).forEach(function(tx) {
-    var t = vg.data.transform.registry[tx.type];
-    if (!t) throw new Error ("Unrecognized data transform: "+tx.type);
-    t(dat, tx, sc);
-  });
-};vg.data.format = {};
-
-vg.data.format["json"] = function(d) {
-  return "JSON.parse("+d+")";
-};
-
-vg.data.format["json-col"] = function(d) {
-  return "vg.fromColumns(JSON.parse("+d+"))";
-};vg.data.transform = {};
-vg.data.transform.registry = {};
-
-vg.data.transform.register = function(type, transform) {
-  vg.data.transform.registry[type] = transform;
-};
-
-// flatten transform
-vg.data.transform.register("flatten", function(dat, tx, sc) {
-  var data = vg.from(dat.name);
-  sc.push(data + " = vg.flatten(" + data + ");");
-});
-
-// group transform
-vg.data.transform.register("group", function(dat, tx, sc) {
-  var data = vg.from(dat.name);
-  sc.push(data + " = vg.group(" + data
-    + (tx.keys ? ", ["+tx.keys.map(vg.str).join(", ")+"]" : "")
-    + (tx.sort ? ", ["+tx.sort.map(vg.str).join(", ")+"]" : "")
-    + (tx.rank ? ", "+vg.str(field) : "")
-    + ");");
-});
-
-// rank transform
-vg.data.transform.register("rank", function(dat, tx, sc) {
-  var data = vg.from(dat.name);
-  sc.push(data + " = vg.rank(" + data
-    + (tx.sort ? ", ["+tx.sort.map(vg.str).join(", ")+"]" : "")
-    + (tx.field ? ", "+vg.str(field) : "")
-    + ");");
-});
-
-// sort transform
-vg.data.transform.register("sort", function(dat, tx, sc) {
-  var data = vg.from(dat.name);
-  sc.push(data + " = vg.sort(" + data
-    + (tx.sort ? ", ["+tx.sort.map(vg.str).join(", ")+"]" : "")
-    + ");");
-});
-
-// tree transform
-vg.data.transform.register("tree", function(dat, tx, sc) {
-  var data = vg.from(dat.name);
-  sc.push(data + " = vg.tree(" + data
-    + (tx.keys ? ", ["+tx.keys.map(vg.str).join(", ")+"]" : "")
-    + ");");
-});
-
-// reductions
-vg.data.transform.reduce = function(func) {
-  return function(dat, tx, sc) {
-    var data = vg.from(dat.name);
-    sc.push(data + " = vg.reduce(" + data
-      + ", vg.reduce."+func+", " + vg.str(tx.value)
-      + (tx.keys ? ", ["+tx.keys.map(vg.str).join(", ")+"]" : "")
-      + ");");
-  }
-};
-
-["sum"].forEach(function(func) {
-  var reduction = vg.data.transform.reduce(func);
-  vg.data.transform.register(func, reduction);
-});vg.marks = function(spec, sc) {
-  // build global name map of data sets
-  var dmap = {};
-  (spec.data || []).forEach(function(dat) {
-    dmap[dat.name] = dat;
-  });
-  // build global name map of encoders
-  var emap = {};
-  (spec.encoders || []).forEach(function(enc) {
-    emap[enc.name] = enc;
-  });
-  // generate code for marks
-  (spec.marks || []).forEach(function(mark, index) {
-    if (index > 0) sc.push();
-    vg.mark(mark, index, spec, dmap, emap, sc);
-  });
-};
-
-vg.mark = function(mark, index, spec, dataMap, encoderMap, sc) {
-  // check if mark type is supported
-  if (vg.mark.registry[mark.type] == undefined) {
-    vg.log("Skipping unsupported mark type: "+mark.type);
-    return;
-  }
-  
-  // set up encoders, as needed
-  var encoders = [];
-  (mark.encoders || []).forEach(function(enc, i) {
-    var def = encoderMap[enc.name];
-    encoders.push({
-      def: def,
-      spec: vg.extend(vg.clone(def), enc)
-    });
-  });
-  
-  // generate mark code
-  sc.push("// Mark "+index+" ("+mark.type+")");
-  sc.push("marks.push(function(dur) {").indent();
-  
-  encoders.forEach(function(enc) {
-    vg.encoder.start(enc.def, enc.spec, mark, index, sc);
-  });
-  vg.mark.builder(spec, mark, index, dataMap, encoders, sc);
-  encoders.forEach(function(enc) {
-    vg.encoder.finish(enc.def, enc.spec, mark, index, sc);
-  });
-  
-  sc.unindent().push("});");
-};
-
-vg.mark.obj = "this.vega";
-vg.mark.registry = {};
-vg.mark.reserved = {
-  "x1":       1,
-  "x2":       1,
-  "y1":       1,
-  "y2":       1,
-  "width":    1,
-  "height":   1,
-  "duration": 1,
-  "delay":    1,
-  "ease":     1
-};
-vg.mark.styles = {
-  "opacity":       "opacity",
-  "fill":          "fill",
-  "stroke":        "stroke",
-  "fillOpacity":   "fill-opacity",
-  "strokeOpacity": "stroke-opacity",
-  "strokeWidth":   "stroke-width",
-  "font":          "font",
-  "fontFamily":    "font-family",
-  "fontSize":      "font-size",
-  "fontWeight":    "font-weight",
-  "fontStyle":     "font-style"
-};
-
-vg.mark.register = function(type, def) {
-  vg.mark.registry[type] = def;
-  (def.reserved || []).forEach(function(p) {
-    vg.mark.reserved[p] = 1 + (vg.mark.reserved[p] || 0);
-  });
-};
-
-vg.mark.from = function(mark, datatype) {
-  var def = vg.mark.registry[mark.type],
-      from = mark.from,
-      flat = arguments.length > 1, // don't flatten if no group arg
-      s = vg.from(from);
-  group = vg.isArray(from) || (datatype === "group");
-  if (flat && group && !def.group) {
-    s = "vg.flatten("+s+")";
-  }
-  return s;
-};
-
-vg.mark.builder = function(spec, mark, index, data, encoders, sc) {
-  var markName = vg.varname(mark.type, index),
-      from = vg.isArray(mark.from) ? null : mark.from.split(".")[0],
-      dat = vg.mark.from(mark, from===null ? null : data[from].type),
-      def = vg.mark.registry[mark.type],
-      key = from===null ? undefined : data[from].key,
-      keyfn = (key === undefined ? "null"
-        : "function(d) { return d["+vg.str(key)+"]; }");
-
-  // select
-  sc.chain()
-    .decl(markName, "dom.select('.mark-"+index+"')")
-    .call(".selectAll", "'"+def.svg+"'")
-    .call(".data", dat, keyfn)
-    .unchain().push();
-
-  // enter
-  sc.push("// enter");
-  sc.chain().push(markName+".enter().append('"+def.svg+"')");
-  if (mark.enter) {
-    vg.mark.encode(mark, mark.enter, index, encoders, sc);
-    def.attr(mark.enter, sc);
-    vg.mark.props(mark.enter, sc);
-  }
-  sc.unchain().push();
-
-  // exit
-  sc.push("// exit");
-  vg.mark.selection(spec, mark, markName, "exit", sc);
-  if (mark.exit) {
-    vg.mark.encode(mark, mark.exit, index, encoders, sc);
-    def.attr(mark.exit, sc);
-    vg.mark.props(mark.exit, sc);
-  }
-  sc.call(".remove").unchain().push();
-
-  // update
-  sc.push("// update");
-  vg.mark.selection(spec, mark, markName, "update", sc);
-  if (mark.update) {
-    vg.mark.encode(mark, mark.update, index, encoders, sc);
-    def.attr(mark.update, sc);
-    vg.mark.props(mark.update, sc);
-  }
-  sc.unchain();
-};
-
-vg.mark.selection = function(spec, mark, markName, selName, sc) {
-  var props = mark[selName],
-      dur = (props && props.duration) || mark.duration,
-      durName = "dur_"+selName;
-    
-  sc.decl(durName, "dur!=undefined ? dur : " +
-    (dur !== undefined ? vg.value(dur) : "duration"));
-
-  selName = selName==="update" ? "" : ("." + selName + "()");
-  sc.chain().push("("+durName+" ? " + markName + selName + ".transition()");
-  
-  var ease = (props && props.ease) || mark.ease || spec.ease;
-  if (ease) sc.call(".ease", vg.value(ease));  
-  
-  var delay = (props && props.delay) || mark.delay || spec.delay;
-  if (delay) sc.call(".delay", vg.get(delay));
-  
-  sc.push(".duration("+durName+")" + " : " + markName + selName + ")");
-}
-
-vg.mark.encode = function(mark, props, index, encoders, sc) {
-  var obj = vg.mark.obj,
-      def = vg.mark.registry[mark.type];
-
-  sc.push(".each(function(d,i) {").indent();
-  if (def.group) {
-    sc.push("var scene = "+obj+" || ("+obj+" = []);");
-    sc.push("d.forEach(function(d,j) {").indent();
-    sc.push("var o = scene[j] || (scene[j] = {x:0, y:0});");
-  } else {
-    sc.push("var o = "+obj+" || ("+obj+" = {x:0, y:0});");
-  }
-  
-  // encoder properties
-  encoders.forEach(function(enc) {
-    vg.encoder.encode(enc.def, enc.spec, mark, index, sc);
-  });
-
-  // horizontal spatial properties
-  if (props.x1 !== undefined && props.x2 !== undefined) {
-    sc.decl("x1", vg.value(props.x1))
-      .decl("x2", vg.value(props.x2))
-      .push("if (x1 > x2) { var tmp = x1; x1 = x2; x2 = tmp; }")
-      .push("o.x = x1;")
-      .push("o.width = (x2-x1);");
-  } else if (props.x1 !== undefined && props.width !== undefined) {
-    sc.decl("x1", vg.value(props.x1))
-      .decl("w", vg.value(props.width))
-      .push("if (w < 0) { x1 += w; w *= -1; }")
-      .push("o.x = x1;")
-      .push("o.width = w;");
-  } else if (props.x2 !== undefined && props.width !== undefined) {
-    sc.decl("w", vg.value(props.width))
-      .decl("x2", vg.value(props.x2) + " - w")
-      .push("if (width < 0) { x2 += w; w *= -1; }")
-      .push("o.x = x2;")
-      .push("o.width = w;");
-  } else if (props.x1 !== undefined) {
-    sc.push("o.x = " + vg.value(props.x1) + ";");
-  }
-
-  // vertical spatial properties
-  if (props.y1 !== undefined && props.y2 !== undefined) {
-    sc.decl("y1", vg.value(props.y1))
-      .decl("y2", vg.value(props.y2))
-      .push("if (y1 > y2) { var tmp = y1; y1 = y2; y2 = tmp; }")
-      .push("o.y = y1;")
-      .push("o.height = (y2-y1);");
-  } else if (props.y1 !== undefined && props.height !== undefined) {
-    sc.decl("y1", vg.value(props.y1))
-      .decl("h", vg.value(props.height))
-      .push("if (h < 0) { y1 += h; h *= -1; }")
-      .push("o.y = y1;")
-      .push("o.height = h;");
-  } else if (props.y2 !== undefined && props.height !== undefined) {
-    sc.decl("h", vg.value(props.height))
-      .decl("y2", vg.value(props.y2) + " - h")
-      .push("if (height < 0) { y2 += h; h *= -1; }")
-      .push("o.y = y2;")
-      .push("o.height = h;");
-  } else if (props.y1 !== undefined) {
-    sc.push("o.y = " + vg.value(props.y1) + ";");
-  }
-
-  // mark-specific properties
-  if (def.encode) def.encode(props, sc);
-
-  if (def.group) {
-    sc.unindent().push("});");
-  }
-  sc.unindent().push("})");
-};
-
-vg.mark.props = function(properties, sc) {
-  for (var name in properties) {
-    if (vg.mark.reserved[name]) continue;
-    sc.call(vg.mark.styles[name] ? ".style" : ".attr",
-      vg.str(vg.mark.styles[name] || name),
-      vg.get(properties[name]));
-  }
-};vg.mark.register("arc", {
-  svg: "path",
-  reserved: ["innerRadius", "outerRadius", "startAngle", "endAngle"],
-  encode: function(properties, sc) {
-    ["innerRadius","outerRadius","startAngle","endAngle"].forEach(function(p) {
-      if (properties[p] === undefined) return;
-      sc.push("o."+p+" = "+vg.value(properties[p])+";");
-    });
-  },
-  attr: function(properties, sc) {
-    var o = vg.mark.obj;
-    sc.call(".attr", "'transform'", "function() { "
-        + "return 'translate('+"+o+".x+','+"+o+".y+')'; }")
-      .call(".attr", "'d'", "function() { return d3.svg.arc()("+o+"); }");
-  }
-});
-vg.mark.register("area", {
-  svg: "path",
-  group: true,
-  reserved: ["interpolate", "tension"],
-  attr: function(properties, sc) {
-    var o = vg.mark.obj + "[i]";
-    sc.chain()
-      .push(".attr('d', d3.svg.area()")
-      .call(".x",  vg.getv(o, "x"))
-      .call(".y0", vg.getv(o, "y"))
-      .call(".y1", "function(d,i) { return "+o+".y + "+o+".height; }");
-    if (properties.interpolate !== undefined)
-      sc.call(".interpolate", vg.value(properties.interpolate));
-    if (properties.tension !== undefined)
-      sc.call(".tension", vg.value(properties.tension));
-    sc.unchain(1, true);
-  }
-});vg.mark.register("circ", {
-  svg: "circle",
-  reserved: ["size"],
-  encode: function(properties, sc) {
-    if (properties["size"] !== undefined) {
-      sc.push("o.size = Math.sqrt(" + vg.value(properties["size"]) + ");");
-    }
-  },
-  attr: function(properties, sc) {
-    var o = vg.mark.obj;
-    if (properties.x1 || properties.x2)
-      sc.call(".attr", "'cx'", vg.getv(o, "x"));
-    if (properties.y1 || properties.y2)
-      sc.call(".attr", "'cy'", vg.getv(o, "y"));
-    if (properties.size)
-      sc.call(".attr", "'r'", vg.getv(o, "size"));
-  }
-});vg.mark.register("image", {
-  svg: "image",
-  reserved: ["url", "align", "baseline", "aspect"],
-  encode: function(properties, sc) {
-    if (properties.align) {
-      sc.decl("align", vg.value(properties.align))
-        .push("if (align === 'right') o.x = o.x - o.width;")
-        .push("if (align === 'center') o.x = o.x - o.width/2;");
-    }
-    if (properties.baseline) {
-      sc.decl("baseline", vg.value(properties.baseline))
-        .push("if (baseline === 'bottom') o.y = o.y - o.height;")
-        .push("if (baseline === 'middle') o.y = o.y - o.height/2;");
-    }
-    if (properties.ratio !== undefined) {
-      sc.decl("ratio", vg.value(properties.ratio))
-        .push("o.ratio = ratio ? 'xMidYMid' : 'none'");
-    }
-  },
-  attr: function(properties, sc) {
-    var obj = vg.mark.obj;
-    if (properties.ratio !== undefined)
-      sc.call(".attr", "'preserveAspectRatio'", vg.getv(obj, "ratio"));
-    if (properties.url)
-      sc.call(".attr", "'xlink:href'", vg.get(properties.url));
-    ["x","y","width","height"].forEach(function(p) {
-      sc.call(".attr", vg.str(p), vg.getv(obj, p));
-    });
-  }
-});
-vg.mark.register("line", {
-  svg: "path",
-  group: true,
-  reserved: [
-    "interpolate",
-    "tension"
-  ],
-  attr: function(properties, sc) {
-    var o = vg.mark.obj + "[i]";
-    sc.chain()
-      .push(".attr('d', d3.svg.line()")
-      .call(".x", vg.getv(o, "x"))
-      .call(".y", vg.getv(o, "y"));
-    if (properties.interpolate !== undefined)
-      sc.call(".interpolate", vg.value(properties.interpolate));
-    if (properties.tension !== undefined)
-      sc.call(".tension", vg.value(properties.tension));
-    sc.unchain(1, true);
-  }
-});vg.mark.register("path", {
-  svg: "path",
-  reserved: ["path"],
-  attr: function(properties, sc) {
-    var o = vg.mark.obj;
-    sc.call(".attr", "'transform'", "function() { "
-        + "return 'translate('+"+o+".x+','+"+o+".y+')'; }")
-      .call(".attr", "'d'", vg.getv(o, "path"));
-  }
-});vg.mark.register("rect", {
-  svg: "rect",
-  attr: function(properties, sc) {
-    var o = vg.mark.obj;
-    ["x","y","width","height"].forEach(function(p) {
-      sc.call(".attr", vg.str(p), vg.getv(o, p));
-    });
-  }
-});vg.mark.register("text", {
-  svg: "text",
-  reserved: ["text", "align", "baseline", "rotate", "xMargin", "yMargin"],
-  encode: function(properties, sc) {
-    if (properties.align) {
-      sc.decl("align", vg.value(properties.align))
-        .push("o.align = align==='right' ? 'end' "
-          + ": align==='center' ? 'middle' : 'start';");
-    }
-    if (properties.baseline) {
-      sc.decl("baseline", vg.value(properties.baseline))
-        .push("o.dy = baseline==='top' ? '.71em' "
-          + ": baseline==='middle' ? '.35em' : '0em';");
-    }
-    if (properties.angle !== undefined) {
-      sc.push("o.angle = -1 * " + vg.value(properties.angle) + ";");
-    }
-    if (properties.xMargin !== undefined) {
-      sc.decl("dx", "(typeof(align)!=='undefined' && align!=='left' "
-          + "? (align==='right'?-1:0) : 1)")
-        .push("o.x += dx * "+vg.value(properties.xMargin) + ";");
-    }
-    if (properties.yMargin !== undefined) {
-      sc.decl("dy", "(typeof(baseline)!=='undefined' && baseline!=='top' "
-          + "? (baseline==='bottom'?-1:0) : 1)")
-        .push("o.y += dy * "+vg.value(properties.yMargin) + ";");
-    }
-  },
-  attr: function(properties, sc) {
-    var o = vg.mark.obj;
-    if (properties.text !== undefined) {
-      sc.call(".text", vg.get(properties.text));
-    }
-    if (properties.angle !== undefined) {
-      sc.call(".attr", "'transform'", "function() { return "
-        + "'rotate('+"+o+".angle+', '+"+o+".x+', '+"+o+".y+')'; }");
-    }
-    ["x","y"].forEach(function(p) {
-      sc.call(".attr", vg.str(p), vg.getv(o, p));
-    });
-    if (properties.align) {
-      sc.call(".attr", "'text-anchor'", vg.getv(o, "align"));
-    }
-    if (properties.baseline) {
-      sc.call(".attr", "'dy'", vg.getv(o, "dy"));
-    }
-  }
-});
-vg.encoders = function(spec, sc) {
-  if (!spec.encoders) return;
-  spec.encoders.forEach(function(enc, index) {
-    if (index > 0) sc.push();
-    vg.encoder.init(enc, sc);
-  });
-};
-
-vg.encoder = {};
-vg.encoder.meta = {"name":true, "type":true};
-vg.encoder.registry = {};
-
-vg.encoder.register = function(name, pkg) {
-  pkg = vg.isFunction(pkg) ? pkg() : pkg;
-  if (vg.isObject(pkg.method) && !vg.isFunction(pkg.method)) {
-    for (var methodName in pkg.method) {
-      var enc = vg.clone(pkg);
-      enc.method = pkg.method[methodName];
-      var registryName = name + (methodName ? "."+methodName : "");
-      vg.encoder.registry[registryName] = enc;
-    }
-  } else {
-    vg.encoder.registry[name] = pkg;
-  }
-};
-
-vg.encoder.init = function(def, sc) {
-  var type = def.type.split("."),
-      encoder = vg.encoder.registry[type.shift()];
-  if (!encoder) {
-    vg.error("Unrecognized encoder type: "+def.type);
-  }
-  var method = encoder.method;
-  if (vg.isFunction(method)) {
-    method = method(type.join("."));
-  } 
-  if (method === undefined) return;
-  
-  sc.chain().push("encoders['"+def.name+"'] = "+method+"()");  
-  if (encoder.init) encoder.init(def, sc);
-  sc.unchain();
-};
-
-vg.encoder.start = function(def, spec, mark, index, sc) {
-  var type = def.type.split("."),
-      encoder = vg.encoder.registry[type[0]];
-  if (encoder.start) encoder.start(def, spec, mark, index, sc);  
-};
-
-vg.encoder.encode = function(def, spec, mark, index, sc) {
-  var type = def.type.split("."),
-      encoder = vg.encoder.registry[type[0]];
-  if (encoder.encode) encoder.encode(def, spec, mark, index, sc);  
-};
-
-vg.encoder.finish = function(def, spec, mark, index, sc) {
-  var type = def.type.split("."),
-      encoder = vg.encoder.registry[type[0]];
-  if (encoder.finish) encoder.finish(def, spec, mark, index, sc);
-};
-vg.encoder.register("geo", function() {
-
-  var input = ["lon", "lat"],
-      output = ["x", "y"],
-      params = ["center", "scale", "translate",
-                "rotate", "precision", "clipAngle"];
-
-  var method = function(projection) {
-    return "d3.geo."+projection;
-  };
-
-  return {
-    input: input,
-    output: output,
-    params: params,
-    method: method,
-    
-    init: function(def, sc) {
-      params.forEach(function(param) {
-        if (def[param]) sc.call("."+param, vg.value(def[param]));
-      });
-    },
-    
-    start: function(def, spec, mark, index, sc) {
-      sc.chain().decl(vg.varname("geo", index), "encoders['"+def.name+"']");
-      params.forEach(function(p) {
-        // update parameter if override present
-        if (def[p] !== spec[p]) sc.call("."+p, vg.value(spec[p]));
-      });
-      sc.unchain();
-    },
-    
-    encode: function(def, spec, mark, index, sc) {
-      var name = vg.varname("geo", index),
-          lon = vg.value(spec.lon),
-          lat = vg.value(spec.lat);
-
-      sc.decl("xy", name+"(["+lon+", "+lat+"])")
-        .push("o.x = xy[0];")
-        .push("o.y = xy[1];");
-    },
-    
-    finish: function(def, spec, mark, index, sc) {
-      // return parameters to initial values, if necessary
-      var override = params.filter(function(p) { return def[p] !== spec[p]; });
-      if (override.length === 0) return;
-      sc.chain().push(vg.varname("geo", index));
-      override.forEach(function(p) { sc.call("."+param, def[p]); });
-      sc.unchain();
-    }
-  };
-  
-});vg.encoder.register("geojson", {
-
-  input: ["field"],
-  params: ["projection"],
-  output: ["path"],
-  method: "d3.geo.path",
-
-  init: function(def, sc) {
-    if (def.projection) sc.call(".projection", "encoders['"+def.projection+"']");
-  },
-  
-  start: function(def, spec, mark, index, sc) {
-    var name = vg.varname("geojson", index);
-    sc.chain().decl(name, "encoders['"+spec.name+"']");
-    if (spec.projection !== def.projection) {
-      // update projection if override present
-      sc.call(".projection", "encoders['"+spec.projection+"']")
-    }
-    sc.unchain();
-  },
-  
-  encode: function(def, spec, mark, index, sc) {
-    var name = vg.varname("geojson", index),
-        field = vg.value(spec.field);
-    sc.push("o.path = "+name+"("+field+");");
-  },
-  
-  finish: function(def, spec, mark, index, sc) {
-    // return projection to initial value, if necessary
-    if (def.projection && spec.projection !== def.projection) {
-      var name = vg.varname("geojson", index);
-      sc.call(name+".projection", "encoders['"+def.projection+"']");
-    }
-  }
-  
-});vg.encoder.register("pie", {
-
-  input: ["field"],
-  output: ["startAngle", "endAngle"],
-  method: undefined,
-    
-  start: function(def, spec, mark, index, sc) {
-    var name = vg.varname("pie", index);
-    sc.chain().decl(name, "d3.layout.pie()").call(".sort","null");
-    if (spec.field !== undefined) sc.call(".value", vg.get(spec.field));
-    sc.push("(data['"+mark.from+"'])")
-      .unchain();
-  },
-  
-  encode: function(def, spec, mark, index, sc) {
-    var name = vg.varname("pie", index);
-    sc.push("o.startAngle = "+name+"[i].startAngle;")
-      .push("o.endAngle = "+name+"[i].endAngle;");
-  }
-  
-});vg.encoder.register("stack", {
-
-  input: ["x", "y"],
-  params: ["offset", "order", "scale"],
-  output: ["x", "y", "height"],
-  method: undefined,
-    
-  start: function(def, spec, mark, index, sc) {
-    var name = vg.varname("stack", index);
-    sc.chain().decl(name, "d3.layout.stack()");
-    if (spec.offset !== undefined) {
-      sc.call(".offset", vg.value(spec.offset));
-    }
-    if (spec.order !== undefined) {
-      sc.call(".order", vg.value(spec.order));
-    }
-    sc.call(".x", vg.get(spec.x, true))
-      .call(".y", vg.get(spec.y, true))
-      .push("("+vg.from(mark.from)+")")
-      .unchain();
-  },
-  
-  encode: function(def, spec, mark, index, sc) {
-    sc.decl("so", "d");
-    if (spec.scale) {
-      var s = "scales['"+spec.scale+"']";
-      sc.decl("y1", s+"(so.y0)")
-        .decl("y2", s+"(so.y0 + so.y)")
-        .push("if (y1 > y2) { var tmp = y1; y1 = y2; y2 = tmp; }")
-        .push("o.y = y1;")
-        .push("o.height = (y2-y1);");
-    } else {
-      sc.push("o.y = so.y0;")
-        .push("o.height = so.y;");
-    }
-  }
-});vg.encoder.register("symbol", {
-
-  params: ["shape", "size"],
-  output: ["path"],
-  method: undefined,
-
-  start: function(def, spec, mark, index, sc) {
-    var name = vg.varname("symbol", index);
-    sc.chain().decl(name, "d3.svg.symbol()");
-    if (spec.shape) sc.call(".type", vg.get(spec.shape));
-    if (spec.size) sc.call(".size", vg.get(spec.size));
-    sc.unchain();
-  },
-  
-  encode: function(def, spec, mark, index, sc) {
-    var name = vg.varname("symbol", index);
-    sc.push("o.path = "+name+"(d);");
-  }
-  
-});vg.encoder.register("treemap", {
-
-  input: ["value"],
-  params: ["round", "sticky", "ratio", "padding", "size"],
-  output: ["x", "y", "width", "height"],
-  method: "d3.layout.treemap",
-
-  init: function(def, sc) {
-    ["round", "sticky", "ratio", "padding"].forEach(function(p) {
-      if (def[p] === undefined) return;
-      sc.call("."+p, vg.value(def[p]));
-    });
-  },
-
-  start: function(def, spec, mark, index, sc) {
-    var name = vg.varname("treemap", index);
-
-    sc.chain().decl(name, "encoders['"+spec.name+"']")
-      .call(".size", spec.size ? vg.value(spec.size) : "[width, height]")
-      .call(".children", "function(d) { return d.values; }")
-      .call(".value", vg.get(spec.value, true))
-      .call(".nodes", vg.from(mark.from, false))
-      .unchain();
-  },
-  
-  encode: function(def, spec, mark, index, sc) {
-    sc.decl("so", "d")
-      .push("o.x = so.x")
-      .push("o.y = so.y")
-      .push("o.width = so.dx")
-      .push("o.height = so.dy");
-  }
-});vg.dom = function(spec, sc) {
-  // create container div
-  sc.chain()
-    .push("dom = d3.select(el)")
-    .call(".append", "'div'");
-  if (spec.clientWidth || spec.clientHeight) {
-    sc.call(".style", "{"
-      + (spec.clientWidth  ? "width:'"  + spec.clientWidth  + "px', " : "")
-      + (spec.clientHeight ? "height:'" + spec.clientHeight + "px', " : "")
-      + "overflow:'auto'"
-      + "}");
-  }
-  sc.unchain().push();
-  
-  // create SVG element
-  sc.chain()
-    .decl("svg", "dom.append('svg')")
-    .call(".attr", "'width'", "width + padding.left + padding.right")
-    .call(".attr", "'height'", "height + padding.top + padding.bottom")
-    .unchain();
-
-  sc.push();
-    
-  // create root SVG container
-  sc.chain()
-    .decl("root", "svg.append('g')")
-    .call(".attr", "'class'", "root")
-    .call(".attr", "'transform'", "'translate('+padding.left+', '+padding.top+')'")
-    .unchain();
-    
-  sc.push();
-
-  // create axes container
-  sc.chain()
-    .push("root.selectAll('g.axis')")
-    .call(".data", "axes")
-    .push(".enter().append('g')").indent()
-    .call(".attr", "'class'", "function(d, i) { return 'axis axis-'+i; }")
-    .unindent()
-    .unchain();
-
-  sc.push();
-
-  // create mark containers
-  sc.chain()
-    .push("root.selectAll('g.mark')")
-    .call(".data", "d3.range("+spec.marks.length+")")
-    .push(".enter().append('g')").indent()
-    .call(".attr", "'class'", "function(d, i) { "
-      + "return 'mark mark-'+i; }")
-    .unindent()
-    .unchain();
-};
-  
-vg.compile = function(spec, template) {
-  var js = vg.template(template),
-      sc = vg.code();
-      
-  // make deep copy to avoid modification
-  spec = vg.copy(spec);
-      
-  var defaults = {
-    name: "chart",
-    width: 400,
-    height: 400,
-    padding: {top:30, bottom:30, left:30, right:30},
-    duration: 0
-  };
-
-  // PARAMETERS
-  js.set("NAME", vg_compile_name(spec.name) || defaults.name);
-  js.set("WIDTH", spec.width || defaults.width);
-  js.set("HEIGHT", spec.height || defaults.height);
-  js.set("DURATION", spec.duration || defaults.duration);
-  js.set("PADDING", vg_compile_padding(spec.padding) || defaults.padding);
-
-  // INITIALIZATION
-
-  // data
-  vg.data.load(spec, sc.clear().indent(2));
-  js.set("LOAD_DATA", sc.source());
-  vg.data(spec, sc.clear().indent(2));
-  js.set("UPDATE_DATA", sc.source());
-  
-  // scales
-  vg.scales(spec, sc.clear().indent(2));
-  js.set("INIT_SCALES", sc.source());
-
-  // encoders
-  vg.encoders(spec, sc.clear().indent(2));
-  js.set("INIT_ENCODERS", sc.source());
-
-  // axes
-  vg.axes(spec, sc.clear().indent(2));
-  js.set("INIT_AXES", sc.source());
-
-  // marks
-  vg.marks(spec, sc.clear().indent(2));
-  js.set("INIT_MARKS", sc.source());
-  
-  // DOM element
-  vg.dom(spec, sc.clear().indent(2));
-  js.set("INIT_DOM", sc.source());
-  
-  // UPDATE
-  
-  // axes
-  vg.axes.update(spec, sc.clear().indent(2));
-  js.set("UPDATE_AXES", sc.source());
-  
-  return js.toString();
-};
-
-var vg_compile_name_re = /([:;,'`"<>=~!@#\$%\^\&(){}\[\]\|\?\.\*\+\/\\])/g,
-    vg_compile_space_re = /([ -]+)/g;
-
-function vg_compile_name(name) {
-  if (name) name = name.replace(vg_compile_name_re, "");
-  return name ? name.replace(vg_compile_space_re, "_") : name;
-}
-
-function vg_compile_padding(pad) {
-  if (pad !== undefined && !vg.isObject(pad)) {
-    pad = {top:pad, bottom:pad, left:pad, right:pad};
-  }
-  return pad;
-}
-})();
-if (typeof vg === 'undefined') { vg = {}; }
-
-vg.unique = function(data, field) {
-  var results = [], v;
-  for (var i=0; i<data.length; ++i) {
-    v = data[i][field];
-    if (results.indexOf(v) < 0) results.push(v);
-  }
-  return results;
-};
-
-vg.flatten = function(data) {
-  var result = [];
-  data.forEach(function(d) {
-    d.forEach(function(x) { result.push(x); });
-  });
-  return result;
-};
-
-vg.columns = function(data, values, names) {
-  values = values === undefined ? "values" : values;
-  names = names === undefined ? "name" : names;
-  var table = [],
-      cols = data.length,
-      rows = data[0][values].length,
-      r, c, col, t;
-
-  for (r=0; r<rows; ++r) {
-    t = {};
-    for (col=data[c=0]; c<cols; col=data[++c]) {
-      t[col[name]] = col[values][r];
-    }
-    table.push(t);
-  }
-  return table;
-};
-
-vg.rank = function(data, sort, field) {
-  field = field || "index";
-  (sort ? vg.sort(data, sort) : data)
-    .forEach(function(d,i) { d[field] = i; });
-  return data;
-};
-
-vg.sort = function(data, sort) {
-  return data.slice().sort(vg.cmp(sort));
-};
-
-vg.group = function(data, keys, sort, rank) {
-  if (keys === undefined) keys = [];
-  keys = Array.isArray(keys) ? keys : [keys];
-  var map = {}, result = [],
-      list, klist, kstr, i, j, k, kv, cmp;
-
-  for (i=0; i<data.length; ++i) {
-    for (k=0, klist=[], kstr=""; k<keys.length; ++k) {
-      kv = data[i][keys[k]];
-      klist.push(kv);
-      kstr += (k>0 ? "|" : "") + String(kv);
-    }
-    list = map[kstr];
-    if (list === undefined) {
-      list = (map[kstr] = []);
-      list.key = kstr;
-      list.keys = klist;
-      result.push(list);
-    }
-    list.push(data[i]);
-  }
-
-  if (sort) {
-    cmp = vg.cmp(sort);
-    for (i=0; i<result.length; ++i) {
-      result[i].sort(cmp);
-    }
-  }
-  
-  if (rank) {
-    for (i=0; i<result.length; ++i) {
-      vg.rank(result[i], rank===true ? undefined : rank);
-    }
-  }
-
-  return result;
-};
-
-vg.cmp = function(sort) {
-  var sign = [];
-  if (sort === undefined) sort = [];
-  sort = (Array.isArray(sort) ? sort : [sort]).map(function(f) {
-    var s = 1;
-    if (f[0] === "-") {
-      s = -1; f = f.slice(1);
-    } else if (field[0] === "+") {
-      f = f.slice(1);
-    }
-    sign.push(s);
-    return f;
-  });
-  return function(a,b) {
-    var i, s;
-    for (i=0; i<sort.length; ++i) {
-      s = sort[i];
-      if (a[s] < b[s]) return -1 * sign[i];
-      if (a[s] > b[s]) return sign[i];
-    }
-    return 0;
-  };
-};
-
-vg.tree = function(data, keys) {
-  var root = {key:"root", depth:0, values:[], leaves:data},
-      map = {}, nodes = (root.nodes = [root]),
-      p, c, i, len, k, kv, klen, kstr, name;
-  keys = (keys || []);
-
-  for (i=0, len=data.length; i<len; ++i) {
-    n = data[i];
-    for (p=c=root, k=0, klen=keys.length, key=""; k<klen; ++k, p=c) {
-      kv = data[i][keys[k]];
-      key += (k>0 ? "|" : "") + (name = String(kv));
-      if (!(c = map[key])) {
-        c = (map[key] = {key: name, depth: p.depth + 1, values: []});
-        p.values.push(c);
-        nodes.push(c);
-      }
-    }
-    n.depth = p.depth + 1;
-    c.values.push(n);
-    nodes.push(n);
-  }
-  return root;
-};
-
-vg.reduce = function(data, fn, value, keys) {
-  var map = {}, result = [];
-  
-  function next(d) {
-    var k, klist, kstr, kv, obj;
-    for (k=0, klist=[], kstr=""; k<keys.length; ++k) {
-      kv = d[keys[k]];
-      klist.push(kv);
-      kstr += (k>0 ? "|" : "") + String(kv);
-    }
-    obj = map[kstr];
-    if (obj === undefined) {
-      obj = (map[kstr] = {});
-      obj.key = kstr;
-      obj.keys = klist;
-      obj.count = 0;
-      obj.value = fn.init || 0;
-      result.push(obj);
-    }
-    obj.count = obj.count + 1;
-    obj.value = fn.update(obj, obj.value, d[value]);
-  }
-  
-  // compute reductions
-  var group = vg.isGroup(data, value);
-  data.forEach(group ? function(d) { d.forEach(next); } : next);
-  if (fn.done) {
-    result.forEach(group ? function(d) { d.forEach(fn.done); } : fn.done);
-  }
-  return result;
-};
-
-vg.isGroup = function(data, value) {
-  return Array.isArray(data[0]) && data[0][value] === undefined;
-};
-
-vg.reduce.count = {
-  update: function(obj, a, b) { return a + 1; }
-};
-
-vg.reduce.sum = {
-  update: function(obj, a, b) { return a + b; }
-};
-
-vg.reduce.average = {
-  update: function(obj, a, b) { return a + b; },
-  done: function(obj) { return obj.value / obj.count; }
-};
-
-vg.reduce.median = {
-  init: [],
-  update: function(obj, a, b) { a.push(b); },
-  done: function(obj) { return obj.value[obj.count >> 1]; }
-};
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/.buildinfo b/dashboard/lib/static/doc/.buildinfo
deleted file mode 100755
index 854b432..0000000
--- a/dashboard/lib/static/doc/.buildinfo
+++ /dev/null
@@ -1,4 +0,0 @@
-# Sphinx build info version 1
-# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: b45783775da71306797d73fba0876d2d
-tags: fbb0d17656682115ca4d033fb2f83ba1
diff --git a/dashboard/lib/static/doc/_images/diagram.png b/dashboard/lib/static/doc/_images/diagram.png
deleted file mode 100644
index 0ec5446..0000000
--- a/dashboard/lib/static/doc/_images/diagram.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_images/wf.png b/dashboard/lib/static/doc/_images/wf.png
deleted file mode 100644
index 0eefe51..0000000
--- a/dashboard/lib/static/doc/_images/wf.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_sources/app.txt b/dashboard/lib/static/doc/_sources/app.txt
deleted file mode 100644
index 7a68dad..0000000
--- a/dashboard/lib/static/doc/_sources/app.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-.. _wf-trans:
-
-Worflow Coding Transition
--------------------------
-
-The previous version of this document used a different set of workflow codes.  This table describes how these old codes have transitioned over to the new codes.
-
-.. list-table:: Workflow Coding Transition from Version 1 to Version 2
-   :widths: 30 30
-   :header-rows: 1
-
-   * - Version 1
-     - Version 2
-   * - 0-Other
-     - 0-Other
-   * - 1-Plan
-     - 1-Define Problem
-   * - 2-Search
-     - 2-Get Data
-   * - 3-Examine
-     - 3-Explore Data
-   * - 3-Examine
-     - 6-Transform Data
-   * - 4-Marshall
-     - 4-Create View of Data
-   * - 5-Reason
-     - 5-Enrich
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_sources/getting_started.txt b/dashboard/lib/static/doc/_sources/getting_started.txt
deleted file mode 100644
index ca0f19b..0000000
--- a/dashboard/lib/static/doc/_sources/getting_started.txt
+++ /dev/null
@@ -1,108 +0,0 @@
-Quick Start
-===========
-
-Install
--------
-Clone the Draper Logging Repository from Github
-
-.. code-block:: bash
-
-	$ git clone https://github.com/draperlab/xdatalogger.git
-
-Add Draper helper library to your tool
-
-.. NOTE::
-	requires JQuery
-
-.. code-block:: html
-
-	<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
-	<script src="javascript/draper.activity_logger-2.1.1.js"></script>
-
-Register
---------
-
-.. NOTE::
-	Draper Logger URL is available on XNET. Please look there or contact Draper.
-
-.. code-block:: javascript
-
-	// Instantiate the javascript logger, and pass the location of the web worker javascript file
-	var ac = new activityLogger('js/draper.activity_worker-2.1.1.js');
-
-	// Register the activity logger
-	var url = "http://localhost:1337";
-	ac.registerActivityLogger(url, "", "3.04");
-
-Log a USER action
------------------
-
-General message
-
-.. code-block:: javascript
-
-	ac.logUserActivity('action description', 'activity', wf_state);
-
-------------
-
-An example of logging *hover* actions on d3 objects:
-
-.. code-block:: javascript
-
-	vis.selectAll("circle")
-	.data([1,2,3])
-	.enter()
-	.append("svg:circle")
-	.attr("cx", function(d) { return 10*d; })
-	.attr("cy", function(d) { return 10*d; })
-	.attr("r", 10)
-	.on("mouseenter", function() {
-	  ac.logUserActivity(
-	    'User hovered over element to read popup',
-	    'read_hover_enter',
-	    ac.WF_EXAMINE
-	  );
-	})
-	.on("mouseleave", function() {
-	  ac.logUserActivity(
-	    'User left hover element',
-	    'read_hover_exit',
-	    ac.WF_EXAMINE
-	  );
-	});
-
-------------
-
-An example of tagging an HTML element.  We will listen for events.
-
-.. code-block:: html
-
-	<input class="draper" data-wf="2" data-activity="query_input"/>
-
-------------
-
-Selecting elements to be logged.
-
-.. code-block:: javascript
-
-	ac.tag('.query-div > .query-input', {
-	  events: ['click', 'focus'],
-	  wf_state: ac.WF_GETDATA,
-	  activity: 'write_query',
-	  desc: 'user clicked/focused on query input box'
-	})
-
-Log a SYS action
-----------------
-
-Here is an example of adding a SYSACTION when asking the server for data.
-
-.. code-block:: javascript
-
-	ac.logSystemActivity('asking server for data.');
-
-	$.getJSON('https://my_endpoint/get_data', data, function(data) {
-	  ac.logSystemActivity('received data from server.');
-	  $("#result").text(data.result);
-	});
-
diff --git a/dashboard/lib/static/doc/_sources/how_to.txt b/dashboard/lib/static/doc/_sources/how_to.txt
deleted file mode 100644
index 5214e9e..0000000
--- a/dashboard/lib/static/doc/_sources/how_to.txt
+++ /dev/null
@@ -1,207 +0,0 @@
-.. _how-to:
-
-How-to Guide for Implementing the Activity Logging API
-======================================================
-
-Below, we provide a formal specification of the format of log messages sent to the Draper Log Server. But most developers will not need to concern themselves with specific formatting requirements, since Draper has developed helper libraries in JavaScript, Python, Java and C# 
-
-The current version of the client software (which includes the following details in-line) is available at
-   
-   `[xdatagit]/tools/utilities/draper/draper.activity_logger-2.0.js`
-
-The Logging server url is available on XNET, please contact look there or contact Draper for the url.
-
-.. NOTE::
-   the machine sending log messages must be connected to the XDATA VPN in order to access this server. 
-
-The following sections detail the use of the API client in several supported languages.
-
-Javascript
-----------
-The JavaScript helper library provides a background process via the use of `Web Workers <https://developer.mozilla.org/en-US/docs/Web/API/Worker>`_ to send activity logs to a logging server.  The library and server handle Cross Origin Resource Sharing from arbitrary domains. 
-
-The library consists of 2 files, a logger script and a worker script.  The logger script is included in your HTML code like any other javascript file.  The worker script should NOT be included, and is instead called from the the logger script.
-
-The JavaScript helper library is located at: https://github.com/draperlab/xdatalogger/javascript
-
-You can use this helper library in just 3 steps:
-1) Instantiate an ActivityLogger object
-2) Call registerActivityLogger(...) to pass in required networking  and version information.
-3) Call one of the logging functions:
-logSystemActivity(...)
-logUser(...)
-
-Example Implementation of JavaScript Helper Library
-***************************************************
-
-An example use of this library is included below:
-
-.. code-block:: html
-
-	<script src="draper.activity_logger-2.1.1.js"></script>
-
-Instantiate the Activity Logger
-
-.. code-block:: javascript
-
-   var ac = new activityLogger('draper.activity_logger-2.1.1.js');
-
-Register the logger. In this case, we register the logger to look for the logging server at `http://localhost:1337`. The component name is a descriptor that uniquely defines your tool from others, and the component version is used to make any distinction between component versions.
-
-.. code-block:: javascript
-	
-	var url = "http://localhost:1337";
-	ac.registerActivityLogger(url, "test-component", "3.04");
-
-Re-register the logger.  In this case, we register the logger to look for the logger at `http://localhost:1337`, telling it that this software component is version 3.04 of the software named "Draper Test Component"
-
-.. code-block:: javascript
-	
-	var url = "http://localhost:1337";
-	ac.registerActivityLogger(url, "Draper Test Component", "3.04");
-
-
-Send a System Activity Message with optional metadata included. In this case, we send a System Activity message with the action description 'Testing System Activity Message' and optional metadata with two key-value pairs of:
-'Test Window Val'='Main
-'Data Source'='healthcare'
-
-.. code-block:: javascript
-	
-	ac.logSystemActivity('Testing System Activity Message', {
-	  'Test Window Val': 'Main',
-	  'Data Source':'healthCare'
-	});
-
-Send a System Activity Message In this case, we send a System Activity message with the action description 'Testing System Activity Message'
-
-.. code-block:: javascript
-
-	ac.logSystemActivity('Testing System Activity Message');
-
-
-Send a User Activity Message In this case, we send a User Activity message with the action description 'Testing User Activity Message', a developer-defined user action "watch", and the workflow constant WF_EXPLORE, defined in the Activity Log API.
-
-.. code-block:: javascript
-
-	ac.logUserActivity('Testing User Activity Message', 'Watch', ac.WF_EXPLORE );
-
-Send a User Activity Message with optional metadata included In this case, we send a User Activity message with the action description 'Testing User Activity Message', a developer-defined user action "watch", and a the workflow constant WF_EXPLORE, defined in the Activity Log API. This message also contains optional metadata with two key-value pairs of:
-'Test Window Val'='Main
-'Data Source'='healthcare'
-
-.. code-block:: javascript
-
-   ac.logUserActivity('Testing User Activity Message', 'watch', ac.WF_EXPLORE, {
-     'Test Window Val':'Main', 
-     'Data Source':'healthCare'
-   });
-
-JavaScript Helper Library Reference
-***********************************
-
-Registration
-~~~~~~~~~~~~
-
-.. function:: registerActivityLogger(loggingServerUrl, componentName, componentVersion)
-
-   Registers the session with Draper server
-
-   :param loggingServerUrl: url of logging server
-   :param componentName: name of the software component or application sending log messages from this library
-   :param componentVersion: version number of the software component or application 
-
-
-Development Functionality
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The properties and function in this section allow developers to  echo log messages to the console, and disable the generation and  transmission of logging messages by this library.
-
-.. function:: echo(onOff)
-
-   Set to true to echo log messages to the console, even if they are sent successfully to the Logging Server.
-
-   :param onOff: bool
-
-.. function:: mute(msgArray)
-
-   Mute either the SYS actions, the USER actions, or both. Calling this function with the appropriate values disables the sending of messages to the server. Mute accepts an array of String values, acceptable values are ‘SYS’ or ‘USER’.
-
-   :param msgArray: 
-
-.. function:: unmute(msgArray)
-
-   Unmute either the SYS actions, the USER actions, or both. Calling this function with the appropriate values enables the sending of messages to the server. Unmute accepts an array of String values, acceptable values are ‘SYS’ or ‘USER’.
-
-   :param msgArray: 
-
-.. function:: testing(onOff)
-
-   Set to true to disable all connection with Draper’s server.  No registration will be done against Draper’s server, and no logs will be sent.  If echo is set to true, console messages will still be fired for debugging purposes.
-
-   :param onOff: bool
-
-Example:
-
-.. code-block:: javascript
-
-   var ac = new activityLogger().echo(true).testing(true).mute(['SYS','USER']);
-
-Activity Logging Functions
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The 2 functions in this section are used to send Activity Log Messages to an Activity Logging Server. Separate functions are used to log System Activity and User Activity. See the Activity Logging API by Draper Laboratory for more details about the use of these messages.
-
-.. function:: logSystemActivity(actionDescription [,softwareMetadata])
-
-   Log a System Activity. registerActivityLogger MUST be called before calling this function. Use logSystemActivity to log software actions that are not explicitly invoked by the user. For example, if a software component refreshes a data store after a pre-determined time span, the refresh event should be logged as a system activity. However, if the datastore was refreshed in response to a user clicking a Refresh UI element, that activity should NOT be logged as a System Activity, but rather as a User Activity.
-
-   :param actionDescription: A string describing the System  Activity performed by the component.
-   :param softwareMetadata: Any key/value pairs that will clarify or parameterize this system activity.
-
-.. function:: logUserActivity(actionDescription, userActivity, userWorkflowState [,softwareMetadata])
-
-   Log a User Activity. <registerActivityLogger> MUST be called before calling this function. Use <logUserActivity> to log actions initiated by an explicit user action. For example, if a software component refreshes a data store when the user clicks a Refresh UI element, that activity should be logged as a User Activity. However, if the datastore was refreshed automatically after a certain time span, that activity should NOT be logged as a User Activity, but rather as a System Activity.
-
-   :param actionDescription: A string describing the System  Activity performed by the component.
-   :param userActivity: A key word defined by each software component or application indicating which software-centric function is most likely indicated by the this user activity. See the Activity Logging API for a standard set of user activity key words.
-   :param userWorkflowState: This value must be one of the Workflow Codes defined in this library. See the Activity Logging API for definitions of each workflow code. 
-   :param softwareMetadata: Any key/value pairs that will clarify or parameterize this system activity.
-
-DOM Events and Listeners
-************************
-
-To assist the developers in the logging of User actions, Draper has added functionality to listen to specific events on elements classed and attributed appropriately.  The developer need only to class DOM elements they feel will involve interaction from the user with the class ‘draper’.  Workflow states and action descriptions are then added as data attributes on the element.  Using the included script, Draper will DOM events will be useful to track for logging activities of the user associated with mouse movements but are not explicity to any other implemented tool function.  These event types include:
-
-:click: occurs when a user clicks something
-:focusin: occurs when an element gains focus (input field)
-:focusout: occurs when an element looses focus
-:mouseover: occurs when the pointer is moved onto an element
-:mouseout: occurs when the pointer is moved out of an element
-:select: occurs when the user selects some text
-:scroll: occurs when users scrolls with either mouse wheel, or scrollbar
-	
-Example:
-
-.. code-block:: HTML
-
-	<input class=”my-input draper” data-wf=”2” data-description=”search box”></input>
-	<div style=”overflow-y: auto” class=”draper” data-wf=”3” data-description=”table container”>
-
-
-Python
-------
-Deprecated. Contact Draper for support
-
-Java
-----
-Deprecated. Contact Draper for support
-
-C#
---
-Deprecated. Contact Draper for support
-
-
-Future Implementations of the Logging API (A.K.A. “Hey! You don’t support my favorite programming language _____”)
-------------------------------------------------------------------------------------------------------------------
-
-As stated earlier in this document, it’s a goal of the Logging API to make it very easy for XDATA teams to implement the API, and that means supporting other programming languages by authoring additional clients. If you have a specific language in mind that is not supported, please contact any member of the Draper team to discuss your software.
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_sources/index.txt b/dashboard/lib/static/doc/_sources/index.txt
deleted file mode 100755
index 5400e05..0000000
--- a/dashboard/lib/static/doc/_sources/index.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-.. XDATA API documentation master file, created by
-   sphinx-quickstart on Fri Jan 31 18:47:30 2014.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to XDATA API's documentation!
-=====================================
-
-.. toctree::
-   :maxdepth: 2
-
-   getting_started.rst
-   overview.rst
-   log_reqs.rst
-   how_to.rst   
-   server.rst
-
-Appendix
-========
-
-.. toctree::
-   :maxdepth: 1
-
-   app.rst
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_sources/log_reqs.txt b/dashboard/lib/static/doc/_sources/log_reqs.txt
deleted file mode 100755
index d4b406d..0000000
--- a/dashboard/lib/static/doc/_sources/log_reqs.txt
+++ /dev/null
@@ -1,153 +0,0 @@
-Draper Activity Logging API Requirements
-========================================
-
-In order to evaluate XDATA software components, user action and system action log messages will be collected. The data required for each of these types of log messages are formally specified in this section, but Draper has also provided helper libraries in a number of common languages to ease the implementation of this API in your software component (see :ref:`how-to` for information about using these helper libraries). 
-
-:User Actions: User action log messages should be sent when the user explicitly interacts with a software component.  Examples of user actions that should be logged are zooming in on a map, clicking buttons, sending queries, mouse clicks, keyboard events, view switches, etc. As is apparent from the preceding list of examples, user actions will span a wide range events from high-level, application-specific actions (e.g. zooming on a map) to more generic actions (e.g. keyboard events). The common element of all user action log messages is that they are sent only when a user takes explicit action in the UI (see :ref:`user-message-reqs` below for a specification of user action log messages). 
-
-:System Actions: System action log messages should be sent when the software performs an action that will affect its user interface, but which has not been explicitly performed by the user. For example, a if a table view is refreshed because the user clicked a refresh button on that view, that action should be logged as a user action. But if the same table is refreshed automatically every minute, a system action should be dispatched each time that timer fires.  System actions also indicate any latency in the system; for example if the user requests data from a database, a USER action is sent, and when the data arrives 20ms or 30s later, a SYSTEM action is fired. Other actions which should send system action messages are error messages, prompts, assists, when the UI has loaded, etc (see :ref:`sys-message-reqs` below for a specification of user action log messages).
-
-.. _message-reqs:
-
-Activity Log Message Requirements
----------------------------------
-Each activity log message shall contain the following elements:
-
-:componentName:	This is the unique identifying name of the software component generating this log entry.
-
-:componentVersion: Specifies the version of the software component identified in  componentName
-
-:client: The hostname of the computer or VM on which the software component send this log message is running. In the case of a web-based user interface component, this should be the host name of the computer on which the web browser displaying the UI is running. Ideally, this hostname should describe a physical terminal or experimental setup as persistently as possible.
-
-:sessionID: The unique session ID identifying a specific user interacting with this software component as a specific time. During registration, this identifier is created on the server and passed back to the client for subsequent messages.
-
-:timestamp: This is the timestamp for the log entry. The timestamp string shall be a date-time string that complies with the World Wide Web Consortium date-time standard.
-
-:impLanguage: The software environment from which this log message was sent.
-
-:apiVersion: The version of this API document. See the title section of this document for the current version.
-
-:type: "USERACTION" or “SYSACTION”
-
-:desc: A natural-language description of the action that the user has taken.
-
-:metadata: Developers may optionally include structured data that provides context or elaboration to the information included in this log message. This string must comply with the JSON standard.
-
-.. _user-message-reqs:
-
-User Action Log Message Requirements
-------------------------------------
-
-User Action log messages are used to describe the behavior and workflow of the user from the perspective of your application. In addition to the standard fields, a user action log message (i.e. a log message where `type==USERACTION`) shall contain the following fields:
-
-:activity: An application-specific keyword used to categorize the action taken by the user. This string should not contain whitespace.
-	
-:wf_state: This number indicates which of workflow state is most likely indicated by the current User Action. Possible values of wf_state enumeration are listed below. 
-
-.. _wf-coding:
-
-.. .. tabularcolumns:: |c{0.5cm}|c{2cm}|p{3.5cm}|p{9cm}|  
-
-.. tabularcolumns:: |c|c|c|p{9cm}|  
-
-.. list-table:: Workflow Coding (v2)
-   :widths: 25,10,25,40
-   :header-rows: 1
-
-   * - #
-     - State
-     - Code
-     - Suggested Activities
-   * - 0
-     - Other
-     - WF_OTHER
-     - This user action does not correspond to any other workflow state. Please contact Draper for guidance.
-   * - 1
-     - Define Problem
-     - WF_DEFINE
-     - define_hypothesis
-   * - 2
-     - Get Data
-     - WF_GETDATA
-     - write_query, select_option, execute_query, monitor_query
-   * - 3
-     - Explore Data
-     - WF_EXPLORE
-     - browse, pan, zoom_in, zoom_out, scale, rotate, filter, drill, crossfilter, scroll, hover_start, hover_end, toggle_option, highlight, sort, select, deselect
-   * - 4
-     - Create View of Data
-     - WF_CREATE
-     - create_visualization, define_axes, define_chart_type, define_table, move_window, resize_window, set_color_palette, select_layers, {add,remove,split,merge}_{rows,columns}, arrange_windows
-   * - 5
-     - Enrich
-     - WF_ENRICH
-     - add_note, bookmark_view, label
-   * - 6
-     - Transform Data
-     - WF_TRANSFORM
-     - denoise, detrend, pattern_search, do_math, transform_data, coordinate_transform
-
-Each of these workflow states is described in more detail :ref:`below <state-defs>`. 
-
-.. NOTE::
-  the workflow codes have changed since the last revision (see :ref:`wf-trans` for more details).
-
-Describing User Actions
------------------------
-Each component development team will understand best which user actions are related to both user activity within the software and workflow state. The challenge faced by this API is to capture a user’s activity with enough specificity to characterize her use of your particular application, while also describing the behavior in a general way so that user activity logs can be compared across applications. To accomplish this, we ask developers to describe each user action at 3 levels of abstraction, using the fields action description, activity, and workflow state. Each component development team will understand best which user actions are related to both user activity within the software and workflow state, and so is best placed to instrument their own software. The analysis of the log messages will allow insight into the application-specific activity of the user, and will enable analysis of user workflow both within a single XDATA tool and across the set of XDATA tools. All analyses will leverage the Workflow State information, which is required to be consistently defined and applied across all tools.  Within-tool analysis may be further refined with tool-specific Activity and Action Description information, which can have custom meaning to the tool developers.
-
-.. _wf-diagram:
-
-.. figure:: wf.png
-   :scale: 50 %
-   :alt: workflow figure
-
-   User activities are described using 3 levels of abstraction.  
-
-Each program team will ultimately be responsible for deciding when a logging event is recorded. Logs capture user actions at the micro-level (e.g. individual clicks) and user activities as the macro-level (e.g., “searching for data”).
-
-.. _state-defs:
-
-Definition of User Workflow States
-----------------------------------
-
-Each event described above labels the current user workflow state. These states come from the following list of activities, and it will be up to each performer team to map the following user activities to the activities of the users of their software. If a user activity does not appear to correspond to any of the workflow states below, it can be assigned the value Other (0). If you find it necessary to categorize an activity as Other, please notify Draper.  The expectation of this set of workflow states is that it can be use to categorize any user activity in your software. 
-
-The full workflow coding can be seen :ref:`above <wf-coding>` which includes example activities for each workflow state.  The full coding chart also includes workflow states that have not been implemented for Year 2 based on expectations of experimental outcomes.
-
-.. NOTE::
-   future revisions of tools and the API could include activities that necessitate coding of new workflow states.
-
-:Other: This user action does not correspond to any other workflow state. Please contact Draper for guidance.
-
-:Define the Problem: Most of Define the Problem will be accomplished outside of XDATA tools (largely in the challenge problem assignment interface).  This state includes:  receiving tasking, refining the request (perhaps with the requestor), defining specific goals and objectives for the request, specifying research questions and/or hypotheses to test, and justifying the tasking.   
-
-:Get Data: Get Data involves creating (formulating and writing), executing, and refining search queries.  Refining may include drilling down, augmenting (e.g., for multiple spellings).  We use the term 'query' loosely -- a database is not required.   Because some searches are on-going, any action involved in monitoring the status or checking for new results from a persistent search also fall into this activity.   Operationally, this state would include requesting data from others, but that is out of scope for XDATA.
-
-:Explore Data: Explore Data involves consuming data (reading, listening, watching) or visualizations of data. This activity may involve the examination of a visualization, or the comparing of multiple views of a dataset.  Explore may be dynamic, but is a passive state (vs. Enrich).  This is the triage step of taking a first look at the data.  This is typically a big picture view.
-
-:Create View of Data: Create View of Data involves the organization of data. Creating and manipulating the spatial layout in a visualization, creating categories, deriving higher-level structures, and merging pieces of information all fall under this activity. 
-
-:Enrich: In Enrich, the user actively adds insight value back into the tool.  Activities include annotating/tagging/labeling data with textual notes or links, bookmarking views, creating links between data elements.  Annotations may include external insight (from SMEs), algorithmic results (searching for patterns, denoising, etc.), identifying patterns/trends,  (Making notes or conclusions about patterns is in Enrich. Identifying/searching for them is in Transform.)
-
-:Transform Data: In Transform, the user takes a deeper look at the data. The user applies algorithms to transform the data (reduce, denoise, etc.) and searches for patterns.  Actions may be informed by SME knowledge or knowledge gained from other datasets.  Actions may include interpolating or extrapolating, comparing across data sets or models, correlating.  (Making notes or conclusions about patterns is in Enrich. Identifying/searching for them is in Transform.)
-
-.. _sys-message-reqs:
-
-System Action Log Message Requirements
---------------------------------------
-
-System action log messages should be sent when the software performs an action that will affect its user interface, but which has not been explicitly by the user. For example, a if a table view is refreshed because the user clicked a refresh button on that view, that action should be logged as a user action. But if the same table is refreshed automatically every minute, a system action should be dispatched each time that timer fires. Other actions which should which should send system action messages are error messages, error messages, prompts, assists, when the UI has loaded, etc. 
-In this version of the API, there are no additional fields required for a System Action log message other than those listed in Section 2.1, which apply to all log messages. The only requirement to specify a System Action log message is that the type field  is set to ”SYSACTION”.
-
-UI Layout Log Message Requirements
-----------------------------------
-UI Layout Logging is no longer supported.  Please contact Draper for support.
-
-DOM Logging
------------
-Mouse events are notifications that track mouse interaction with other components.  These events will be useful to track a user’s interaction with on-screen components that do not explicity log a message for a particular activity.  Such activities include new or updates to information displays when the mouse is placed over a component and when the focus is changed to a particular component such as a text input box among others.  
-
-Subject and data security
--------------------------
-TBD
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_sources/overview.txt b/dashboard/lib/static/doc/_sources/overview.txt
deleted file mode 100755
index fb1658f..0000000
--- a/dashboard/lib/static/doc/_sources/overview.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Overview
-========
-The purpose of this document is to outline the design and use of the Analytic Activity Logging API for software components built in the XDATA program. The API outlined in this document are designed to support the behavioral and physiological assessment (including eye tracking) of users as they interact with XDATA tools, in service of building a better understanding of how analyst’s make use of these tools. Through the development of a common activity logging API, we can ensure that the combined XDATA team generates uniform logging of user actions and intents. Figure 1 illustrates a planned XDATA analytic tool, with software components built by multiple program teams.
-
-
-There are several uses of the Logging API that make an application- and component-independent scheme for activity logging valuable to all software components:
-
-- Capturing observations for evaluation metrics
-- Capturing context for physiological assessment of XDATA tools
-- Capturing analytic interests for user or task modeling
-- Capturing analyst activity for workflow or process modeling and analysis
-- Capturing context (individual or community) for resource (data or compute) utilitization and optimization 
-
-The vision for XDATA is that each component development team implements the proposed analytic activity logging scheme into their software component to facilitate the analysis of user workflow and the matching of measured physiological data to user and software actions using the collection of events logged from all components. Since XDATA teams are asked to implement this logging scheme, there is a desire to:
-
-a) Make the implementation of this scheme as painless as possible.
-b) Keep the scheme general enough that it supports the variety of teams’ software approaches.
-c) Allow the scheme to collect specific details so that it can support the analysis of a wide variety of software.
-d) Ensure the scheme is generally applicable to capturing analytic process and intent, so that the effort in implementing this logging API will have utility to performers outside of XDATA program requirements, and independent of any physiological assessment.
-
-:ref:`The following figure <fig-diagram>` illustrates the high-level architecture employed by this proposed API. In this architecture, each software component communicates to a logging server via XMLHttpRequests, simple JSON log messages describing the user’s interaction with each component. These messages are collected and processed to create a top-level analytic model of the user’s activity.
-
-.. _fig-diagram:
-
-.. figure:: diagram.png
-   :scale: 50 %
-   :alt: diagram figure
-
-   The proposed API creates a common message passing interface that allows heterogeneous software components to communicate with an activity logging engine. This engine builds a model of the user’s activity over time.
-
-.. The remainder of this document is organized into the following sections. Section 2 describes the motivation and requirements for logging the activities of the user. The value of these logs, and their content is described. Section 3 describes the helper libraries and how to use them within the developers tools  Section 4 describes the logging server and message format.
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_sources/server.txt b/dashboard/lib/static/doc/_sources/server.txt
deleted file mode 100644
index 0fdc01a..0000000
--- a/dashboard/lib/static/doc/_sources/server.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-Logging Server Implementation Details
-=====================================
-
-JSON messages using HTTP POST requests.
----------------------------------------
-
-The Draper Activity Logging Server accepts log messages as json strings in HTTP POST requests. We hope that the vast majority developers have no need to know about these implementation details, as they will use one of the helper libraries provided by Draper Laboratory to automatically encode and transmit log messages. See section 3 above for information about these helper libraries. 
-
-Why JSON + HTTP?
-----------------
-Leveraging HTTP to transmit log messages will allow us to transmit messages even when code is executed in a highly restricted runtime, such as client-side javascript code. It also offers maximum compatibility with current and future network topologies, since any network allowing web traffic will allow for HTTP communication. In addition, a natural path to encrypting activity log transmission exists in the form of HTTPS. 
-
-Encoding log messages as JSON strings allows for relatively human-readable log messages, a flexible data format that allows for transmission of complex, nested data structures, and excellent encoding support in a wide variety of programming languages. 
-
-
-Messaging Diagram
-
-Activity Log Data as JSON Strings
---------------------------------------
-The specific fields to be included in each log message were described earlier in this document (see :ref:`message-reqs`). A JSON string is generated with this information by the following steps: 
-
-1. The values of componentName and componentVersion as defined in Section 2.1 of this document are stored in the keys component.name and component.value, respectively. 
-2. The value of desc is stored in the key params.desc
-3. All other values specified in Section 2.1 are stored using their title as a key.
-4. All the values specific to one kind of log message for example, activity and wf_state in the case of User Activity log messages, are stored in the key params. 
-5.  Any optional metadata is stored as a JSON object in the meta. 
-Example encoded log messages: 
-
-A System Activity message with metadata
-
-.. code-block:: json
-
-   {
-	   "timestamp":"2013-09-21T19:29Z",
-	   "client":"xDATAClient23",
-	   "component":{
-	      "name":"pyTestComp",
-	      "version":"34.87"
-	   },
-	   "sessionID":4593,
-	   "impLanguage":"Java",
-	   "apiVersion":2,
-	   "type":"SYSACTION",
-	   "params":{
-	      "desc":"TEST SYSTEM MESSAGE"
-	   },
-	   "meta":{
-	      "testQual":"quall",
-	      "testQuant":3
-	   }
-	}
-
-A User Activity message
-
-.. code-block:: json
-	
-	{
-	   "timestamp":"2013-09-21T19:29Z",
-	   "client":" xDATAClient23",
-	   "component":{
-	      "name":"pyTestComp",
-	      "version":"34.87"
-	   },
-	   "sessionID":4593,
-	   "impLanguage":"Java",
-	   "apiVersion":2,
-	   "type":"USERACTION",
-	   "params":{
-	      "desc":"TEST USER MESSAGE",
-	      "activity":"scaleHistogram",
-	      "wf_state":6,
-	      "wfCodeVersion":1
-	   }
-	}
-
-A User Activity message with metadata
-
-.. code-block:: json
-
-	{
-	   "timestamp":"2013-09-21T19:29Z",
-	   "client":"xDataClient23",
-	   "component":{
-	      "name":"pyTestComp",
-	      "version":"34.87"
-	   },
-	   "sessionID":4593,
-	   "impLanguage":"Java",
-	   "apiVersion":2,
-	   "type":"USERACTION",
-	   "params":{
-	      "desc":"TEST USER MESSAGE",
-	      "activity":"scaleHistogram",
-	      "wf_state":4,
-	      "wfCodeVersion":1
-	   },
-	   "meta":{
-	      "testQual":"quall",
-	      "testQuant":3
-	   }
-	}
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_static/ajax-loader.gif b/dashboard/lib/static/doc/_static/ajax-loader.gif
deleted file mode 100755
index 61faf8c..0000000
--- a/dashboard/lib/static/doc/_static/ajax-loader.gif
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/basic.css b/dashboard/lib/static/doc/_static/basic.css
deleted file mode 100755
index 43e8baf..0000000
--- a/dashboard/lib/static/doc/_static/basic.css
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * basic.css
- * ~~~~~~~~~
- *
- * Sphinx stylesheet -- basic theme.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/* -- main layout ----------------------------------------------------------- */
-
-div.clearer {
-    clear: both;
-}
-
-/* -- relbar ---------------------------------------------------------------- */
-
-div.related {
-    width: 100%;
-    font-size: 90%;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-/* -- sidebar --------------------------------------------------------------- */
-
-div.sphinxsidebarwrapper {
-    padding: 10px 5px 0 10px;
-}
-
-div.sphinxsidebar {
-    float: left;
-    width: 230px;
-    margin-left: -100%;
-    font-size: 90%;
-}
-
-div.sphinxsidebar ul {
-    list-style: none;
-}
-
-div.sphinxsidebar ul ul,
-div.sphinxsidebar ul.want-points {
-    margin-left: 20px;
-    list-style: square;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-div.sphinxsidebar #searchbox input[type="text"] {
-    width: 170px;
-}
-
-div.sphinxsidebar #searchbox input[type="submit"] {
-    width: 30px;
-}
-
-img {
-    border: 0;
-}
-
-/* -- search page ----------------------------------------------------------- */
-
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* -- index page ------------------------------------------------------------ */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-/* -- general index --------------------------------------------------------- */
-
-table.indextable {
-    width: 100%;
-}
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-div.modindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-div.genindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-/* -- general body styles --------------------------------------------------- */
-
-a.headerlink {
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-div.body p.caption {
-    text-align: inherit;
-}
-
-div.body td {
-    text-align: left;
-}
-
-.field-list ul {
-    padding-left: 1em;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-img.align-left, .figure.align-left, object.align-left {
-    clear: left;
-    float: left;
-    margin-right: 1em;
-}
-
-img.align-right, .figure.align-right, object.align-right {
-    clear: right;
-    float: right;
-    margin-left: 1em;
-}
-
-img.align-center, .figure.align-center, object.align-center {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.align-left {
-    text-align: left;
-}
-
-.align-center {
-    text-align: center;
-}
-
-.align-right {
-    text-align: right;
-}
-
-/* -- sidebars -------------------------------------------------------------- */
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-/* -- topics ---------------------------------------------------------------- */
-
-div.topic {
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* -- admonitions ----------------------------------------------------------- */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-/* -- tables ---------------------------------------------------------------- */
-
-table.docutils {
-    border: 0;
-    border-collapse: collapse;
-}
-
-table.docutils td, table.docutils th {
-    padding: 1px 8px 1px 5px;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-table.citation {
-    border-left: solid 1px gray;
-    margin-left: 1px;
-}
-
-table.citation td {
-    border-bottom: none;
-}
-
-/* -- other body styles ----------------------------------------------------- */
-
-ol.arabic {
-    list-style: decimal;
-}
-
-ol.loweralpha {
-    list-style: lower-alpha;
-}
-
-ol.upperalpha {
-    list-style: upper-alpha;
-}
-
-ol.lowerroman {
-    list-style: lower-roman;
-}
-
-ol.upperroman {
-    list-style: upper-roman;
-}
-
-dl {
-    margin-bottom: 15px;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-dt:target, .highlighted {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-.refcount {
-    color: #060;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-.system-message {
-    background-color: #fda;
-    padding: 5px;
-    border: 3px solid red;
-}
-
-.footnote:target  {
-    background-color: #ffa;
-}
-
-.line-block {
-    display: block;
-    margin-top: 1em;
-    margin-bottom: 1em;
-}
-
-.line-block .line-block {
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 1.5em;
-}
-
-.guilabel, .menuselection {
-    font-family: sans-serif;
-}
-
-.accelerator {
-    text-decoration: underline;
-}
-
-.classifier {
-    font-style: oblique;
-}
-
-abbr, acronym {
-    border-bottom: dotted 1px;
-    cursor: help;
-}
-
-/* -- code displays --------------------------------------------------------- */
-
-pre {
-    overflow: auto;
-    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
-}
-
-td.linenos pre {
-    padding: 5px 0px;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.viewcode-link {
-    float: right;
-}
-
-.viewcode-back {
-    float: right;
-    font-family: sans-serif;
-}
-
-div.viewcode-block:target {
-    margin: -1px -10px;
-    padding: 0 10px;
-}
-
-/* -- math display ---------------------------------------------------------- */
-
-img.math {
-    vertical-align: middle;
-}
-
-div.body div.math p {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-/* -- printout stylesheet --------------------------------------------------- */
-
-@media print {
-    div.document,
-    div.documentwrapper,
-    div.bodywrapper {
-        margin: 0 !important;
-        width: 100%;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    #top-link {
-        display: none;
-    }
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_static/comment-bright.png b/dashboard/lib/static/doc/_static/comment-bright.png
deleted file mode 100755
index 551517b..0000000
--- a/dashboard/lib/static/doc/_static/comment-bright.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/comment-close.png b/dashboard/lib/static/doc/_static/comment-close.png
deleted file mode 100755
index 09b54be..0000000
--- a/dashboard/lib/static/doc/_static/comment-close.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/comment.png b/dashboard/lib/static/doc/_static/comment.png
deleted file mode 100755
index 92feb52..0000000
--- a/dashboard/lib/static/doc/_static/comment.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/default.css b/dashboard/lib/static/doc/_static/default.css
deleted file mode 100755
index 21f3f50..0000000
--- a/dashboard/lib/static/doc/_static/default.css
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * default.css_t
- * ~~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- default theme.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
-    font-family: sans-serif;
-    font-size: 100%;
-    background-color: #11303d;
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-div.document {
-    background-color: #1c4e63;
-}
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 0 0 230px;
-}
-
-div.body {
-    background-color: #ffffff;
-    color: #000000;
-    padding: 0 20px 30px 20px;
-}
-
-div.footer {
-    color: #ffffff;
-    width: 100%;
-    padding: 9px 0 9px 0;
-    text-align: center;
-    font-size: 75%;
-}
-
-div.footer a {
-    color: #ffffff;
-    text-decoration: underline;
-}
-
-div.related {
-    background-color: #133f52;
-    line-height: 30px;
-    color: #ffffff;
-}
-
-div.related a {
-    color: #ffffff;
-}
-
-div.sphinxsidebar {
-}
-
-div.sphinxsidebar h3 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: #ffffff;
-    font-size: 1.4em;
-    font-weight: normal;
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar h3 a {
-    color: #ffffff;
-}
-
-div.sphinxsidebar h4 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: #ffffff;
-    font-size: 1.3em;
-    font-weight: normal;
-    margin: 5px 0 0 0;
-    padding: 0;
-}
-
-div.sphinxsidebar p {
-    color: #ffffff;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    padding: 0;
-    color: #ffffff;
-}
-
-div.sphinxsidebar a {
-    color: #98dbcc;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-
-
-/* -- hyperlink styles ------------------------------------------------------ */
-
-a {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:visited {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-
-
-/* -- body styles ----------------------------------------------------------- */
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: 'Trebuchet MS', sans-serif;
-    background-color: #f2f2f2;
-    font-weight: normal;
-    color: #20435c;
-    border-bottom: 1px solid #ccc;
-    margin: 20px -20px 10px -20px;
-    padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-}
-
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li {
-    text-align: justify;
-    line-height: 130%;
-}
-
-div.admonition p.admonition-title + p {
-    display: inline;
-}
-
-div.admonition p {
-    margin-bottom: 5px;
-}
-
-div.admonition pre {
-    margin-bottom: 5px;
-}
-
-div.admonition ul, div.admonition ol {
-    margin-bottom: 5px;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.topic {
-    background-color: #eee;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-p.admonition-title {
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-pre {
-    padding: 5px;
-    background-color: #eeffcc;
-    color: #333333;
-    line-height: 120%;
-    border: 1px solid #ac9;
-    border-left: none;
-    border-right: none;
-}
-
-tt {
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-    font-size: 0.95em;
-}
-
-th {
-    background-color: #ede;
-}
-
-.warning tt {
-    background: #efc2c2;
-}
-
-.note tt {
-    background: #d6d6d6;
-}
-
-.viewcode-back {
-    font-family: sans-serif;
-}
-
-div.viewcode-block:target {
-    background-color: #f4debf;
-    border-top: 1px solid #ac9;
-    border-bottom: 1px solid #ac9;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_static/doctools.js b/dashboard/lib/static/doc/_static/doctools.js
deleted file mode 100755
index d4619fd..0000000
--- a/dashboard/lib/static/doc/_static/doctools.js
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * doctools.js
- * ~~~~~~~~~~~
- *
- * Sphinx JavaScript utilities for all documentation.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/**
- * select a different prefix for underscore
- */
-$u = _.noConflict();
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
-if (!window.console || !console.firebug) {
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
-    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
-    "profile", "profileEnd"];
-  window.console = {};
-  for (var i = 0; i < names.length; ++i)
-    window.console[names[i]] = function() {};
-}
- */
-
-/**
- * small helper function to urldecode strings
- */
-jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
-}
-
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
-
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
-    s = document.location.search;
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
-  var result = {};
-  for (var i = 0; i < parts.length; i++) {
-    var tmp = parts[i].split('=', 2);
-    var key = jQuery.urldecode(tmp[0]);
-    var value = jQuery.urldecode(tmp[1]);
-    if (key in result)
-      result[key].push(value);
-    else
-      result[key] = [value];
-  }
-  return result;
-};
-
-/**
- * small function to check if an array contains
- * a given item.
- */
-jQuery.contains = function(arr, item) {
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] == item)
-      return true;
-  }
-  return false;
-};
-
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
-      var val = node.nodeValue;
-      var pos = val.toLowerCase().indexOf(text);
-      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
-          document.createTextNode(val.substr(pos + text.length)),
-          node.nextSibling));
-        node.nodeValue = val.substr(0, pos);
-      }
-    }
-    else if (!jQuery(node).is("button, select, textarea")) {
-      jQuery.each(node.childNodes, function() {
-        highlight(this);
-      });
-    }
-  }
-  return this.each(function() {
-    highlight(this);
-  });
-};
-
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
-
-  init : function() {
-    this.fixFirefoxAnchorBug();
-    this.highlightSearchWords();
-    this.initIndexTable();
-  },
-
-  /**
-   * i18n support
-   */
-  TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
-  LOCALE : 'unknown',
-
-  // gettext and ngettext don't access this so that the functions
-  // can safely bound to a different name (_ = Documentation.gettext)
-  gettext : function(string) {
-    var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
-      return string;
-    return (typeof translated == 'string') ? translated : translated[0];
-  },
-
-  ngettext : function(singular, plural, n) {
-    var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
-      return (n == 1) ? singular : plural;
-    return translated[Documentation.PLURALEXPR(n)];
-  },
-
-  addTranslations : function(catalog) {
-    for (var key in catalog.messages)
-      this.TRANSLATIONS[key] = catalog.messages[key];
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
-    this.LOCALE = catalog.locale;
-  },
-
-  /**
-   * add context elements like header anchor links
-   */
-  addContextElements : function() {
-    $('div[id] > :header:first').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this headline')).
-      appendTo(this);
-    });
-    $('dt[id]').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this definition')).
-      appendTo(this);
-    });
-  },
-
-  /**
-   * workaround a firefox stupidity
-   */
-  fixFirefoxAnchorBug : function() {
-    if (document.location.hash && $.browser.mozilla)
-      window.setTimeout(function() {
-        document.location.href += '';
-      }, 10);
-  },
-
-  /**
-   * highlight the search words provided in the url in the text
-   */
-  highlightSearchWords : function() {
-    var params = $.getQueryParameters();
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
-    if (terms.length) {
-      var body = $('div.body');
-      window.setTimeout(function() {
-        $.each(terms, function() {
-          body.highlightText(this.toLowerCase(), 'highlighted');
-        });
-      }, 10);
-      $('<p class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
-          .appendTo($('#searchbox'));
-    }
-  },
-
-  /**
-   * init the domain index toggle buttons
-   */
-  initIndexTable : function() {
-    var togglers = $('img.toggler').click(function() {
-      var src = $(this).attr('src');
-      var idnum = $(this).attr('id').substr(7);
-      $('tr.cg-' + idnum).toggle();
-      if (src.substr(-9) == 'minus.png')
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
-      else
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
-    }).css('display', '');
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
-        togglers.click();
-    }
-  },
-
-  /**
-   * helper function to hide the search marks again
-   */
-  hideSearchWords : function() {
-    $('#searchbox .highlight-link').fadeOut(300);
-    $('span.highlighted').removeClass('highlighted');
-  },
-
-  /**
-   * make the url absolute
-   */
-  makeURL : function(relativeURL) {
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
-  },
-
-  /**
-   * get the current relative url
-   */
-  getCurrentURL : function() {
-    var path = document.location.pathname;
-    var parts = path.split(/\//);
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
-        parts.pop();
-    });
-    var url = parts.join('/');
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
-  }
-};
-
-// quick alias for translations
-_ = Documentation.gettext;
-
-$(document).ready(function() {
-  Documentation.init();
-});
diff --git a/dashboard/lib/static/doc/_static/down-pressed.png b/dashboard/lib/static/doc/_static/down-pressed.png
deleted file mode 100755
index 6f7ad78..0000000
--- a/dashboard/lib/static/doc/_static/down-pressed.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/down.png b/dashboard/lib/static/doc/_static/down.png
deleted file mode 100755
index 3003a88..0000000
--- a/dashboard/lib/static/doc/_static/down.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/file.png b/dashboard/lib/static/doc/_static/file.png
deleted file mode 100755
index d18082e..0000000
--- a/dashboard/lib/static/doc/_static/file.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/jquery.js b/dashboard/lib/static/doc/_static/jquery.js
deleted file mode 100755
index 7c24308..0000000
--- a/dashboard/lib/static/doc/_static/jquery.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.2
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Sat Feb 13 22:33:48 2010 -0500
- */
-(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
-e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
-j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
-"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
-true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
-Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
-(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
-a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
-"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
-function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
-c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
-L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
-"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
-a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
-d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
-a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
-!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
-true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
-parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
-false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
-s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
-applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
-else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
-a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
-w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
-cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
-i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
-" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
-this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
-e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
-c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
-a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
-function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
-k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
-C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
-null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
-e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
-f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
-if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
-"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
-a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
-isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
-{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
-if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
-e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
-"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
-d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
-!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
-toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
-u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
-function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
-if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
-t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
-g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
-for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
-1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
-CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
-relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
-l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
-h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
-CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
-g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
-text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
-setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
-h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
-m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
-"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
-h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
-!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
-h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
-q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
-if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
-(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
-function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
-gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
-c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
-{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
-"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
-d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
-a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
-1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
-a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
-c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
-wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
-prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
-this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
-return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
-""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
-this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
-u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
-1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
-return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
-""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
-c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
-c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
-function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
-Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
-"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
-a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
-a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
-"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
-serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
-function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
-global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
-e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
-"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
-false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
-false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
-c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
-d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
-g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
-1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
-"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
-if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
-this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
-"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
-animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
-j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
-this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
-"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
-c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
-this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
-this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
-e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
-c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
-function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
-this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
-k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
-f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
-c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
-d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
-"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
-e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/dashboard/lib/static/doc/_static/minus.png b/dashboard/lib/static/doc/_static/minus.png
deleted file mode 100755
index da1c562..0000000
--- a/dashboard/lib/static/doc/_static/minus.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/plus.png b/dashboard/lib/static/doc/_static/plus.png
deleted file mode 100755
index b3cb374..0000000
--- a/dashboard/lib/static/doc/_static/plus.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/pygments.css b/dashboard/lib/static/doc/_static/pygments.css
deleted file mode 100755
index d79caa1..0000000
--- a/dashboard/lib/static/doc/_static/pygments.css
+++ /dev/null
@@ -1,62 +0,0 @@
-.highlight .hll { background-color: #ffffcc }
-.highlight  { background: #eeffcc; }
-.highlight .c { color: #408090; font-style: italic } /* Comment */
-.highlight .err { border: 1px solid #FF0000 } /* Error */
-.highlight .k { color: #007020; font-weight: bold } /* Keyword */
-.highlight .o { color: #666666 } /* Operator */
-.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #007020 } /* Comment.Preproc */
-.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
-.highlight .gd { color: #A00000 } /* Generic.Deleted */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
-.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #333333 } /* Generic.Output */
-.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0044DD } /* Generic.Traceback */
-.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #007020 } /* Keyword.Pseudo */
-.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #902000 } /* Keyword.Type */
-.highlight .m { color: #208050 } /* Literal.Number */
-.highlight .s { color: #4070a0 } /* Literal.String */
-.highlight .na { color: #4070a0 } /* Name.Attribute */
-.highlight .nb { color: #007020 } /* Name.Builtin */
-.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
-.highlight .no { color: #60add5 } /* Name.Constant */
-.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
-.highlight .ne { color: #007020 } /* Name.Exception */
-.highlight .nf { color: #06287e } /* Name.Function */
-.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
-.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
-.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #bb60d5 } /* Name.Variable */
-.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
-.highlight .mf { color: #208050 } /* Literal.Number.Float */
-.highlight .mh { color: #208050 } /* Literal.Number.Hex */
-.highlight .mi { color: #208050 } /* Literal.Number.Integer */
-.highlight .mo { color: #208050 } /* Literal.Number.Oct */
-.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
-.highlight .sc { color: #4070a0 } /* Literal.String.Char */
-.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
-.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
-.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
-.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
-.highlight .sx { color: #c65d09 } /* Literal.String.Other */
-.highlight .sr { color: #235388 } /* Literal.String.Regex */
-.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
-.highlight .ss { color: #517918 } /* Literal.String.Symbol */
-.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
-.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
-.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
-.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
-.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_static/searchtools.js b/dashboard/lib/static/doc/_static/searchtools.js
deleted file mode 100755
index 663be4c..0000000
--- a/dashboard/lib/static/doc/_static/searchtools.js
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * searchtools.js_t
- * ~~~~~~~~~~~~~~~~
- *
- * Sphinx JavaScript utilties for the full-text search.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/**
- * helper function to return a node containing the
- * search summary for a given text. keywords is a list
- * of stemmed words, hlwords is the list of normal, unstemmed
- * words. the first one is used to find the occurance, the
- * latter for highlighting it.
- */
-
-jQuery.makeSearchSummary = function(text, keywords, hlwords) {
-  var textLower = text.toLowerCase();
-  var start = 0;
-  $.each(keywords, function() {
-    var i = textLower.indexOf(this.toLowerCase());
-    if (i > -1)
-      start = i;
-  });
-  start = Math.max(start - 120, 0);
-  var excerpt = ((start > 0) ? '...' : '') +
-  $.trim(text.substr(start, 240)) +
-  ((start + 240 - text.length) ? '...' : '');
-  var rv = $('<div class="context"></div>').text(excerpt);
-  $.each(hlwords, function() {
-    rv = rv.highlightText(this, 'highlighted');
-  });
-  return rv;
-}
-
-
-/**
- * Porter Stemmer
- */
-var Stemmer = function() {
-
-  var step2list = {
-    ational: 'ate',
-    tional: 'tion',
-    enci: 'ence',
-    anci: 'ance',
-    izer: 'ize',
-    bli: 'ble',
-    alli: 'al',
-    entli: 'ent',
-    eli: 'e',
-    ousli: 'ous',
-    ization: 'ize',
-    ation: 'ate',
-    ator: 'ate',
-    alism: 'al',
-    iveness: 'ive',
-    fulness: 'ful',
-    ousness: 'ous',
-    aliti: 'al',
-    iviti: 'ive',
-    biliti: 'ble',
-    logi: 'log'
-  };
-
-  var step3list = {
-    icate: 'ic',
-    ative: '',
-    alize: 'al',
-    iciti: 'ic',
-    ical: 'ic',
-    ful: '',
-    ness: ''
-  };
-
-  var c = "[^aeiou]";          // consonant
-  var v = "[aeiouy]";          // vowel
-  var C = c + "[^aeiouy]*";    // consonant sequence
-  var V = v + "[aeiou]*";      // vowel sequence
-
-  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
-  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
-  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
-  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
-
-  this.stemWord = function (w) {
-    var stem;
-    var suffix;
-    var firstch;
-    var origword = w;
-
-    if (w.length < 3)
-      return w;
-
-    var re;
-    var re2;
-    var re3;
-    var re4;
-
-    firstch = w.substr(0,1);
-    if (firstch == "y")
-      w = firstch.toUpperCase() + w.substr(1);
-
-    // Step 1a
-    re = /^(.+?)(ss|i)es$/;
-    re2 = /^(.+?)([^s])s$/;
-
-    if (re.test(w))
-      w = w.replace(re,"$1$2");
-    else if (re2.test(w))
-      w = w.replace(re2,"$1$2");
-
-    // Step 1b
-    re = /^(.+?)eed$/;
-    re2 = /^(.+?)(ed|ing)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      re = new RegExp(mgr0);
-      if (re.test(fp[1])) {
-        re = /.$/;
-        w = w.replace(re,"");
-      }
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1];
-      re2 = new RegExp(s_v);
-      if (re2.test(stem)) {
-        w = stem;
-        re2 = /(at|bl|iz)$/;
-        re3 = new RegExp("([^aeiouylsz])\\1$");
-        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-        if (re2.test(w))
-          w = w + "e";
-        else if (re3.test(w)) {
-          re = /.$/;
-          w = w.replace(re,"");
-        }
-        else if (re4.test(w))
-          w = w + "e";
-      }
-    }
-
-    // Step 1c
-    re = /^(.+?)y$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(s_v);
-      if (re.test(stem))
-        w = stem + "i";
-    }
-
-    // Step 2
-    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step2list[suffix];
-    }
-
-    // Step 3
-    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step3list[suffix];
-    }
-
-    // Step 4
-    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
-    re2 = /^(.+?)(s|t)(ion)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      if (re.test(stem))
-        w = stem;
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1] + fp[2];
-      re2 = new RegExp(mgr1);
-      if (re2.test(stem))
-        w = stem;
-    }
-
-    // Step 5
-    re = /^(.+?)e$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      re2 = new RegExp(meq1);
-      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
-        w = stem;
-    }
-    re = /ll$/;
-    re2 = new RegExp(mgr1);
-    if (re.test(w) && re2.test(w)) {
-      re = /.$/;
-      w = w.replace(re,"");
-    }
-
-    // and turn initial Y back to y
-    if (firstch == "y")
-      w = firstch.toLowerCase() + w.substr(1);
-    return w;
-  }
-}
-
-
-/**
- * Search Module
- */
-var Search = {
-
-  _index : null,
-  _queued_query : null,
-  _pulse_status : -1,
-
-  init : function() {
-      var params = $.getQueryParameters();
-      if (params.q) {
-          var query = params.q[0];
-          $('input[name="q"]')[0].value = query;
-          this.performSearch(query);
-      }
-  },
-
-  loadIndex : function(url) {
-    $.ajax({type: "GET", url: url, data: null, success: null,
-            dataType: "script", cache: true});
-  },
-
-  setIndex : function(index) {
-    var q;
-    this._index = index;
-    if ((q = this._queued_query) !== null) {
-      this._queued_query = null;
-      Search.query(q);
-    }
-  },
-
-  hasIndex : function() {
-      return this._index !== null;
-  },
-
-  deferQuery : function(query) {
-      this._queued_query = query;
-  },
-
-  stopPulse : function() {
-      this._pulse_status = 0;
-  },
-
-  startPulse : function() {
-    if (this._pulse_status >= 0)
-        return;
-    function pulse() {
-      Search._pulse_status = (Search._pulse_status + 1) % 4;
-      var dotString = '';
-      for (var i = 0; i < Search._pulse_status; i++)
-        dotString += '.';
-      Search.dots.text(dotString);
-      if (Search._pulse_status > -1)
-        window.setTimeout(pulse, 500);
-    };
-    pulse();
-  },
-
-  /**
-   * perform a search for something
-   */
-  performSearch : function(query) {
-    // create the required interface elements
-    this.out = $('#search-results');
-    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
-    this.dots = $('<span></span>').appendTo(this.title);
-    this.status = $('<p style="display: none"></p>').appendTo(this.out);
-    this.output = $('<ul class="search"/>').appendTo(this.out);
-
-    $('#search-progress').text(_('Preparing search...'));
-    this.startPulse();
-
-    // index already loaded, the browser was quick!
-    if (this.hasIndex())
-      this.query(query);
-    else
-      this.deferQuery(query);
-  },
-
-  query : function(query) {
-    var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
-
-    // Stem the searchterms and add them to the correct list
-    var stemmer = new Stemmer();
-    var searchterms = [];
-    var excluded = [];
-    var hlterms = [];
-    var tmp = query.split(/\s+/);
-    var objectterms = [];
-    for (var i = 0; i < tmp.length; i++) {
-      if (tmp[i] != "") {
-          objectterms.push(tmp[i].toLowerCase());
-      }
-
-      if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
-          tmp[i] == "") {
-        // skip this "word"
-        continue;
-      }
-      // stem the word
-      var word = stemmer.stemWord(tmp[i]).toLowerCase();
-      // select the correct list
-      if (word[0] == '-') {
-        var toAppend = excluded;
-        word = word.substr(1);
-      }
-      else {
-        var toAppend = searchterms;
-        hlterms.push(tmp[i].toLowerCase());
-      }
-      // only add if not already in the list
-      if (!$.contains(toAppend, word))
-        toAppend.push(word);
-    };
-    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
-    // console.debug('SEARCH: searching for:');
-    // console.info('required: ', searchterms);
-    // console.info('excluded: ', excluded);
-
-    // prepare search
-    var filenames = this._index.filenames;
-    var titles = this._index.titles;
-    var terms = this._index.terms;
-    var fileMap = {};
-    var files = null;
-    // different result priorities
-    var importantResults = [];
-    var objectResults = [];
-    var regularResults = [];
-    var unimportantResults = [];
-    $('#search-progress').empty();
-
-    // lookup as object
-    for (var i = 0; i < objectterms.length; i++) {
-      var others = [].concat(objectterms.slice(0,i),
-                             objectterms.slice(i+1, objectterms.length))
-      var results = this.performObjectSearch(objectterms[i], others);
-      // Assume first word is most likely to be the object,
-      // other words more likely to be in description.
-      // Therefore put matches for earlier words first.
-      // (Results are eventually used in reverse order).
-      objectResults = results[0].concat(objectResults);
-      importantResults = results[1].concat(importantResults);
-      unimportantResults = results[2].concat(unimportantResults);
-    }
-
-    // perform the search on the required terms
-    for (var i = 0; i < searchterms.length; i++) {
-      var word = searchterms[i];
-      // no match but word was a required one
-      if ((files = terms[word]) == null)
-        break;
-      if (files.length == undefined) {
-        files = [files];
-      }
-      // create the mapping
-      for (var j = 0; j < files.length; j++) {
-        var file = files[j];
-        if (file in fileMap)
-          fileMap[file].push(word);
-        else
-          fileMap[file] = [word];
-      }
-    }
-
-    // now check if the files don't contain excluded terms
-    for (var file in fileMap) {
-      var valid = true;
-
-      // check if all requirements are matched
-      if (fileMap[file].length != searchterms.length)
-        continue;
-
-      // ensure that none of the excluded terms is in the
-      // search result.
-      for (var i = 0; i < excluded.length; i++) {
-        if (terms[excluded[i]] == file ||
-            $.contains(terms[excluded[i]] || [], file)) {
-          valid = false;
-          break;
-        }
-      }
-
-      // if we have still a valid result we can add it
-      // to the result list
-      if (valid)
-        regularResults.push([filenames[file], titles[file], '', null]);
-    }
-
-    // delete unused variables in order to not waste
-    // memory until list is retrieved completely
-    delete filenames, titles, terms;
-
-    // now sort the regular results descending by title
-    regularResults.sort(function(a, b) {
-      var left = a[1].toLowerCase();
-      var right = b[1].toLowerCase();
-      return (left > right) ? -1 : ((left < right) ? 1 : 0);
-    });
-
-    // combine all results
-    var results = unimportantResults.concat(regularResults)
-      .concat(objectResults).concat(importantResults);
-
-    // print the results
-    var resultCount = results.length;
-    function displayNextItem() {
-      // results left, load the summary and display it
-      if (results.length) {
-        var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
-        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
-          // dirhtml builder
-          var dirname = item[0] + '/';
-          if (dirname.match(/\/index\/$/)) {
-            dirname = dirname.substring(0, dirname.length-6);
-          } else if (dirname == 'index/') {
-            dirname = '';
-          }
-          listItem.append($('<a/>').attr('href',
-            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
-            highlightstring + item[2]).html(item[1]));
-        } else {
-          // normal html builders
-          listItem.append($('<a/>').attr('href',
-            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
-            highlightstring + item[2]).html(item[1]));
-        }
-        if (item[3]) {
-          listItem.append($('<span> (' + item[3] + ')</span>'));
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
-          $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
-                item[0] + '.txt', function(data) {
-            if (data != '') {
-              listItem.append($.makeSearchSummary(data, searchterms, hlterms));
-              Search.output.append(listItem);
-            }
-            listItem.slideDown(5, function() {
-              displayNextItem();
-            });
-          }, "text");
-        } else {
-          // no source available, just display title
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        }
-      }
-      // search finished, update title and status message
-      else {
-        Search.stopPulse();
-        Search.title.text(_('Search Results'));
-        if (!resultCount)
-          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
-        else
-            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
-        Search.status.fadeIn(500);
-      }
-    }
-    displayNextItem();
-  },
-
-  performObjectSearch : function(object, otherterms) {
-    var filenames = this._index.filenames;
-    var objects = this._index.objects;
-    var objnames = this._index.objnames;
-    var titles = this._index.titles;
-
-    var importantResults = [];
-    var objectResults = [];
-    var unimportantResults = [];
-
-    for (var prefix in objects) {
-      for (var name in objects[prefix]) {
-        var fullname = (prefix ? prefix + '.' : '') + name;
-        if (fullname.toLowerCase().indexOf(object) > -1) {
-          var match = objects[prefix][name];
-          var objname = objnames[match[1]][2];
-          var title = titles[match[0]];
-          // If more than one term searched for, we require other words to be
-          // found in the name/title/description
-          if (otherterms.length > 0) {
-            var haystack = (prefix + ' ' + name + ' ' +
-                            objname + ' ' + title).toLowerCase();
-            var allfound = true;
-            for (var i = 0; i < otherterms.length; i++) {
-              if (haystack.indexOf(otherterms[i]) == -1) {
-                allfound = false;
-                break;
-              }
-            }
-            if (!allfound) {
-              continue;
-            }
-          }
-          var descr = objname + _(', in ') + title;
-          anchor = match[3];
-          if (anchor == '')
-            anchor = fullname;
-          else if (anchor == '-')
-            anchor = objnames[match[1]][1] + '-' + fullname;
-          result = [filenames[match[0]], fullname, '#'+anchor, descr];
-          switch (match[2]) {
-          case 1: objectResults.push(result); break;
-          case 0: importantResults.push(result); break;
-          case 2: unimportantResults.push(result); break;
-          }
-        }
-      }
-    }
-
-    // sort results descending
-    objectResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-    importantResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-    unimportantResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-    return [importantResults, objectResults, unimportantResults]
-  }
-}
-
-$(document).ready(function() {
-  Search.init();
-});
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/_static/sidebar.js b/dashboard/lib/static/doc/_static/sidebar.js
deleted file mode 100755
index a45e192..0000000
--- a/dashboard/lib/static/doc/_static/sidebar.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * sidebar.js
- * ~~~~~~~~~~
- *
- * This script makes the Sphinx sidebar collapsible.
- *
- * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
- * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
- * used to collapse and expand the sidebar.
- *
- * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
- * and the width of the sidebar and the margin-left of the document
- * are decreased. When the sidebar is expanded the opposite happens.
- * This script saves a per-browser/per-session cookie used to
- * remember the position of the sidebar among the pages.
- * Once the browser is closed the cookie is deleted and the position
- * reset to the default (expanded).
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-$(function() {
-  // global elements used by the functions.
-  // the 'sidebarbutton' element is defined as global after its
-  // creation, in the add_sidebar_button function
-  var bodywrapper = $('.bodywrapper');
-  var sidebar = $('.sphinxsidebar');
-  var sidebarwrapper = $('.sphinxsidebarwrapper');
-
-  // for some reason, the document has no sidebar; do not run into errors
-  if (!sidebar.length) return;
-
-  // original margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar expanded
-  var bw_margin_expanded = bodywrapper.css('margin-left');
-  var ssb_width_expanded = sidebar.width();
-
-  // margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar collapsed
-  var bw_margin_collapsed = '.8em';
-  var ssb_width_collapsed = '.8em';
-
-  // colors used by the current theme
-  var dark_color = $('.related').css('background-color');
-  var light_color = $('.document').css('background-color');
-
-  function sidebar_is_collapsed() {
-    return sidebarwrapper.is(':not(:visible)');
-  }
-
-  function toggle_sidebar() {
-    if (sidebar_is_collapsed())
-      expand_sidebar();
-    else
-      collapse_sidebar();
-  }
-
-  function collapse_sidebar() {
-    sidebarwrapper.hide();
-    sidebar.css('width', ssb_width_collapsed);
-    bodywrapper.css('margin-left', bw_margin_collapsed);
-    sidebarbutton.css({
-        'margin-left': '0',
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('»');
-    sidebarbutton.attr('title', _('Expand sidebar'));
-    document.cookie = 'sidebar=collapsed';
-  }
-
-  function expand_sidebar() {
-    bodywrapper.css('margin-left', bw_margin_expanded);
-    sidebar.css('width', ssb_width_expanded);
-    sidebarwrapper.show();
-    sidebarbutton.css({
-        'margin-left': ssb_width_expanded-12,
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('«');
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    document.cookie = 'sidebar=expanded';
-  }
-
-  function add_sidebar_button() {
-    sidebarwrapper.css({
-        'float': 'left',
-        'margin-right': '0',
-        'width': ssb_width_expanded - 28
-    });
-    // create the button
-    sidebar.append(
-        '<div id="sidebarbutton"><span>&laquo;</span></div>'
-    );
-    var sidebarbutton = $('#sidebarbutton');
-    light_color = sidebarbutton.css('background-color');
-    // find the height of the viewport to center the '<<' in the page
-    var viewport_height;
-    if (window.innerHeight)
- 	  viewport_height = window.innerHeight;
-    else
-	  viewport_height = $(window).height();
-    sidebarbutton.find('span').css({
-        'display': 'block',
-        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
-    });
-
-    sidebarbutton.click(toggle_sidebar);
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    sidebarbutton.css({
-        'color': '#FFFFFF',
-        'border-left': '1px solid ' + dark_color,
-        'font-size': '1.2em',
-        'cursor': 'pointer',
-        'height': bodywrapper.height(),
-        'padding-top': '1px',
-        'margin-left': ssb_width_expanded - 12
-    });
-
-    sidebarbutton.hover(
-      function () {
-          $(this).css('background-color', dark_color);
-      },
-      function () {
-          $(this).css('background-color', light_color);
-      }
-    );
-  }
-
-  function set_position_from_cookie() {
-    if (!document.cookie)
-      return;
-    var items = document.cookie.split(';');
-    for(var k=0; k<items.length; k++) {
-      var key_val = items[k].split('=');
-      var key = key_val[0];
-      if (key == 'sidebar') {
-        var value = key_val[1];
-        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
-          collapse_sidebar();
-        else if ((value == 'expanded') && (sidebar_is_collapsed()))
-          expand_sidebar();
-      }
-    }
-  }
-
-  add_sidebar_button();
-  var sidebarbutton = $('#sidebarbutton');
-  set_position_from_cookie();
-});
diff --git a/dashboard/lib/static/doc/_static/underscore.js b/dashboard/lib/static/doc/_static/underscore.js
deleted file mode 100755
index 5d89914..0000000
--- a/dashboard/lib/static/doc/_static/underscore.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Underscore.js 0.5.5
-// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the terms of the MIT license.
-// Portions of Underscore are inspired by or borrowed from Prototype.js,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore/
-(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
-a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
-var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
-d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
-function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
-function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
-0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
-e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
-a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
-return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
-var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
-if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
-0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
-a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
-" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
-o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
diff --git a/dashboard/lib/static/doc/_static/up-pressed.png b/dashboard/lib/static/doc/_static/up-pressed.png
deleted file mode 100755
index 8bd587a..0000000
--- a/dashboard/lib/static/doc/_static/up-pressed.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/up.png b/dashboard/lib/static/doc/_static/up.png
deleted file mode 100755
index b946256..0000000
--- a/dashboard/lib/static/doc/_static/up.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/_static/websupport.js b/dashboard/lib/static/doc/_static/websupport.js
deleted file mode 100755
index e9bd1b8..0000000
--- a/dashboard/lib/static/doc/_static/websupport.js
+++ /dev/null
@@ -1,808 +0,0 @@
-/*
- * websupport.js
- * ~~~~~~~~~~~~~
- *
- * sphinx.websupport utilties for all documentation.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-(function($) {
-  $.fn.autogrow = function() {
-    return this.each(function() {
-    var textarea = this;
-
-    $.fn.autogrow.resize(textarea);
-
-    $(textarea)
-      .focus(function() {
-        textarea.interval = setInterval(function() {
-          $.fn.autogrow.resize(textarea);
-        }, 500);
-      })
-      .blur(function() {
-        clearInterval(textarea.interval);
-      });
-    });
-  };
-
-  $.fn.autogrow.resize = function(textarea) {
-    var lineHeight = parseInt($(textarea).css('line-height'), 10);
-    var lines = textarea.value.split('\n');
-    var columns = textarea.cols;
-    var lineCount = 0;
-    $.each(lines, function() {
-      lineCount += Math.ceil(this.length / columns) || 1;
-    });
-    var height = lineHeight * (lineCount + 1);
-    $(textarea).css('height', height);
-  };
-})(jQuery);
-
-(function($) {
-  var comp, by;
-
-  function init() {
-    initEvents();
-    initComparator();
-  }
-
-  function initEvents() {
-    $('a.comment-close').live("click", function(event) {
-      event.preventDefault();
-      hide($(this).attr('id').substring(2));
-    });
-    $('a.vote').live("click", function(event) {
-      event.preventDefault();
-      handleVote($(this));
-    });
-    $('a.reply').live("click", function(event) {
-      event.preventDefault();
-      openReply($(this).attr('id').substring(2));
-    });
-    $('a.close-reply').live("click", function(event) {
-      event.preventDefault();
-      closeReply($(this).attr('id').substring(2));
-    });
-    $('a.sort-option').live("click", function(event) {
-      event.preventDefault();
-      handleReSort($(this));
-    });
-    $('a.show-proposal').live("click", function(event) {
-      event.preventDefault();
-      showProposal($(this).attr('id').substring(2));
-    });
-    $('a.hide-proposal').live("click", function(event) {
-      event.preventDefault();
-      hideProposal($(this).attr('id').substring(2));
-    });
-    $('a.show-propose-change').live("click", function(event) {
-      event.preventDefault();
-      showProposeChange($(this).attr('id').substring(2));
-    });
-    $('a.hide-propose-change').live("click", function(event) {
-      event.preventDefault();
-      hideProposeChange($(this).attr('id').substring(2));
-    });
-    $('a.accept-comment').live("click", function(event) {
-      event.preventDefault();
-      acceptComment($(this).attr('id').substring(2));
-    });
-    $('a.delete-comment').live("click", function(event) {
-      event.preventDefault();
-      deleteComment($(this).attr('id').substring(2));
-    });
-    $('a.comment-markup').live("click", function(event) {
-      event.preventDefault();
-      toggleCommentMarkupBox($(this).attr('id').substring(2));
-    });
-  }
-
-  /**
-   * Set comp, which is a comparator function used for sorting and
-   * inserting comments into the list.
-   */
-  function setComparator() {
-    // If the first three letters are "asc", sort in ascending order
-    // and remove the prefix.
-    if (by.substring(0,3) == 'asc') {
-      var i = by.substring(3);
-      comp = function(a, b) { return a[i] - b[i]; };
-    } else {
-      // Otherwise sort in descending order.
-      comp = function(a, b) { return b[by] - a[by]; };
-    }
-
-    // Reset link styles and format the selected sort option.
-    $('a.sel').attr('href', '#').removeClass('sel');
-    $('a.by' + by).removeAttr('href').addClass('sel');
-  }
-
-  /**
-   * Create a comp function. If the user has preferences stored in
-   * the sortBy cookie, use those, otherwise use the default.
-   */
-  function initComparator() {
-    by = 'rating'; // Default to sort by rating.
-    // If the sortBy cookie is set, use that instead.
-    if (document.cookie.length > 0) {
-      var start = document.cookie.indexOf('sortBy=');
-      if (start != -1) {
-        start = start + 7;
-        var end = document.cookie.indexOf(";", start);
-        if (end == -1) {
-          end = document.cookie.length;
-          by = unescape(document.cookie.substring(start, end));
-        }
-      }
-    }
-    setComparator();
-  }
-
-  /**
-   * Show a comment div.
-   */
-  function show(id) {
-    $('#ao' + id).hide();
-    $('#ah' + id).show();
-    var context = $.extend({id: id}, opts);
-    var popup = $(renderTemplate(popupTemplate, context)).hide();
-    popup.find('textarea[name="proposal"]').hide();
-    popup.find('a.by' + by).addClass('sel');
-    var form = popup.find('#cf' + id);
-    form.submit(function(event) {
-      event.preventDefault();
-      addComment(form);
-    });
-    $('#s' + id).after(popup);
-    popup.slideDown('fast', function() {
-      getComments(id);
-    });
-  }
-
-  /**
-   * Hide a comment div.
-   */
-  function hide(id) {
-    $('#ah' + id).hide();
-    $('#ao' + id).show();
-    var div = $('#sc' + id);
-    div.slideUp('fast', function() {
-      div.remove();
-    });
-  }
-
-  /**
-   * Perform an ajax request to get comments for a node
-   * and insert the comments into the comments tree.
-   */
-  function getComments(id) {
-    $.ajax({
-     type: 'GET',
-     url: opts.getCommentsURL,
-     data: {node: id},
-     success: function(data, textStatus, request) {
-       var ul = $('#cl' + id);
-       var speed = 100;
-       $('#cf' + id)
-         .find('textarea[name="proposal"]')
-         .data('source', data.source);
-
-       if (data.comments.length === 0) {
-         ul.html('<li>No comments yet.</li>');
-         ul.data('empty', true);
-       } else {
-         // If there are comments, sort them and put them in the list.
-         var comments = sortComments(data.comments);
-         speed = data.comments.length * 100;
-         appendComments(comments, ul);
-         ul.data('empty', false);
-       }
-       $('#cn' + id).slideUp(speed + 200);
-       ul.slideDown(speed);
-     },
-     error: function(request, textStatus, error) {
-       showError('Oops, there was a problem retrieving the comments.');
-     },
-     dataType: 'json'
-    });
-  }
-
-  /**
-   * Add a comment via ajax and insert the comment into the comment tree.
-   */
-  function addComment(form) {
-    var node_id = form.find('input[name="node"]').val();
-    var parent_id = form.find('input[name="parent"]').val();
-    var text = form.find('textarea[name="comment"]').val();
-    var proposal = form.find('textarea[name="proposal"]').val();
-
-    if (text == '') {
-      showError('Please enter a comment.');
-      return;
-    }
-
-    // Disable the form that is being submitted.
-    form.find('textarea,input').attr('disabled', 'disabled');
-
-    // Send the comment to the server.
-    $.ajax({
-      type: "POST",
-      url: opts.addCommentURL,
-      dataType: 'json',
-      data: {
-        node: node_id,
-        parent: parent_id,
-        text: text,
-        proposal: proposal
-      },
-      success: function(data, textStatus, error) {
-        // Reset the form.
-        if (node_id) {
-          hideProposeChange(node_id);
-        }
-        form.find('textarea')
-          .val('')
-          .add(form.find('input'))
-          .removeAttr('disabled');
-	var ul = $('#cl' + (node_id || parent_id));
-        if (ul.data('empty')) {
-          $(ul).empty();
-          ul.data('empty', false);
-        }
-        insertComment(data.comment);
-        var ao = $('#ao' + node_id);
-        ao.find('img').attr({'src': opts.commentBrightImage});
-        if (node_id) {
-          // if this was a "root" comment, remove the commenting box
-          // (the user can get it back by reopening the comment popup)
-          $('#ca' + node_id).slideUp();
-        }
-      },
-      error: function(request, textStatus, error) {
-        form.find('textarea,input').removeAttr('disabled');
-        showError('Oops, there was a problem adding the comment.');
-      }
-    });
-  }
-
-  /**
-   * Recursively append comments to the main comment list and children
-   * lists, creating the comment tree.
-   */
-  function appendComments(comments, ul) {
-    $.each(comments, function() {
-      var div = createCommentDiv(this);
-      ul.append($(document.createElement('li')).html(div));
-      appendComments(this.children, div.find('ul.comment-children'));
-      // To avoid stagnating data, don't store the comments children in data.
-      this.children = null;
-      div.data('comment', this);
-    });
-  }
-
-  /**
-   * After adding a new comment, it must be inserted in the correct
-   * location in the comment tree.
-   */
-  function insertComment(comment) {
-    var div = createCommentDiv(comment);
-
-    // To avoid stagnating data, don't store the comments children in data.
-    comment.children = null;
-    div.data('comment', comment);
-
-    var ul = $('#cl' + (comment.node || comment.parent));
-    var siblings = getChildren(ul);
-
-    var li = $(document.createElement('li'));
-    li.hide();
-
-    // Determine where in the parents children list to insert this comment.
-    for(i=0; i < siblings.length; i++) {
-      if (comp(comment, siblings[i]) <= 0) {
-        $('#cd' + siblings[i].id)
-          .parent()
-          .before(li.html(div));
-        li.slideDown('fast');
-        return;
-      }
-    }
-
-    // If we get here, this comment rates lower than all the others,
-    // or it is the only comment in the list.
-    ul.append(li.html(div));
-    li.slideDown('fast');
-  }
-
-  function acceptComment(id) {
-    $.ajax({
-      type: 'POST',
-      url: opts.acceptCommentURL,
-      data: {id: id},
-      success: function(data, textStatus, request) {
-        $('#cm' + id).fadeOut('fast');
-        $('#cd' + id).removeClass('moderate');
-      },
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem accepting the comment.');
-      }
-    });
-  }
-
-  function deleteComment(id) {
-    $.ajax({
-      type: 'POST',
-      url: opts.deleteCommentURL,
-      data: {id: id},
-      success: function(data, textStatus, request) {
-        var div = $('#cd' + id);
-        if (data == 'delete') {
-          // Moderator mode: remove the comment and all children immediately
-          div.slideUp('fast', function() {
-            div.remove();
-          });
-          return;
-        }
-        // User mode: only mark the comment as deleted
-        div
-          .find('span.user-id:first')
-          .text('[deleted]').end()
-          .find('div.comment-text:first')
-          .text('[deleted]').end()
-          .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
-                ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
-          .remove();
-        var comment = div.data('comment');
-        comment.username = '[deleted]';
-        comment.text = '[deleted]';
-        div.data('comment', comment);
-      },
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem deleting the comment.');
-      }
-    });
-  }
-
-  function showProposal(id) {
-    $('#sp' + id).hide();
-    $('#hp' + id).show();
-    $('#pr' + id).slideDown('fast');
-  }
-
-  function hideProposal(id) {
-    $('#hp' + id).hide();
-    $('#sp' + id).show();
-    $('#pr' + id).slideUp('fast');
-  }
-
-  function showProposeChange(id) {
-    $('#pc' + id).hide();
-    $('#hc' + id).show();
-    var textarea = $('#pt' + id);
-    textarea.val(textarea.data('source'));
-    $.fn.autogrow.resize(textarea[0]);
-    textarea.slideDown('fast');
-  }
-
-  function hideProposeChange(id) {
-    $('#hc' + id).hide();
-    $('#pc' + id).show();
-    var textarea = $('#pt' + id);
-    textarea.val('').removeAttr('disabled');
-    textarea.slideUp('fast');
-  }
-
-  function toggleCommentMarkupBox(id) {
-    $('#mb' + id).toggle();
-  }
-
-  /** Handle when the user clicks on a sort by link. */
-  function handleReSort(link) {
-    var classes = link.attr('class').split(/\s+/);
-    for (var i=0; i<classes.length; i++) {
-      if (classes[i] != 'sort-option') {
-	by = classes[i].substring(2);
-      }
-    }
-    setComparator();
-    // Save/update the sortBy cookie.
-    var expiration = new Date();
-    expiration.setDate(expiration.getDate() + 365);
-    document.cookie= 'sortBy=' + escape(by) +
-                     ';expires=' + expiration.toUTCString();
-    $('ul.comment-ul').each(function(index, ul) {
-      var comments = getChildren($(ul), true);
-      comments = sortComments(comments);
-      appendComments(comments, $(ul).empty());
-    });
-  }
-
-  /**
-   * Function to process a vote when a user clicks an arrow.
-   */
-  function handleVote(link) {
-    if (!opts.voting) {
-      showError("You'll need to login to vote.");
-      return;
-    }
-
-    var id = link.attr('id');
-    if (!id) {
-      // Didn't click on one of the voting arrows.
-      return;
-    }
-    // If it is an unvote, the new vote value is 0,
-    // Otherwise it's 1 for an upvote, or -1 for a downvote.
-    var value = 0;
-    if (id.charAt(1) != 'u') {
-      value = id.charAt(0) == 'u' ? 1 : -1;
-    }
-    // The data to be sent to the server.
-    var d = {
-      comment_id: id.substring(2),
-      value: value
-    };
-
-    // Swap the vote and unvote links.
-    link.hide();
-    $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
-      .show();
-
-    // The div the comment is displayed in.
-    var div = $('div#cd' + d.comment_id);
-    var data = div.data('comment');
-
-    // If this is not an unvote, and the other vote arrow has
-    // already been pressed, unpress it.
-    if ((d.value !== 0) && (data.vote === d.value * -1)) {
-      $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
-      $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
-    }
-
-    // Update the comments rating in the local data.
-    data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
-    data.vote = d.value;
-    div.data('comment', data);
-
-    // Change the rating text.
-    div.find('.rating:first')
-      .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
-
-    // Send the vote information to the server.
-    $.ajax({
-      type: "POST",
-      url: opts.processVoteURL,
-      data: d,
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem casting that vote.');
-      }
-    });
-  }
-
-  /**
-   * Open a reply form used to reply to an existing comment.
-   */
-  function openReply(id) {
-    // Swap out the reply link for the hide link
-    $('#rl' + id).hide();
-    $('#cr' + id).show();
-
-    // Add the reply li to the children ul.
-    var div = $(renderTemplate(replyTemplate, {id: id})).hide();
-    $('#cl' + id)
-      .prepend(div)
-      // Setup the submit handler for the reply form.
-      .find('#rf' + id)
-      .submit(function(event) {
-        event.preventDefault();
-        addComment($('#rf' + id));
-        closeReply(id);
-      })
-      .find('input[type=button]')
-      .click(function() {
-        closeReply(id);
-      });
-    div.slideDown('fast', function() {
-      $('#rf' + id).find('textarea').focus();
-    });
-  }
-
-  /**
-   * Close the reply form opened with openReply.
-   */
-  function closeReply(id) {
-    // Remove the reply div from the DOM.
-    $('#rd' + id).slideUp('fast', function() {
-      $(this).remove();
-    });
-
-    // Swap out the hide link for the reply link
-    $('#cr' + id).hide();
-    $('#rl' + id).show();
-  }
-
-  /**
-   * Recursively sort a tree of comments using the comp comparator.
-   */
-  function sortComments(comments) {
-    comments.sort(comp);
-    $.each(comments, function() {
-      this.children = sortComments(this.children);
-    });
-    return comments;
-  }
-
-  /**
-   * Get the children comments from a ul. If recursive is true,
-   * recursively include childrens' children.
-   */
-  function getChildren(ul, recursive) {
-    var children = [];
-    ul.children().children("[id^='cd']")
-      .each(function() {
-        var comment = $(this).data('comment');
-        if (recursive)
-          comment.children = getChildren($(this).find('#cl' + comment.id), true);
-        children.push(comment);
-      });
-    return children;
-  }
-
-  /** Create a div to display a comment in. */
-  function createCommentDiv(comment) {
-    if (!comment.displayed && !opts.moderator) {
-      return $('<div class="moderate">Thank you!  Your comment will show up '
-               + 'once it is has been approved by a moderator.</div>');
-    }
-    // Prettify the comment rating.
-    comment.pretty_rating = comment.rating + ' point' +
-      (comment.rating == 1 ? '' : 's');
-    // Make a class (for displaying not yet moderated comments differently)
-    comment.css_class = comment.displayed ? '' : ' moderate';
-    // Create a div for this comment.
-    var context = $.extend({}, opts, comment);
-    var div = $(renderTemplate(commentTemplate, context));
-
-    // If the user has voted on this comment, highlight the correct arrow.
-    if (comment.vote) {
-      var direction = (comment.vote == 1) ? 'u' : 'd';
-      div.find('#' + direction + 'v' + comment.id).hide();
-      div.find('#' + direction + 'u' + comment.id).show();
-    }
-
-    if (opts.moderator || comment.text != '[deleted]') {
-      div.find('a.reply').show();
-      if (comment.proposal_diff)
-        div.find('#sp' + comment.id).show();
-      if (opts.moderator && !comment.displayed)
-        div.find('#cm' + comment.id).show();
-      if (opts.moderator || (opts.username == comment.username))
-        div.find('#dc' + comment.id).show();
-    }
-    return div;
-  }
-
-  /**
-   * A simple template renderer. Placeholders such as <%id%> are replaced
-   * by context['id'] with items being escaped. Placeholders such as <#id#>
-   * are not escaped.
-   */
-  function renderTemplate(template, context) {
-    var esc = $(document.createElement('div'));
-
-    function handle(ph, escape) {
-      var cur = context;
-      $.each(ph.split('.'), function() {
-        cur = cur[this];
-      });
-      return escape ? esc.text(cur || "").html() : cur;
-    }
-
-    return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
-      return handle(arguments[2], arguments[1] == '%' ? true : false);
-    });
-  }
-
-  /** Flash an error message briefly. */
-  function showError(message) {
-    $(document.createElement('div')).attr({'class': 'popup-error'})
-      .append($(document.createElement('div'))
-               .attr({'class': 'error-message'}).text(message))
-      .appendTo('body')
-      .fadeIn("slow")
-      .delay(2000)
-      .fadeOut("slow");
-  }
-
-  /** Add a link the user uses to open the comments popup. */
-  $.fn.comment = function() {
-    return this.each(function() {
-      var id = $(this).attr('id').substring(1);
-      var count = COMMENT_METADATA[id];
-      var title = count + ' comment' + (count == 1 ? '' : 's');
-      var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
-      var addcls = count == 0 ? ' nocomment' : '';
-      $(this)
-        .append(
-          $(document.createElement('a')).attr({
-            href: '#',
-            'class': 'sphinx-comment-open' + addcls,
-            id: 'ao' + id
-          })
-            .append($(document.createElement('img')).attr({
-              src: image,
-              alt: 'comment',
-              title: title
-            }))
-            .click(function(event) {
-              event.preventDefault();
-              show($(this).attr('id').substring(2));
-            })
-        )
-        .append(
-          $(document.createElement('a')).attr({
-            href: '#',
-            'class': 'sphinx-comment-close hidden',
-            id: 'ah' + id
-          })
-            .append($(document.createElement('img')).attr({
-              src: opts.closeCommentImage,
-              alt: 'close',
-              title: 'close'
-            }))
-            .click(function(event) {
-              event.preventDefault();
-              hide($(this).attr('id').substring(2));
-            })
-        );
-    });
-  };
-
-  var opts = {
-    processVoteURL: '/_process_vote',
-    addCommentURL: '/_add_comment',
-    getCommentsURL: '/_get_comments',
-    acceptCommentURL: '/_accept_comment',
-    deleteCommentURL: '/_delete_comment',
-    commentImage: '/static/_static/comment.png',
-    closeCommentImage: '/static/_static/comment-close.png',
-    loadingImage: '/static/_static/ajax-loader.gif',
-    commentBrightImage: '/static/_static/comment-bright.png',
-    upArrow: '/static/_static/up.png',
-    downArrow: '/static/_static/down.png',
-    upArrowPressed: '/static/_static/up-pressed.png',
-    downArrowPressed: '/static/_static/down-pressed.png',
-    voting: false,
-    moderator: false
-  };
-
-  if (typeof COMMENT_OPTIONS != "undefined") {
-    opts = jQuery.extend(opts, COMMENT_OPTIONS);
-  }
-
-  var popupTemplate = '\
-    <div class="sphinx-comments" id="sc<%id%>">\
-      <p class="sort-options">\
-        Sort by:\
-        <a href="#" class="sort-option byrating">best rated</a>\
-        <a href="#" class="sort-option byascage">newest</a>\
-        <a href="#" class="sort-option byage">oldest</a>\
-      </p>\
-      <div class="comment-header">Comments</div>\
-      <div class="comment-loading" id="cn<%id%>">\
-        loading comments... <img src="<%loadingImage%>" alt="" /></div>\
-      <ul id="cl<%id%>" class="comment-ul"></ul>\
-      <div id="ca<%id%>">\
-      <p class="add-a-comment">Add a comment\
-        (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
-      <div class="comment-markup-box" id="mb<%id%>">\
-        reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
-        <tt>``code``</tt>, \
-        code blocks: <tt>::</tt> and an indented block after blank line</div>\
-      <form method="post" id="cf<%id%>" class="comment-form" action="">\
-        <textarea name="comment" cols="80"></textarea>\
-        <p class="propose-button">\
-          <a href="#" id="pc<%id%>" class="show-propose-change">\
-            Propose a change &#9657;\
-          </a>\
-          <a href="#" id="hc<%id%>" class="hide-propose-change">\
-            Propose a change &#9663;\
-          </a>\
-        </p>\
-        <textarea name="proposal" id="pt<%id%>" cols="80"\
-                  spellcheck="false"></textarea>\
-        <input type="submit" value="Add comment" />\
-        <input type="hidden" name="node" value="<%id%>" />\
-        <input type="hidden" name="parent" value="" />\
-      </form>\
-      </div>\
-    </div>';
-
-  var commentTemplate = '\
-    <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
-      <div class="vote">\
-        <div class="arrow">\
-          <a href="#" id="uv<%id%>" class="vote" title="vote up">\
-            <img src="<%upArrow%>" />\
-          </a>\
-          <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
-            <img src="<%upArrowPressed%>" />\
-          </a>\
-        </div>\
-        <div class="arrow">\
-          <a href="#" id="dv<%id%>" class="vote" title="vote down">\
-            <img src="<%downArrow%>" id="da<%id%>" />\
-          </a>\
-          <a href="#" id="du<%id%>" class="un vote" title="vote down">\
-            <img src="<%downArrowPressed%>" />\
-          </a>\
-        </div>\
-      </div>\
-      <div class="comment-content">\
-        <p class="tagline comment">\
-          <span class="user-id"><%username%></span>\
-          <span class="rating"><%pretty_rating%></span>\
-          <span class="delta"><%time.delta%></span>\
-        </p>\
-        <div class="comment-text comment"><#text#></div>\
-        <p class="comment-opts comment">\
-          <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
-          <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
-          <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
-          <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
-          <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
-          <span id="cm<%id%>" class="moderation hidden">\
-            <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
-          </span>\
-        </p>\
-        <pre class="proposal" id="pr<%id%>">\
-<#proposal_diff#>\
-        </pre>\
-          <ul class="comment-children" id="cl<%id%>"></ul>\
-        </div>\
-        <div class="clearleft"></div>\
-      </div>\
-    </div>';
-
-  var replyTemplate = '\
-    <li>\
-      <div class="reply-div" id="rd<%id%>">\
-        <form id="rf<%id%>">\
-          <textarea name="comment" cols="80"></textarea>\
-          <input type="submit" value="Add reply" />\
-          <input type="button" value="Cancel" />\
-          <input type="hidden" name="parent" value="<%id%>" />\
-          <input type="hidden" name="node" value="" />\
-        </form>\
-      </div>\
-    </li>';
-
-  $(document).ready(function() {
-    init();
-  });
-})(jQuery);
-
-$(document).ready(function() {
-  // add comment anchors for all paragraphs that are commentable
-  $('.sphinx-has-comment').comment();
-
-  // highlight search words in search results
-  $("div.context").each(function() {
-    var params = $.getQueryParameters();
-    var terms = (params.q) ? params.q[0].split(/\s+/) : [];
-    var result = $(this);
-    $.each(terms, function() {
-      result.highlightText(this.toLowerCase(), 'highlighted');
-    });
-  });
-
-  // directly open comment window if requested
-  var anchor = document.location.hash;
-  if (anchor.substring(0, 9) == '#comment-') {
-    $('#ao' + anchor.substring(9)).click();
-    document.location.hash = '#s' + anchor.substring(9);
-  }
-});
diff --git a/dashboard/lib/static/doc/app.html b/dashboard/lib/static/doc/app.html
deleted file mode 100644
index 79b17c7..0000000
--- a/dashboard/lib/static/doc/app.html
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Worflow Coding Transition &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="prev" title="Logging Server Implementation Details" href="server.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="server.html" title="Logging Server Implementation Details"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="worflow-coding-transition">
-<span id="wf-trans"></span><h1>Worflow Coding Transition<a class="headerlink" href="#worflow-coding-transition" title="Permalink to this headline">¶</a></h1>
-<p>The previous version of this document used a different set of workflow codes.  This table describes how these old codes have transitioned over to the new codes.</p>
-<table border="1" class="docutils">
-<caption>Workflow Coding Transition from Version 1 to Version 2</caption>
-<colgroup>
-<col width="50%" />
-<col width="50%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Version 1</th>
-<th class="head">Version 2</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>0-Other</td>
-<td>0-Other</td>
-</tr>
-<tr class="row-odd"><td>1-Plan</td>
-<td>1-Define Problem</td>
-</tr>
-<tr class="row-even"><td>2-Search</td>
-<td>2-Get Data</td>
-</tr>
-<tr class="row-odd"><td>3-Examine</td>
-<td>3-Explore Data</td>
-</tr>
-<tr class="row-even"><td>3-Examine</td>
-<td>6-Transform Data</td>
-</tr>
-<tr class="row-odd"><td>4-Marshall</td>
-<td>4-Create View of Data</td>
-</tr>
-<tr class="row-even"><td>5-Reason</td>
-<td>5-Enrich</td>
-</tr>
-</tbody>
-</table>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="server.html"
-                        title="previous chapter">Logging Server Implementation Details</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/app.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="server.html" title="Logging Server Implementation Details"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/genindex.html b/dashboard/lib/static/doc/genindex.html
deleted file mode 100755
index 64d68ae..0000000
--- a/dashboard/lib/static/doc/genindex.html
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Index &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="#" title="General Index"
-             accesskey="I">index</a></li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-
-<h1 id="index">Index</h1>
-
-<div class="genindex-jumpbox">
- <a href="#E"><strong>E</strong></a>
- | <a href="#L"><strong>L</strong></a>
- | <a href="#M"><strong>M</strong></a>
- | <a href="#R"><strong>R</strong></a>
- | <a href="#T"><strong>T</strong></a>
- | <a href="#U"><strong>U</strong></a>
- 
-</div>
-<h2 id="E">E</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#echo">echo() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="L">L</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#logSystemActivity">logSystemActivity() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#logUserActivity">logUserActivity() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="M">M</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#mute">mute() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="R">R</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#registerActivityLogger">registerActivityLogger() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="T">T</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#testing">testing() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="U">U</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="how_to.html#unmute">unmute() (built-in function)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-
-   
-
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="#" title="General Index"
-             >index</a></li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/getting_started.html b/dashboard/lib/static/doc/getting_started.html
deleted file mode 100644
index e42c79c..0000000
--- a/dashboard/lib/static/doc/getting_started.html
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Quick Start &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="next" title="Overview" href="overview.html" />
-    <link rel="prev" title="Welcome to XDATA API’s documentation!" href="index.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="overview.html" title="Overview"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="index.html" title="Welcome to XDATA API’s documentation!"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="quick-start">
-<h1>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="install">
-<h2>Install<a class="headerlink" href="#install" title="Permalink to this headline">¶</a></h2>
-<p>Clone the Draper Logging Repository from Github</p>
-<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>git clone https://github.com/draperlab/xdatalogger.git
-</pre></div>
-</div>
-<p>Add Draper helper library to your tool</p>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">requires JQuery</p>
-</div>
-<div class="highlight-html"><div class="highlight"><pre><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
-<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;javascript/draper.activity_logger-2.1.1.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="register">
-<h2>Register<a class="headerlink" href="#register" title="Permalink to this headline">¶</a></h2>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">Draper Logger URL is available on XNET. Please look there or contact Draper.</p>
-</div>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="c1">// Instantiate the javascript logger, and pass the location of the web worker javascript file</span>
-<span class="kd">var</span> <span class="nx">ac</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">activityLogger</span><span class="p">(</span><span class="s1">&#39;js/draper.activity_worker-2.1.1.js&#39;</span><span class="p">);</span>
-
-<span class="c1">// Register the activity logger</span>
-<span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="s2">&quot;http://localhost:1337&quot;</span><span class="p">;</span>
-<span class="nx">ac</span><span class="p">.</span><span class="nx">registerActivityLogger</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;3.04&quot;</span><span class="p">);</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="log-a-user-action">
-<h2>Log a USER action<a class="headerlink" href="#log-a-user-action" title="Permalink to this headline">¶</a></h2>
-<p>General message</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logUserActivity</span><span class="p">(</span><span class="s1">&#39;action description&#39;</span><span class="p">,</span> <span class="s1">&#39;activity&#39;</span><span class="p">,</span> <span class="nx">wf_state</span><span class="p">);</span>
-</pre></div>
-</div>
-<hr class="docutils" />
-<p>An example of logging <em>hover</em> actions on d3 objects:</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">vis</span><span class="p">.</span><span class="nx">selectAll</span><span class="p">(</span><span class="s2">&quot;circle&quot;</span><span class="p">)</span>
-<span class="p">.</span><span class="nx">data</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
-<span class="p">.</span><span class="nx">enter</span><span class="p">()</span>
-<span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s2">&quot;svg:circle&quot;</span><span class="p">)</span>
-<span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;cx&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">10</span><span class="o">*</span><span class="nx">d</span><span class="p">;</span> <span class="p">})</span>
-<span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;cy&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">10</span><span class="o">*</span><span class="nx">d</span><span class="p">;</span> <span class="p">})</span>
-<span class="p">.</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
-<span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mouseenter&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
-  <span class="nx">ac</span><span class="p">.</span><span class="nx">logUserActivity</span><span class="p">(</span>
-    <span class="s1">&#39;User hovered over element to read popup&#39;</span><span class="p">,</span>
-    <span class="s1">&#39;read_hover_enter&#39;</span><span class="p">,</span>
-    <span class="nx">ac</span><span class="p">.</span><span class="nx">WF_EXAMINE</span>
-  <span class="p">);</span>
-<span class="p">})</span>
-<span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;mouseleave&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
-  <span class="nx">ac</span><span class="p">.</span><span class="nx">logUserActivity</span><span class="p">(</span>
-    <span class="s1">&#39;User left hover element&#39;</span><span class="p">,</span>
-    <span class="s1">&#39;read_hover_exit&#39;</span><span class="p">,</span>
-    <span class="nx">ac</span><span class="p">.</span><span class="nx">WF_EXAMINE</span>
-  <span class="p">);</span>
-<span class="p">});</span>
-</pre></div>
-</div>
-<hr class="docutils" />
-<p>An example of tagging an HTML element.  We will listen for events.</p>
-<div class="highlight-html"><div class="highlight"><pre><span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;draper&quot;</span> <span class="na">data-wf=</span><span class="s">&quot;2&quot;</span> <span class="na">data-activity=</span><span class="s">&quot;query_input&quot;</span><span class="nt">/&gt;</span>
-</pre></div>
-</div>
-<hr class="docutils" />
-<p>Selecting elements to be logged.</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">tag</span><span class="p">(</span><span class="s1">&#39;.query-div &gt; .query-input&#39;</span><span class="p">,</span> <span class="p">{</span>
-  <span class="nx">events</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="s1">&#39;focus&#39;</span><span class="p">],</span>
-  <span class="nx">wf_state</span><span class="o">:</span> <span class="nx">ac</span><span class="p">.</span><span class="nx">WF_GETDATA</span><span class="p">,</span>
-  <span class="nx">activity</span><span class="o">:</span> <span class="s1">&#39;write_query&#39;</span><span class="p">,</span>
-  <span class="nx">desc</span><span class="o">:</span> <span class="s1">&#39;user clicked/focused on query input box&#39;</span>
-<span class="p">})</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="log-a-sys-action">
-<h2>Log a SYS action<a class="headerlink" href="#log-a-sys-action" title="Permalink to this headline">¶</a></h2>
-<p>Here is an example of adding a SYSACTION when asking the server for data.</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logSystemActivity</span><span class="p">(</span><span class="s1">&#39;asking server for data.&#39;</span><span class="p">);</span>
-
-<span class="nx">$</span><span class="p">.</span><span class="nx">getJSON</span><span class="p">(</span><span class="s1">&#39;https://my_endpoint/get_data&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
-  <span class="nx">ac</span><span class="p">.</span><span class="nx">logSystemActivity</span><span class="p">(</span><span class="s1">&#39;received data from server.&#39;</span><span class="p">);</span>
-  <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#result&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">result</span><span class="p">);</span>
-<span class="p">});</span>
-</pre></div>
-</div>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">Quick Start</a><ul>
-<li><a class="reference internal" href="#install">Install</a></li>
-<li><a class="reference internal" href="#register">Register</a></li>
-<li><a class="reference internal" href="#log-a-user-action">Log a USER action</a></li>
-<li><a class="reference internal" href="#log-a-sys-action">Log a SYS action</a></li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="index.html"
-                        title="previous chapter">Welcome to XDATA API&#8217;s documentation!</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="overview.html"
-                        title="next chapter">Overview</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/getting_started.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="overview.html" title="Overview"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="index.html" title="Welcome to XDATA API’s documentation!"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/how_to.html b/dashboard/lib/static/doc/how_to.html
deleted file mode 100644
index 9269a8e..0000000
--- a/dashboard/lib/static/doc/how_to.html
+++ /dev/null
@@ -1,381 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>How-to Guide for Implementing the Activity Logging API &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="next" title="Logging Server Implementation Details" href="server.html" />
-    <link rel="prev" title="Draper Activity Logging API Requirements" href="log_reqs.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="server.html" title="Logging Server Implementation Details"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="log_reqs.html" title="Draper Activity Logging API Requirements"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="how-to-guide-for-implementing-the-activity-logging-api">
-<span id="how-to"></span><h1>How-to Guide for Implementing the Activity Logging API<a class="headerlink" href="#how-to-guide-for-implementing-the-activity-logging-api" title="Permalink to this headline">¶</a></h1>
-<p>Below, we provide a formal specification of the format of log messages sent to the Draper Log Server. But most developers will not need to concern themselves with specific formatting requirements, since Draper has developed helper libraries in JavaScript, Python, Java and C#</p>
-<p>The current version of the client software (which includes the following details in-line) is available at</p>
-<blockquote>
-<div><cite>[xdatagit]/tools/utilities/draper/draper.activity_logger-2.0.js</cite></div></blockquote>
-<p>The Logging server url is available on XNET, please contact look there or contact Draper for the url.</p>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">the machine sending log messages must be connected to the XDATA VPN in order to access this server.</p>
-</div>
-<p>The following sections detail the use of the API client in several supported languages.</p>
-<div class="section" id="javascript">
-<h2>Javascript<a class="headerlink" href="#javascript" title="Permalink to this headline">¶</a></h2>
-<p>The JavaScript helper library provides a background process via the use of <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Worker">Web Workers</a> to send activity logs to a logging server.  The library and server handle Cross Origin Resource Sharing from arbitrary domains.</p>
-<p>The library consists of 2 files, a logger script and a worker script.  The logger script is included in your HTML code like any other javascript file.  The worker script should NOT be included, and is instead called from the the logger script.</p>
-<p>The JavaScript helper library is located at: <a class="reference external" href="https://github.com/draperlab/xdatalogger/javascript">https://github.com/draperlab/xdatalogger/javascript</a></p>
-<p>You can use this helper library in just 3 steps:
-1) Instantiate an ActivityLogger object
-2) Call registerActivityLogger(...) to pass in required networking  and version information.
-3) Call one of the logging functions:
-logSystemActivity(...)
-logUser(...)</p>
-<div class="section" id="example-implementation-of-javascript-helper-library">
-<h3>Example Implementation of JavaScript Helper Library<a class="headerlink" href="#example-implementation-of-javascript-helper-library" title="Permalink to this headline">¶</a></h3>
-<p>An example use of this library is included below:</p>
-<div class="highlight-html"><div class="highlight"><pre><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;draper.activity_logger-2.1.1.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
-</pre></div>
-</div>
-<p>Instantiate the Activity Logger</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">ac</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">activityLogger</span><span class="p">(</span><span class="s1">&#39;draper.activity_logger-2.1.1.js&#39;</span><span class="p">);</span>
-</pre></div>
-</div>
-<p>Register the logger. In this case, we register the logger to look for the logging server at <cite>http://localhost:1337</cite>. The component name is a descriptor that uniquely defines your tool from others, and the component version is used to make any distinction between component versions.</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="s2">&quot;http://localhost:1337&quot;</span><span class="p">;</span>
-<span class="nx">ac</span><span class="p">.</span><span class="nx">registerActivityLogger</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s2">&quot;test-component&quot;</span><span class="p">,</span> <span class="s2">&quot;3.04&quot;</span><span class="p">);</span>
-</pre></div>
-</div>
-<p>Re-register the logger.  In this case, we register the logger to look for the logger at <cite>http://localhost:1337</cite>, telling it that this software component is version 3.04 of the software named &#8220;Draper Test Component&#8221;</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="s2">&quot;http://localhost:1337&quot;</span><span class="p">;</span>
-<span class="nx">ac</span><span class="p">.</span><span class="nx">registerActivityLogger</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s2">&quot;Draper Test Component&quot;</span><span class="p">,</span> <span class="s2">&quot;3.04&quot;</span><span class="p">);</span>
-</pre></div>
-</div>
-<p>Send a System Activity Message with optional metadata included. In this case, we send a System Activity message with the action description &#8216;Testing System Activity Message&#8217; and optional metadata with two key-value pairs of:
-&#8216;Test Window Val&#8217;=&#8217;Main
-&#8216;Data Source&#8217;=&#8217;healthcare&#8217;</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logSystemActivity</span><span class="p">(</span><span class="s1">&#39;Testing System Activity Message&#39;</span><span class="p">,</span> <span class="p">{</span>
-  <span class="s1">&#39;Test Window Val&#39;</span><span class="o">:</span> <span class="s1">&#39;Main&#39;</span><span class="p">,</span>
-  <span class="s1">&#39;Data Source&#39;</span><span class="o">:</span><span class="s1">&#39;healthCare&#39;</span>
-<span class="p">});</span>
-</pre></div>
-</div>
-<p>Send a System Activity Message In this case, we send a System Activity message with the action description &#8216;Testing System Activity Message&#8217;</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logSystemActivity</span><span class="p">(</span><span class="s1">&#39;Testing System Activity Message&#39;</span><span class="p">);</span>
-</pre></div>
-</div>
-<p>Send a User Activity Message In this case, we send a User Activity message with the action description &#8216;Testing User Activity Message&#8217;, a developer-defined user action &#8220;watch&#8221;, and the workflow constant WF_EXPLORE, defined in the Activity Log API.</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logUserActivity</span><span class="p">(</span><span class="s1">&#39;Testing User Activity Message&#39;</span><span class="p">,</span> <span class="s1">&#39;Watch&#39;</span><span class="p">,</span> <span class="nx">ac</span><span class="p">.</span><span class="nx">WF_EXPLORE</span> <span class="p">);</span>
-</pre></div>
-</div>
-<p>Send a User Activity Message with optional metadata included In this case, we send a User Activity message with the action description &#8216;Testing User Activity Message&#8217;, a developer-defined user action &#8220;watch&#8221;, and a the workflow constant WF_EXPLORE, defined in the Activity Log API. This message also contains optional metadata with two key-value pairs of:
-&#8216;Test Window Val&#8217;=&#8217;Main
-&#8216;Data Source&#8217;=&#8217;healthcare&#8217;</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="nx">ac</span><span class="p">.</span><span class="nx">logUserActivity</span><span class="p">(</span><span class="s1">&#39;Testing User Activity Message&#39;</span><span class="p">,</span> <span class="s1">&#39;watch&#39;</span><span class="p">,</span> <span class="nx">ac</span><span class="p">.</span><span class="nx">WF_EXPLORE</span><span class="p">,</span> <span class="p">{</span>
-  <span class="s1">&#39;Test Window Val&#39;</span><span class="o">:</span><span class="s1">&#39;Main&#39;</span><span class="p">,</span>
-  <span class="s1">&#39;Data Source&#39;</span><span class="o">:</span><span class="s1">&#39;healthCare&#39;</span>
-<span class="p">});</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="javascript-helper-library-reference">
-<h3>JavaScript Helper Library Reference<a class="headerlink" href="#javascript-helper-library-reference" title="Permalink to this headline">¶</a></h3>
-<div class="section" id="registration">
-<h4>Registration<a class="headerlink" href="#registration" title="Permalink to this headline">¶</a></h4>
-<dl class="function">
-<dt id="registerActivityLogger">
-<tt class="descname">registerActivityLogger</tt><big>(</big><em>loggingServerUrl</em>, <em>componentName</em>, <em>componentVersion</em><big>)</big><a class="headerlink" href="#registerActivityLogger" title="Permalink to this definition">¶</a></dt>
-<dd><p>Registers the session with Draper server</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
-<li><strong>loggingServerUrl</strong> &#8211; url of logging server</li>
-<li><strong>componentName</strong> &#8211; name of the software component or application sending log messages from this library</li>
-<li><strong>componentVersion</strong> &#8211; version number of the software component or application</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<div class="section" id="development-functionality">
-<h5>Development Functionality<a class="headerlink" href="#development-functionality" title="Permalink to this headline">¶</a></h5>
-<p>The properties and function in this section allow developers to  echo log messages to the console, and disable the generation and  transmission of logging messages by this library.</p>
-<dl class="function">
-<dt id="echo">
-<tt class="descname">echo</tt><big>(</big><em>onOff</em><big>)</big><a class="headerlink" href="#echo" title="Permalink to this definition">¶</a></dt>
-<dd><p>Set to true to echo log messages to the console, even if they are sent successfully to the Logging Server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>onOff</strong> &#8211; bool</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="function">
-<dt id="mute">
-<tt class="descname">mute</tt><big>(</big><em>msgArray</em><big>)</big><a class="headerlink" href="#mute" title="Permalink to this definition">¶</a></dt>
-<dd><p>Mute either the SYS actions, the USER actions, or both. Calling this function with the appropriate values disables the sending of messages to the server. Mute accepts an array of String values, acceptable values are ‘SYS’ or ‘USER’.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>msgArray</strong> &#8211; </td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="function">
-<dt id="unmute">
-<tt class="descname">unmute</tt><big>(</big><em>msgArray</em><big>)</big><a class="headerlink" href="#unmute" title="Permalink to this definition">¶</a></dt>
-<dd><p>Unmute either the SYS actions, the USER actions, or both. Calling this function with the appropriate values enables the sending of messages to the server. Unmute accepts an array of String values, acceptable values are ‘SYS’ or ‘USER’.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>msgArray</strong> &#8211; </td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="function">
-<dt id="testing">
-<tt class="descname">testing</tt><big>(</big><em>onOff</em><big>)</big><a class="headerlink" href="#testing" title="Permalink to this definition">¶</a></dt>
-<dd><p>Set to true to disable all connection with Draper’s server.  No registration will be done against Draper’s server, and no logs will be sent.  If echo is set to true, console messages will still be fired for debugging purposes.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>onOff</strong> &#8211; bool</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<p>Example:</p>
-<div class="highlight-javascript"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">ac</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">activityLogger</span><span class="p">().</span><span class="nx">echo</span><span class="p">(</span><span class="kc">true</span><span class="p">).</span><span class="nx">testing</span><span class="p">(</span><span class="kc">true</span><span class="p">).</span><span class="nx">mute</span><span class="p">([</span><span class="s1">&#39;SYS&#39;</span><span class="p">,</span><span class="s1">&#39;USER&#39;</span><span class="p">]);</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="activity-logging-functions">
-<h4>Activity Logging Functions<a class="headerlink" href="#activity-logging-functions" title="Permalink to this headline">¶</a></h4>
-<p>The 2 functions in this section are used to send Activity Log Messages to an Activity Logging Server. Separate functions are used to log System Activity and User Activity. See the Activity Logging API by Draper Laboratory for more details about the use of these messages.</p>
-<dl class="function">
-<dt id="logSystemActivity">
-<tt class="descname">logSystemActivity</tt><big>(</big><em>actionDescription</em><span class="optional">[</span>, <em>softwareMetadata</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#logSystemActivity" title="Permalink to this definition">¶</a></dt>
-<dd><p>Log a System Activity. registerActivityLogger MUST be called before calling this function. Use logSystemActivity to log software actions that are not explicitly invoked by the user. For example, if a software component refreshes a data store after a pre-determined time span, the refresh event should be logged as a system activity. However, if the datastore was refreshed in response to a user clicking a Refresh UI element, that activity should NOT be logged as a System Activity, but rather as a User Activity.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
-<li><strong>actionDescription</strong> &#8211; A string describing the System  Activity performed by the component.</li>
-<li><strong>softwareMetadata</strong> &#8211; Any key/value pairs that will clarify or parameterize this system activity.</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="function">
-<dt id="logUserActivity">
-<tt class="descname">logUserActivity</tt><big>(</big><em>actionDescription</em>, <em>userActivity</em>, <em>userWorkflowState</em><span class="optional">[</span>, <em>softwareMetadata</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#logUserActivity" title="Permalink to this definition">¶</a></dt>
-<dd><p>Log a User Activity. &lt;registerActivityLogger&gt; MUST be called before calling this function. Use &lt;logUserActivity&gt; to log actions initiated by an explicit user action. For example, if a software component refreshes a data store when the user clicks a Refresh UI element, that activity should be logged as a User Activity. However, if the datastore was refreshed automatically after a certain time span, that activity should NOT be logged as a User Activity, but rather as a System Activity.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
-<li><strong>actionDescription</strong> &#8211; A string describing the System  Activity performed by the component.</li>
-<li><strong>userActivity</strong> &#8211; A key word defined by each software component or application indicating which software-centric function is most likely indicated by the this user activity. See the Activity Logging API for a standard set of user activity key words.</li>
-<li><strong>userWorkflowState</strong> &#8211; This value must be one of the Workflow Codes defined in this library. See the Activity Logging API for definitions of each workflow code.</li>
-<li><strong>softwareMetadata</strong> &#8211; Any key/value pairs that will clarify or parameterize this system activity.</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-</div>
-</div>
-<div class="section" id="dom-events-and-listeners">
-<h3>DOM Events and Listeners<a class="headerlink" href="#dom-events-and-listeners" title="Permalink to this headline">¶</a></h3>
-<p>To assist the developers in the logging of User actions, Draper has added functionality to listen to specific events on elements classed and attributed appropriately.  The developer need only to class DOM elements they feel will involve interaction from the user with the class ‘draper’.  Workflow states and action descriptions are then added as data attributes on the element.  Using the included script, Draper will DOM events will be useful to track for logging activities of the user associated with mouse movements but are not explicity to any other implemented tool function.  These event types include:</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">click:</th><td class="field-body">occurs when a user clicks something</td>
-</tr>
-<tr class="field-even field"><th class="field-name">focusin:</th><td class="field-body">occurs when an element gains focus (input field)</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">focusout:</th><td class="field-body">occurs when an element looses focus</td>
-</tr>
-<tr class="field-even field"><th class="field-name">mouseover:</th><td class="field-body">occurs when the pointer is moved onto an element</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">mouseout:</th><td class="field-body">occurs when the pointer is moved out of an element</td>
-</tr>
-<tr class="field-even field"><th class="field-name">select:</th><td class="field-body">occurs when the user selects some text</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">scroll:</th><td class="field-body">occurs when users scrolls with either mouse wheel, or scrollbar</td>
-</tr>
-</tbody>
-</table>
-<p>Example:</p>
-<div class="highlight-HTML"><pre>&lt;input class=”my-input draper” data-wf=”2” data-description=”search box”&gt;&lt;/input&gt;
-&lt;div style=”overflow-y: auto” class=”draper” data-wf=”3” data-description=”table container”&gt;</pre>
-</div>
-</div>
-</div>
-<div class="section" id="python">
-<h2>Python<a class="headerlink" href="#python" title="Permalink to this headline">¶</a></h2>
-<p>Deprecated. Contact Draper for support</p>
-</div>
-<div class="section" id="java">
-<h2>Java<a class="headerlink" href="#java" title="Permalink to this headline">¶</a></h2>
-<p>Deprecated. Contact Draper for support</p>
-</div>
-<div class="section" id="c">
-<h2>C#<a class="headerlink" href="#c" title="Permalink to this headline">¶</a></h2>
-<p>Deprecated. Contact Draper for support</p>
-</div>
-<div class="section" id="future-implementations-of-the-logging-api-a-k-a-hey-you-dont-support-my-favorite-programming-language">
-<h2>Future Implementations of the Logging API (A.K.A. “Hey! You don’t support my favorite programming language _____”)<a class="headerlink" href="#future-implementations-of-the-logging-api-a-k-a-hey-you-dont-support-my-favorite-programming-language" title="Permalink to this headline">¶</a></h2>
-<p>As stated earlier in this document, it’s a goal of the Logging API to make it very easy for XDATA teams to implement the API, and that means supporting other programming languages by authoring additional clients. If you have a specific language in mind that is not supported, please contact any member of the Draper team to discuss your software.</p>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">How-to Guide for Implementing the Activity Logging API</a><ul>
-<li><a class="reference internal" href="#javascript">Javascript</a><ul>
-<li><a class="reference internal" href="#example-implementation-of-javascript-helper-library">Example Implementation of JavaScript Helper Library</a></li>
-<li><a class="reference internal" href="#javascript-helper-library-reference">JavaScript Helper Library Reference</a><ul>
-<li><a class="reference internal" href="#registration">Registration</a><ul>
-<li><a class="reference internal" href="#development-functionality">Development Functionality</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#activity-logging-functions">Activity Logging Functions</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#dom-events-and-listeners">DOM Events and Listeners</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#python">Python</a></li>
-<li><a class="reference internal" href="#java">Java</a></li>
-<li><a class="reference internal" href="#c">C#</a></li>
-<li><a class="reference internal" href="#future-implementations-of-the-logging-api-a-k-a-hey-you-dont-support-my-favorite-programming-language">Future Implementations of the Logging API (A.K.A. “Hey! You don’t support my favorite programming language _____”)</a></li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="log_reqs.html"
-                        title="previous chapter">Draper Activity Logging API Requirements</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="server.html"
-                        title="next chapter">Logging Server Implementation Details</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/how_to.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="server.html" title="Logging Server Implementation Details"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="log_reqs.html" title="Draper Activity Logging API Requirements"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/index.html b/dashboard/lib/static/doc/index.html
deleted file mode 100755
index b619087..0000000
--- a/dashboard/lib/static/doc/index.html
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Welcome to XDATA API’s documentation! &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="#" />
-    <link rel="next" title="Quick Start" href="getting_started.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="getting_started.html" title="Quick Start"
-             accesskey="N">next</a> |</li>
-        <li><a href="#">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="welcome-to-xdata-api-s-documentation">
-<h1>Welcome to XDATA API&#8217;s documentation!<a class="headerlink" href="#welcome-to-xdata-api-s-documentation" title="Permalink to this headline">¶</a></h1>
-<div class="toctree-wrapper compound">
-<ul>
-<li class="toctree-l1"><a class="reference internal" href="getting_started.html">Quick Start</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="getting_started.html#install">Install</a></li>
-<li class="toctree-l2"><a class="reference internal" href="getting_started.html#register">Register</a></li>
-<li class="toctree-l2"><a class="reference internal" href="getting_started.html#log-a-user-action">Log a USER action</a></li>
-<li class="toctree-l2"><a class="reference internal" href="getting_started.html#log-a-sys-action">Log a SYS action</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="overview.html">Overview</a></li>
-<li class="toctree-l1"><a class="reference internal" href="log_reqs.html">Draper Activity Logging API Requirements</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#activity-log-message-requirements">Activity Log Message Requirements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#user-action-log-message-requirements">User Action Log Message Requirements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#describing-user-actions">Describing User Actions</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#definition-of-user-workflow-states">Definition of User Workflow States</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#system-action-log-message-requirements">System Action Log Message Requirements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#ui-layout-log-message-requirements">UI Layout Log Message Requirements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#dom-logging">DOM Logging</a></li>
-<li class="toctree-l2"><a class="reference internal" href="log_reqs.html#subject-and-data-security">Subject and data security</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="how_to.html">How-to Guide for Implementing the Activity Logging API</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="how_to.html#javascript">Javascript</a></li>
-<li class="toctree-l2"><a class="reference internal" href="how_to.html#python">Python</a></li>
-<li class="toctree-l2"><a class="reference internal" href="how_to.html#java">Java</a></li>
-<li class="toctree-l2"><a class="reference internal" href="how_to.html#c">C#</a></li>
-<li class="toctree-l2"><a class="reference internal" href="how_to.html#future-implementations-of-the-logging-api-a-k-a-hey-you-dont-support-my-favorite-programming-language">Future Implementations of the Logging API (A.K.A. “Hey! You don’t support my favorite programming language _____”)</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="server.html">Logging Server Implementation Details</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="server.html#json-messages-using-http-post-requests">JSON messages using HTTP POST requests.</a></li>
-<li class="toctree-l2"><a class="reference internal" href="server.html#why-json-http">Why JSON + HTTP?</a></li>
-<li class="toctree-l2"><a class="reference internal" href="server.html#activity-log-data-as-json-strings">Activity Log Data as JSON Strings</a></li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div class="section" id="appendix">
-<h1>Appendix<a class="headerlink" href="#appendix" title="Permalink to this headline">¶</a></h1>
-<div class="toctree-wrapper compound">
-<ul>
-<li class="toctree-l1"><a class="reference internal" href="app.html">Worflow Coding Transition</a></li>
-</ul>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="#">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">Welcome to XDATA API&#8217;s documentation!</a><ul>
-</ul>
-</li>
-<li><a class="reference internal" href="#appendix">Appendix</a><ul>
-</ul>
-</li>
-</ul>
-
-  <h4>Next topic</h4>
-  <p class="topless"><a href="getting_started.html"
-                        title="next chapter">Quick Start</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/index.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="getting_started.html" title="Quick Start"
-             >next</a> |</li>
-        <li><a href="#">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/log_reqs.html b/dashboard/lib/static/doc/log_reqs.html
deleted file mode 100755
index 40544ec..0000000
--- a/dashboard/lib/static/doc/log_reqs.html
+++ /dev/null
@@ -1,299 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Draper Activity Logging API Requirements &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="next" title="How-to Guide for Implementing the Activity Logging API" href="how_to.html" />
-    <link rel="prev" title="Overview" href="overview.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="how_to.html" title="How-to Guide for Implementing the Activity Logging API"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="overview.html" title="Overview"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="draper-activity-logging-api-requirements">
-<h1>Draper Activity Logging API Requirements<a class="headerlink" href="#draper-activity-logging-api-requirements" title="Permalink to this headline">¶</a></h1>
-<p>In order to evaluate XDATA software components, user action and system action log messages will be collected. The data required for each of these types of log messages are formally specified in this section, but Draper has also provided helper libraries in a number of common languages to ease the implementation of this API in your software component (see <a class="reference internal" href="how_to.html#how-to"><em>How-to Guide for Implementing the Activity Logging API</em></a> for information about using these helper libraries).</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">User Actions:</th><td class="field-body">User action log messages should be sent when the user explicitly interacts with a software component.  Examples of user actions that should be logged are zooming in on a map, clicking buttons, sending queries, mouse clicks, keyboard events, view switches, etc. As is apparent from the preceding list of examples, user actions will span a wide range events from high-level, application-specific actions (e.g. zooming on a map) to more generic actions (e.g. keyboard events). The common element of all user action log messages is that they are sent only when a user takes explicit action in the UI (see <a class="reference internal" href="#user-message-reqs"><em>User Action Log Message Requirements</em></a> below for a specification of user action log messages).</td>
-</tr>
-<tr class="field-even field"><th class="field-name">System Actions:</th><td class="field-body">System action log messages should be sent when the software performs an action that will affect its user interface, but which has not been explicitly performed by the user. For example, a if a table view is refreshed because the user clicked a refresh button on that view, that action should be logged as a user action. But if the same table is refreshed automatically every minute, a system action should be dispatched each time that timer fires.  System actions also indicate any latency in the system; for example if the user requests data from a database, a USER action is sent, and when the data arrives 20ms or 30s later, a SYSTEM action is fired. Other actions which should send system action messages are error messages, prompts, assists, when the UI has loaded, etc (see <a class="reference internal" href="#sys-message-reqs"><em>System Action Log Message Requirements</em></a> below for a specification of user action log messages).</td>
-</tr>
-</tbody>
-</table>
-<div class="section" id="activity-log-message-requirements">
-<span id="message-reqs"></span><h2>Activity Log Message Requirements<a class="headerlink" href="#activity-log-message-requirements" title="Permalink to this headline">¶</a></h2>
-<p>Each activity log message shall contain the following elements:</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">componentName:</th><td class="field-body">This is the unique identifying name of the software component generating this log entry.</td>
-</tr>
-<tr class="field-even field"><th class="field-name" colspan="2">componentVersion:</th></tr>
-<tr class="field-even field"><td>&nbsp;</td><td class="field-body">Specifies the version of the software component identified in  componentName</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">client:</th><td class="field-body">The hostname of the computer or VM on which the software component send this log message is running. In the case of a web-based user interface component, this should be the host name of the computer on which the web browser displaying the UI is running. Ideally, this hostname should describe a physical terminal or experimental setup as persistently as possible.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">sessionID:</th><td class="field-body">The unique session ID identifying a specific user interacting with this software component as a specific time. During registration, this identifier is created on the server and passed back to the client for subsequent messages.</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">timestamp:</th><td class="field-body">This is the timestamp for the log entry. The timestamp string shall be a date-time string that complies with the World Wide Web Consortium date-time standard.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">impLanguage:</th><td class="field-body">The software environment from which this log message was sent.</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">apiVersion:</th><td class="field-body">The version of this API document. See the title section of this document for the current version.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">type:</th><td class="field-body">&#8220;USERACTION&#8221; or “SYSACTION”</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">desc:</th><td class="field-body">A natural-language description of the action that the user has taken.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">metadata:</th><td class="field-body">Developers may optionally include structured data that provides context or elaboration to the information included in this log message. This string must comply with the JSON standard.</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="user-action-log-message-requirements">
-<span id="user-message-reqs"></span><h2>User Action Log Message Requirements<a class="headerlink" href="#user-action-log-message-requirements" title="Permalink to this headline">¶</a></h2>
-<p>User Action log messages are used to describe the behavior and workflow of the user from the perspective of your application. In addition to the standard fields, a user action log message (i.e. a log message where <cite>type==USERACTION</cite>) shall contain the following fields:</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">activity:</th><td class="field-body">An application-specific keyword used to categorize the action taken by the user. This string should not contain whitespace.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">wf_state:</th><td class="field-body">This number indicates which of workflow state is most likely indicated by the current User Action. Possible values of wf_state enumeration are listed below.</td>
-</tr>
-</tbody>
-</table>
-<span class="target" id="wf-coding"></span><table border="1" class="docutils">
-<caption>Workflow Coding (v2)</caption>
-<colgroup>
-<col width="25%" />
-<col width="10%" />
-<col width="25%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">#</th>
-<th class="head">State</th>
-<th class="head">Code</th>
-<th class="head">Suggested Activities</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>0</td>
-<td>Other</td>
-<td>WF_OTHER</td>
-<td>This user action does not correspond to any other workflow state. Please contact Draper for guidance.</td>
-</tr>
-<tr class="row-odd"><td>1</td>
-<td>Define Problem</td>
-<td>WF_DEFINE</td>
-<td>define_hypothesis</td>
-</tr>
-<tr class="row-even"><td>2</td>
-<td>Get Data</td>
-<td>WF_GETDATA</td>
-<td>write_query, select_option, execute_query, monitor_query</td>
-</tr>
-<tr class="row-odd"><td>3</td>
-<td>Explore Data</td>
-<td>WF_EXPLORE</td>
-<td>browse, pan, zoom_in, zoom_out, scale, rotate, filter, drill, crossfilter, scroll, hover_start, hover_end, toggle_option, highlight, sort, select, deselect</td>
-</tr>
-<tr class="row-even"><td>4</td>
-<td>Create View of Data</td>
-<td>WF_CREATE</td>
-<td>create_visualization, define_axes, define_chart_type, define_table, move_window, resize_window, set_color_palette, select_layers, {add,remove,split,merge}_{rows,columns}, arrange_windows</td>
-</tr>
-<tr class="row-odd"><td>5</td>
-<td>Enrich</td>
-<td>WF_ENRICH</td>
-<td>add_note, bookmark_view, label</td>
-</tr>
-<tr class="row-even"><td>6</td>
-<td>Transform Data</td>
-<td>WF_TRANSFORM</td>
-<td>denoise, detrend, pattern_search, do_math, transform_data, coordinate_transform</td>
-</tr>
-</tbody>
-</table>
-<p>Each of these workflow states is described in more detail <a class="reference internal" href="#state-defs"><em>below</em></a>.</p>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">the workflow codes have changed since the last revision (see <a class="reference internal" href="app.html#wf-trans"><em>Worflow Coding Transition</em></a> for more details).</p>
-</div>
-</div>
-<div class="section" id="describing-user-actions">
-<h2>Describing User Actions<a class="headerlink" href="#describing-user-actions" title="Permalink to this headline">¶</a></h2>
-<p>Each component development team will understand best which user actions are related to both user activity within the software and workflow state. The challenge faced by this API is to capture a user’s activity with enough specificity to characterize her use of your particular application, while also describing the behavior in a general way so that user activity logs can be compared across applications. To accomplish this, we ask developers to describe each user action at 3 levels of abstraction, using the fields action description, activity, and workflow state. Each component development team will understand best which user actions are related to both user activity within the software and workflow state, and so is best placed to instrument their own software. The analysis of the log messages will allow insight into the application-specific activity of the user, and will enable analysis of user workflow both within a single XDATA tool and across the set of XDATA tools. All analyses will leverage the Workflow State information, which is required to be consistently defined and applied across all tools.  Within-tool analysis may be further refined with tool-specific Activity and Action Description information, which can have custom meaning to the tool developers.</p>
-<div class="figure" id="wf-diagram">
-<a class="reference internal image-reference" href="_images/wf.png"><img alt="workflow figure" src="_images/wf.png" style="width: 544.5px; height: 253.0px;" /></a>
-<p class="caption">User activities are described using 3 levels of abstraction.</p>
-</div>
-<p>Each program team will ultimately be responsible for deciding when a logging event is recorded. Logs capture user actions at the micro-level (e.g. individual clicks) and user activities as the macro-level (e.g., “searching for data”).</p>
-</div>
-<div class="section" id="definition-of-user-workflow-states">
-<span id="state-defs"></span><h2>Definition of User Workflow States<a class="headerlink" href="#definition-of-user-workflow-states" title="Permalink to this headline">¶</a></h2>
-<p>Each event described above labels the current user workflow state. These states come from the following list of activities, and it will be up to each performer team to map the following user activities to the activities of the users of their software. If a user activity does not appear to correspond to any of the workflow states below, it can be assigned the value Other (0). If you find it necessary to categorize an activity as Other, please notify Draper.  The expectation of this set of workflow states is that it can be use to categorize any user activity in your software.</p>
-<p>The full workflow coding can be seen <a class="reference internal" href="#wf-coding"><em>above</em></a> which includes example activities for each workflow state.  The full coding chart also includes workflow states that have not been implemented for Year 2 based on expectations of experimental outcomes.</p>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">future revisions of tools and the API could include activities that necessitate coding of new workflow states.</p>
-</div>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Other:</th><td class="field-body">This user action does not correspond to any other workflow state. Please contact Draper for guidance.</td>
-</tr>
-<tr class="field-even field"><th class="field-name" colspan="2">Define the Problem:</th></tr>
-<tr class="field-even field"><td>&nbsp;</td><td class="field-body">Most of Define the Problem will be accomplished outside of XDATA tools (largely in the challenge problem assignment interface).  This state includes:  receiving tasking, refining the request (perhaps with the requestor), defining specific goals and objectives for the request, specifying research questions and/or hypotheses to test, and justifying the tasking.</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Get Data:</th><td class="field-body">Get Data involves creating (formulating and writing), executing, and refining search queries.  Refining may include drilling down, augmenting (e.g., for multiple spellings).  We use the term &#8216;query&#8217; loosely &#8211; a database is not required.   Because some searches are on-going, any action involved in monitoring the status or checking for new results from a persistent search also fall into this activity.   Operationally, this state would include requesting data from others, but that is out of scope for XDATA.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Explore Data:</th><td class="field-body">Explore Data involves consuming data (reading, listening, watching) or visualizations of data. This activity may involve the examination of a visualization, or the comparing of multiple views of a dataset.  Explore may be dynamic, but is a passive state (vs. Enrich).  This is the triage step of taking a first look at the data.  This is typically a big picture view.</td>
-</tr>
-<tr class="field-odd field"><th class="field-name" colspan="2">Create View of Data:</th></tr>
-<tr class="field-odd field"><td>&nbsp;</td><td class="field-body">Create View of Data involves the organization of data. Creating and manipulating the spatial layout in a visualization, creating categories, deriving higher-level structures, and merging pieces of information all fall under this activity.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Enrich:</th><td class="field-body">In Enrich, the user actively adds insight value back into the tool.  Activities include annotating/tagging/labeling data with textual notes or links, bookmarking views, creating links between data elements.  Annotations may include external insight (from SMEs), algorithmic results (searching for patterns, denoising, etc.), identifying patterns/trends,  (Making notes or conclusions about patterns is in Enrich. Identifying/searching for them is in Transform.)</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Transform Data:</th><td class="field-body">In Transform, the user takes a deeper look at the data. The user applies algorithms to transform the data (reduce, denoise, etc.) and searches for patterns.  Actions may be informed by SME knowledge or knowledge gained from other datasets.  Actions may include interpolating or extrapolating, comparing across data sets or models, correlating.  (Making notes or conclusions about patterns is in Enrich. Identifying/searching for them is in Transform.)</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="system-action-log-message-requirements">
-<span id="sys-message-reqs"></span><h2>System Action Log Message Requirements<a class="headerlink" href="#system-action-log-message-requirements" title="Permalink to this headline">¶</a></h2>
-<p>System action log messages should be sent when the software performs an action that will affect its user interface, but which has not been explicitly by the user. For example, a if a table view is refreshed because the user clicked a refresh button on that view, that action should be logged as a user action. But if the same table is refreshed automatically every minute, a system action should be dispatched each time that timer fires. Other actions which should which should send system action messages are error messages, error messages, prompts, assists, when the UI has loaded, etc.
-In this version of the API, there are no additional fields required for a System Action log message other than those listed in Section 2.1, which apply to all log messages. The only requirement to specify a System Action log message is that the type field  is set to ”SYSACTION”.</p>
-</div>
-<div class="section" id="ui-layout-log-message-requirements">
-<h2>UI Layout Log Message Requirements<a class="headerlink" href="#ui-layout-log-message-requirements" title="Permalink to this headline">¶</a></h2>
-<p>UI Layout Logging is no longer supported.  Please contact Draper for support.</p>
-</div>
-<div class="section" id="dom-logging">
-<h2>DOM Logging<a class="headerlink" href="#dom-logging" title="Permalink to this headline">¶</a></h2>
-<p>Mouse events are notifications that track mouse interaction with other components.  These events will be useful to track a user’s interaction with on-screen components that do not explicity log a message for a particular activity.  Such activities include new or updates to information displays when the mouse is placed over a component and when the focus is changed to a particular component such as a text input box among others.</p>
-</div>
-<div class="section" id="subject-and-data-security">
-<h2>Subject and data security<a class="headerlink" href="#subject-and-data-security" title="Permalink to this headline">¶</a></h2>
-<p>TBD</p>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">Draper Activity Logging API Requirements</a><ul>
-<li><a class="reference internal" href="#activity-log-message-requirements">Activity Log Message Requirements</a></li>
-<li><a class="reference internal" href="#user-action-log-message-requirements">User Action Log Message Requirements</a></li>
-<li><a class="reference internal" href="#describing-user-actions">Describing User Actions</a></li>
-<li><a class="reference internal" href="#definition-of-user-workflow-states">Definition of User Workflow States</a></li>
-<li><a class="reference internal" href="#system-action-log-message-requirements">System Action Log Message Requirements</a></li>
-<li><a class="reference internal" href="#ui-layout-log-message-requirements">UI Layout Log Message Requirements</a></li>
-<li><a class="reference internal" href="#dom-logging">DOM Logging</a></li>
-<li><a class="reference internal" href="#subject-and-data-security">Subject and data security</a></li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="overview.html"
-                        title="previous chapter">Overview</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="how_to.html"
-                        title="next chapter">How-to Guide for Implementing the Activity Logging API</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/log_reqs.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="how_to.html" title="How-to Guide for Implementing the Activity Logging API"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="overview.html" title="Overview"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/objects.inv b/dashboard/lib/static/doc/objects.inv
deleted file mode 100755
index 020529b..0000000
--- a/dashboard/lib/static/doc/objects.inv
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/doc/overview.html b/dashboard/lib/static/doc/overview.html
deleted file mode 100755
index e1a6605..0000000
--- a/dashboard/lib/static/doc/overview.html
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Overview &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="next" title="Draper Activity Logging API Requirements" href="log_reqs.html" />
-    <link rel="prev" title="Quick Start" href="getting_started.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="log_reqs.html" title="Draper Activity Logging API Requirements"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="getting_started.html" title="Quick Start"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="overview">
-<h1>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h1>
-<p>The purpose of this document is to outline the design and use of the Analytic Activity Logging API for software components built in the XDATA program. The API outlined in this document are designed to support the behavioral and physiological assessment (including eye tracking) of users as they interact with XDATA tools, in service of building a better understanding of how analyst’s make use of these tools. Through the development of a common activity logging API, we can ensure that the combined XDATA team generates uniform logging of user actions and intents. Figure 1 illustrates a planned XDATA analytic tool, with software components built by multiple program teams.</p>
-<p>There are several uses of the Logging API that make an application- and component-independent scheme for activity logging valuable to all software components:</p>
-<ul class="simple">
-<li>Capturing observations for evaluation metrics</li>
-<li>Capturing context for physiological assessment of XDATA tools</li>
-<li>Capturing analytic interests for user or task modeling</li>
-<li>Capturing analyst activity for workflow or process modeling and analysis</li>
-<li>Capturing context (individual or community) for resource (data or compute) utilitization and optimization</li>
-</ul>
-<p>The vision for XDATA is that each component development team implements the proposed analytic activity logging scheme into their software component to facilitate the analysis of user workflow and the matching of measured physiological data to user and software actions using the collection of events logged from all components. Since XDATA teams are asked to implement this logging scheme, there is a desire to:</p>
-<ol class="loweralpha simple">
-<li>Make the implementation of this scheme as painless as possible.</li>
-<li>Keep the scheme general enough that it supports the variety of teams’ software approaches.</li>
-<li>Allow the scheme to collect specific details so that it can support the analysis of a wide variety of software.</li>
-<li>Ensure the scheme is generally applicable to capturing analytic process and intent, so that the effort in implementing this logging API will have utility to performers outside of XDATA program requirements, and independent of any physiological assessment.</li>
-</ol>
-<p><a class="reference internal" href="#fig-diagram"><em>The following figure</em></a> illustrates the high-level architecture employed by this proposed API. In this architecture, each software component communicates to a logging server via XMLHttpRequests, simple JSON log messages describing the user’s interaction with each component. These messages are collected and processed to create a top-level analytic model of the user’s activity.</p>
-<div class="figure" id="fig-diagram">
-<a class="reference internal image-reference" href="_images/diagram.png"><img alt="diagram figure" src="_images/diagram.png" style="width: 333.5px; height: 346.5px;" /></a>
-<p class="caption">The proposed API creates a common message passing interface that allows heterogeneous software components to communicate with an activity logging engine. This engine builds a model of the user’s activity over time.</p>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="getting_started.html"
-                        title="previous chapter">Quick Start</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="log_reqs.html"
-                        title="next chapter">Draper Activity Logging API Requirements</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/overview.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="log_reqs.html" title="Draper Activity Logging API Requirements"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="getting_started.html" title="Quick Start"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/search.html b/dashboard/lib/static/doc/search.html
deleted file mode 100755
index 7b76cc0..0000000
--- a/dashboard/lib/static/doc/search.html
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Search &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <script type="text/javascript" src="_static/searchtools.js"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-  <script type="text/javascript">
-    jQuery(function() { Search.loadIndex("searchindex.js"); });
-  </script>
-   
-
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <h1 id="search-documentation">Search</h1>
-  <div id="fallback" class="admonition warning">
-  <script type="text/javascript">$('#fallback').hide();</script>
-  <p>
-    Please activate JavaScript to enable the search
-    functionality.
-  </p>
-  </div>
-  <p>
-    From here you can search these documents. Enter your search
-    words into the box below and click "search". Note that the search
-    function will automatically search for all of the words. Pages
-    containing fewer words won't appear in the result list.
-  </p>
-  <form action="" method="get">
-    <input type="text" name="q" value="" />
-    <input type="submit" value="search" />
-    <span id="search-progress" style="padding-left: 10px"></span>
-  </form>
-  
-  <div id="search-results">
-  
-  </div>
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/searchindex.js b/dashboard/lib/static/doc/searchindex.js
deleted file mode 100644
index 7de1dc3..0000000
--- a/dashboard/lib/static/doc/searchindex.js
+++ /dev/null
@@ -1 +0,0 @@
-Search.setIndex({objects:{"":{logUserActivity:[1,0,1,""],mute:[1,0,1,""],unmute:[1,0,1,""],testing:[1,0,1,""],echo:[1,0,1,""],registerActivityLogger:[1,0,1,""],logSystemActivity:[1,0,1,""]}},terms:{definecharttyp:[],all:[3,1,2,5],code:[0,4,1,2,5],quall:5,illustr:3,queri:[6,2],consum:2,focus:6,extrapol:2,follow:[3,1,2,5],wf_examin:6,row:2,categori:2,decid:2,worflow:[0,4,2],doe:2,"21t19":5,readabl:5,send:[1,2],influentbitcoinview:[],"29z":5,cdnj:6,componentvers:[1,2,5],under:2,sent:[1,2],passiv:2,emploi:3,define_chart_typ:2,sourc:1,everi:2,string:[0,1,2,5],fals:[],bookmark_view:2,mous:[1,2],fall:2,veri:1,appar:2,parameter:1,brows:2,vast:5,cool:[],valuabl:3,level:[3,2],button:2,list:2,correl:2,team:[3,1,2],quick:[0,6],div:[1,6],pleas:[1,6,2],outlin:3,version:[4,1,2,5],trend:2,natur:[2,5],"643z":[],cost:[],video:[],pass:[3,1,6,2],further:2,click:[1,6,2],append:6,even:[1,5],index:[],read_hover_ent:6,appear:2,compar:2,mergetablerow:[],section:[1,2,5],patternsearch:[],invok:1,uniform:3,current:[1,2,5],experiment:2,"new":[4,1,6,2],method:[],metadata:[1,2,5],involv:[1,2],full:2,themselv:1,deriv:2,gener:[3,1,6,2,5],here:6,xnet:[1,6],address:[],toggle_opt:2,locat:[1,6],parenthesi:[],sinc:[3,1,2,5],valu:[1,2,5],box:[1,6,2],search:[4,1,2],step:[1,2,5],observ:3,arrangewindow:[],action:[0,1,6,2,3],implement:[0,5,1,2,3],via:[3,1],appli:2,app:[],deprec:1,api:[0,1,2,3],bankaccounttableview:[],selectlay:[],instal:[0,6],select:[1,6,2],highli:5,plot:[],from:[3,4,1,6,2],describ:[0,1,2,3,4,5],would:2,commun:[3,5],distinct:1,regist:[0,1,6],two:1,program:[0,5,1,2,3],call:1,taken:2,scope:2,pattern_search:2,type:[1,2,5],tell:1,toggl:[],more:[1,2],sort:2,desir:3,zoom_out:2,focusout:1,relat:2,line:1,visual:2,appendix:0,accept:[1,5],examin:[4,2],particular:2,vpn:1,effort:3,must:[1,2],word:1,loggingserverurl:1,augment:2,setup:2,work:[],focu:[1,6,2],componentnamein:[],descriptor:1,can:[3,1,2],drill:2,motiv:[],purpos:[3,1],scatter:[],prompt:2,process:[3,1],challeng:2,registr:[1,2],share:1,indic:[1,2],high:[3,2],tag:[6,2],explor:[4,2],occur:1,val:1,multipl:[3,2],goal:[1,2],secur:[0,2],rather:1,get:[4,2],write:2,how:[0,4,1,2,3],xdatatestinglab:[],instead:1,perspect:2,onoff:1,map:2,resourc:[3,1],clone:6,after:1,diagram:5,befor:1,resize_window:2,wf_search:[],date:2,datastor:1,data:[0,1,2,3,4,5,6],physic:2,util:[3,1],github:[1,6],domath:[],favorit:[0,1],correspond:2,element:[1,6,2],resizewindow:[],execute_queri:2,"switch":2,imageri:[],environ:2,allow:[3,1,2,5],enter:6,first:2,order:[1,2],rotat:2,mute:1,testqual:5,over:[3,4,6,2],insight:2,becaus:2,through:3,affect:2,still:1,pointer:1,dynam:2,paramet:1,style:1,monitor:2,outcom:2,xdataclient23:5,better:3,window:1,loguseract:[1,6],wf_state:[6,2,5],persist:2,main:1,them:2,"return":6,thei:[3,1,2,5],python:[0,1],auto:1,downselectdata:[],spell:2,initi:1,facilit:3,discuss:1,logsystemact:[1,6],assess:3,term:2,name:[1,2,5],kitwar:[],filterdata:[],refresh:[1,2],separ:1,micro:2,scrollbar:1,each:[3,1,2,5],debug:1,fulli:[],updat:2,necessit:2,mean:[1,2],healthcar:1,domain:1,write_queri:[6,2],laboratori:[1,5],individu:[3,2],overflow:1,meta:5,expect:2,year:2,operation:2,event:[3,1,6,2],out:[1,2],shown:[],accomplish:2,network:[1,5],research:2,content:[],rel:5,xdatagit:1,sme:2,merg:2,clarifi:1,qualifi:[],painless:3,workflow:[0,4,1,2,3],manipul:2,mouseleav:6,standard:[1,2],reason:4,base:2,createvisu:[],ask:[3,6,2],kitwaremappingdemo:[],filter_data:[],move_window:2,question:2,could:2,synchron:[],timer:2,keep:3,filter:2,turn:[],perhap:2,place:2,outsid:[3,2],onto:1,assign:2,do_math:2,origin:1,softwar:[3,1,2],rang:2,note:[1,6,2],notifi:2,feel:1,selection_view:[],arrai:1,independ:3,number:[1,2],echo:1,restrict:5,mai:2,done:1,blank:[],differ:4,timestamp:[2,5],script:[1,6],bookmark:2,associ:1,top:3,coordinate_transform:2,system:[0,1,2,5],messag:[0,1,2,3,5,6],circl:6,termin:2,scheme:3,transformdata:[],store:[1,5],listen:[1,6,2],consol:1,option:[1,2,5],draper:[0,1,6,2,5],tool:[3,1,6,2],transform_data:2,specifi:[2,5],sessionid:[2,5],appropri:1,than:2,wide:[3,2,5],kind:5,keyword:2,provid:[1,2,5],registeractivitylogg:[1,6],remov:2,structur:[2,5],exampl:[1,6,2,5],jqueri:6,apivers:[2,5],sysact:[6,2,5],query_input:6,macro:2,design:3,minut:2,typic:2,browser:2,pre:1,analysi:[3,2],comput:[3,2],abov:[2,5],explicit:[1,2],respons:[1,2],mind:1,ani:[3,1,2,5],mouseent:6,wai:2,have:[3,4,1,2,5],tabl:[4,1,2],need:[1,5],seen:2,"20m":2,crossfilt:2,engin:3,mil:[],lib:6,inform:[1,2,5],setcolorpalett:[],consortium:2,softwaremetadata:1,also:[1,2,5],ideal:2,client:[1,2,5],build:3,annot:2,transmit:5,combin:3,concern:1,singl:2,compat:5,shall:2,track:[3,1,2],previou:4,chart:2,pytestcomp:5,most:[1,2],plan:[3,4],pair:1,"class":[1,6],don:[0,1],workstation14:[],url:[1,6],later:2,clienthostnam:[],hospit:[],runtim:5,determin:1,pattern:2,link:2,selectdata:[],left:6,gain:[1,2],oculu:[],draperlab:[1,6],activitylogserverin:[],text:[1,6,2],session:[1,2],find:2,add_not:2,access:1,onli:[1,2],explicitli:[1,2],layout:[0,2],just:1,"true":1,activ:[0,1,2,3,5,6],enough:[3,2],down_select_data:[],should:[1,2],latenc:2,explic:[1,2],analyt:3,analys:2,hope:5,move:1,wf_explor:[1,2],watch:[1,2],compli:2,sortdata:[],wf_creat:2,msgarrai:1,major:5,tbd:2,requir:[0,1,2,3,5,6],define_t:2,enabl:[1,2],organ:2,componentnam:[1,2,5],topolog:5,"default":[],activitylogg:[1,6],stuff:[],common:[3,2],contain:[1,2],movement:1,where:2,vision:3,view:[4,2],set:[4,1,2],knowledg:2,maximum:5,userworkflowst:1,see:[1,2,5],centric:1,result:[6,2],bookmarkview:[],simpl:3,rowsad:[],subject:[0,2],statu:2,flexibl:5,record:2,heterogen:3,databas:2,someth:1,enumer:2,label:2,state:[0,1,2],physiolog:3,testquant:5,between:[1,2],approach:3,across:2,"19t16":[],attribut:1,wf_getdata:[6,2],popup:6,kei:[1,5],keyboard:2,darpa:[],screen:2,javascript:[0,1,6,5],detrend:2,logus:1,come:2,popul:[],both:[1,2],last:2,howev:1,against:1,etc:2,hover_start:2,context:[3,2],com:[1,6],my_endpoint:6,load:2,among:2,figur:3,instanti:[1,6],overview:[0,3],arriv:2,dispatch:2,path:5,respect:5,guid:[0,1,2],ultim:2,java:[0,1,5],creat:[3,4,2],zoom_in:2,requestor:2,areasynchron:[],been:2,compon:[3,1,2,5],json:[0,5,2,3],toolbar:[],interest:3,tactic:[],futur:[0,1,2,5],addit:[1,2,5],dure:2,deeper:2,fire:[1,2],worker:[1,6],argument:[],dave:[],activity_work:6,mouseov:1,those:2,"case":[1,2,5],look:[1,6,2],servic:3,properti:1,defineax:[],defin:[4,1,2,5],"while":2,uniqu:[1,2],behavior:[3,2],error:2,modul:[],loos:[1,2],helper:[1,6,2,5],metric:3,useract:[1,2,5],select_opt:2,revis:2,sever:[3,1],disabl:1,develop:[3,1,2,5],welcom:0,author:1,perform:[3,1,2],suggest:2,make:[3,1,2],cross:1,same:2,member:1,handl:1,complex:5,"31t23":[],split:2,enrich:[4,2],document:[0,1,2,3,4,5],pan:2,higher:2,wheel:1,http:[0,1,6,5],hostnam:2,optim:3,nest:5,assist:[1,2],preced:2,fuse:[],user:[0,1,2,3,5,6],refin:2,extern:2,triag:2,built:3,task:[3,2],entri:2,hypothes:2,min:6,movewindow:[],know:5,justifi:2,contact:[1,6,2],thi:[3,4,1,2,5],interpol:2,traffic:5,focusin:1,audio:[],guidanc:2,propos:3,identifi:2,execut:[2,5],excel:5,elabor:2,human:5,wf_other:2,languag:[0,1,2,5],web:[1,6,2,5],xmlhttprequest:3,easi:1,character:2,param:5,instrument:2,add:[6,2],input:[1,6,2],logger:[1,6],subsequ:2,transit:[0,4,2],match:3,take:2,applic:[3,1,2],hover:6,which:[1,2],hypothesi:[],format:[1,5],read:[6,2],big:2,varieti:[3,5],piec:2,were:5,componentversionin:[],xdata:[0,1,2,3],background:1,datasourc:[],world:2,set_color_palett:2,mouseout:1,desc:[6,2,5],wf_version:[],measur:3,like:[1,2],specif:[3,1,2,5],arbitrari:1,whitespac:2,html:[1,6],integ:[],server:[0,1,2,3,5,6],collect:[3,2],"boolean":[],necessari:2,either:1,page:[],popov:[],old:4,captur:[3,2],understand:[3,2],wfcodevers:5,interact:[3,1,2],some:[1,2],back:2,zoom:2,certain:1,viewscatterplot:[],successfulli:1,librari:[1,6,2,5],transmiss:[1,5],deselect:2,scale:2,actiondescript:1,sort_data:[],definit:[0,1,2],best:2,larg:2,scalehistogram:5,localhost:[1,6],refer:1,machin:1,object:[1,6,2,5],run:2,define_ax:2,"enum":[],arrange_window:2,host:2,corp:[],repositori:6,post:[0,5],earlier:[1,5],src:[1,6],about:[1,2,5],socket:[],"_____":[0,1],column:2,coordinatetransform:[],side:5,ajax:6,marshal:4,wf_transform:2,own:2,wf_enrich:2,within:2,encod:5,automat:[1,2,5],dataset:2,down:2,model:[3,2],ensur:3,chang:2,your:[1,6,2],denois:2,leverag:[2,5],git:6,span:[1,2],log:[0,1,2,3,5,6],her:2,pictur:2,checkingaccount:[],support:[0,5,1,2,3],xdatalogg:[1,6],transform:[4,2],textual:2,custom:2,avail:[1,6],start:[0,6],formul:2,interfac:[3,2],includ:[3,1,2,5],"var":[1,6],addnot:[],select_data:[],hei:[0,1],"function":[1,6],head:[],form:5,offer:5,reed:[],hidenavmenu:[],eas:2,categor:2,analyst:3,conclus:2,immedi:[],attr:6,consist:[1,2],possibl:[3,2],whether:[],dom:[0,1,2],displai:2,select_lay:2,below:[1,2],highlight:2,problem:[4,2],remaind:[],connect:1,read_hover_exit:6,constant:1,evalu:[3,2],"int":[],request:[0,2,5],"abstract":2,create_visu:2,utilit:3,monitor_queri:2,exist:5,cloudflar:6,file:[1,6],definet:[],face:2,unmut:1,check:2,hover_stop:[],encrypt:5,titl:[2,5],hover_end:2,get_data:6,when:[1,6,2,5],detail:[0,5,1,2,3],wf_defin:2,field:[1,2,5],other:[4,1,2,5],bool:1,mouseclick:[],spatial:2,test:[1,2,5],you:[0,1,2],architectur:3,notif:2,why:[0,5],define_hypothesi:2,intent:3,formal:[1,2],selectal:6,reduc:2,receiv:[6,2],longer:2,algorithm:2,svg:6,descript:[1,6,2],getjson:6,activity_logg:[1,6],time:[3,1,2],implanguag:[2,5],scroll:[1,2]},objtypes:{"0":"py:function"},titles:["Welcome to XDATA API&#8217;s documentation!","How-to Guide for Implementing the Activity Logging API","Draper Activity Logging API Requirements","Overview","Worflow Coding Transition","Logging Server Implementation Details","Quick Start"],objnames:{"0":["py","function","Python function"]},filenames:["index","how_to","log_reqs","overview","app","server","getting_started"]})
\ No newline at end of file
diff --git a/dashboard/lib/static/doc/server.html b/dashboard/lib/static/doc/server.html
deleted file mode 100644
index 80eb9d4..0000000
--- a/dashboard/lib/static/doc/server.html
+++ /dev/null
@@ -1,210 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Logging Server Implementation Details &mdash; XDATA API 2.1.1 documentation</title>
-    
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '2.1.1',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-    <link rel="top" title="XDATA API 2.1.1 documentation" href="index.html" />
-    <link rel="next" title="Worflow Coding Transition" href="app.html" />
-    <link rel="prev" title="How-to Guide for Implementing the Activity Logging API" href="how_to.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="app.html" title="Worflow Coding Transition"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="how_to.html" title="How-to Guide for Implementing the Activity Logging API"
-             accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  <div class="section" id="logging-server-implementation-details">
-<h1>Logging Server Implementation Details<a class="headerlink" href="#logging-server-implementation-details" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="json-messages-using-http-post-requests">
-<h2>JSON messages using HTTP POST requests.<a class="headerlink" href="#json-messages-using-http-post-requests" title="Permalink to this headline">¶</a></h2>
-<p>The Draper Activity Logging Server accepts log messages as json strings in HTTP POST requests. We hope that the vast majority developers have no need to know about these implementation details, as they will use one of the helper libraries provided by Draper Laboratory to automatically encode and transmit log messages. See section 3 above for information about these helper libraries.</p>
-</div>
-<div class="section" id="why-json-http">
-<h2>Why JSON + HTTP?<a class="headerlink" href="#why-json-http" title="Permalink to this headline">¶</a></h2>
-<p>Leveraging HTTP to transmit log messages will allow us to transmit messages even when code is executed in a highly restricted runtime, such as client-side javascript code. It also offers maximum compatibility with current and future network topologies, since any network allowing web traffic will allow for HTTP communication. In addition, a natural path to encrypting activity log transmission exists in the form of HTTPS.</p>
-<p>Encoding log messages as JSON strings allows for relatively human-readable log messages, a flexible data format that allows for transmission of complex, nested data structures, and excellent encoding support in a wide variety of programming languages.</p>
-<p>Messaging Diagram</p>
-</div>
-<div class="section" id="activity-log-data-as-json-strings">
-<h2>Activity Log Data as JSON Strings<a class="headerlink" href="#activity-log-data-as-json-strings" title="Permalink to this headline">¶</a></h2>
-<p>The specific fields to be included in each log message were described earlier in this document (see <a class="reference internal" href="log_reqs.html#message-reqs"><em>Activity Log Message Requirements</em></a>). A JSON string is generated with this information by the following steps:</p>
-<ol class="arabic simple">
-<li>The values of componentName and componentVersion as defined in Section 2.1 of this document are stored in the keys component.name and component.value, respectively.</li>
-<li>The value of desc is stored in the key params.desc</li>
-<li>All other values specified in Section 2.1 are stored using their title as a key.</li>
-<li>All the values specific to one kind of log message for example, activity and wf_state in the case of User Activity log messages, are stored in the key params.</li>
-</ol>
-<p>5.  Any optional metadata is stored as a JSON object in the meta.
-Example encoded log messages:</p>
-<p>A System Activity message with metadata</p>
-<div class="highlight-json"><pre>{
-        "timestamp":"2013-09-21T19:29Z",
-        "client":"xDATAClient23",
-        "component":{
-           "name":"pyTestComp",
-           "version":"34.87"
-        },
-        "sessionID":4593,
-        "impLanguage":"Java",
-        "apiVersion":2,
-        "type":"SYSACTION",
-        "params":{
-           "desc":"TEST SYSTEM MESSAGE"
-        },
-        "meta":{
-           "testQual":"quall",
-           "testQuant":3
-        }
-     }</pre>
-</div>
-<p>A User Activity message</p>
-<div class="highlight-json"><pre>{
-   "timestamp":"2013-09-21T19:29Z",
-   "client":" xDATAClient23",
-   "component":{
-      "name":"pyTestComp",
-      "version":"34.87"
-   },
-   "sessionID":4593,
-   "impLanguage":"Java",
-   "apiVersion":2,
-   "type":"USERACTION",
-   "params":{
-      "desc":"TEST USER MESSAGE",
-      "activity":"scaleHistogram",
-      "wf_state":6,
-      "wfCodeVersion":1
-   }
-}</pre>
-</div>
-<p>A User Activity message with metadata</p>
-<div class="highlight-json"><pre>{
-   "timestamp":"2013-09-21T19:29Z",
-   "client":"xDataClient23",
-   "component":{
-      "name":"pyTestComp",
-      "version":"34.87"
-   },
-   "sessionID":4593,
-   "impLanguage":"Java",
-   "apiVersion":2,
-   "type":"USERACTION",
-   "params":{
-      "desc":"TEST USER MESSAGE",
-      "activity":"scaleHistogram",
-      "wf_state":4,
-      "wfCodeVersion":1
-   },
-   "meta":{
-      "testQual":"quall",
-      "testQuant":3
-   }
-}</pre>
-</div>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">Logging Server Implementation Details</a><ul>
-<li><a class="reference internal" href="#json-messages-using-http-post-requests">JSON messages using HTTP POST requests.</a></li>
-<li><a class="reference internal" href="#why-json-http">Why JSON + HTTP?</a></li>
-<li><a class="reference internal" href="#activity-log-data-as-json-strings">Activity Log Data as JSON Strings</a></li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="how_to.html"
-                        title="previous chapter">How-to Guide for Implementing the Activity Logging API</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="app.html"
-                        title="next chapter">Worflow Coding Transition</a></p>
-  <h3>This Page</h3>
-  <ul class="this-page-menu">
-    <li><a href="_sources/server.txt"
-           rel="nofollow">Show Source</a></li>
-  </ul>
-<div id="searchbox" style="display: none">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="app.html" title="Worflow Coding Transition"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="how_to.html" title="How-to Guide for Implementing the Activity Logging API"
-             >previous</a> |</li>
-        <li><a href="index.html">XDATA API 2.1.1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-        &copy; Copyright 2014, Draper .
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/dashboard/lib/static/simple_guide/css/normalize.css b/dashboard/lib/static/simple_guide/css/normalize.css
deleted file mode 100644
index aeb9258..0000000
--- a/dashboard/lib/static/simple_guide/css/normalize.css
+++ /dev/null
@@ -1,439 +0,0 @@
-/*! normalize.css 2011-08-31T22:02 UTC Â· http://github.com/necolas/normalize.css */
-
-/* =============================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/*
- * Corrects block display not defined in IE6/7/8/9 & FF3
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-    display: block;
-}
-
-/*
- * Corrects inline-block display not defined in IE6/7/8/9 & FF3
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-}
-
-/*
- * Prevents modern browsers from displaying 'audio' without controls
- */
-
-audio:not([controls]) {
-    display: none;
-}
-
-/*
- * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4
- * Known issue: no IE6 support
- */
-
-[hidden] {
-    display: none;
-}
-
-
-/* =============================================================================
-   Base
-   ========================================================================== */
-
-/*
- * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
- *    http://clagnut.com/blog/348/#c790
- * 2. Keeps page centred in all browsers regardless of content height
- * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom
- *    www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
- */
-
-html {
-    font-size: 100%; /* 1 */
-    overflow-y: scroll; /* 2 */
-    -webkit-text-size-adjust: 100%; /* 3 */
-    -ms-text-size-adjust: 100%; /* 3 */
-}
-
-/*
- * Addresses margins handled incorrectly in IE6/7
- */
-
-body {
-    margin: 0;
-}
-
-/* 
- * Addresses font-family inconsistency between 'textarea' and other form elements.
- */
-
-body,
-button,
-input,
-select,
-textarea {
-    font-family: sans-serif;
-}
-
-
-/* =============================================================================
-   Links
-   ========================================================================== */
-
-a {
-    color: #00e;
-}
-
-a:visited {
-    color: #551a8b;
-}
-
-/*
- * Addresses outline displayed oddly in Chrome
- */
-
-a:focus {
-    outline: 0;
-}
-
-/*
- * Improves readability when focused and also mouse hovered in all browsers
- * people.opera.com/patrickl/experiments/keyboard/test
- */
-
-a:hover,
-a:active {
-    outline: 0;
-}
-
-
-/* =============================================================================
-   Typography
-   ========================================================================== */
-
-/*
- * Addresses styling not present in IE7/8/9, S5, Chrome
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/*
- * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome
-*/
-
-b, 
-strong { 
-    font-weight: bold; 
-}
-
-blockquote {
-    margin: 1em 40px;
-}
-
-/*
- * Addresses styling not present in S5, Chrome
- */
-
-dfn {
-    font-style: italic;
-}
-
-/*
- * Addresses styling not present in IE6/7/8/9
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-/*
- * Corrects font family set oddly in IE6, S4/5, Chrome
- * en.wikipedia.org/wiki/User:Davidgothberg/Test59
- */
-
-pre,
-code,
-kbd,
-samp {
-    font-family: monospace, serif;
-    _font-family: 'courier new', monospace;
-    font-size: 1em;
-}
-
-/*
- * Improves readability of pre-formatted text in all browsers
- */
-
-pre {
-    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-}
-
-/*
- * 1. Addresses CSS quotes not supported in IE6/7
- * 2. Addresses quote property not supported in S4
- */
-
-/* 1 */
-
-q {
-    quotes: none;
-}
-
-/* 2 */
-
-q:before,
-q:after {
-    content: '';
-    content: none;
-}
-
-small {
-    font-size: 75%;
-}
-
-/*
- * Prevents sub and sup affecting line-height in all browsers
- * gist.github.com/413930
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-
-/* =============================================================================
-   Lists
-   ========================================================================== */
-
-ul,
-ol {
-    margin: 1em 0;
-    padding: 0 0 0 40px;
-}
-
-dd {
-    margin: 0 0 0 40px;
-}
-
-nav ul,
-nav ol {
-    list-style: none;
-    list-style-image: none;
-}
-
-
-/* =============================================================================
-   Embedded content
-   ========================================================================== */
-
-/*
- * 1. Removes border when inside 'a' element in IE6/7/8/9, F3
- * 2. Improves image quality when scaled in IE7
- *    code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
- */
-
-img {
-    border: 0; /* 1 */
-    -ms-interpolation-mode: bicubic; /* 2 */
-}
-
-/*
- * Corrects overflow displayed oddly in IE9 
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-
-/* =============================================================================
-   Figures
-   ========================================================================== */
-
-/*
- * Addresses margin not present in IE6/7/8/9, S5, O11
- */
-
-figure {
-    margin: 0;
-}
-
-
-/* =============================================================================
-   Forms
-   ========================================================================== */
-
-/*
- * Corrects margin displayed oddly in IE6/7
- */
-
-form {
-    margin: 0;
-}
-
-/*
- * Define consistent margin and padding
- */
-
-fieldset {
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/*
- * 1. Corrects color not being inherited in IE6/7/8/9
- * 2. Corrects alignment displayed oddly in IE6/7
- */
-
-legend {
-    border: 0; /* 1 */
-    *margin-left: -7px; /* 2 */
-}
-
-/*
- * 1. Corrects font size not being inherited in all browsers
- * 2. Addresses margins set differently in IE6/7, F3/4, S5, Chrome
- * 3. Improves appearance and consistency in all browsers
- */
-
-button,
-input,
-select,
-textarea {
-    font-size: 100%; /* 1 */
-    margin: 0; /* 2 */
-    vertical-align: baseline; /* 3 */
-    *vertical-align: middle; /* 3 */
-}
-
-/*
- * 1. Addresses FF3/4 setting line-height using !important in the UA stylesheet
- * 2. Corrects inner spacing displayed oddly in IE6/7
- */
-
-button,
-input {
-    line-height: normal; /* 1 */
-    *overflow: visible;  /* 2 */
-}
-
-/*
- * Corrects overlap and whitespace issue for buttons and inputs in IE6/7
- * Known issue: reintroduces inner spacing
- */
-
-table button,
-table input {
-    *overflow: auto;
-}
-
-/*
- * 1. Improves usability and consistency of cursor style between image-type 'input' and others
- * 2. Corrects inability to style clickable 'input' types in iOS
- */
-
-button,
-html input[type="button"], 
-input[type="reset"], 
-input[type="submit"] {
-    cursor: pointer; /* 1 */
-    -webkit-appearance: button; /* 2 */
-}
-
-/*
- * 1. Addresses box sizing set to content-box in IE8/9
- * 2. Addresses excess padding in IE8/9
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Addresses appearance set to searchfield in S5, Chrome
- * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof)
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    -moz-box-sizing: content-box;
-    -webkit-box-sizing: content-box; /* 2 */
-    box-sizing: content-box;
-}
-
-/*
- * Corrects inner padding displayed oddly in S5, Chrome on OSX
- */
-
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/*
- * Corrects inner padding and border displayed oddly in FF3/4
- * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/*
- * 1. Removes default vertical scrollbar in IE6/7/8/9
- * 2. Improves readability and alignment in all browsers
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-
-/* =============================================================================
-   Tables
-   ========================================================================== */
-
-/* 
- * Remove most spacing between table cells
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/simple_guide/css/style.css b/dashboard/lib/static/simple_guide/css/style.css
deleted file mode 100644
index a170827..0000000
--- a/dashboard/lib/static/simple_guide/css/style.css
+++ /dev/null
@@ -1,158 +0,0 @@
-body {
-	background: #FFF;
-	font-family: Georgia, Times New Roman, Times, serif;
-	font-size: 30px;
-	text-align: center;
-    margin: 0;
-    padding: 0;
-}
-
-h1 {
-	font-size: 60px;
-	font-weight: normal;
-	margin: 0;
-    font-family: 'Chelsea Market', Georgia, serif;
-    color: #000;
-	line-height: 1;
-}
-
-h2 {
-	font-size: 70px;
-	font-weight: normal;
-	margin: 0;
-	color: #FFB000;
-    font-family: 'Chelsea Market', Georgia, serif;
-	text-transform: lowercase;
-}
-
-h3 {
-	font-size: 40px;
-	font-weight: normal;
-	margin: 0;
-    margin-top: 40px;
-	text-transform: lowercase;
-}
-
-p {
-	width: 960px;
-	margin: 40px auto;
-	color: #000;
-    line-height: 200%;
-}
-
-a, a:visited {
-	color: cornflowerblue;
-    font-size: 30px;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-ul {
-	list-style: none;
-}
-
-.download {
-	padding: 10px;
-}
-
-pre {
-	font-size: 18px;
-}
-
-blockquote {
-	text-align: left;
-	width: 720px;
-	margin: 10px auto;
-	background: #C5C3DE;
-	border: solid 2px #69697A;
-	padding: 0 40px;
-}
-
-code {
-    background-color: #000;
-	font-style: normal;
-    border-radius: 10px;
-    color: white;
-    padding: 5px 15px;
-    font-family: menlo, monospace;
-}
-
-/*----------------------------------------  BLOCKS */
-
-.scrollblock {
-	position: relative;
-	margin: 0;
-	width: 100%;
-    color: white;
-    padding-top: 80px;
-    padding-bottom: 80px;
-}
-
-.scrollblock h2 {
-
-}
-
-.block-title { 
-	margin-top: 150px; 
-	background-color: #FFF; 
-	padding: 0;
-	height: calc(100% - 150px);
-	/*padding-bottom: 50px; */
-}
-
-/*.block-title>div {
-	margin-top: 100px;
-}*/
-.block-title h2 { color: #000; }
-.block-title .meta { font-size: 16px; color: #999; }
-.block-title .meta a { font-size: 16px; color: #333; }
-.block-setup { background-color: #348fd4; }
-.block-setup h2 { color: #06406c; }
-.block-setup h2 a { background: none; padding: 0; font-size: normal; }
-.block-setup a { color: #FFF; font-size: 40px; font-weight: normal;font-style: normal; background-color: #06406c; padding: 10px 15px; border-radius: 10px; text-decoration: none; }
-.block-setup a:hover { text-decoration: underline; }
-
-.block-register { background-color: #06406c; }
-.block-register h2 { color: #FFF; }
-.block-register p { color: #FFF; }
-/*.block-register code { background-color: #000; color: #FFF; }*/
-
-.block-user { background-color: #4c0d09; }
-.block-user h2 { color: #d3b2af; }
-.block-user p { color: #d3b2af; }
-.block-user div.definitions { 
-	color: #d3b2af; 
-	/*font-family: 'Chelsea Market', Georgia, serif;*/
-}
-/*.block-user code { color: #000; background-color: white; }*/
-
-.block-system { background-color: #ffc19f; }
-.block-system h2 { color: #cc4037; }
-
-.block-dashboard .content{
-	margin: 70px auto;
-	/*width: 900px;*/
-}
-
-.block-dashboard p{
-	margin: 0 auto;
-	line-height: 160%;
-	/*width: 900px;*/
-}
-
-
-code {
-	font-size: 1.5em;
-	text-align: left;
-}
-
-pre {
-	margin: 0 10%;
-}
-
-html, body {
-	height: 100%;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/simple_guide/img/dashboard.png b/dashboard/lib/static/simple_guide/img/dashboard.png
deleted file mode 100644
index f3e1db0..0000000
--- a/dashboard/lib/static/simple_guide/img/dashboard.png
+++ /dev/null
Binary files differ
diff --git a/dashboard/lib/static/simple_guide/index.html b/dashboard/lib/static/simple_guide/index.html
deleted file mode 100644
index 5892f73..0000000
--- a/dashboard/lib/static/simple_guide/index.html
+++ /dev/null
@@ -1,115 +0,0 @@
-
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="utf-8">
-	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-	<title>Logging API</title>
-    <link href='http://fonts.googleapis.com/css?family=Chelsea+Market' rel='stylesheet' type='text/css'>
-    
-    <!-- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/styles/default.min.css"> -->
-    <link rel="stylesheet" href="http://yandex.st/highlightjs/8.0/styles/default.min.css">
-    <script src="http://yandex.st/highlightjs/8.0/highlight.min.js"></script>
-    <!-- <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/styles/github.min.css"> -->
-    
-    <script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/languages/javascript.min.js"></script>
-    <script>hljs.initHighlightingOnLoad();</script>
-
-    <link rel="stylesheet" href="css/normalize.css" type="text/css">
-    <link rel="stylesheet" href="css/style.css" type="text/css">
-</head>
-<body>
-    <div class="scrollblock block-title">
-        <div>
-            <h1>Draper Logging API</h1>
-            <h1>-the simple guide</h1>
-        </div>
-    </div>
-    <!-- instantiate -->
-    <a name="instantiate"></a>
-    <div class="scrollblock block-setup">
-        <h2>Instantiate the Logger</h2>
-        <pre>
-            <code>
-// web worker url
-var worker = 'js/draper.activity_worker-2.1.1.js'
-var ac = new activityLogger(worker);
-.testing(true) // simulate POST, won't send log
-.echo(true) // log to console
-.mute(['SYS']); // don't log SYSTEM actions
-            </code>
-        </pre>
-    </div>
-    <!-- register -->
-    <a name="register"></a>
-    <div class="scrollblock block-register">
-        <h2>register the Logger</h2>
-        <pre>
-            <code>
-ac.registerActivityLogger(
-    "http://xd-draper.xdata.data-tactics-corp.com:1337", 
-    "my-component", 
-    "v0.1"
-    );
-            </code>
-        </pre>
-    </div>
-    <!-- register -->
-    <a name="log-user"></a>
-    <div class="scrollblock block-user">
-        <h2>Log a User Activity</h2>
-        <br>
-        <pre>
-            <code>
-$('#button').mouseenter(function() {
-    ac.logUserActivity(
-    'User hovered over element to read popup', // description
-    'hover_start', // activity_code
-    ac.WF_EXPLORE // workflow State
-    );
-})
-            </code>
-        </pre>
-
-        <div class="definitions" style="text-align: left; margin: 0 10%;">
-          <div style="margin-bottom: 40px;"><b>Description is a</b> is a natural language explanation of the activity, which can be descriptive as you want.</div>
-          <div style="margin-bottom: 40px;"><b>Activity Code is a</b> is a coding of the tool action that should be mappable across tools. Make some attempt to use activity codes listed in the API and here.</div>
-          <div><b>Workflow State is a</b> is a collection of tool actions which represent the gross activity of the user. The logging library has enumerated these for you.</div>
-        </div>
-        
-    </div>
-
-    <a name="log-user"></a>
-    <div class="scrollblock block-system">
-        <h2>Log a System Activity</h2>
-        <pre>
-            <code>
-ac.logSystemActivity('asking server for data.');
-
-$.getJSON('https://my_endpoint/get_data', data, function(data) {
-  ac.logSystemActivity('received data from server.');
-  $("#result").text(data.result);
-});
-            </code>
-        </pre>
-    </div>
-
-    <div class="scrollblock block-dashboard">
-        <h2>Check the Dashboard</h2>
-
-        <div class="content">
-          <!-- <div classstyle="width: 500px; margin: 0 auto;"> -->
-            <p>Go to</p>
-            <p><a href="http://xd-draper.xdata.data-tactics-corp.com:1337/">http://xd-draper.xdata.data-tactics-corp.com:1337</a></p>
-            <p>and see if the logs represent how your tool is being used.</p>
-          <!-- </div> -->
-          <br>
-          <img src="img/dashboard.png" alt="">
-        </div>
-        
-    </div>
-    <div style="font-size: 12px">
-      Inspired by <a style="font-size: 12px" href="http://rogerdudler.github.io/git-guide/">http://rogerdudler.github.io/git-guide/</a>
-    </div>
-</body>
-</html>
diff --git a/dashboard/lib/static/wf_states/css/normalize.css b/dashboard/lib/static/wf_states/css/normalize.css
deleted file mode 100644
index aeb9258..0000000
--- a/dashboard/lib/static/wf_states/css/normalize.css
+++ /dev/null
@@ -1,439 +0,0 @@
-/*! normalize.css 2011-08-31T22:02 UTC Â· http://github.com/necolas/normalize.css */
-
-/* =============================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/*
- * Corrects block display not defined in IE6/7/8/9 & FF3
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-    display: block;
-}
-
-/*
- * Corrects inline-block display not defined in IE6/7/8/9 & FF3
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-}
-
-/*
- * Prevents modern browsers from displaying 'audio' without controls
- */
-
-audio:not([controls]) {
-    display: none;
-}
-
-/*
- * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4
- * Known issue: no IE6 support
- */
-
-[hidden] {
-    display: none;
-}
-
-
-/* =============================================================================
-   Base
-   ========================================================================== */
-
-/*
- * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
- *    http://clagnut.com/blog/348/#c790
- * 2. Keeps page centred in all browsers regardless of content height
- * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom
- *    www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
- */
-
-html {
-    font-size: 100%; /* 1 */
-    overflow-y: scroll; /* 2 */
-    -webkit-text-size-adjust: 100%; /* 3 */
-    -ms-text-size-adjust: 100%; /* 3 */
-}
-
-/*
- * Addresses margins handled incorrectly in IE6/7
- */
-
-body {
-    margin: 0;
-}
-
-/* 
- * Addresses font-family inconsistency between 'textarea' and other form elements.
- */
-
-body,
-button,
-input,
-select,
-textarea {
-    font-family: sans-serif;
-}
-
-
-/* =============================================================================
-   Links
-   ========================================================================== */
-
-a {
-    color: #00e;
-}
-
-a:visited {
-    color: #551a8b;
-}
-
-/*
- * Addresses outline displayed oddly in Chrome
- */
-
-a:focus {
-    outline: 0;
-}
-
-/*
- * Improves readability when focused and also mouse hovered in all browsers
- * people.opera.com/patrickl/experiments/keyboard/test
- */
-
-a:hover,
-a:active {
-    outline: 0;
-}
-
-
-/* =============================================================================
-   Typography
-   ========================================================================== */
-
-/*
- * Addresses styling not present in IE7/8/9, S5, Chrome
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/*
- * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome
-*/
-
-b, 
-strong { 
-    font-weight: bold; 
-}
-
-blockquote {
-    margin: 1em 40px;
-}
-
-/*
- * Addresses styling not present in S5, Chrome
- */
-
-dfn {
-    font-style: italic;
-}
-
-/*
- * Addresses styling not present in IE6/7/8/9
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-/*
- * Corrects font family set oddly in IE6, S4/5, Chrome
- * en.wikipedia.org/wiki/User:Davidgothberg/Test59
- */
-
-pre,
-code,
-kbd,
-samp {
-    font-family: monospace, serif;
-    _font-family: 'courier new', monospace;
-    font-size: 1em;
-}
-
-/*
- * Improves readability of pre-formatted text in all browsers
- */
-
-pre {
-    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-}
-
-/*
- * 1. Addresses CSS quotes not supported in IE6/7
- * 2. Addresses quote property not supported in S4
- */
-
-/* 1 */
-
-q {
-    quotes: none;
-}
-
-/* 2 */
-
-q:before,
-q:after {
-    content: '';
-    content: none;
-}
-
-small {
-    font-size: 75%;
-}
-
-/*
- * Prevents sub and sup affecting line-height in all browsers
- * gist.github.com/413930
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-
-/* =============================================================================
-   Lists
-   ========================================================================== */
-
-ul,
-ol {
-    margin: 1em 0;
-    padding: 0 0 0 40px;
-}
-
-dd {
-    margin: 0 0 0 40px;
-}
-
-nav ul,
-nav ol {
-    list-style: none;
-    list-style-image: none;
-}
-
-
-/* =============================================================================
-   Embedded content
-   ========================================================================== */
-
-/*
- * 1. Removes border when inside 'a' element in IE6/7/8/9, F3
- * 2. Improves image quality when scaled in IE7
- *    code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
- */
-
-img {
-    border: 0; /* 1 */
-    -ms-interpolation-mode: bicubic; /* 2 */
-}
-
-/*
- * Corrects overflow displayed oddly in IE9 
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-
-/* =============================================================================
-   Figures
-   ========================================================================== */
-
-/*
- * Addresses margin not present in IE6/7/8/9, S5, O11
- */
-
-figure {
-    margin: 0;
-}
-
-
-/* =============================================================================
-   Forms
-   ========================================================================== */
-
-/*
- * Corrects margin displayed oddly in IE6/7
- */
-
-form {
-    margin: 0;
-}
-
-/*
- * Define consistent margin and padding
- */
-
-fieldset {
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/*
- * 1. Corrects color not being inherited in IE6/7/8/9
- * 2. Corrects alignment displayed oddly in IE6/7
- */
-
-legend {
-    border: 0; /* 1 */
-    *margin-left: -7px; /* 2 */
-}
-
-/*
- * 1. Corrects font size not being inherited in all browsers
- * 2. Addresses margins set differently in IE6/7, F3/4, S5, Chrome
- * 3. Improves appearance and consistency in all browsers
- */
-
-button,
-input,
-select,
-textarea {
-    font-size: 100%; /* 1 */
-    margin: 0; /* 2 */
-    vertical-align: baseline; /* 3 */
-    *vertical-align: middle; /* 3 */
-}
-
-/*
- * 1. Addresses FF3/4 setting line-height using !important in the UA stylesheet
- * 2. Corrects inner spacing displayed oddly in IE6/7
- */
-
-button,
-input {
-    line-height: normal; /* 1 */
-    *overflow: visible;  /* 2 */
-}
-
-/*
- * Corrects overlap and whitespace issue for buttons and inputs in IE6/7
- * Known issue: reintroduces inner spacing
- */
-
-table button,
-table input {
-    *overflow: auto;
-}
-
-/*
- * 1. Improves usability and consistency of cursor style between image-type 'input' and others
- * 2. Corrects inability to style clickable 'input' types in iOS
- */
-
-button,
-html input[type="button"], 
-input[type="reset"], 
-input[type="submit"] {
-    cursor: pointer; /* 1 */
-    -webkit-appearance: button; /* 2 */
-}
-
-/*
- * 1. Addresses box sizing set to content-box in IE8/9
- * 2. Addresses excess padding in IE8/9
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Addresses appearance set to searchfield in S5, Chrome
- * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof)
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    -moz-box-sizing: content-box;
-    -webkit-box-sizing: content-box; /* 2 */
-    box-sizing: content-box;
-}
-
-/*
- * Corrects inner padding displayed oddly in S5, Chrome on OSX
- */
-
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/*
- * Corrects inner padding and border displayed oddly in FF3/4
- * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/*
- * 1. Removes default vertical scrollbar in IE6/7/8/9
- * 2. Improves readability and alignment in all browsers
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-
-/* =============================================================================
-   Tables
-   ========================================================================== */
-
-/* 
- * Remove most spacing between table cells
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/wf_states/css/style.css b/dashboard/lib/static/wf_states/css/style.css
deleted file mode 100644
index 4f9edda..0000000
--- a/dashboard/lib/static/wf_states/css/style.css
+++ /dev/null
@@ -1,215 +0,0 @@
-body {
-	background: #FFF;
-	font-family: Georgia, Times New Roman, Times, serif;
-	font-size: 30px;
-	text-align: center;
-    margin: 0;
-    padding: 0;
-}
-
-h1 {
-	font-size: 60px;
-	font-weight: normal;
-	margin: 0;
-    font-family: 'Chelsea Market', Georgia, serif;
-    color: #000;
-	line-height: 1;
-}
-
-h2 {
-	font-size: 70px;
-	font-weight: normal;
-	margin: 0;
-	color: #FFB000;
-    font-family: 'Chelsea Market', Georgia, serif;
-	text-transform: lowercase;
-}
-
-h3 {
-	font-size: 40px;
-	font-weight: normal;
-	margin: 0;
-    margin-top: 40px;
-	text-transform: lowercase;
-}
-
-p {
-	width: 960px;
-	margin: 40px auto;
-	color: #000;
-    line-height: 200%;
-}
-
-a, a:visited {
-	color: #000;
-    font-size: 12px;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-ul {
-	list-style: none;
-}
-
-.download {
-	padding: 10px;
-}
-
-pre {
-	font-size: 18px;
-}
-
-blockquote {
-	text-align: left;
-	width: 720px;
-	margin: 10px auto;
-	background: #C5C3DE;
-	border: solid 2px #69697A;
-	padding: 0 40px;
-}
-
-code {
-    background-color: #000;
-	font-style: normal;
-    border-radius: 10px;
-    color: white;
-    padding: 5px 15px;
-    font-family: menlo, monospace;
-}
-
-/*----------------------------------------  BLOCKS */
-
-.scrollblock {
-	position: relative;
-	margin: 0;
-	width: 100%;
-    color: white;
-    padding-top: 80px;
-    padding-bottom: 80px;
-}
-
-.scrollblock h2 {
-
-}
-
-.block-title { 
-	margin-top: 150px; 
-	background-color: #FFF; 
-	padding: 0;
-	height: calc(100% - 150px);
-	/*padding-bottom: 50px; */
-}
-
-/*.block-title>div {
-	margin-top: 100px;
-}*/
-.block-title h2 { color: #000; }
-.block-title .meta { font-size: 16px; color: #999; }
-.block-title .meta a { font-size: 16px; color: #333; }
-.block-setup { background-color: #348fd4; }
-.block-setup h2 { color: #06406c; }
-.block-setup h2 a { background: none; padding: 0; font-size: normal; }
-.block-setup a { color: #FFF; font-size: 40px; font-weight: normal;font-style: normal; background-color: #06406c; padding: 10px 15px; border-radius: 10px; text-decoration: none; }
-.block-setup a:hover { text-decoration: underline; }
-/*.block-create { background-color: #06406c; }
-.block-create h2 { color: #FFF; }
-.block-create p { color: #FFF; }
-.block-create code { background-color: #000; color: #FFF; }*/
-
-.block-define { background-color: #984ea3; }
-.block-define h2 { color: #F8D0FD; }
-.block-define p { color: #F8D0FD; }
-.block-define code.label { 
-	background-color: #F8D0FD;
-	color: #984ea3; 
-}
-
-.block-getdata { background-color: #d7191c; }
-.block-getdata h2 { color: rgb(255, 192, 192); }
-.block-getdata p { color: rgb(255, 192, 192); }
-.block-getdata code.label { 
-	background-color: rgb(255, 192, 192);
-	color: #d7191c; 
-}
-
-.block-exploredata { background-color: #fdae61; }
-.block-exploredata h2 { color: #AF6013; }
-.block-exploredata p { color: #AF6013; }
-.block-exploredata code.label { 
-	background-color: #AF6013;
-	color: #fdae61; 
-}
-
-.block-create { background-color: #f1b6da; }
-.block-create h2 { color: #cc4037; }
-.block-create p { color: #cc4037; }
-.block-create code.label { 
-	background-color: #cc4037;
-	color: #f1b6da; 
-}
-
-.block-enrich { background-color: #abdda4}
-.block-enrich h2 { color: #4F8348;}
-.block-enrich p { color: #4F8348; }
-.block-enrich code.label { 
-	background-color: #4F8348;
-	color: #abdda4; 
-}
-
-.block-transform { background-color: #2b83ba}
-.block-transform h2 { color: #0B3D5C;}
-.block-transform p { color: #0B3D5C; }
-.block-transform code.label { 
-	background-color: #0B3D5C;
-	color: #2b83ba; 
-}
-
-code {
-	/*font-size: 1.em;*/
-	text-align: left;
-}
-
-pre {
-	margin: 0 10%;
-}
-
-html, body {
-	height: 100%;
-}
-
-.row:after {
-	clear: both;
-}
-
-.col {
-	float: left;
-	width: 50%;
-}
-
-.example > p {
-	text-align: left;
-	margin: 0 auto;
-	line-height: 1em;
-}
-
-.activities > p {
-	text-align: left;
-	margin: 0 auto;
-	line-height: 1em;
-	margin-bottom: 20px;
-}
-
-.activities > div {
-	margin: 0 10%;
-	background-color: white;
-	padding: 13px;
-	color: #000;
-	line-height: 2em;
-	text-align: left;
-	border-radius: 10px;
-	font-size: 21px;
-
-}
\ No newline at end of file
diff --git a/dashboard/lib/static/wf_states/index.html b/dashboard/lib/static/wf_states/index.html
deleted file mode 100644
index d74edb1..0000000
--- a/dashboard/lib/static/wf_states/index.html
+++ /dev/null
@@ -1,213 +0,0 @@
-
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="utf-8">
-	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-	<title>Logging API</title>
-
-    <link href='http://fonts.googleapis.com/css?family=Chelsea+Market' rel='stylesheet' type='text/css'>
-    
-    <link rel="stylesheet" href="http://yandex.st/highlightjs/8.0/styles/default.min.css">
-    <script src="http://yandex.st/highlightjs/8.0/highlight.min.js"></script>
-    
-    <script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/languages/javascript.min.js"></script>
-    <script>hljs.initHighlightingOnLoad();</script>
-
-    <link rel="stylesheet" href="css/normalize.css" type="text/css">
-    <link rel="stylesheet" href="css/style.css" type="text/css">
-</head>
-<body>
-    <div class="scrollblock block-title">
-        <div>
-            <h1>Draper Logging API</h1>
-            <br>
-            <h1>-Simple Guide to</h1>
-            <h1>Workflow Coding</h1>
-        </div>
-    </div>
-    <a name="instantiate"></a>
-    <div id="WF_DEFINE" class="scrollblock block-define">
-        <h2>Define Problem</h2>
-        <br>
-        <code class="label">WF_DEFINE</code>
-        
-        <div class="example">
-          <p>Examples</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'Define Hypothesis', // description
-  'define_hypothesis', // activity code
-  ac.WF_DEFINE // workflow state
-  );
-              </code>
-          </pre>
-        </div>
-
-        <div class="activities">
-          <p>More Activities</p>
-          <div>define_hypothesis</div>
-        </div>
-    </div>
-    <!-- instantiate -->
-    <a name="instantiate"></a>
-    <div id="WF_GETDATA" class="scrollblock block-getdata">
-        <h2>Get Data</h2>
-        <br>
-        <code class="label">WF_GETDATA</code>
-        
-        <div class="example">
-          <p>Examples</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'Execute attribute search', // description
-  'execute_query', // activity code
-  ac.WF_GETDATA // workflow state
-  );
-
-ac.logUserActivity(
-  'User has requested to load a new community.', // description
-  'execute_query', // activity code
-  ac.WF_GETDATA // workflow state
-  );
-              </code>
-          </pre>
-        </div>
-
-        <div class="activities">
-          <p>More Activities</p>
-          <div>write_query, select_option, execute_query, monitor_query</div>
-        </div>
-    </div>
-
-    <a name="instantiate"></a>
-    <div id="WF_EXPLORE" class="scrollblock block-exploredata">
-        <h2>Explore Data</h2>
-        <br>
-        <code class="label">WF_EXPLORE</code>
-        <div class="example">
-          <p>Example Usage</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'User has selected new date range filter parameters.', // description
-  'select', // activity code
-  ac.WF_EXPLORE // workflow state
-  );
-
-ac.logUserActivity(
-  'User scrolled window', // description
-  'scroll', // activity code
-  ac.WF_EXPLORE // workflow state
-  );
-
-ac.logUserActivity(
-  'User hovered over element to read popup',
-  'hover_start',
-  ac.WF_EXPLORE
-);
-
-ac.logUserActivity(
-  'User left hover element',
-  'hover_end',
-  ac.WF_EXPLORE
-);
-              </code>
-          </pre>
-        </div>
-        <div class="activities">
-          <p>More Activities</p>
-          <div>browse, pan, zoom_in, zoom_out, scale, rotate, filter, drill, crossfilter, scroll, hover_start, hover_end, toggle_option, highlight, sort, select, deselect</div>
-        </div>
-    </div>
-    
-    <a name="instantiate"></a>
-    <div id="WF_CREATE" class="scrollblock block-create">
-        <h2>Create View</h2>
-        <br>
-        <code class="label">WF_CREATE</code>
-        <div class="example">
-          <p>Example Usage</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'Import a chart of all filed content from the local computer.', // description
-  'import-graph-request', // activity code
-  ac.WF_CREATE // workflow state
-  );
-              </code>
-          </pre>
-        </div>
-
-        <div class="activities">
-          <p>More Activities</p>
-          <div>create_visualization, define_axes, define_chart_type, define_table, move_window, resize_window, set_color_palette, select_layers, {add,remove,split,merge}_{rows,columns}, arrange_windows</div>
-        </div>
-    </div>
-
-    <a name="instantiate"></a>
-    <div id="WF_ENRICH" class="scrollblock block-enrich">
-        <h2>Enrich Data</h2>
-        <br>
-        <code class="label">WF_ENRICH</code>
-        <div class="example">
-          <p>Example Usage</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'Add edge between nodes', // description
-  'add_connection', // activity code
-  ac.WF_ENRICH // workflow state
-  );
-
-ac.logUserActivity(
-  'Remove edge between nodes', // description
-  'remove_connection', // activity code
-  ac.WF_ENRICH // workflow state
-  );
-              </code>
-          </pre>
-        </div>
-
-        <div class="activities">
-          <p>More Activities</p>
-          <div>add_note, bookmark_view, label</div>
-        </div>
-    </div>
-
-    <a name="instantiate"></a>
-    <div id="WF_TRANSFORM" class="scrollblock block-transform">
-        <h2>Transform Data</h2>
-        <br>
-        <code class="label">WF_TRANSFORM</code>
-        <div class="example">
-          <p>Example Usage</p>
-          <pre>
-              <code>
-ac.logUserActivity(
-  'low-pass filter image', // description
-  'denoise', // activity code
-  ac.WF_TRANSFORM // workflow state
-  );
-
-ac.logUserActivity(
-  'subtract mean from signal', // description
-  'tranform_data', // activity code
-  ac.WF_TRANSFORM // workflow state
-  );
-              </code>
-          </pre>
-        </div>
-
-        <div class="activities">
-          <p>More Activities</p>
-          <div>denoise, detrend, pattern_search, do_math, transform_data, coordinate_transform</div>
-        </div>
-    </div>
-    <div style="font-size: 12px">
-      Inspired by <a href="http://rogerdudler.github.io/git-guide/">http://rogerdudler.github.io/git-guide/</a>
-    </div>
-</body>
-</html>
diff --git a/dashboard/lib/style.less b/dashboard/lib/style.less
deleted file mode 100644
index 17eefa1..0000000
--- a/dashboard/lib/style.less
+++ /dev/null
@@ -1,163 +0,0 @@
-body {
-  padding-top: 20px;
-  padding-bottom: 20px;
-}
-
-.navbar {
-  margin-bottom: 20px;
-}
-
-.axis path, .axis line {
-  fill: none;
-  stroke: #000;
-  shape-rendering: crispEdges;
-}
-
-.axis text {
-  font: 10px sans-serif;
-}
-
-.brush rect.extent {
-  fill: steelblue;
-  fill-opacity: .125;
-}
-
-.brush .resize path {
-  fill: #eee;
-  stroke: #666;
-}
-
-circle:hover {
-  fill: black;
-}
-
-.axis {
-  font: 10px sans-serif;
-}
-
-.seperator {
-border-right: 1px solid rgb(202, 202, 202);
-margin-right: 10px;
-padding-left: 10px;
-}
-
-.timestamp {
-  width: 40%;
-  display: inline-block;
-}
-
-.activity {
-  width: 20%;
-  display: inline-block;
-}
-
-.wf_state {
-  width: 20%;
-  display: inline-block;
-}
-
-.list-group-item {
-padding: 3px 15px;
-
-}
-
-@addnew: hsl(90, 80%, 50%);
-.glyphicon:hover {
-  color: @addnew;
-}
-
-.glyphicon {
-  color: darken(@addnew, 15%);
-}
-
-
-
-.editable {
-  background-color: lighten(@addnew, 40%);
-}
-
-.add-new {
-  margin-right: 10px;
-}
-
-.form-control.dave {
-  display: inline; 
-  width: 90%; 
-  height: 20px; 
-  padding: 1px 4px;
-  font-size: 14px;
-  line-height: 1.428571429;
-  color: #555555;
-  vertical-align: middle;
-  background-color: #ffffff;
-  background-image: none;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-
-  &:focus {
-    outline: -webkit-focus-ring-color auto 5px;
-  }
-}
-
-input.dave {
-  border: none;
-box-shadow: none;
-outline: none;
-}
-
-.list-group-item.header {
-  background-color: #ddd;
-  font-weight: bold;
-  border-bottom: 2px solid rgb(167, 167, 167);
-}
-
-.wf-code {
-  width: 7px;
-  height: 20px;
-  float: left;
-  margin-right: 6px;
-}
-
-.my-indicator {
-  width: 7px;
-  height: 20px;
-  float: left;
-  margin-right: 6px;
-}
-
-.my-indicator.feedback {
-  background-color: rgb(138, 144, 218);
-}
-
-.gen-mysize();
-
-.gen-mysize(@counter: 1) when (@counter <= 100) {
-  .mysize-@{counter} {
-    width: @counter + 0%;
-  }
-  .gen-mysize(@counter + 1);
-}
-
-.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
-padding: 1px 8px;
-line-height: 1.428571429;
-vertical-align: top;
-border-top: 1px solid #dddddd;
-}
-
-.table-wrapper {
-  height: 300px;
-  overflow-y: auto;
-}
-
-table{
-    // border: 1px solid black;
-    table-layout: fixed;
-    // width: 200px;
-}
-// thead > tr, tbody{
-//     display:block;}
\ No newline at end of file
diff --git a/dashboard/lib/templates/directives/bootstrap-nav.html b/dashboard/lib/templates/directives/bootstrap-nav.html
deleted file mode 100644
index c95fa71..0000000
--- a/dashboard/lib/templates/directives/bootstrap-nav.html
+++ /dev/null
@@ -1 +0,0 @@
-<a href="{{url}}">{{name}}</a>
\ No newline at end of file
diff --git a/dashboard/lib/templates/directives/draper-logo.html b/dashboard/lib/templates/directives/draper-logo.html
deleted file mode 100644
index a0a96a9..0000000
--- a/dashboard/lib/templates/directives/draper-logo.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div style="position: relative; width: 80px; height: 60px; display: inline-block; float: left; margin-top: 3px;">
-  <div class="draperC"></div>
-  <div class="draperA"></div>
-  <div class="draperD"></div>
-  <div class="draperE"></div>
-  <div class="draperB"></div>
-  <div class="draper c1"></div>
-  <div class="draper rot1"></div>
-  <div class="draper c2"></div>
-  <div class="draper c3"></div>
-  <div class="draper rot2"></div>
-  <div class="draper c4"></div>
-  <div class="draper c5"></div>
-  <div class="draper c6"></div>
-</div>
\ No newline at end of file
diff --git a/dashboard/lib/templates/directives/paginate.html b/dashboard/lib/templates/directives/paginate.html
deleted file mode 100644
index a02209f..0000000
--- a/dashboard/lib/templates/directives/paginate.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<ul class="pagination">
-  <li ng-repeat="p in pages" ng-class="{active: p.cls=='active', disabled: p.cls=='disabled'}">
-	  <a ng-show="p.cls=='disabled'">{{p.text}}</a>
-	  <a ng-hide="p.cls=='disabled'" ng-click="$parent.currentPage = p.text" href="">{{p.text}}</a>
-  </li>
-</ul>
\ No newline at end of file
diff --git a/dashboard/lib/templates/directives/sort-th.html b/dashboard/lib/templates/directives/sort-th.html
deleted file mode 100644
index 383f021..0000000
--- a/dashboard/lib/templates/directives/sort-th.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<div ng-click="toggleOrder()" class="table-order">
-  <span ng-transclude></span>
-  <span ng-show="asc && on" class="glyphicon glyphicon-chevron-up"></span>
-  <span ng-show="!asc && on" class="glyphicon glyphicon-chevron-down"></span>
-</div>
\ No newline at end of file
diff --git a/dashboard/lib/templates/index.html b/dashboard/lib/templates/index.html
deleted file mode 100644
index 014e903..0000000
--- a/dashboard/lib/templates/index.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<div class="row">
-  <div class="col-md-3">
-    <div class="input-group">
-      <span class="input-group-addon"><i class="glyphicon glyphicon-th-large"></i></span>
-      <input type="text" ng-model=sesFilter.curComponent placeholder="search by component" typeahead="a.key for a in components2 | filter:{key:$viewValue}" typeahead-template-url="templates/partials/select.html" class="form-control">
-    </div>
-  </div>
-  <div class="col-md-3">
-    <div class="input-group">
-      <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
-      <input type="text" ng-model=sesFilter.curUser placeholder="search by user/client_ip" typeahead="a.key for a in users2 | filter:{key:$viewValue}" typeahead-template-url="templates/partials/select.html" class="form-control">
-    </div>
-  </div>
-  <div class="col-md-3">
-    <div class="input-group">
-      <span class="input-group-btn">
-        <button type="button" class="btn btn-default" ng-click="open($event)"><i class="glyphicon glyphicon-calendar"></i></button>
-      </span>
-
-      <input type="text" class="form-control" datepicker-popup="{{format}}" ng-model=sesFilter.dt is-open="opened" min-date="minDate" max-date="'2015-06-22'" datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true" close-text="Close" />
-    </div>
-  </div>
-  <div class="col-md-3">
-  </div>
-</div>
-
-<h1>{{filtSessions.length}} Sessions</h1>
-<table class="table table-striped table-hover">
-  <thead>
-    <tr>
-      <th class="dr width15" sort-header label="'start'" order=sesFilter.orderBy>Date</th>
-      <th class="dr width15" sort-header label="'nLogs'" order=sesFilter.orderBy>
-        # Logs <small style="color:#aaa">(<span style="color: #777">USER</span>|<span style="color: #aaa">SYS</span>)</small>
-      </th>
-      <!-- <th ng-click=orderBy('nLogs') class="dr width15" style="cursor:pointer"># Logs <small style="color:#aaa">(<span style="color: #777">USER</span>|<span style="color: #aaa">SYS</span>)</small></th> -->
-      <th class="dr width15" style="cursor:pointer">Start</th>
-      <th class="dr width15" style="cursor:pointer">Duration</th>
-      <th class="dr width15" style="cursor:pointer">Client</th>
-      <th class="dr width25" style="cursor:pointer">Component</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr
-    style="cursor:pointer"
-    ng-click="redirect(session)"
-    ng-repeat="session in pagedData">
-      <td>{{session.start | date : 'longDate'}}</td>
-      <td>{{session.nLogs}} <small style="color:#aaa">(<span style="color: #777">{{session.nUserLogs}}</span>|<span style="color: #aaa">{{nSysLogs(session)}}</span>)</small></td>
-      <!-- <td>{{session.nLogs}}/{{nSysLogs(session)}}/{{session.nUserLogs}}</td> -->
-      <td>{{session.start | date : 'shortTime'}}</td>
-      <td>{{duration(session) | duration}}</td>
-      <td>{{session.user}}</td>
-      <td>{{session.component}}</td>
-    </tr>
-  </tbody>
-</table>
-
-<paginate current-page=currentPage number-of-pages=numberOfPages></paginate>
\ No newline at end of file
diff --git a/dashboard/lib/templates/modals/activity.html b/dashboard/lib/templates/modals/activity.html
deleted file mode 100644
index 62fa1f3..0000000
--- a/dashboard/lib/templates/modals/activity.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<div class="modal-header">
-    <h3 class="modal-title">Unique Activities</h3>
-</div>
-<div class="modal-body">
-  <ul class="list-group">
-    <li ng-repeat="activity in activities | orderBy : 'key'" class="list-group-item">
-      {{activity.key}} <span class="badge">{{activity.values.length}}</span>
-      </li>
-  </ul>
-</div>
\ No newline at end of file
diff --git a/dashboard/lib/templates/partials/select.html b/dashboard/lib/templates/partials/select.html
deleted file mode 100644
index 1cd0431..0000000
--- a/dashboard/lib/templates/partials/select.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<a>
-  <span bind-html-unsafe="match.label | typeaheadHighlight:query"></span>
-  <span>({{match.model.values.length}})</span>
-</a>
\ No newline at end of file
diff --git a/dashboard/lib/templates/session.html b/dashboard/lib/templates/session.html
deleted file mode 100644
index 620b15e..0000000
--- a/dashboard/lib/templates/session.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<ul class="list-group">
-  <li class="list-group-item">
-    <h1>{{component.name}}</h1>
-    <div><b>Version:</b> {{component.version}}</div>
-    <div>
-      <b>Session:</b>
-      {{logs[0].sessionID}}
-      <!-- <my-download id="content" get-data="getBlob()">
-      </my-download> -->
-    </div>
-  </li>
-  <li class="list-group-item">
-    <b>Date Collected:</b> {{logs[0].timestamp | date : 'medium'}}<em style="color: #aaa"> for {{duration() | duration}}</em>
-  </li>
-  <li class="list-group-item">
-    <b># logs:</b> {{logs.length}}
-  </li>
-</ul>
-<h4>Workflow Legend:</h4>
-<wf-legend height=30></wf-legend>
-<hr>
-<div style="cursor: pointer" ng-click="activityModal()" class="pull-right">{{activities.length}} Unique Activites &nbsp;<span class="glyphicon glyphicon-th-large"></span></div>
-<h4>Recorded Activities</h4> 
-<wf-state-chart height=100 logs=logs timebounds=timebounds></wf-state-chart>
-<hr>
-<h3>{{filtData.length}} of {{logs.length}}</h3>
-<table class="table table-striped table-hover">
-  <thead>
-    <tr class="mysize-100" >
-      <th class="dr width1"></th>
-      <th class="dr width5"></th>
-      <th class="dr width5">Type</th>
-      <th class="dr width12">Workflow</th>
-      <th class="dr width22">Activity</th>
-      <th class="dr width40">Description</th>
-      <th class="dr width15" sort-header label="'timestamp'" order=orderBy>Timestamp</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr
-    style="cursor:pointer"
-    ng-click="redirect(session)"
-    ng-repeat="log in pagedData"
-    class="animate">
-      <td style="background-color: {{log.color}}"class="dr wf marker"></td>
-      <td>{{log.index}}</td>
-      <td>{{log.type}}</td>
-      <td>{{log.parms.name}}</td>
-      <td>{{log.parms.activity}}</td>
-      <td>{{log.parms.desc}}</td>
-      <td>{{log.timestamp | date : 'hh:mm:ss.sss a'}}</td>
-    </tr>
-  </tbody>
-</table>
-<paginate current-page=currentPage number-of-pages=numberOfPages></paginate>
\ No newline at end of file
diff --git a/dashboard/lib/templates/stats-comp-activity.html b/dashboard/lib/templates/stats-comp-activity.html
deleted file mode 100644
index 9e73d95..0000000
--- a/dashboard/lib/templates/stats-comp-activity.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div class="fixed-info">
-  <div></div>
-  <div class="axis"></div>
-</div>
-<!-- <div class="components">
-  <ol></ol>
-</div> -->
-<div class="canvas"></div>
-<comp-by-activity></comp-by-activity>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/albums.handlebars.temp b/dashboard/lib/templates_old/albums.handlebars.temp
deleted file mode 100644
index 7af6fad..0000000
--- a/dashboard/lib/templates_old/albums.handlebars.temp
+++ /dev/null
@@ -1,63 +0,0 @@
-<table class="table table-hover">
-  <thead>
-    <tr>
-	    <th class="mysize-10" ></th>
-      <th class="mysize-5" style="cursor:pointer">Type</th>
-      <th class="mysize-15" style="cursor:pointer">Workflow</th>
-      <th class="mysize-10" style="cursor:pointer">Activity</th>
-      <th class="mysize-30" style="cursor:pointer">Description</th>
-      <th style="cursor:pointer">Timestamp</th>       
-    </tr>
-  </thead>
-  <tbody>
-    {{#each}}                 
-    <tr {{bind-attr class="isSys:success"}}>
-    	<td>
-    		<div {{bind-attr class=":my-indicator feedback"}}></div>
-    		<a href="" {{action 'createLog' this}}><span class="glyphicon glyphicon-chevron-down add-new"></span></a>
-    		{{#if feedback}}
-    		<a href="" {{action "editLog"}}><span class="glyphicon glyphicon-edit"></span></a>
-				<a href="" {{action 'removeLog' this}}><span class="glyphicon glyphicon-remove"></span></a>
-				{{/if}}
-    	</td>            
-      <td>{{activityType}}</td>
-      <td>
-      	<div class="wf-code" {{bind-attr style="wfColor"}}"></div>
-      	{{#if isEditing}}
-	    	{{view Ember.Select
-	       content=wfStates2
-	       optionValuePath="content.id"
-	       optionLabelPath="content.name"
-	       class="form-control dave"
-	       value=wfState 
-	       action="updateLog"}}
-			  {{!-- {{view Ember.Select content=wfStates class="form-control dave" value=wfS action="updateLog"}} --}}
-				{{else}}
-				  {{wfStateFormat}}
-				{{/if}}
-			</td>
-      <td>
-      	{{#if isEditing}}
-				  {{input type="text" placeholder='add activity' value=activity class="form-control dave" action="updateLog"}}
-				{{else}}
-				  {{activity}}
-				{{/if}}
-			</td>
-      <td>
-      	{{#if isEditing}}
-				  {{input type="text" placeholder='add activity description' value=activityDesc class="form-control dave" action="updateLog"}}
-				{{else}}
-				  {{activityDesc}}
-				{{/if}}
-      </td>
-      <td>
-      	{{#if isEditing}}
-		  		{{input type="text" value=newTimestamp class="form-control dave" action="updateLog"}}
-				{{else}}
-		  		{{format-time timestamp}}
-				{{/if}}				
-			</td>
-    </tr>       
-    {{/each}}
-  </tbody>
-</table>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/application.handlebars b/dashboard/lib/templates_old/application.handlebars
deleted file mode 100644
index 310bc46..0000000
--- a/dashboard/lib/templates_old/application.handlebars
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="container">     
-  <div class="navbar navbar-default" role="navigation">
-  <div class="navbar-header">   
-    <a class="navbar-brand" href="#">XDATA Logging Dashboard</a>
-  </div>
-  <div class="navbar-collapse collapse">
-    <ul class="nav navbar-nav">          
-      <li class="active">{{#link-to 'sessions'}}By Session{{/link-to}}</li>
-      <li><a href="sphinx_docs">Docs</a></li>
-    </ul>
-    <ul class="nav navbar-text navbar-nav navbar-right">
-      <li {{action "record"}}><span class="glyphicon glyphicon-record"></span></li>          
-    </ul>
-  </div>
-  </div>      
-  
-  {{outlet}}
-
-</div>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/band.handlebars.temp b/dashboard/lib/templates_old/band.handlebars.temp
deleted file mode 100644
index 306579b..0000000
--- a/dashboard/lib/templates_old/band.handlebars.temp
+++ /dev/null
@@ -1,4 +0,0 @@
-<h1>{{component}}</h1>
-<h6>{{id}}</h6>
-{{render 'albums' albums}}
-
diff --git a/dashboard/lib/templates_old/bands.handlebars.temp b/dashboard/lib/templates_old/bands.handlebars.temp
deleted file mode 100644
index 5fb0898..0000000
--- a/dashboard/lib/templates_old/bands.handlebars.temp
+++ /dev/null
@@ -1,26 +0,0 @@
-<h1>{{length}} Sessions</h1> 
-<table class="table table-striped table-hover">
-  <thead>
-    <tr>
-	    <th class="mysize-8" style="cursor:pointer">Collection Date</th>
-      <th style="cursor:pointer">Total/SYS/USER</th>      
-      <th style="cursor:pointer">Start</th>
-      <th style="cursor:pointer">Duration</th>
-      <th style="cursor:pointer">Client</th>
-      <th style="cursor:pointer">Component</th>           
-    </tr>
-  </thead>
-  <tbody>
-    {{#each}}
-    <tr class="draper" style="cursor:pointer" {{action "link" this}}>           
-      <td>{{format-date minTime}}</td>
-      <td>{{albums.length}}/{{nUserLogs}}/{{nSysLogs}}</td>
-      <td>{{format-time minTime}}</td>
-      <td>{{format-time maxTime}}</td>
-      {{!-- <td>{{format-duration duration}}</td> --}}
-      <td>{{albums.length}}</td>
-      <td>{{component}}</td>      
-    </tr>       
-    {{/each}}
-  </tbody>
-</table>
diff --git a/dashboard/lib/templates_old/dession.handlebars.temp b/dashboard/lib/templates_old/dession.handlebars.temp
deleted file mode 100644
index 1491fb0..0000000
--- a/dashboard/lib/templates_old/dession.handlebars.temp
+++ /dev/null
@@ -1,5 +0,0 @@
-Logs
-{{extra}}
-
-{{render "logs" logs}}
-
diff --git a/dashboard/lib/templates_old/dessions.handlebars.temp b/dashboard/lib/templates_old/dessions.handlebars.temp
deleted file mode 100644
index 9d6cbda..0000000
--- a/dashboard/lib/templates_old/dessions.handlebars.temp
+++ /dev/null
@@ -1,30 +0,0 @@
-<h1>{{count}} Sessions</h1> 
-asdsasd
-<table class="table table-striped table-hover">
-  <thead>
-    <tr>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer"># Msgs</th>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer"># Sys</th>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer"># User</th>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer">Start</th>
-      <th class="draper" data-wf="2" data-activity="sorting"style="cursor:pointer">Stop</th>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer">Duration</th>
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer">Client</th>  
-      <th class="draper" data-wf="2" data-activity="sorting" style="cursor:pointer">Component</th>          
-    </tr>
-  </thead>
-  <tbody>
-    {{#each}}
-    <tr class="draper" style="cursor:pointer" {{action "link" this}}>           
-      <td>{{numLogs}}</td>
-      <td>{{numSysActions}}</td>
-      <td>{{numUserActions}}</td>
-      <td>{{format-date minTime}}</td>
-      <td>{{format-date maxTime}}</td>
-      <td>{{format-duration duration}}</td>
-      <td>{{client}}</td>
-      <td>{{component}}</td>
-    </tr>       
-    {{/each}}
-  </tbody>
-</table>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/index.handlebars b/dashboard/lib/templates_old/index.handlebars
deleted file mode 100644
index f5be645..0000000
--- a/dashboard/lib/templates_old/index.handlebars
+++ /dev/null
@@ -1,4 +0,0 @@
-{{#unless model.isLoaded}}
-  Loading data...
-{{/unless}}
-{{start}}
diff --git a/dashboard/lib/templates_old/logs.handlebars b/dashboard/lib/templates_old/logs.handlebars
deleted file mode 100644
index 69f99fe..0000000
--- a/dashboard/lib/templates_old/logs.handlebars
+++ /dev/null
@@ -1,79 +0,0 @@
-<div style="height: 30px;">
-	{{legend-chart counts=counts}}
-</div>
-<div style="height: 150px;">
-{{context-chart wfData=wfData logs=userLogs}}
-</div>
-<div>
-	{{activity-chart logs=userLogs width=500 height=200}}
-</div>
-
-	<div style="padding-right: 15px;">
-		<table class="table table-hover" style="margin-bottom: 0px; overflow-y: scroll">
-		  <thead>
-		    <tr class="mysize-100" >
-			    <th class="mysize-10" ></th>
-		      <th class="mysize-5" style="cursor:pointer">Type</th>
-		      <th class="mysize-15" style="cursor:pointer">Workflow</th>
-		      <th class="mysize-15" style="cursor:pointer">Activity</th>
-		      <th class="mysize-40" style="cursor:pointer">Description</th>
-		      <th class="mysize-15" style="cursor:pointer">Timestamp</th>       
-		    </tr>
-		  </thead>	  
-		</table>
-	</div>
-	<div class="table-wrapper">
-		<table class="table table-hover">			
-		  <tbody>
-		    {{#each}}                 
-		    <tr {{bind-attr class="isSys:success"}}>
-		    	<td class="mysize-10">
-		    		<div {{bind-attr class=":my-indicator feedback"}}></div>
-		    		<a href="" {{action 'createLog' this}}><span class="glyphicon glyphicon-chevron-down add-new"></span></a>
-		    		{{#if feedback}}
-		    		<a href="" {{action "editLog"}}><span class="glyphicon glyphicon-edit"></span></a>
-						<a href="" {{action 'removeLog' this}}><span class="glyphicon glyphicon-remove"></span></a>
-						{{/if}}
-		    	</td>            
-		      <td class="mysize-5">{{format-action activityType}}</td>
-		      <td class="mysize-15">
-		      	<div class="wf-code" {{bind-attr style="wfColor"}}"></div>
-		      	{{#if isEditing}}
-			    	{{view Ember.Select
-			       content=wfStates2
-			       optionValuePath="content.id"
-			       optionLabelPath="content.name"
-			       class="form-control dave"
-			       value=wfState 
-			       action="updateLog"}}
-					  {{!-- {{view Ember.Select content=wfStates class="form-control dave" value=wfS action="updateLog"}} --}}
-						{{else}}
-						  {{wfStateFormat}}
-						{{/if}}
-					</td>
-		      <td class="mysize-15">
-		      	{{#if isEditing}}
-						  {{input type="text" placeholder='add activity' value=activity class="form-control dave" action="updateLog"}}
-						{{else}}
-						  {{activity}}
-						{{/if}}
-					</td>
-		      <td class="mysize-40">
-		      	{{#if isEditing}}
-						  {{input type="text" placeholder='add activity description' value=activityDesc class="form-control dave" action="updateLog"}}
-						{{else}}
-						  {{activityDesc}}
-						{{/if}}
-		      </td>
-		      <td class="mysize-15">
-		      	{{#if isEditing}}
-				  		{{input type="text" value=newTimestamp class="form-control dave" action="updateLog"}}
-						{{else}}
-				  		{{format-time timestamp}}
-						{{/if}}				
-					</td>
-		    </tr>       
-		    {{/each}}
-		  </tbody>
-		</table>
-	</div>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/logs.handlebars.temp b/dashboard/lib/templates_old/logs.handlebars.temp
deleted file mode 100644
index 9c83bd0..0000000
--- a/dashboard/lib/templates_old/logs.handlebars.temp
+++ /dev/null
@@ -1,101 +0,0 @@
-<ul class="list-group">
-  <li class="list-group-item">
-    <b>Session:</b>
-    <a href="data: {{unbound stuff}}" download="data.json">
-      {{session}}  <span class="glyphicon glyphicon-download"></span>
-    </a>       
-  </li>
-  <li class="list-group-item">
-    <b>Date Collected:</b> {{format-date-full minTime}} ({{format-duration-human duration}})
-  </li> 
-  <li class="list-group-item">
-    <b># logs:</b> {{length}}
-  </li>     
-</ul>
-<div style="height: 30px;">
-	{{legend-chart counts=counts}}
-</div>
-
-<div style="height: 150px;">
-{{context-chart wfData=wfData logs=userLogs}}
-</div>
-
-<div>
-	{{activity-chart logs=userLogs width=500 height=200}}
-</div>
-
-<ul class="list-group">
-	<li class="list-group-item header">  
-  	<div class="row">	  	
-	    <div class="col-md-2">
-	    Index    	
-	    </div>
-	    <div class="col-md-2">
-	    Timestamp    
-			</div>
-			<div class="col-md-2">
-	    Workflow State   
-			</div>
-			<div class="col-md-2">
-			Activity   
-			</div>
-			<div class="col-md-4">
-			Description   
-			</div>	    				
-		</div> 			
-  </li>
-	{{#each }}
-  <li {{bind-attr class=":list-group-item feedback:editable"}}>  
-  	<div class="row">
-  	{{!-- <div class="col-md-1">
-    	<a href="" {{action 'createLog' this}}><span class="glyphicon glyphicon-chevron-down add-new"></span></a> 
-    </div> --}}
-    
-    {{!-- <div class="timestamp">{{format-time timestamp}}</div> --}}
-    <div class="col-md-2">
-    <a href="" {{action 'createLog' this}}><span class="glyphicon glyphicon-chevron-down add-new"></span></a>
-    	{{format-id id}}
-    </div>
-    <div class="col-md-2">
-    {{#if isEditing}}
-		  {{input type="text" value=newTimestamp class="form-control dave" action="updateLog"}}
-		{{else}}
-		  {{format-time timestamp}}
-		{{/if}}
-		</div>  
-    {{!-- <span class="seperator"></span> --}}
-		<div class="col-md-2">
-		<div class="wf-code" {{bind-attr style="wfColor"}}"></div>
-    {{#if isEditing}}
-    	{{view Ember.Select
-       content=wfStates2
-       optionValuePath="content.id"
-       optionLabelPath="content.name"
-       class="form-control dave"
-       value=wfState 
-       action="updateLog"}}
-		  {{!-- {{view Ember.Select content=wfStates class="form-control dave" value=wfS action="updateLog"}} --}}
-		{{else}}
-		  {{wfStateFormat}}
-		{{/if}}    
-		</div>    
-    {{!-- <span class="seperator"></span> --}}
-    <div class="col-md-2">
-    {{#if isEditing}}
-		  {{input type="text" placeholder=activity value=activity class="form-control dave" action="updateLog"}}
-		{{else}}
-		  {{activity}}
-		{{/if}}
-		</div>
-		<div class="col-md-4">
-		{{#if feedback}}
-		<div class="pull-right">
-			<a href="" {{action "editLog"}}><span class="glyphicon glyphicon-edit"></span></a>
-			<a href="" {{action 'removeLog' this}}><span class="glyphicon glyphicon-remove"></span></a>
-		</div>		
-		{{/if}}
-		</div>
-		</div> 			
-  </li>
-  {{/each}}
-</ul>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/post.handlebars.temp b/dashboard/lib/templates_old/post.handlebars.temp
deleted file mode 100644
index 5c9a1a0..0000000
--- a/dashboard/lib/templates_old/post.handlebars.temp
+++ /dev/null
@@ -1,5 +0,0 @@
-<article class="post">
-  <h2>{{title}}</h2>
-  <p>{{content}}</p>
-  <aside></aside>
-</article>
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/session.handlebars b/dashboard/lib/templates_old/session.handlebars
deleted file mode 100644
index 697f915..0000000
--- a/dashboard/lib/templates_old/session.handlebars
+++ /dev/null
@@ -1,17 +0,0 @@
-<ul class="list-group">
-  <li class="list-group-item">
-    <h1>{{component}}</h1>    
-    <b>Session:</b>
-    <a {{bind-attr href=downloadData}} download="data.json">
-      {{id}}  <span class="glyphicon glyphicon-download"></span>
-    </a>       
-  </li>
-  <li class="list-group-item">
-    <b>Date Collected:</b> {{format-date-full minTime}} <em>for {{format-duration-human duration}}</em>
-  </li> 
-  <li class="list-group-item">
-    <b># logs:</b> {{logs.length}}
-  </li>     
-</ul>
-{{render 'logs' logs}}
-
diff --git a/dashboard/lib/templates_old/session/session-meta.handlebars b/dashboard/lib/templates_old/session/session-meta.handlebars
deleted file mode 100644
index 4b1a7b4..0000000
--- a/dashboard/lib/templates_old/session/session-meta.handlebars
+++ /dev/null
@@ -1,3 +0,0 @@
-{{format-date minTime}}
-{{format-time minTime}}
-{{format-time maxTime}}
\ No newline at end of file
diff --git a/dashboard/lib/templates_old/sessions.handlebars b/dashboard/lib/templates_old/sessions.handlebars
deleted file mode 100644
index 8da33dd..0000000
--- a/dashboard/lib/templates_old/sessions.handlebars
+++ /dev/null
@@ -1,26 +0,0 @@
-<h1>{{length}} Sessions</h1> 
-<table class="table table-striped table-hover">
-  <thead>
-    <tr>
-      <th class="mysize-8" style="cursor:pointer">Collection Date</th>
-      <th style="cursor:pointer">Total/SYS/USER</th>      
-      <th style="cursor:pointer">Start</th>
-      <th style="cursor:pointer">Duration</th>
-      <th style="cursor:pointer">Client</th>
-      <th style="cursor:pointer">Component</th>           
-    </tr>
-  </thead>
-  <tbody>
-    {{#each}}
-    <tr class="draper" style="cursor:pointer" {{action "link" this}}>           
-      <td>{{format-date start}}</td>
-      <td>{{logs.length}}/{{nUserLogs}}/{{nSysLogs}}</td>
-      <td>{{format-time-simple minTime}}</td>
-      <td>{{format-duration-human duration}}</td>
-      {{!-- <td>{{format-duration duration}}</td> --}}
-      <td>{{user}}</td>
-      <td>{{component}}</td>      
-    </tr>       
-    {{/each}}
-  </tbody>
-</table>
diff --git a/dashboard/lib/templates_old/todos.handlebars.temp b/dashboard/lib/templates_old/todos.handlebars.temp
deleted file mode 100644
index 91c76f6..0000000
--- a/dashboard/lib/templates_old/todos.handlebars.temp
+++ /dev/null
@@ -1,30 +0,0 @@
-Todos
-<ul class="list-group">
-	{{#each item in todos}}
-  <li {{bind-attr class=":list-group-item editable:editable"}}>
-  	 
-    <span class="glyphicon glyphicon-chevron-down add-new" {{action 'createTodo'}}></span>
-    <div class="timestamp">{{format-time item.timestamp}}</div>
-    <span class="seperator"></span>
-		<div class="activity">
-    {{#if editable}}
-		  {{input type="text" placeholder=parms value=newActivity class="dave"}}
-		{{else}}
-		  {{parms.activity}}
-		{{/if}}
-		</div>    
-    <span class="seperator"></span>
-    <div class="wf_state">
-    {{#if editable}}
-		  {{view Ember.Select content=wfStates class="form-control dave" value=newWfState}}
-		{{else}}
-		  {{parms.wf_state}}
-		{{/if}}
-		</div>
-		{{#if editable}}
-		  <span class="glyphicon glyphicon-remove pull-right" {{action 'removeLog'}}></span> 
-		{{/if}}
-		
-  </li>
-  {{/each}}
-</ul>
\ No newline at end of file
diff --git a/dashboard/package.json b/dashboard/package.json
deleted file mode 100644
index 6edfdb7..0000000
--- a/dashboard/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "xdata-dashboard",
-  "description": "Dashboard for XDATA logs.",
-  "version": "0.1.0",
-  "homepage": "https://github.com/draperlab/xdatalogger",
-  "author": {
-    "name": "David Reed",
-    "email": "dreed@draper.com"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/draperlab/xdatalogger.git"
-  },
-  "bugs": {
-    "url": "https://github.com/draperlab/xdatalogger/issues"
-  },
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://github.com/draperlab/xdatalogger/blob/master/LICENSE-MIT"
-    }
-  ],
-  "main": "lib/xdata-dashboard",
-  "engines": {
-    "node": ">= 0.10.0"
-  },
-  "scripts": {
-    "test": "grunt nodeunit"
-  },
-  "dependencies": {
-    "express": "3.5.1",
-    "mongoose": "3.8.8",
-    "jade": "1.3.1"
-  },
-  "devDependencies": {
-    "grunt-contrib-concat": "~0.3.0",
-    "grunt-contrib-uglify": "~0.2.0",
-    "grunt-contrib-jshint": "~0.6.0",
-    "grunt-contrib-nodeunit": "~0.2.0",
-    "grunt-contrib-watch": "~0.4.0",
-    "grunt-ember-templates": "~0.4.19",
-    "grunt-contrib-copy": "~0.5.0",
-    "grunt-contrib-less": "~0.10.0",
-    "grunt": "~0.4.4"
-  },
-  "keywords": []
-}
\ No newline at end of file
diff --git a/dashboard/scripts/install.sh b/dashboard/scripts/install.sh
new file mode 100644
index 0000000..50cbbe6
--- /dev/null
+++ b/dashboard/scripts/install.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+sudo -E apt-get update
+
+sudo -E apt-get -y install openjdk-7-jdk
+
+wget http://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86_64.sh
+
+bash Miniconda-3.7.0-Linux-x86_64.sh -b
+
+#wget http://09c8d0b2229f813c1b93-c95ac804525aac4b6dba79b00b39d1d3.r79.cf1.rackcdn.com/Anaconda-2.1.0-Linux-x86_64.sh
+
+
+echo export PATH="/home/vagrant/miniconda/bin:$PATH" >> $HOME/.bashrc
+
+source $HOME/.bashrc
+
+conda update --yes conda
+
+wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.2.deb
+sudo dpkg -i elasticsearch-1.4.2.deb 
+sudo service elasticsearch start
+
+wget https://download.elasticsearch.org/logstash/logstash/packages/debian/logstash_1.4.2-1-2c0f5a1_all.deb
+sudo dpkg -i logstash_1.4.2-1-2c0f5a1_all.deb
+sudo service logstash start
+
+wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.tar.gz
+tar -xvf kibana-3.1.2.tar.gz
+
+sudo cp /vagrant/files/elasticsearch.yml /etc/elasticsearch/
+sudo cp /vagrant/files/xdata.conf /etc/logstash/conf.d/
+
+#config
+#/etc/elasticsearch/elasticsearch.yml
+
+#logstash conf
+# /etc/logstash/conf.d/test.conf
+
+#sudo twistd -y twisted_app.py
\ No newline at end of file
diff --git a/dashboard/scripts/restart.sh b/dashboard/scripts/restart.sh
new file mode 100644
index 0000000..426e818
--- /dev/null
+++ b/dashboard/scripts/restart.sh
@@ -0,0 +1,82 @@
+curl -XDELETE 'http://127.0.0.1:9200/xdata/'
+
+curl -XPUT 'http://127.0.0.1:9200/xdata/'
+
+curl -XPUT 'http://127.0.0.1:9200/xdata/_mapping/USERACTION' -d '
+  {"USERACTION" : {
+    "properties" : {
+      "@timestamp" : {
+        "type" : "date",
+        "format" : "dateOptionalTime"
+      },
+      "@version" : {
+        "type" : "string"
+      },
+      "apiVersion" : {
+        "type" : "string"
+      },
+      "client" : {
+        "type" : "string"
+      },
+      "component" : {
+        "properties" : {
+          "name" : {
+          	"index" : "not_analyzed",
+            "type" : "string"
+          },
+          "version" : {
+            "type" : "string"
+          }
+        }
+      },
+      "host" : {
+        "type" : "string"
+      },
+      "impLanguage" : {
+        "type" : "string"
+      },
+      "message" : {
+        "type" : "string"
+      },
+      "parms" : {
+        "properties" : {
+          "activity" : {
+          	"index" : "not_analyzed",
+            "type" : "string"
+          },
+          "desc" : {
+            "type" : "string"
+          },
+          "wf_state" : {
+            "type" : "long"
+          },
+          "wf_state_longname" : {
+          	"index" : "not_analyzed",
+            "type" : "string"
+          },
+          "wf_version" : {
+            "type" : "string"
+          }
+        }
+      },
+      "path" : {
+        "type" : "string"
+      },
+      "sessionID" : {
+      	"index" : "not_analyzed",
+        "type" : "string"
+      },
+      "timestamp" : {
+        "type" : "date",
+        "format" : "dateOptionalTime"
+      },
+      "type" : {
+        "type" : "string"
+      }
+    }
+  }
+}
+'
+
+# sudo service elasticsearch restart
+# sudo service logstash restart
\ No newline at end of file
diff --git a/dashboard/server/app.js b/dashboard/server/app.js
deleted file mode 100644
index 8839efe..0000000
--- a/dashboard/server/app.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*jshint node:true*/
-var express = require('express');
-var http = require('http');
-var path = require('path');
-
-var app = express();
-var server = http.createServer(app);
-
-app.set('port', process.env.VCAP_APP_PORT || 1337);
-app.set('views', path.join(__dirname, 'views'));
-app.set('view engine', 'jade');
-app.use(express.favicon());
-app.use(function(req, res, next) {
-  res.header("Access-Control-Allow-Origin", "*");
-  res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
-  next();
-});
-app.use(express.logger('dev'));
-app.use(express.bodyParser());
-app.use(express.methodOverride());
-app.use(app.router);
-app.use(express.static(path.join(__dirname, '../dist')));
-
-// Handle Errors gracefully
-app.use(function(err, req, res, next) {
-	if(!err) return next();
-	console.log(err.stack);
-	res.json({error: true});
-});
-
-// Main App Page
-app.get('/', function(req, res) {
-	res.render('index');
-});
-
-require('./routes/logger')(app);
-require('./routes/dashboard')(app);
-
-// start server
-server.listen(app.get('port'), function(){
-  console.log('Express server listening on port ' + app.get('port'));
-});
diff --git a/dashboard/server/models/index.js b/dashboard/server/models/index.js
deleted file mode 100644
index 839f477..0000000
--- a/dashboard/server/models/index.js
+++ /dev/null
@@ -1,100 +0,0 @@
-var mongoose = require('mongoose');
-
-var db = mongoose.createConnection('localhost', 'dave');
-
-Schema = mongoose.Schema;
-
-var keywordSchema = new Schema({ 
-	name: { type: String, unique: true, required: true } 
-});
-var entitySchema = new Schema({ 
-	name: { type: String, unique: true, required: true } 
-});
-var userSchema = new Schema({ 
-	name: { type: String, unique: true, required: true } 
-});
-
-var hypothesisSchema = Schema({
-  title	: { type: String, default: '' },
-  description	: { type: String, default: '' },
-  observations	: [
-  {
-  	obsvId: { type: Schema.Types.ObjectId, ref: 'Observation' },
-  	comments: [String],
-  	hits: [Number],
-  	summary: String
-  }  
-  ],
-  keywords	: [{ type: Schema.Types.ObjectId, ref: 'Keyword' }],
-  entities	: [{ type: Schema.Types.ObjectId, ref: 'Entity' }]
-});
-
-var documentSchema = Schema({
-  title	: { type: String, default: '' },
-  description	: { type: String, default: '' },
-  source: { type: String, default: '' },  
-  observation: { type: Schema.Types.ObjectId, ref: 'Observation' },
-  keywords	: [{ type: Schema.Types.ObjectId, ref: 'Keyword' }],
-  entities	: [{ type: Schema.Types.ObjectId, ref: 'Entity' }]
-});
-
-var observationSchema = Schema({
-  title	: { type: String, default: '' },
-  description	: { type: String, default: '' },
-  documents	: [
-  {
-  	docId: { type: Schema.Types.ObjectId, ref: 'Document' },
-  	comments: [String],
-  	hits: [Number],
-  	summary: String
-  }  
-  ],
-  keywords	: [{ type: Schema.Types.ObjectId, ref: 'Keyword' }],
-  entities	: [{ type: Schema.Types.ObjectId, ref: 'Entity' }]
-});
-
-var Keyword = db.model('Keyword', keywordSchema);
-var Entity = db.model('Entity', entitySchema);
-var User = db.model('User', userSchema);
-
-var Hypothesis = db.model('Hypothesis', hypothesisSchema);
-var Observation = db.model('Observation', observationSchema);
-var Document = db.model('Document', documentSchema);
-
-// createAll()
-
-exports.Observation = Observation;
-exports.Keyword = Keyword;
-exports.Entity = Entity;
-exports.Document = Document;
-
-function createAll() {
-	// drop all collections
-	[Keyword, Entity, User, Observation].forEach(function(d) {
-		d.remove({}, function(err) { 
-			console.log('collection removed') 
-		});
-	});
-
-	var kws = d3.range(10).map(function(d) {
-		a = new Keyword({name: 'keyword_' + d})
-		a.save();
-		return a;
-	})
-
-	var entities = d3.range(10).map(function(d) {
-		a = new Entity({name: 'entity_' + d})
-		a.save();
-		return a;
-	})
-
-	var observations = d3.range(10).map(function(d) {
-		var a = new Observation({
-			title: 'observation_' + d,
-			keywords: d3.shuffle(kws).slice(0,3).map(function(d){ return d._id; }),
-			entities: d3.shuffle(entities).slice(0,3).map(function(d){ return d._id; })
-		});
-		a.save();
-		return a;
-	})	
-}
\ No newline at end of file
diff --git a/dashboard/server/routes/dashboard.js b/dashboard/server/routes/dashboard.js
deleted file mode 100644
index b0fc67f..0000000
--- a/dashboard/server/routes/dashboard.js
+++ /dev/null
@@ -1,69 +0,0 @@
-//Dashboard endpoints
-var mongojs = require("mongojs");
-db = mongojs.connect("xdata", ["logs", "sessions", "feedback"]);
-
-// http://docs.mongodb.org/manual/reference/operator/aggregation/cond/
-module.exports = function(app){
-	app.get('/sessions', function(req, res){
-    // Allow CORS
-    var origin = (req.headers.origin || "*");
-    res.header("Access-Control-Allow-Origin", origin);
-
-		var query = [{$group: {
-	    '_id':'$sessionID',
-	    'component': {'$min': '$component.name'},
-	    'user': {'$min': '$client'},
-	    'start': {'$min': '$timestamp'},
-	    'stop': {'$max': '$timestamp'},
-	    nLogs: {'$sum': 1},
-	    nUserLogs: { $sum: 
-	    	{ $cond: 
-	    		[{ $eq: [ "$type", "USERACTION" ] } , 1, 0] 
-	    	} 
-	    }
-	  }}
-	  ];
-		if (req.params.id) {
-			var match = [{$match: {sessionID: req.params.id}}];
-			query = match.concat(query);
-		}
-
-	  db.logs.aggregate(query, function(err, result) {
-		  res.json(result);
-	  })
-	});
-
-
-	app.get('/sessions/:id', function(req, res){
-
-    // Allow CORS
-    var origin = (req.headers.origin || "*");
-    res.header("Access-Control-Allow-Origin", origin);
-
-		var query = {
-			sessionID: req.params.id
-		};
-
-	  db.logs.find(query, function(err, result) {
-	  	res.json(result);
-	  })
-	});
-
-  app.get('/stats/activities', function(req, res) {
-    var query = [
-    {'$match': {'type': 'USERACTION'}},
-    {'$group': {
-        '_id':'$parms.activity',
-        'nLogs': {'$sum': 1},
-        'components': {'$addToSet': '$component.name'},
-        'wfStates': {'$addToSet': '$parms.wf_state'}    
-        }
-    }
-    ]
-
-    db.logs.aggregate(query, function(err, result) {
-      res.json(result);
-    })
-
-  })
-}
\ No newline at end of file
diff --git a/dashboard/server/routes/logger.js b/dashboard/server/routes/logger.js
deleted file mode 100644
index 19b4696..0000000
--- a/dashboard/server/routes/logger.js
+++ /dev/null
@@ -1,55 +0,0 @@
-//Demo
-var mongojs = require("mongojs");
-db = mongojs.connect("xdata", ["logs", "sessions", "feedback"]);
-
-module.exports = function(app){
-	app.post('/send_log', function(req, res){
-		console.log('Received log');
-		// Allow CORS
-	  var origin = (req.headers.origin || "*");
-	  res.header("Access-Control-Allow-Origin", origin);
-
-		var data = req.body;
-    
-	  data.timestamp = new Date(data.timestamp)
-	  db.logs.insert(data, function (err, result) {
-	    res.json({});
-			res.end()
-	  });
-	});
-
-  // app.post('/logger', function(req, res){
-  //   console.log('Received logs');
-  //   // Allow CORS
-  //   var origin = (req.headers.origin || "*");
-  //   res.header("Access-Control-Allow-Origin", origin);
-
-  //   var data = req.body;
-    
-  //   data.timestamp = new Date(data.timestamp)
-  //   db.logs.insert(data, function (err, result) {
-  //     res.json({});
-  //     res.end()
-  //   });
-  // });
-
-	app.get('/register', function(req, res){
-  	console.log('Registering Session', req.connection.remoteAddress);
-
-  	// Allow CORS
-    var origin = (req.headers.origin || "*");
-    res.header("Access-Control-Allow-Origin", origin);
-
-  	var client_ip = req.connection.remoteAddress
-    var data = {client_ip: client_ip};
-
-    db.sessions.insert(data, function (err, result) {
-
-    	res.json({
-  			session_id: result._id,
-  			client_ip: req.connection.remoteAddress
-  		})
-      res.end()
-  	})
-  });
-}
\ No newline at end of file
diff --git a/dashboard/server/views/index.html b/dashboard/server/views/index.html
deleted file mode 100644
index ebbd44e..0000000
--- a/dashboard/server/views/index.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" ng-app='xdata-db'>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description" content="">
-    <meta name="author" content="">
-    <meta charset="UTF-8" />
-    <meta name="google" content="notranslate">
-    <meta http-equiv="Content-Language" content="en" />
-
-    <title>XDATA | Logging Dashboard</title>
-
-    <link rel="stylesheet" href="css/bootstrap.css">
-
-    <!-- add packages here -->
-
-    <!-- custom css -->
-    <link rel="stylesheet" href="css/style.css">
-  </head>
-
-  <body ng-controller="AppController">
-    <div class="navbar navbar-default navbar-static-top" role="navigation">
-      <div class="container">
-        <div class="navbar-header">
-          <draper-logo></draper-logo>
-          <a class="navbar-brand" href="#">{{title}}</a>
-        </div>
-        <div class="navbar-collapse collapse">
-          <ul class="nav navbar-nav">
-            <li bootstrap-nav ng-repeat="route in routes" ng-class="{ active: isActive()}" url=route.url name=route.name></li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Statistics <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li><a href="/#/stats/compActivity">Components Per Activity</a></li>     
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Examples <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li class="dropdown-header">Kitware</li>
-                <!-- <li><a href="/static/HospitalCosts/index2.html">Hospital Costs</a></li>    -->
-                <li><a href="http://10.1.98.102/year2/twitter-mentions-instrumented-v2/">Twitter Mentions</a></li>     
-                <!-- <li><a href="http://10.1.98.102/year2/twitter-geomap-instrumented-v2/ -->
-<!-- ">Twitter Geomap</a></li>      -->
-                <li class="divider"></li>
-                <li class="dropdown-header">Oculus</li>
-                <li><a href="http://10.1.98.104:8080/kiva/">Influent</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a href="#" class="dropdown-toggle">Documentation <b class="caret"></b></a>
-              <ul class="dropdown-menu">
-                <li><a href="/static/simple_guide">Getting Started</a></li> 
-                <li><a href="/static/wf_states">Workflow Guide</a></li> 
-                <li><a href="/static/doc/index.html">Full API</a></li>     
-              </ul>
-            </li>
-            <!-- <li><a href="/static/HospitalCosts/index2.html">Demo</a></li> -->
-            <!-- <li><a href="/static/doc/index.html">Documentation</a></li> -->
-            <!-- <li><a href="/#/wfDesc">Workflow Descriptions</a></li> -->
-          </ul>
-          <ul class="nav navbar-nav navbar-right">
-            <li><a href="">Login</a></li>
-          </ul>
-        </div><!--/.nav-collapse -->
-      </div>
-    </div>
-
-    <div class="container" ng-view>
-    </div>
-
-    <script src="js/assets.js"></script>
-
-    <!-- add packages here -->
-
-    <script src="js/src.js"></script>
-  </body>
-</html>
diff --git a/dashboard/server/views/index.jade b/dashboard/server/views/index.jade
deleted file mode 100644
index 3c95496..0000000
--- a/dashboard/server/views/index.jade
+++ /dev/null
@@ -1 +0,0 @@
-include index.html
\ No newline at end of file
diff --git a/dashboard/client/draper.activity_logger-2.1.1.js b/dashboard/test/draper.activity_logger-2.1.1.js
similarity index 100%
rename from dashboard/client/draper.activity_logger-2.1.1.js
rename to dashboard/test/draper.activity_logger-2.1.1.js
diff --git a/dashboard/client/draper.activity_worker-2.1.1.js b/dashboard/test/draper.activity_worker-2.1.1.js
similarity index 100%
rename from dashboard/client/draper.activity_worker-2.1.1.js
rename to dashboard/test/draper.activity_worker-2.1.1.js
diff --git a/dashboard/test/index.html b/dashboard/test/index.html
new file mode 100644
index 0000000..252a6b0
--- /dev/null
+++ b/dashboard/test/index.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8">
+	<style>
+		rect {
+			/*fill: None;*/
+			stroke: #aaa;
+		}
+	</style>
+	<title>Hello</title>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
+	<script src="draper.activity_logger-2.1.1.js"></script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
+</head>
+<body>
+	<div id="canvas"></div>
+	<div>
+		<p>Mouse over elements to simulate user actions.</p>  
+		<p>You should be able to see these coming through real time on the Kibana server.</p>
+		<p>Also, if you open the JavaScript console, you should see the logs going out.</p>
+	</div>
+	<script>
+	var activies = [
+		'activiy-A',
+		'activiy-B',
+		'activiy-C',
+		'activiy-D',
+		'activiy-E',
+		'activiy-F',
+		'activiy-G'
+	]
+	var colors = d3.scale.category10()
+	var svg = d3.select('#canvas').append('svg')
+	.attr({'w': 200, 'h': 200});
+
+	svg.selectAll('rect')
+	.data(d3.range(400))
+	.enter()
+	.append('rect')
+	.attr({
+		x: function(d) { return d%20*10; },
+		y: function(d) { return Math.floor(d/20)*10; },
+		fill: function(d) { return colors(d%7); },
+		height: 10,
+		width: 10,
+	})
+	.on('mouseover', function(d) {
+		ac.logUserActivity(
+		'description', // description
+		activies[d%activies.length], // activity_code
+		d%7 // workflow State
+		);
+	})
+
+
+	var worker = "draper.activity_worker-2.1.1.js"
+	var ac = new activityLogger(worker)
+	.testing(false) // simulate POST, won't send log
+	.echo(true) // log to console
+	.mute(['SYS']); // don't log SYSTEM actions
+
+	ac.registerActivityLogger(
+		"http://localhost:9000",
+		"my-component",
+		"v0.1"
+		);
+
+	ac.logUserActivity(
+	'User hovered over element to read popup', // description
+	'hover_start', // activity_code
+	ac.WF_EXPLORE // workflow State
+	);
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/dashboard/twisted_app.py b/dashboard/twisted_app.py
new file mode 100644
index 0000000..01c7f96
--- /dev/null
+++ b/dashboard/twisted_app.py
@@ -0,0 +1,111 @@
+from twisted.web.server import Site
+from twisted.web.static import File
+from twisted.internet import reactor
+from twisted.web.resource import Resource
+
+import logging
+from logging import config
+import logging.handlers
+
+import simplejson
+
+# logging configuration
+
+LOG_SETTINGS = {
+    'version': 1,
+    'handlers': {    
+        'file1': {
+            'class': 'logging.handlers.RotatingFileHandler',
+            'level': 'INFO',
+            'formatter': 'xdata',
+            'filename': '/var/log/xdata/xdata.log',
+            'mode': 'a',
+            'maxBytes': 100e6,
+            'backupCount': 10,
+        },
+        'file2': {
+            'class': 'logging.handlers.RotatingFileHandler',
+            'level': 'INFO',
+            'formatter': 'detailed',
+            'filename': '/var/log/xdata/xdata-error.log',
+            'mode': 'a',
+            'maxBytes': 100e6,
+            'backupCount': 10,
+        },
+    },
+    'formatters': {
+        'xdata': {
+            'format': '%(message)s',
+        },
+        'detailed': {
+            'format': '%(asctime)s %(module)-17s line:%(lineno)-4d ' \
+            '%(levelname)-8s %(message)s',
+        },
+        'email': {
+            'format': 'Timestamp: %(asctime)s\nModule: %(module)s\n' \
+            'Line: %(lineno)d\nMessage: %(message)s',
+        },
+    },
+    'loggers': {
+        'xdata': {
+            'level':'DEBUG',
+            'handlers': ['file1',]
+        },
+        'error': {
+            'level':'DEBUG',
+            'handlers': ['file2',]
+        },
+    }
+}
+
+config.dictConfig(LOG_SETTINGS)
+
+logger = logging.getLogger('xdata')
+logger_err = logging.getLogger('error')
+
+kibana = File('/home/vagrant/kibana-3.1.2')
+test = File('/vagrant/test')
+
+wf_dict = {
+    0: "WF_OTHER",
+    1: "WF_DEFINE",
+    2: "WF_GETDATA",
+    3: "WF_EXPLORE",
+    4: "WF_CREATE",
+    5: "WF_ENRICH",
+    6: "WF_TRANSFORM"
+}
+
+class Counter(Resource):
+    isLeaf = True
+    numberRequests = 0
+
+    def render_GET(self, request):
+        self.numberRequests += 1
+        request.setHeader("content-type", "text/plain")
+        return "I am request #" + str(self.numberRequests) + "\n"
+
+class Logger(Resource):
+    def render_POST(self, request):
+        newdata = request.content.getvalue()
+        newdata = simplejson.loads(newdata)
+        try:
+            for a in newdata:
+                if 'wf_state' in a['parms']:
+                    a['wf_state_longname'] = wf_dict[a['parms']['wf_state']]
+                
+                logger.info(simplejson.dumps(a))
+        except:
+            logger_err.error('logging error')
+
+        return ''
+
+root = Resource()
+root.putChild("kibana", kibana)
+root.putChild("test", test)
+
+root.putChild("counter", Counter())
+root.putChild("send_log", Logger())
+
+reactor.listenTCP(9000, Site(root))
+reactor.run()
\ No newline at end of file
