Clean up discourse.js

This commit is contained in:
Robin Ward
2013-02-26 14:54:43 -05:00
parent b9ccf4d09c
commit 1caf1e6b45
21 changed files with 818 additions and 537 deletions

View File

@@ -141,6 +141,15 @@ Ember.LOG_STACKTRACE_ON_DEPRECATION = (Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION !
*/
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.
@@ -1596,7 +1605,7 @@ var MapWithDefault = Ember.MapWithDefault = function(options) {
@static
@param [options]
@param {anything} [options.defaultValue]
@return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
@return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
`Ember.MapWithDefault` otherwise returns `Ember.Map`
*/
MapWithDefault.create = function(options) {
@@ -1670,7 +1679,7 @@ var FIRST_KEY = /^([^\.\*]+)/;
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 '_'
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
@@ -1731,7 +1740,7 @@ get = function get(obj, keyName) {
If you plan to run on IE8 and older browsers then you should use this
method anytime you want to set a property on an object that you don't
know for sure is private. (Properties beginning with an underscore '_'
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 set
@@ -4069,7 +4078,7 @@ Ember.RunLoop = RunLoop;
```javascript
Ember.run(function(){
// code to be execute within a RunLoop
// code to be execute within a RunLoop
});
```
@@ -4108,7 +4117,7 @@ var run = Ember.run;
```javascript
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
```
@@ -4126,7 +4135,7 @@ Ember.run.begin = function() {
```javascript
Ember.run.begin();
// code to be execute within a RunLoop
// code to be execute within a RunLoop
Ember.run.end();
```
@@ -5963,7 +5972,6 @@ define("container",
register: function(type, name, factory, options) {
var fullName;
if (type.indexOf(':') !== -1){
options = factory;
factory = name;
@@ -5973,15 +5981,23 @@ define("container",
fullName = type + ":" + name;
}
this.registry.set(fullName, factory);
this._options.set(fullName, options || {});
var normalizedName = this.normalize(fullName);
this.registry.set(normalizedName, factory);
this._options.set(normalizedName, options || {});
},
resolve: function(fullName) {
return this.resolver(fullName) || this.registry.get(fullName);
},
normalize: function(fullName) {
return fullName;
},
lookup: function(fullName, options) {
fullName = this.normalize(fullName);
options = options || {};
if (this.cache.has(fullName) && options.singleton !== false) {
@@ -6110,7 +6126,8 @@ define("container",
}
function factoryFor(container, fullName) {
return container.resolve(fullName);
var name = container.normalize(fullName);
return container.resolve(name);
}
function instantiate(container, fullName) {
@@ -6584,6 +6601,20 @@ Ember.Error.prototype = Ember.create(Error.prototype);
(function() {
/**
Expose RSVP implementation
@class RSVP
@namespace Ember
@constructor
*/
Ember.RSVP = requireModule('rsvp');
})();
(function() {
/**
@module ember
@@ -7197,7 +7228,7 @@ Ember.Enumerable = Ember.Mixin.create(
@method nextObject
@param {Number} index the current index of the iteration
@param {Object} previousObject the value returned by the last call to
@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
@@ -8264,9 +8295,9 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
@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
@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
@param {Number} addAmt The number of items that will be added If you
pass `null` assumes 0.
@return {Ember.Array} receiver
*/
@@ -8740,11 +8771,11 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
passed array. You should also call `this.enumerableContentDidChange()`
@method replace
@param {Number} idx Starting index in the array to replace. If
@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
@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
@param {Array} objects An array of zero or more objects that should be
inserted into the array at *idx*
*/
replace: Ember.required(),
@@ -9998,14 +10029,14 @@ CoreObject.PrototypeMixin = Mixin.create({
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.
@@ -10962,40 +10993,8 @@ Ember.Mixin.prototype.toString = classToString;
(function() {
/**
@module ember
@submodule ember-runtime
*/
/**
Defines a namespace that will contain an executable application. This is
very similar to a normal namespace except that it is expected to include at
least a 'ready' function which can be run to initialize the application.
Currently `Ember.Application` is very similar to `Ember.Namespace.` However,
this class may be augmented by additional frameworks so it is important to
use this instance when building new applications.
# Example Usage
```javascript
MyApp = Ember.Application.create({
VERSION: '1.0.0',
store: Ember.Store.create().from(Ember.fixtures)
});
MyApp.ready = function() {
//..init code goes here...
}
```
@class Application
@namespace Ember
@extends Ember.Namespace
*/
Ember.Application = Ember.Namespace.extend();
})();
@@ -11379,6 +11378,25 @@ Ember.ObjectProxy = Ember.Object.extend(
}
});
Ember.ObjectProxy.reopenClass({
create: function () {
var mixin, prototype, i, l, properties, keyName;
if (arguments.length) {
prototype = this.proto();
for (i = 0, l = arguments.length; i < l; i++) {
properties = arguments[i];
for (keyName in properties) {
if (!properties.hasOwnProperty(keyName) || keyName in prototype) { continue; }
if (!mixin) mixin = {};
mixin[keyName] = null;
}
}
if (mixin) this._initMixins([mixin]);
}
return this._super.apply(this, arguments);
}
});
})();
@@ -11699,7 +11717,7 @@ if (ignore.length>0) {
/**
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
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`.
@@ -12274,7 +12292,8 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
objectAtContent: function(idx) {
var length = get(this, 'length'),
object = get(this,'arrangedContent').objectAt(idx);
arrangedContent = get(this,'arrangedContent'),
object = arrangedContent && arrangedContent.objectAt(idx);
if (idx >= 0 && idx < length) {
var controllerClass = this.lookupItemController(object);
@@ -12425,15 +12444,16 @@ Ember.$ = jQuery;
@module ember
@submodule ember-views
*/
if (Ember.$) {
// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents
var dragEvents = Ember.String.w('dragstart drag dragenter dragleave dragover drop dragend');
// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents
var dragEvents = Ember.String.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
Ember.EnumerableUtils.forEach(dragEvents, function(eventName) {
Ember.$.event.fixHooks[eventName] = { props: ['dataTransfer'] };
});
// Copies the `dataTransfer` property from a browser event object onto the
// jQuery event object for the specified events
Ember.EnumerableUtils.forEach(dragEvents, function(eventName) {
Ember.$.event.fixHooks[eventName] = { props: ['dataTransfer'] };
});
}
})();
@@ -12450,7 +12470,8 @@ Ember.EnumerableUtils.forEach(dragEvents, function(eventName) {
// 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 = (function(){
var needsShy = this.document && (function(){
var testEl = document.createElement('div');
testEl.innerHTML = "<div></div>";
testEl.firstChild.innerHTML = "<script></script>";
@@ -12460,7 +12481,7 @@ var needsShy = (function(){
// 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 = (function() {
var movesWhitespace = this.document && (function() {
var testEl = document.createElement('div');
testEl.innerHTML = "Test: <script type='text/x-placeholder'></script>Value";
return testEl.childNodes[0].nodeValue === 'Test:' &&
@@ -13131,7 +13152,7 @@ Ember.EventDispatcher = Ember.Object.extend(
setup: function(addedEvents) {
var event, events = {
touchstart : 'touchStart',
// touchmove : 'touchMove',
touchmove : 'touchMove',
touchend : 'touchEnd',
touchcancel : 'touchCancel',
keydown : 'keyDown',
@@ -13142,7 +13163,7 @@ Ember.EventDispatcher = Ember.Object.extend(
contextmenu : 'contextMenu',
click : 'click',
dblclick : 'doubleClick',
// mousemove : 'mouseMove',
mousemove : 'mouseMove',
focusin : 'focusIn',
focusout : 'focusOut',
mouseenter : 'mouseEnter',
@@ -13290,8 +13311,9 @@ Ember.EventDispatcher = Ember.Object.extend(
// 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 = Ember.run.queues;
queues.splice(Ember.$.inArray('actions', queues)+1, 0, 'render', 'afterRender');
var queues = Ember.run.queues,
indexOf = Ember.ArrayPolyfills.indexOf;
queues.splice(indexOf.call(queues, 'actions')+1, 0, 'render', 'afterRender');
})();
@@ -14080,7 +14102,7 @@ class:
* `mouseEnter`
* `mouseLeave`
Form events:
Form events:
* `submit`
* `change`
@@ -14088,7 +14110,7 @@ class:
* `focusOut`
* `input`
HTML5 drag and drop events:
HTML5 drag and drop events:
* `dragStart`
* `drag`
@@ -15530,17 +15552,24 @@ Ember.View = Ember.CoreView.extend(
// once the view has been inserted into the DOM, legal manipulations
// are done on the DOM element.
function notifyMutationListeners() {
Ember.run.once(Ember.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) {
@@ -15550,15 +15579,18 @@ var DOMManager = {
view._insertElementLater(function() {
Ember.$(element).replaceWith(get(view, 'element'));
notifyMutationListeners();
});
},
remove: function(view) {
view.$().remove();
notifyMutationListeners();
},
empty: function(view) {
view.$().empty();
notifyMutationListeners();
}
};
@@ -15619,14 +15651,14 @@ Ember.View.reopenClass({
`className` and optional `falsyClassName`.
- if a `className` or `falsyClassName` has been specified:
- if the value is truthy and `className` 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,
- 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
- 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`
- if the value is not `false`, `undefined` or `null`, the `value`
is returned
- if none of the above rules apply, `null` is returned
@@ -15673,6 +15705,20 @@ Ember.View.reopenClass({
}
});
var mutation = Ember.Object.extend(Ember.Evented).create();
Ember.View.addMutationListener = function(callback) {
mutation.on('change', callback);
};
Ember.View.removeMutationListener = function(callback) {
mutation.off('change', callback);
};
Ember.View.notifyMutationListeners = function() {
mutation.trigger('change');
};
/**
Global views hash
@@ -16476,7 +16522,7 @@ var get = Ember.get, set = Ember.set, fmt = Ember.String.fmt;
Given an empty `<body>` and the following code:
```javascript
```javascript
someItemsView = Ember.CollectionView.create({
classNames: ['a-collection'],
content: ['A','B','C'],
@@ -16831,15 +16877,15 @@ define("metamorph",
var K = function(){},
guid = 0,
document = window.document,
document = this.document,
// Feature-detect the W3C range API, the extended check is for IE9 which only partially supports ranges
supportsRange = ('createRange' in document) && (typeof Range !== 'undefined') && Range.prototype.createContextualFragment,
supportsRange = document && ('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 = (function(){
needsShy = document && (function(){
var testEl = document.createElement('div');
testEl.innerHTML = "<div></div>";
testEl.firstChild.innerHTML = "<script></script>";
@@ -16850,7 +16896,7 @@ define("metamorph",
// 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 = (function() {
movesWhitespace = document && (function() {
var testEl = document.createElement('div');
testEl.innerHTML = "Test: <script type='text/x-placeholder'></script>Value";
return testEl.childNodes[0].nodeValue === 'Test:' &&
@@ -17294,7 +17340,10 @@ var objectCreate = Object.create || function(parent) {
return new F();
};
var Handlebars = this.Handlebars || Ember.imports.Handlebars;
var Handlebars = this.Handlebars || (Ember.imports && Ember.imports.Handlebars);
if(!Handlebars && typeof require === 'function') {
Handlebars = require('handlebars');
}
/**
@@ -17647,7 +17696,7 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
## Example with bound options
Bound hash options are also supported. Example:
Bound hash options are also supported. Example:
```handlebars
{{repeat text countBinding="numRepeats"}}
@@ -17685,15 +17734,15 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) {
{{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.
which property the dependent keys would belong to.
## Use with unbound helper
The {{unbound}} helper can be used with bound helper invocations
The {{unbound}} helper can be used with bound helper invocations
to render them in their unbound form, e.g.
```handlebars
{{unbound capitalize name}}
{{unbound capitalize name}}
```
In this example, if the name property changes, the helper
@@ -17719,7 +17768,7 @@ Ember.Handlebars.registerBoundHelper = function(name, fn) {
view = data.view,
currentContext = (options.contexts && options.contexts[0]) || this,
normalized,
pathRoot, path,
pathRoot, path,
loc, hashOption;
// Detect bound options (e.g. countBinding="otherCount")
@@ -17824,7 +17873,7 @@ function evaluateMultiPropertyBoundHelper(context, fn, normalizedProperties, opt
// Assemble liast of watched properties that'll re-render this helper.
watchedProperties = [];
for (boundOption in boundOptions) {
if (boundOptions.hasOwnProperty(boundOption)) {
if (boundOptions.hasOwnProperty(boundOption)) {
watchedProperties.push(normalizePath(context, boundOptions[boundOption], data));
}
}
@@ -17953,22 +18002,30 @@ Ember.Handlebars.resolvePaths = function(options) {
var set = Ember.set, get = Ember.get;
var Metamorph = requireModule('metamorph');
function notifyMutationListeners() {
Ember.run.once(Ember.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.
@@ -17991,11 +18048,13 @@ var DOMManager = {
morph.replaceWith(buffer.string());
view.transitionTo('inDOM');
view.triggerRecursively('didInsertElement');
notifyMutationListeners();
});
},
empty: function(view) {
view.morph.html("");
notifyMutationListeners();
}
};
@@ -18757,14 +18816,14 @@ EmberHandlebars.registerHelper('unless', function(context, options) {
Result in the following rendered output:
```html
```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
A class name is provided via the syntax
`somePropertyName:class-name-if-true`.
```javascript
@@ -18919,9 +18978,9 @@ EmberHandlebars.registerHelper('bindAttr', function(options) {
@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
@param {String} classBindings A string, space-separated, of class bindings
to use
@param {Ember.View} view The view in which observers should look for the
@param {Ember.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
@@ -19610,7 +19669,7 @@ Ember.Handlebars.registerHelper('unbound', function(property, fn) {
// Unbound helper call.
options.data.isUnbound = true;
helper = Ember.Handlebars.helpers[arguments[0]] || Ember.Handlebars.helperMissing;
out = helper.apply(this, Array.prototype.slice.call(arguments, 1));
out = helper.apply(this, Array.prototype.slice.call(arguments, 1));
delete options.data.isUnbound;
return out;
}
@@ -20905,7 +20964,7 @@ helpers = helpers || Ember.Handlebars.helpers; data = data || {};
var buffer = '', stack1, hashTypes, escapeExpression=this.escapeExpression, self=this;
function program1(depth0,data) {
var buffer = '', hashTypes;
data.buffer.push("<option value=\"\">");
hashTypes = {};
@@ -20915,7 +20974,7 @@ function program1(depth0,data) {
}
function program3(depth0,data) {
var hashTypes;
hashTypes = {'contentBinding': "STRING"};
data.buffer.push(escapeExpression(helpers.view.call(depth0, "Ember.SelectOption", {hash:{
@@ -20930,7 +20989,7 @@ function program3(depth0,data) {
stack1 = helpers.each.call(depth0, "view.content", {hash:{},inverse:self.noop,fn:self.program(3, program3, data),contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data});
if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
return buffer;
}),
attributeBindings: ['multiple', 'disabled', 'tabindex'],
@@ -23362,6 +23421,34 @@ function teardownView(route) {
(function() {
Ember.onLoad('Ember.Handlebars', function() {
var handlebarsResolve = Ember.Handlebars.resolveParams,
map = Ember.ArrayPolyfills.map,
get = Ember.get;
function resolveParams(context, params, options) {
var resolved = handlebarsResolve(context, params, options);
return map.call(resolved, unwrap);
function unwrap(object, i) {
if (params[i] === 'controller') { return object; }
if (Ember.ControllerMixin.detect(object)) {
return unwrap(get(object, 'model'));
} else {
return object;
}
}
}
Ember.Router.resolveParams = resolveParams;
});
})();
(function() {
/**
@module ember
@@ -23371,7 +23458,7 @@ function teardownView(route) {
var get = Ember.get, set = Ember.set;
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
var resolveParams = Ember.Handlebars.resolveParams,
var resolveParams = Ember.Router.resolveParams,
isSimpleClick = Ember.ViewUtils.isSimpleClick;
function fullRouteName(router, name) {
@@ -23652,7 +23739,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
*/
Ember.onLoad('Ember.Handlebars', function(Handlebars) {
var resolveParams = Ember.Handlebars.resolveParams,
var resolveParams = Ember.Router.resolveParams,
isSimpleClick = Ember.ViewUtils.isSimpleClick;
var EmberHandlebars = Ember.Handlebars,
@@ -24277,7 +24364,7 @@ Ember.HashLocation = Ember.Object.extend({
set(self, 'lastSetURL', null);
callback(location.hash.substr(1));
callback(path);
});
});
},
@@ -24655,11 +24742,14 @@ var get = Ember.get, set = Ember.set,
```
By default, calling `Ember.Application.create()` will automatically initialize
your application by calling the `Ember.Application.initialize()` method. If
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.
@@ -24854,10 +24944,13 @@ var Application = Ember.Application = Ember.Namespace.extend({
this.scheduleInitialize();
}
if ( Ember.LOG_VERSION ) {
}
},
/**
@@ -25216,6 +25309,7 @@ Ember.Application.reopenClass({
Ember.Container.defaultContainer = Ember.Container.defaultContainer || container;
container.set = Ember.set;
container.normalize = normalize;
container.resolver = resolverFor(namespace);
container.optionsForType('view', { singleton: false });
container.optionsForType('template', { instantiate: false });
@@ -25255,6 +25349,7 @@ function resolverFor(namespace) {
if (type === 'template') {
var templateName = name.replace(/\./g, '/');
if (Ember.TEMPLATES[templateName]) {
return Ember.TEMPLATES[templateName];
}
@@ -25284,9 +25379,31 @@ function resolverFor(namespace) {
};
}
Ember.runLoadHooks('Ember.Application', Ember.Application);
function normalize(fullName) {
var split = fullName.split(':'),
type = split[0],
name = split[1];
if (type !== 'template') {
var result = name;
if (result.indexOf('.') > -1) {
result = result.replace(/\.(.)/g, function(m) { return m[1].toUpperCase(); });
}
if (name.indexOf('_') > -1) {
result = result.replace(/_(.)/g, function(m) { return m[1].toUpperCase(); });
}
return type + ':' + result;
} else {
return fullName;
}
}
Ember.runLoadHooks('Ember.Application', Ember.Application);
})();