ember-source 1.0.0.rc3.5 → 1.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

@@ -8,10 +8,10 @@
8
8
  // ==========================================================================
9
9
 
10
10
 
11
- // Version: v1.0.0-rc.3-2-g85bfdbf
12
- // Last commit: 85bfdbf (2013-07-25 20:16:20 -0400)
11
+ // Version: v1.0.0-rc4
12
+ // Last commit: ae2e55f (2013-05-27 19:34:11 -0400)
13
13
 
14
14
 
15
- (function(){var e,t;(function(){var r={},n={};e=function(e,t,n){r[e]={deps:t,callback:n}},t=function(e){if(n[e])return n[e];n[e]={};for(var i,o=r[e],s=o.deps,a=o.callback,u=[],c=0,h=s.length;h>c;c++)"exports"===s[c]?u.push(i={}):u.push(t(s[c]));var l=a.apply(this,u);return n[e]=i||l}})(),function(){function e(e){return t.console&&t.console[e]?t.console[e].apply?function(){t.console[e].apply(t.console,arguments)}:function(){var r=Array.prototype.join.call(arguments,", ");t.console[e](r)}:void 0}"undefined"==typeof Ember&&(Ember={});var t=Ember.imports=Ember.imports||this,r=Ember.exports=Ember.exports||this;Ember.lookup=Ember.lookup||this,r.Em=r.Ember=Em=Ember,Ember.isNamespace=!0,Ember.toString=function(){return"Ember"},Ember.VERSION="1.0.0-rc.3",Ember.ENV=Ember.ENV||("undefined"==typeof ENV?{}:ENV),Ember.config=Ember.config||{},Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES,"undefined"==typeof Ember.EXTEND_PROTOTYPES&&(Ember.EXTEND_PROTOTYPES=!0),Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==!1,Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===!1?!1:Ember.EXTEND_PROTOTYPES,Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===!1?!1:!0,Ember.K=function(){return this},"undefined"==typeof Ember.assert&&(Ember.assert=Ember.K),"undefined"==typeof Ember.warn&&(Ember.warn=Ember.K),"undefined"==typeof Ember.debug&&(Ember.debug=Ember.K),"undefined"==typeof Ember.deprecate&&(Ember.deprecate=Ember.K),"undefined"==typeof Ember.deprecateFunc&&(Ember.deprecateFunc=function(e,t){return t}),Ember.uuid=0,Ember.Logger={log:e("log")||Ember.K,warn:e("warn")||Ember.K,error:e("error")||Ember.K,info:e("info")||Ember.K,debug:e("debug")||e("info")||Ember.K},Ember.onerror=null,Ember.handleErrors=function(e,t){if("function"!=typeof Ember.onerror)return e.call(t||this);try{return e.call(t||this)}catch(r){Ember.onerror(r)}},Ember.merge=function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e},Ember.isNone=function(e){return null===e||void 0===e},Ember.none=Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.",Ember.isNone),Ember.isEmpty=function(e){return null===e||void 0===e||0===e.length&&"function"!=typeof e||"object"==typeof e&&0===Ember.get(e,"length")},Ember.empty=Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.",Ember.isEmpty)}(),function(){var e=Ember.platform={};if(Ember.create=Object.create,!Ember.create||Ember.ENV.STUB_OBJECT_CREATE){var t=function(){};Ember.create=function(e,r){if(t.prototype=e,e=new t,r){t.prototype=e;for(var n in r)t.prototype[n]=r[n].value;e=new t}return t.prototype=null,e},Ember.create.isSimulated=!0}var r,n,i=Object.defineProperty;if(i)try{i({},"a",{get:function(){}})}catch(o){i=null}i&&(r=function(){var e={};return i(e,"a",{configurable:!0,enumerable:!0,get:function(){},set:function(){}}),i(e,"a",{configurable:!0,enumerable:!0,writable:!0,value:!0}),e.a===!0}(),n=function(){try{return i(document.createElement("div"),"definePropertyOnDOM",{}),!0}catch(e){}return!1}(),r?n||(i=function(e,t,r){var n;return n="object"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName,n?e[t]=r.value:Object.defineProperty(e,t,r)}):i=null),e.defineProperty=i,e.hasPropertyAccessors=!0,e.defineProperty||(e.hasPropertyAccessors=!1,e.defineProperty=function(e,t,r){r.get||(e[t]=r.value)},e.defineProperty.isSimulated=!0),Ember.ENV.MANDATORY_SETTER&&!e.hasPropertyAccessors&&(Ember.ENV.MANDATORY_SETTER=!1)}(),function(){var e=function(e){return e&&Function.prototype.toString.call(e).indexOf("[native code]")>-1},t=e(Array.prototype.map)?Array.prototype.map:function(e){if(void 0===this||null===this)throw new TypeError;var t=Object(this),r=t.length>>>0;if("function"!=typeof e)throw new TypeError;for(var n=new Array(r),i=arguments[1],o=0;r>o;o++)o in t&&(n[o]=e.call(i,t[o],o,t));return n},r=e(Array.prototype.forEach)?Array.prototype.forEach:function(e){if(void 0===this||null===this)throw new TypeError;var t=Object(this),r=t.length>>>0;if("function"!=typeof e)throw new TypeError;for(var n=arguments[1],i=0;r>i;i++)i in t&&e.call(n,t[i],i,t)},n=e(Array.prototype.indexOf)?Array.prototype.indexOf:function(e,t){null===t||void 0===t?t=0:0>t&&(t=Math.max(0,this.length+t));for(var r=t,n=this.length;n>r;r++)if(this[r]===e)return r;return-1};Ember.ArrayPolyfills={map:t,forEach:r,indexOf:n},Ember.SHIM_ES5&&(Array.prototype.map||(Array.prototype.map=t),Array.prototype.forEach||(Array.prototype.forEach=r),Array.prototype.indexOf||(Array.prototype.indexOf=n))}(),function(){function e(e){this.descs={},this.watching={},this.cache={},this.source=e}function t(e,t){return!(!e||"function"!=typeof e[t])}var r=Ember.platform.defineProperty,n=Ember.create,i="__ember"+ +new Date,o=0,s=[],a={},u=Ember.ENV.MANDATORY_SETTER;Ember.GUID_KEY=i;var c={writable:!1,configurable:!1,enumerable:!1,value:null};Ember.generateGuid=function(e,t){t||(t="ember");var n=t+o++;return e&&(c.value=n,r(e,i,c)),n},Ember.guidFor=function(e){if(void 0===e)return"(undefined)";if(null===e)return"(null)";var t,n=typeof e;switch(n){case"number":return t=s[e],t||(t=s[e]="nu"+e),t;case"string":return t=a[e],t||(t=a[e]="st"+o++),t;case"boolean":return e?"(true)":"(false)";default:return e[i]?e[i]:e===Object?"(Object)":e===Array?"(Array)":(t="ember"+o++,c.value=t,r(e,i,c),t)}};var h={writable:!0,configurable:!1,enumerable:!1,value:null},l=Ember.GUID_KEY+"_meta";Ember.META_KEY=l;var f={descs:{},watching:{}};u&&(f.values={}),Ember.EMPTY_META=f,Object.freeze&&Object.freeze(f);var b=Ember.platform.defineProperty.isSimulated;b&&(e.prototype.__preventPlainObject__=!0,e.prototype.toJSON=function(){}),Ember.meta=function(t,i){var o=t[l];return i===!1?o||f:(o?o.source!==t&&(b||r(t,l,h),o=n(o),o.descs=n(o.descs),o.watching=n(o.watching),o.cache={},o.source=t,u&&(o.values=n(o.values)),t[l]=o):(b||r(t,l,h),o=new e(t),u&&(o.values={}),t[l]=o,o.descs.constructor=null),o)},Ember.getMeta=function(e,t){var r=Ember.meta(e,!1);return r[t]},Ember.setMeta=function(e,t,r){var n=Ember.meta(e,!0);return n[t]=r,r},Ember.metaPath=function(e,t,r){for(var i,o,s=Ember.meta(e,r),a=0,u=t.length;u>a;a++){if(i=t[a],o=s[i]){if(o.__ember_source__!==e){if(!r)return void 0;o=s[i]=n(o),o.__ember_source__=e}}else{if(!r)return void 0;o=s[i]={__ember_source__:e}}s=o}return o},Ember.wrap=function(e,t){function r(){}function n(){var n,i=this._super;return this._super=t||r,n=e.apply(this,arguments),this._super=i,n}return n.wrappedFunction=e,n.__ember_observes__=e.__ember_observes__,n.__ember_observesBefore__=e.__ember_observesBefore__,n},Ember.isArray=function(e){return!e||e.setInterval?!1:Array.isArray&&Array.isArray(e)?!0:Ember.Array&&Ember.Array.detect(e)?!0:void 0!==e.length&&"object"==typeof e?!0:!1},Ember.makeArray=function(e){return null===e||void 0===e?[]:Ember.isArray(e)?e:[e]},Ember.canInvoke=t,Ember.tryInvoke=function(e,r,n){return t(e,r)?e[r].apply(e,n||[]):void 0};var m=function(){var e=0;try{try{}finally{throw e++,new Error("needsFinallyFixTest")}}catch(t){}return 1!==e}();Ember.tryFinally=m?function(e,t,r){var n,i,o;r=r||this;try{n=e.call(r)}finally{try{i=t.call(r)}catch(s){o=s}}if(o)throw o;return void 0===i?n:i}:function(e,t,r){var n,i;r=r||this;try{n=e.call(r)}finally{i=t.call(r)}return void 0===i?n:i},Ember.tryCatchFinally=m?function(e,t,r,n){var i,o,s;n=n||this;try{i=e.call(n)}catch(a){i=t.call(n,a)}finally{try{o=r.call(n)}catch(u){s=u}}if(s)throw s;return void 0===o?i:o}:function(e,t,r,n){var i,o;n=n||this;try{i=e.call(n)}catch(s){i=t.call(n,s)}finally{o=r.call(n)}return void 0===o?i:o};var p={},E="Boolean Number String Function Array Date RegExp Object".split(" ");Ember.ArrayPolyfills.forEach.call(E,function(e){p["[object "+e+"]"]=e.toLowerCase()});var d=Object.prototype.toString;Ember.typeOf=function(e){var t;return t=null===e||void 0===e?String(e):p[d.call(e)]||"object","function"===t?Ember.Object&&Ember.Object.detect(e)&&(t="class"):"object"===t&&(t=e instanceof Error?"error":Ember.Object&&e instanceof Ember.Object?"instance":"object"),t}}(),function(){Ember.Instrumentation={};var e=[],t={},r=function(r){for(var n,i=[],o=0,s=e.length;s>o;o++)n=e[o],n.regex.test(r)&&i.push(n.object);return t[r]=i,i},n=function(){var e="undefined"!=typeof window?window.performance||{}:{},t=e.now||e.mozNow||e.webkitNow||e.msNow||e.oNow;return t?t.bind(e):function(){return+new Date}}();Ember.Instrumentation.instrument=function(e,i,o,s){function a(){for(m=0,p=f.length;p>m;m++)b=f[m],E[m]=b.before(e,n(),i);return o.call(s)}function u(e){i=i||{},i.exception=e}function c(){for(m=0,p=f.length;p>m;m++)b=f[m],b.after(e,n(),i,E[m]);Ember.STRUCTURED_PROFILE&&console.timeEnd(h)}var h,l,f=t[e];if(Ember.STRUCTURED_PROFILE&&(h=e+": "+i.object,console.time(h)),f||(f=r(e)),0===f.length)return l=o.call(s),Ember.STRUCTURED_PROFILE&&console.timeEnd(h),l;var b,m,p,E=[];return Ember.tryCatchFinally(a,u,c)},Ember.Instrumentation.subscribe=function(r,n){for(var i,o=r.split("."),s=[],a=0,u=o.length;u>a;a++)i=o[a],"*"===i?s.push("[^\\.]*"):s.push(i);s=s.join("\\."),s+="(\\..*)?";var c={pattern:r,regex:new RegExp("^"+s+"$"),object:n};return e.push(c),t={},c},Ember.Instrumentation.unsubscribe=function(r){for(var n,i=0,o=e.length;o>i;i++)e[i]===r&&(n=i);e.splice(n,1),t={}},Ember.Instrumentation.reset=function(){e=[],t={}},Ember.instrument=Ember.Instrumentation.instrument,Ember.subscribe=Ember.Instrumentation.subscribe}(),function(){var e,t,r,n;n=Array.prototype.concat,e=Array.prototype.map||Ember.ArrayPolyfills.map,t=Array.prototype.forEach||Ember.ArrayPolyfills.forEach,r=Array.prototype.indexOf||Ember.ArrayPolyfills.indexOf;var i=Ember.EnumerableUtils={map:function(t,r,n){return t.map?t.map.call(t,r,n):e.call(t,r,n)},forEach:function(e,r,n){return e.forEach?e.forEach.call(e,r,n):t.call(e,r,n)},indexOf:function(e,t,n){return e.indexOf?e.indexOf.call(e,t,n):r.call(e,t,n)},indexesOf:function(e,t){return void 0===t?[]:i.map(t,function(t){return i.indexOf(e,t)})},addObject:function(e,t){var r=i.indexOf(e,t);-1===r&&e.push(t)},removeObject:function(e,t){var r=i.indexOf(e,t);-1!==r&&e.splice(r,1)},replace:function(e,t,r,i){if(e.replace)return e.replace(t,r,i);var o=n.apply([t,r],i);return e.splice.apply(e,o)},intersection:function(e,t){var r=[];return i.forEach(e,function(e){i.indexOf(t,e)>=0&&r.push(e)}),r}}}(),function(){var e=Ember.guidFor,t=Ember.ArrayPolyfills.indexOf,r=function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},n=function(e,t){var n=e.keys.copy(),i=r(e.values);return t.keys=n,t.values=i,t},i=Ember.OrderedSet=function(){this.clear()};i.create=function(){return new i},i.prototype={clear:function(){this.presenceSet={},this.list=[]},add:function(t){var r=e(t),n=this.presenceSet,i=this.list;r in n||(n[r]=!0,i.push(t))},remove:function(r){var n=e(r),i=this.presenceSet,o=this.list;delete i[n];var s=t.call(o,r);s>-1&&o.splice(s,1)},isEmpty:function(){return 0===this.list.length},has:function(t){var r=e(t),n=this.presenceSet;return r in n},forEach:function(e,t){for(var r=this.toArray(),n=0,i=r.length;i>n;n++)e.call(t,r[n])},toArray:function(){return this.list.slice()},copy:function(){var e=new i;return e.presenceSet=r(this.presenceSet),e.list=this.toArray(),e}};var o=Ember.Map=function(){this.keys=Ember.OrderedSet.create(),this.values={}};o.create=function(){return new o},o.prototype={get:function(t){var r=this.values,n=e(t);return r[n]},set:function(t,r){var n=this.keys,i=this.values,o=e(t);n.add(t),i[o]=r},remove:function(t){var r=this.keys,n=this.values,i=e(t);return n.hasOwnProperty(i)?(r.remove(t),delete n[i],!0):!1},has:function(t){var r=this.values,n=e(t);return r.hasOwnProperty(n)},forEach:function(t,r){var n=this.keys,i=this.values;n.forEach(function(n){var o=e(n);t.call(r,n,i[o])})},copy:function(){return n(this,new o)}};var s=Ember.MapWithDefault=function(e){o.call(this),this.defaultValue=e.defaultValue};s.create=function(e){return e?new s(e):new o},s.prototype=Ember.create(o.prototype),s.prototype.get=function(e){var t=this.has(e);if(t)return o.prototype.get.call(this,e);var r=this.defaultValue(e);return this.set(e,r),r},s.prototype.copy=function(){return n(this,new s({defaultValue:this.defaultValue}))}}(),function(){function e(e){return e.match(a)[0]}function t(t,n){var i,a=s.test(n),u=!a&&o.test(n);if((!t||u)&&(t=Ember.lookup),a&&(n=n.slice(5)),t===Ember.lookup&&(i=e(n),t=r(t,i),n=n.slice(i.length+1)),!n||0===n.length)throw new Error("Invalid Path");return[t,n]}var r,n=Ember.META_KEY,i=Ember.ENV.MANDATORY_SETTER,o=/^([A-Z$]|([0-9][A-Z$])).*[\.\*]/,s=/^this[\.\*]/,a=/^([^\.\*]+)/;r=function r(e,t){if(""===t)return e;if(t||"string"!=typeof e||(t=e,e=null),!e||-1!==t.indexOf("."))return u(e,t);var r,o=e[n],s=o&&o.descs[t];return s?s.get(e,t):(r=i&&o&&o.watching[t]>0?o.values[t]:e[t],void 0!==r||"object"!=typeof e||t in e||"function"!=typeof e.unknownProperty?r:e.unknownProperty(t))},Ember.config.overrideAccessors&&(Ember.get=r,Ember.config.overrideAccessors(),r=Ember.get);var u=Ember._getPath=function(e,n){var i,o,a,u,c;if(null===e&&-1===n.indexOf("."))return r(Ember.lookup,n);for(i=s.test(n),(!e||i)&&(a=t(e,n),e=a[0],n=a[1],a.length=0),o=n.split("."),c=o.length,u=0;e&&c>u;u++)if(e=r(e,o[u],!0),e&&e.isDestroyed)return void 0;return e};Ember.normalizeTuple=function(e,r){return t(e,r)},Ember.getWithDefault=function(e,t,n){var i=r(e,t);return void 0===i?n:i},Ember.get=r,Ember.getPath=Ember.deprecateFunc("getPath is deprecated since get now supports paths",Ember.get)}(),function(){function e(e,t,r){for(var n=-1,i=0,o=e.length;o>i;i++)if(t===e[i][0]&&r===e[i][1]){n=i;break}return n}function t(e,t){var r,n=b(e,!0);return n.listeners||(n.listeners={}),n.hasOwnProperty("listeners")||(n.listeners=f(n.listeners)),r=n.listeners[t],r&&!n.listeners.hasOwnProperty(t)?r=n.listeners[t]=n.listeners[t].slice():r||(r=n.listeners[t]=[]),r}function r(t,r,n){var i=t[m],o=i&&i.listeners&&i.listeners[r];if(o)for(var s=o.length-1;s>=0;s--){var a=o[s][0],u=o[s][1],c=o[s][2],h=o[s][3],l=e(n,a,u);-1===l&&n.push([a,u,c,h])}}function n(t,r,n){var i=t[m],o=i&&i.listeners&&i.listeners[r],s=[];if(o){for(var a=o.length-1;a>=0;a--){var u=o[a][0],c=o[a][1],h=o[a][2],l=o[a][3],f=e(n,u,c);-1===f&&(n.push([u,c,h,l]),s.push([u,c,h,l]))}return s}}function i(r,n,i,o,s){o||"function"!=typeof i||(o=i,i=null);var a=t(r,n),u=e(a,i,o);-1===u&&(a.push([i,o,s,void 0]),"function"==typeof r.didAddListener&&r.didAddListener(n,i,o))}function o(r,n,i,o){function s(i,o){var s=t(r,n),a=e(s,i,o);-1!==a&&(s.splice(a,1),"function"==typeof r.didRemoveListener&&r.didRemoveListener(n,i,o))}if(o||"function"!=typeof i||(o=i,i=null),o)s(i,o);else{var a=r[m],u=a&&a.listeners&&a.listeners[n];if(!u)return;for(var c=u.length-1;c>=0;c--)s(u[c][0],u[c][1])}}function s(r,n,i,o,s){function a(){return s.call(i)}function u(){c&&(c[3]=void 0)}o||"function"!=typeof i||(o=i,i=null);var c,h=t(r,n),l=e(h,i,o);return-1!==l&&(c=h[l].slice(),c[3]=!0,h[l]=c),Ember.tryFinally(a,u)}function a(r,n,i,o,s){function a(){return s.call(i)}function u(){for(f=0,b=m.length;b>f;f++)m[f][3]=void 0}o||"function"!=typeof i||(o=i,i=null);var c,h,l,f,b,m=[];for(f=0,b=n.length;b>f;f++){c=n[f],h=t(r,c);var p=e(h,i,o);-1!==p&&(l=h[p].slice(),l[3]=!0,h[p]=l,m.push(l))}return Ember.tryFinally(a,u)}function u(e){var t=e[m].listeners,r=[];if(t)for(var n in t)t[n]&&r.push(n);return r}function c(e,t,r,n){if(e!==Ember&&"function"==typeof e.sendEvent&&e.sendEvent(t,r),!n){var i=e[m];n=i&&i.listeners&&i.listeners[t]}if(n){for(var s=n.length-1;s>=0;s--)if(n[s]&&n[s][3]!==!0){var a=n[s][0],u=n[s][1],c=n[s][2];c&&o(e,t,a,u),a||(a=e),"string"==typeof u&&(u=a[u]),r?u.apply(a,r):u.call(a)}return!0}}function h(e,t){var r=e[m],n=r&&r.listeners&&r.listeners[t];return!(!n||!n.length)}function l(e,t){var r=[],n=e[m],i=n&&n.listeners&&n.listeners[t];if(!i)return r;for(var o=0,s=i.length;s>o;o++){var a=i[o][0],u=i[o][1];r.push([a,u])}return r}var f=Ember.create,b=Ember.meta,m=Ember.META_KEY;Ember.addListener=i,Ember.removeListener=o,Ember._suspendListener=s,Ember._suspendListeners=a,Ember.sendEvent=c,Ember.hasListeners=h,Ember.watchedEvents=u,Ember.listenersFor=l,Ember.listenersDiff=n,Ember.listenersUnion=r}(),function(){var e=Ember.guidFor,t=Ember.sendEvent,r=Ember._ObserverSet=function(){this.clear()};r.prototype.add=function(t,r,n){var i,o=this.observerSet,s=this.observers,a=e(t),u=o[a];return u||(o[a]=u={}),i=u[r],void 0===i&&(i=s.push({sender:t,keyName:r,eventName:n,listeners:[]})-1,u[r]=i),s[i].listeners},r.prototype.flush=function(){var e,r,n,i,o=this.observers;for(this.clear(),e=0,r=o.length;r>e;++e)n=o[e],i=n.sender,i.isDestroying||i.isDestroyed||t(i,n.eventName,[i,n.keyName],n.listeners)},r.prototype.clear=function(){this.observerSet={},this.observers=[]}}(),function(){function e(e,t,i){if(!e.isDestroying){var o=n,s=!o;s&&(o=n={}),r(p,e,t,o,i),s&&(n=null)}}function t(e,t,n){if(!e.isDestroying){var o=i,s=!o;s&&(o=i={}),r(E,e,t,o,n),s&&(i=null)}}function r(e,t,r,n,i){var o=s(t);if(n[o]||(n[o]={}),!n[o][r]){n[o][r]=!0;var a=i.deps;if(a=a&&a[r])for(var u in a){var c=i.descs[u];c&&c._suspended===t||e(t,u)}}}var n,i,o=Ember.meta,s=Ember.guidFor,a=Ember.tryFinally,u=Ember.sendEvent,c=Ember.listenersUnion,h=Ember.listenersDiff,l=Ember._ObserverSet,f=new l,b=new l,m=0,p=Ember.propertyWillChange=function(t,r){var n=o(t,!1),i=n.watching[r]>0||"length"===r,s=n.proto,a=n.descs[r];i&&s!==t&&(a&&a.willChange&&a.willChange(t,r),e(t,r,n),d(t,r,n),_(t,r))},E=Ember.propertyDidChange=function(e,r){var n=o(e,!1),i=n.watching[r]>0||"length"===r,s=n.proto,a=n.descs[r];s!==e&&(a&&a.didChange&&a.didChange(e,r),(i||"length"===r)&&(t(e,r,n),v(e,r,n),O(e,r)))},d=function(e,t,r,n){if(r.hasOwnProperty("chainWatchers")){var i=r.chainWatchers;if(i=i[t])for(var o=0,s=i.length;s>o;o++)i[o].willChange(n)}},v=function(e,t,r,n){if(r.hasOwnProperty("chainWatchers")){var i=r.chainWatchers;if(i=i[t])for(var o=i.length-1;o>=0;o--)i[o].didChange(n)}};Ember.overrideChains=function(e,t,r){v(e,t,r,!0)};var g=Ember.beginPropertyChanges=function(){m++},y=Ember.endPropertyChanges=function(){m--,0>=m&&(f.clear(),b.flush())};Ember.changeProperties=function(e,t){g(),a(e,y,t)};var _=function(e,t){if(!e.isDestroying){var r,n,i=t+":before";m?(r=f.add(e,t,i),n=h(e,i,r),u(e,i,[e,t],n)):u(e,i,[e,t])}},O=function(e,t){if(!e.isDestroying){var r,n=t+":change";m?(r=b.add(e,t,n),c(e,n,r)):u(e,n,[e,t])}}}(),function(){function e(e,t,r,o){var s;if(s=t.slice(t.lastIndexOf(".")+1),t=t.slice(0,t.length-(s.length+1)),"this"!==t&&(e=n(e,t)),!s||0===s.length)throw new Error("You passed an empty path");if(!e){if(o)return;throw new Error("Object in path "+t+" could not be found or was destroyed.")}return i(e,s,r)}var t=Ember.META_KEY,r=Ember.ENV.MANDATORY_SETTER,n=Ember._getPath,i=function i(n,i,o,s){if("string"==typeof n&&(o=i,i=n,n=null),!n||-1!==i.indexOf("."))return e(n,i,o,s);var a,u,c=n[t],h=c&&c.descs[i];return h?h.set(n,i,o):(a="object"==typeof n&&!(i in n),a&&"function"==typeof n.setUnknownProperty?n.setUnknownProperty(i,o):c&&c.watching[i]>0?(u=r?c.values[i]:n[i],o!==u&&(Ember.propertyWillChange(n,i),r?void 0!==u||i in n?c.values[i]=o:Ember.defineProperty(n,i,null,o):n[i]=o,Ember.propertyDidChange(n,i))):n[i]=o),o};Ember.config.overrideAccessors&&(Ember.set=i,Ember.config.overrideAccessors(),i=Ember.set),Ember.set=i,Ember.setPath=Ember.deprecateFunc("setPath is deprecated since set now supports paths",Ember.set),Ember.trySet=function(e,t,r){return i(e,t,r,!0)},Ember.trySetPath=Ember.deprecateFunc("trySetPath has been renamed to trySet",Ember.trySet)}(),function(){var e=Ember.META_KEY,t=Ember.meta,r=Ember.platform.defineProperty,n=Ember.ENV.MANDATORY_SETTER;Ember.Descriptor=function(){};var i=Ember.MANDATORY_SETTER_FUNCTION=function(){},o=Ember.DEFAULT_GETTER_FUNCTION=function(t){return function(){var r=this[e];return r&&r.values[t]}};Ember.defineProperty=function(e,s,a,u,c){var h,l,f,b;return c||(c=t(e)),h=c.descs,l=c.descs[s],f=c.watching[s]>0,l instanceof Ember.Descriptor&&l.teardown(e,s),a instanceof Ember.Descriptor?(b=a,h[s]=a,n&&f?r(e,s,{configurable:!0,enumerable:!0,writable:!0,value:void 0}):e[s]=void 0,a.setup(e,s)):(h[s]=void 0,null==a?(b=u,n&&f?(c.values[s]=u,r(e,s,{configurable:!0,enumerable:!0,set:i,get:o(s)})):e[s]=u):(b=a,r(e,s,a))),f&&Ember.overrideChains(e,s,c),e.didDefineProperty&&e.didDefineProperty(e,s,b),this}}(),function(){var e=Ember.changeProperties,t=Ember.set;Ember.setProperties=function(r,n){return e(function(){for(var e in n)n.hasOwnProperty(e)&&t(r,e,n[e])}),r}}(),function(){var e=Ember.meta,t=Ember.typeOf,r=Ember.ENV.MANDATORY_SETTER,n=Ember.platform.defineProperty;Ember.watchKey=function(i,o){if("length"!==o||"array"!==t(i)){var s,a=e(i),u=a.watching;u[o]?u[o]=(u[o]||0)+1:(u[o]=1,s=a.descs[o],s&&s.willWatch&&s.willWatch(i,o),"function"==typeof i.willWatchProperty&&i.willWatchProperty(o),r&&o in i&&(a.values[o]=i[o],n(i,o,{configurable:!0,enumerable:!0,set:Ember.MANDATORY_SETTER_FUNCTION,get:Ember.DEFAULT_GETTER_FUNCTION(o)})))}},Ember.unwatchKey=function(t,i){var o,s=e(t),a=s.watching;1===a[i]?(a[i]=0,o=s.descs[i],o&&o.didUnwatch&&o.didUnwatch(t,i),"function"==typeof t.didUnwatchProperty&&t.didUnwatchProperty(i),r&&i in t&&(n(t,i,{configurable:!0,enumerable:!0,writable:!0,value:s.values[i]}),delete s.values[i])):a[i]>1&&a[i]--}}(),function(){function e(e){return e.match(f)[0]}function t(e,t,r){if(e&&"object"==typeof e){var i=n(e),o=i.chainWatchers;i.hasOwnProperty("chainWatchers")||(o=i.chainWatchers={}),o[t]||(o[t]=[]),o[t].push(r),u(e,t)}}function r(e){return n(e,!1).proto===e}var n=Ember.meta,i=Ember.get,o=Ember.normalizeTuple,s=Ember.ArrayPolyfills.forEach,a=Ember.warn,u=Ember.watchKey,c=Ember.unwatchKey,h=Ember.propertyWillChange,l=Ember.propertyDidChange,f=/^([^\.\*]+)/,b=[];Ember.flushPendingChains=function(){if(0!==b.length){var e=b;b=[],s.call(e,function(e){e[0].add(e[1])}),a("Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos",0===b.length)}};var m=Ember.removeChainWatcher=function(e,t,r){if(e&&"object"==typeof e){var i=n(e,!1);if(i.hasOwnProperty("chainWatchers")){var o=i.chainWatchers;if(o[t]){o=o[t];for(var s=0,a=o.length;a>s;s++)o[s]===r&&o.splice(s,1)}c(e,t)}}},p=Ember._ChainNode=function(e,r,n){this._parent=e,this._key=r,this._watching=void 0===n,this._value=n,this._paths={},this._watching&&(this._object=e.value(),this._object&&t(this._object,this._key,this)),this._parent&&"@each"===this._parent._key&&this.value()},E=p.prototype;E.value=function(){if(void 0===this._value&&this._watching){var e=this._parent.value();this._value=e&&!r(e)?i(e,this._key):void 0}return this._value},E.destroy=function(){if(this._watching){var e=this._object;e&&m(e,this._key,this),this._watching=!1}},E.copy=function(e){var t,r=new p(null,null,e),n=this._paths;for(t in n)0>=n[t]||r.add(t);return r},E.add=function(t){var r,n,i,s,a;if(a=this._paths,a[t]=(a[t]||0)+1,r=this.value(),n=o(r,t),n[0]&&n[0]===r)t=n[1],i=e(t),t=t.slice(i.length+1);else{if(!n[0])return b.push([this,t]),n.length=0,void 0;s=n[0],i=t.slice(0,0-(n[1].length+1)),t=n[1]}n.length=0,this.chain(i,t,s)},E.remove=function(t){var r,n,i,s,a;a=this._paths,a[t]>0&&a[t]--,r=this.value(),n=o(r,t),n[0]===r?(t=n[1],i=e(t),t=t.slice(i.length+1)):(s=n[0],i=t.slice(0,0-(n[1].length+1)),t=n[1]),n.length=0,this.unchain(i,t)},E.count=0,E.chain=function(t,r,n){var i,o=this._chains;o||(o=this._chains={}),i=o[t],i||(i=o[t]=new p(this,t,n)),i.count++,r&&r.length>0&&(t=e(r),r=r.slice(t.length+1),i.chain(t,r))},E.unchain=function(t,r){var n=this._chains,i=n[t];r&&r.length>1&&(t=e(r),r=r.slice(t.length+1),i.unchain(t,r)),i.count--,0>=i.count&&(delete n[i._key],i.destroy())},E.willChange=function(){var e=this._chains;if(e)for(var t in e)e.hasOwnProperty(t)&&e[t].willChange();this._parent&&this._parent.chainWillChange(this,this._key,1)},E.chainWillChange=function(e,t,r){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainWillChange(this,t,r+1):(r>1&&h(this.value(),t),t="this."+t,this._paths[t]>0&&h(this.value(),t))},E.chainDidChange=function(e,t,r){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainDidChange(this,t,r+1):(r>1&&l(this.value(),t),t="this."+t,this._paths[t]>0&&l(this.value(),t))},E.didChange=function(e){if(this._watching){var r=this._parent.value();r!==this._object&&(m(this._object,this._key,this),this._object=r,t(r,this._key,this)),this._value=void 0,this._parent&&"@each"===this._parent._key&&this.value()}var n=this._chains;if(n)for(var i in n)n.hasOwnProperty(i)&&n[i].didChange(e);e||this._parent&&this._parent.chainDidChange(this,this._key,1)},Ember.finishChains=function(e){var t=n(e,!1),r=t.chains;r&&(r.value()!==e&&(t.chains=r=r.copy(e)),r.didChange(!0))}}(),function(){function e(e){var r=t(e),i=r.chains;return i?i.value()!==e&&(i=r.chains=i.copy(e)):i=r.chains=new n(null,null,e),i}var t=Ember.meta,r=Ember.typeOf,n=Ember._ChainNode;Ember.watchPath=function(n,i){if("length"!==i||"array"!==r(n)){var o=t(n),s=o.watching;s[i]?s[i]=(s[i]||0)+1:(s[i]=1,e(n).add(i))}},Ember.unwatchPath=function(r,n){var i=t(r),o=i.watching;1===o[n]?(o[n]=0,e(r).remove(n)):o[n]>1&&o[n]--}}(),function(){function e(e){return"*"===e||!l.test(e)}var t=Ember.meta,r=Ember.GUID_KEY,n=Ember.META_KEY,i=Ember.removeChainWatcher,o=Ember.watchKey,s=Ember.unwatchKey,a=Ember.watchPath,u=Ember.unwatchPath,c=Ember.typeOf,h=Ember.generateGuid,l=/[\.\*]/;Ember.watch=function(t,r){("length"!==r||"array"!==c(t))&&(e(r)?o(t,r):a(t,r))},Ember.isWatching=function(e,t){var r=e[n];return(r&&r.watching[t])>0},Ember.watch.flushPending=Ember.flushPendingChains,Ember.unwatch=function(t,r){("length"!==r||"array"!==c(t))&&(e(r)?s(t,r):u(t,r))},Ember.rewatch=function(e){var n=t(e,!1),i=n.chains;r in e&&!e.hasOwnProperty(r)&&h(e,"ember"),i&&i.value()!==e&&(n.chains=i.copy(e))};var f=[];Ember.destroy=function(e){var t,r,o,s,a=e[n];if(a&&(e[n]=null,t=a.chains))for(f.push(t);f.length>0;){if(t=f.pop(),r=t._chains)for(o in r)r.hasOwnProperty(o)&&f.push(r[o]);t._watching&&(s=t._object,s&&i(s,t._key,t))}}}(),function(){function e(e,t){var r=e[t];return r?e.hasOwnProperty(t)||(r=e[t]=f(r)):r=e[t]={},r}function t(t){return e(t,"deps")}function r(r,n,i,o){var s,a,u,c,h,l=r._dependentKeys;if(l)for(s=t(o),a=0,u=l.length;u>a;a++)c=l[a],h=e(s,c),h[i]=(h[i]||0)+1,m(n,c)}function n(r,n,i,o){var s,a,u,c,h,l=r._dependentKeys;if(l)for(s=t(o),a=0,u=l.length;u>a;a++)c=l[a],h=e(s,c),h[i]=(h[i]||0)-1,p(n,c)}function i(e,t){this.func=e,this._cacheable=t&&void 0!==t.cacheable?t.cacheable:!0,this._dependentKeys=t&&t.dependentKeys,this._readOnly=t&&(void 0!==t.readOnly||!!t.readOnly)}function o(e,t){for(var r={},n=0;t.length>n;n++)r[t[n]]=u(e,t[n]);return r}function s(e,t){Ember.computed[e]=function(e){var r=l.call(arguments);return Ember.computed(e,function(){return t.apply(this,r)})}}function a(e,t){Ember.computed[e]=function(){var e=l.call(arguments),r=Ember.computed(function(){return t.apply(this,[o(this,e)])});return r.property.apply(r,e)}}var u=Ember.get,c=Ember.set,h=Ember.meta,l=[].slice,f=Ember.create,b=Ember.META_KEY,m=Ember.watch,p=Ember.unwatch;Ember.ComputedProperty=i,i.prototype=new Ember.Descriptor;var E=i.prototype;E.cacheable=function(e){return this._cacheable=e!==!1,this},E.volatile=function(){return this.cacheable(!1)},E.readOnly=function(e){return this._readOnly=void 0===e||!!e,this},E.property=function(){for(var e=[],t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return this._dependentKeys=e,this},E.meta=function(e){return 0===arguments.length?this._meta||{}:(this._meta=e,this)},E.willWatch=function(e,t){var n=e[b];t in n.cache||r(this,e,t,n)},E.didUnwatch=function(e,t){var r=e[b];t in r.cache||n(this,e,t,r)},E.didChange=function(e,t){if(this._cacheable&&this._suspended!==e){var r=h(e);t in r.cache&&(delete r.cache[t],r.watching[t]||n(this,e,t,r))}},E.get=function(e,t){var n,i,o;if(this._cacheable){if(o=h(e),i=o.cache,t in i)return i[t];n=i[t]=this.func.call(e,t),o.watching[t]||r(this,e,t,o)}else n=this.func.call(e,t);return n},E.set=function(e,t,n){var i,o,s=this._cacheable,a=this.func,u=h(e,s),c=u.watching[t],l=this._suspended,f=!1,b=u.cache;if(this._readOnly)throw new Error("Cannot Set: "+t+" on: "+e.toString());this._suspended=e;try{if(s&&b.hasOwnProperty(t)&&(i=b[t],f=!0),a.wrappedFunction&&(a=a.wrappedFunction),3===a.length)o=a.call(e,t,n,i);else{if(2!==a.length)return Ember.defineProperty(e,t,null,i),Ember.set(e,t,n),void 0;o=a.call(e,t,n)}if(f&&i===o)return;c&&Ember.propertyWillChange(e,t),f&&delete b[t],s&&(c||f||r(this,e,t,u),b[t]=o),c&&Ember.propertyDidChange(e,t)}finally{this._suspended=l}return o},E.setup=function(e,t){var n=e[b];n&&n.watching[t]&&r(this,e,t,h(e))},E.teardown=function(e,t){var r=h(e);return(r.watching[t]||t in r.cache)&&n(this,e,t,r),this._cacheable&&delete r.cache[t],null},Ember.computed=function(e){var t;if(arguments.length>1&&(t=l.call(arguments,0,-1),e=l.call(arguments,-1)[0]),"function"!=typeof e)throw new Error("Computed Property declared without a property function");var r=new i(e);return t&&r.property.apply(r,t),r},Ember.cacheFor=function(e,t){var r=h(e,!1).cache;return r&&t in r?r[t]:void 0},s("empty",function(e){return Ember.isEmpty(u(this,e))}),s("notEmpty",function(e){return!Ember.isEmpty(u(this,e))}),s("none",function(e){return Ember.isNone(u(this,e))}),s("not",function(e){return!u(this,e)}),s("bool",function(e){return!!u(this,e)}),s("match",function(e,t){var r=u(this,e);return"string"==typeof r?!!r.match(t):!1}),s("equal",function(e,t){return u(this,e)===t}),s("gt",function(e,t){return u(this,e)>t}),s("gte",function(e,t){return u(this,e)>=t}),s("lt",function(e,t){return t>u(this,e)}),s("lte",function(e,t){return t>=u(this,e)}),a("and",function(e){for(var t in e)if(e.hasOwnProperty(t)&&!e[t])return!1;return!0}),a("or",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1}),a("any",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return e[t];return null}),a("map",function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&(Ember.isNone(e[r])?t.push(null):t.push(e[r]));return t}),Ember.computed.alias=function(e){return Ember.computed(e,function(t,r){return arguments.length>1?(c(this,e,r),r):u(this,e)})},Ember.computed.defaultTo=function(e){return Ember.computed(function(t,r,n){return 1===arguments.length?null!=n?n:u(this,e):null!=r?r:u(this,e)})}}(),function(){function e(e){return e+r}function t(e){return e+n}var r=":change",n=":before";Ember.guidFor,Ember.addObserver=function(t,r,n,i){return Ember.addListener(t,e(r),n,i),Ember.watch(t,r),this},Ember.observersFor=function(t,r){return Ember.listenersFor(t,e(r))},Ember.removeObserver=function(t,r,n,i){return Ember.unwatch(t,r),Ember.removeListener(t,e(r),n,i),this},Ember.addBeforeObserver=function(e,r,n,i){return Ember.addListener(e,t(r),n,i),Ember.watch(e,r),this},Ember._suspendBeforeObserver=function(e,r,n,i,o){return Ember._suspendListener(e,t(r),n,i,o)},Ember._suspendObserver=function(t,r,n,i,o){return Ember._suspendListener(t,e(r),n,i,o)};var i=Ember.ArrayPolyfills.map;Ember._suspendBeforeObservers=function(e,r,n,o,s){var a=i.call(r,t);return Ember._suspendListeners(e,a,n,o,s)},Ember._suspendObservers=function(t,r,n,o,s){var a=i.call(r,e);return Ember._suspendListeners(t,a,n,o,s)},Ember.beforeObserversFor=function(e,r){return Ember.listenersFor(e,t(r))},Ember.removeBeforeObserver=function(e,r,n,i){return Ember.unwatch(e,r),Ember.removeListener(e,t(r),n,i),this}}(),function(){function e(e,t,r,n){return void 0===t&&(t=e,e=void 0),"string"==typeof t&&(t=e[t]),r&&n>0&&(r=r.length>n?o.call(r,n):null),Ember.handleErrors(function(){return t.apply(e||this,r||[])},this)}function t(){c=null,u.currentRunLoop&&u.end()}function r(){h=null,u(function(){var t=+new Date,n=-1;for(var i in f)if(f.hasOwnProperty(i)){var o=f[i];o&&o.expires&&(t>=o.expires?(delete f[i],e(o.target,o.method,o.args,2)):(0>n||n>o.expires)&&(n=o.expires))}n>0&&(h=setTimeout(r,n-t),l=n)})}function n(t,r){r[this.tguid]&&delete r[this.tguid][this.mguid],f[t]&&e(this.target,this.method,this.args),delete f[t]}function i(e,t,r,i){var o,s=Ember.guidFor(t),a=Ember.guidFor(r),c=u.autorun().onceTimers,h=c[s]&&c[s][a];return h&&f[h]?f[h].args=i:(o={target:t,method:r,args:i,tguid:s,mguid:a},h=Ember.guidFor(o),f[h]=o,c[s]||(c[s]={}),c[s][a]=h,u.schedule(e,o,n,h,c)),h}var o=[].slice,s=Ember.ArrayPolyfills.forEach,a=function(e){this._prev=e||null,this.onceTimers={}};a.prototype={end:function(){this.flush()},prev:function(){return this._prev},schedule:function(e,t,r){var n,i=this._queues;i||(i=this._queues={}),n=i[e],n||(n=i[e]=[]);var s=arguments.length>3?o.call(arguments,3):null;return n.push({target:t,method:r,args:s}),this},flush:function(t){function r(t){e(t.target,t.method,t.args)}function n(){s.call(u,r)}var i,o,a,u,c;if(!this._queues)return this;if(Ember.watch.flushPending(),t)for(;this._queues&&(u=this._queues[t]);)this._queues[t]=null,"sync"===t?(c=Ember.LOG_BINDINGS,c&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(n,Ember.endPropertyChanges),c&&Ember.Logger.log("End: Flush Sync Queue")):s.call(u,r);
16
- else{i=Ember.run.queues,a=i.length,o=0;e:for(;a>o;){t=i[o],u=this._queues&&this._queues[t],delete this._queues[t],u&&("sync"===t?(c=Ember.LOG_BINDINGS,c&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(n,Ember.endPropertyChanges),c&&Ember.Logger.log("End: Flush Sync Queue")):s.call(u,r));for(var h=0;o>=h;h++)if(this._queues&&this._queues[i[h]]){o=h;continue e}o++}}return this}},Ember.RunLoop=a,Ember.run=function(t,r){function n(){return t||r?e(t,r,i,2):void 0}var i=arguments;return u.begin(),Ember.tryFinally(n,u.end)};var u=Ember.run;Ember.run.begin=function(){u.currentRunLoop=new a(u.currentRunLoop)},Ember.run.end=function(){function e(){u.currentRunLoop.end()}function t(){u.currentRunLoop=u.currentRunLoop.prev()}Ember.tryFinally(e,t)},Ember.run.queues=["sync","actions","destroy"],Ember.run.schedule=function(){var e=u.autorun();e.schedule.apply(e,arguments)};var c;Ember.run.hasScheduledTimers=function(){return!(!c&&!h)},Ember.run.cancelTimers=function(){c&&(clearTimeout(c),c=null),h&&(clearTimeout(h),h=null),f={}},Ember.run.autorun=function(){return u.currentRunLoop||(u.begin(),c||(c=setTimeout(t,1))),u.currentRunLoop},Ember.run.sync=function(){u.autorun(),u.currentRunLoop.flush("sync")};var h,l,f={};Ember.run.later=function(e,t){var n,i,s,a,u;return 2===arguments.length&&"function"==typeof e?(u=t,t=e,e=void 0,n=[e,t]):(n=o.call(arguments),u=n.pop()),i=+new Date+u,s={target:e,method:t,expires:i,args:n},a=Ember.guidFor(s),f[a]=s,h&&l>i&&(clearTimeout(h),h=null),h||(h=setTimeout(r,u),l=i),a},Ember.run.once=function(e,t){return i("actions",e,t,o.call(arguments,2))},Ember.run.scheduleOnce=function(e,t,r){return i(e,t,r,o.call(arguments,3))},Ember.run.next=function(){var e=o.call(arguments);return e.push(1),u.later.apply(this,e)},Ember.run.cancel=function(e){delete f[e]}}(),function(){function e(e,t){return r(o(t)?Ember.lookup:e,t)}function t(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])}Ember.LOG_BINDINGS=!1||!!Ember.ENV.LOG_BINDINGS;var r=Ember.get,n=(Ember.set,Ember.guidFor),i=/^([A-Z$]|([0-9][A-Z$]))/,o=Ember.isGlobalPath=function(e){return i.test(e)},s=function(e,t){this._direction="fwd",this._from=t,this._to=e,this._directionMap=Ember.Map.create()};s.prototype={copy:function(){var e=new s(this._to,this._from);return this._oneWay&&(e._oneWay=!0),e},from:function(e){return this._from=e,this},to:function(e){return this._to=e,this},oneWay:function(){return this._oneWay=!0,this},toString:function(){var e=this._oneWay?"[oneWay]":"";return"Ember.Binding<"+n(this)+">("+this._from+" -> "+this._to+")"+e},connect:function(t){var r=this._from,n=this._to;return Ember.trySet(t,n,e(t,r)),Ember.addObserver(t,r,this,this.fromDidChange),this._oneWay||Ember.addObserver(t,n,this,this.toDidChange),this._readyToSync=!0,this},disconnect:function(e){var t=!this._oneWay;return Ember.removeObserver(e,this._from,this,this.fromDidChange),t&&Ember.removeObserver(e,this._to,this,this.toDidChange),this._readyToSync=!1,this},fromDidChange:function(e){this._scheduleSync(e,"fwd")},toDidChange:function(e){this._scheduleSync(e,"back")},_scheduleSync:function(e,t){var r=this._directionMap,n=r.get(e);n||(Ember.run.schedule("sync",this,this._sync,e),r.set(e,t)),"back"===n&&"fwd"===t&&r.set(e,"fwd")},_sync:function(t){var n=Ember.LOG_BINDINGS;if(!t.isDestroyed&&this._readyToSync){var i=this._directionMap,o=i.get(t),s=this._from,a=this._to;if(i.remove(t),"fwd"===o){var u=e(t,this._from);n&&Ember.Logger.log(" ",this.toString(),"->",u,t),this._oneWay?Ember.trySet(t,a,u):Ember._suspendObserver(t,a,this,this.toDidChange,function(){Ember.trySet(t,a,u)})}else if("back"===o){var c=r(t,this._to);n&&Ember.Logger.log(" ",this.toString(),"<-",c,t),Ember._suspendObserver(t,s,this,this.fromDidChange,function(){Ember.trySet(Ember.isGlobalPath(s)?Ember.lookup:t,s,c)})}}}},t(s,{from:function(){var e=this,t=new e;return t.from.apply(t,arguments)},to:function(){var e=this,t=new e;return t.to.apply(t,arguments)},oneWay:function(e,t){var r=this,n=new r(null,e);return n.oneWay(t)}}),Ember.Binding=s,Ember.bind=function(e,t,r){return new Ember.Binding(t,r).connect(e)},Ember.oneWay=function(e,t,r){return new Ember.Binding(t,r).oneWay().connect(e)}}(),function(){function e(e){var t=Ember.meta(e,!0),r=t.mixins;return r?t.hasOwnProperty("mixins")||(r=t.mixins=A(r)):r=t.mixins={},r}function t(e,t){return t&&t.length>0&&(e.mixins=O.call(t,function(e){if(e instanceof g)return e;var t=new g;return t.properties=e,t})),e}function r(e){return"function"==typeof e&&e.isMethod!==!1&&e!==Boolean&&e!==Object&&e!==Number&&e!==Array&&e!==Date&&e!==String}function n(e,t){var r;return t instanceof g?(r=S(t),e[r]?D:(e[r]=t,t.properties)):t}function i(e,t,r){var n;return n=t.concatenatedProperties||r.concatenatedProperties,e.concatenatedProperties&&(n=n?n.concat(e.concatenatedProperties):e.concatenatedProperties),n}function o(e,t,r,n,i){var o;return void 0===n[t]&&(o=i[t]),o=o||e.descs[t],o&&o instanceof Ember.ComputedProperty?(r=A(r),r.func=Ember.wrap(r.func,o.func),r):r}function s(e,t,r,n,i){var o;return void 0===i[t]&&(o=n[t]),o=o||e[t],"function"!=typeof o?r:Ember.wrap(r,o)}function a(e,t,r,n){var i=n[t]||e[t];return i?"function"==typeof i.concat?i.concat(r):Ember.makeArray(i).concat(r):Ember.makeArray(r)}function u(e,t,n,i,u,c,h){if(n instanceof Ember.Descriptor){if(n===y&&u[t])return D;n.func&&(n=o(i,t,n,c,u)),u[t]=n,c[t]=void 0}else r(n)?n=s(e,t,n,c,u):(h&&C.call(h,t)>=0||"concatenatedProperties"===t)&&(n=a(e,t,n,c)),u[t]=void 0,c[t]=n}function c(e,t,r,o,s,a){function h(e){delete r[e],delete o[e]}for(var l,f,b,m,p,E=0,d=e.length;d>E;E++)if(l=e[E],f=n(t,l),f!==D)if(f){p=Ember.meta(s),m=i(f,o,s);for(b in f)f.hasOwnProperty(b)&&(a.push(b),u(s,b,f[b],p,r,o,m));f.hasOwnProperty("toString")&&(s.toString=f.toString)}else l.mixins&&(c(l.mixins,t,r,o,s,a),l._without&&w.call(l._without,h))}function h(e,t,r,n){if(x.test(t)){var i=n.bindings;i?n.hasOwnProperty("bindings")||(i=n.bindings=A(n.bindings)):i=n.bindings={},i[t]=r}}function l(e,t){var r,n,i,o=t.bindings;if(o){for(r in o)n=o[r],n&&(i=r.slice(0,-7),n instanceof Ember.Binding?(n=n.copy(),n.to(i)):n=new Ember.Binding(i,n),n.connect(e),e[r]=n);t.bindings={}}}function f(e,t){return l(e,t||Ember.meta(e)),e}function b(e,t,r,n,i){var o,s=t.methodName;return n[s]||i[s]?(o=i[s],t=n[s]):r.descs[s]?(t=r.descs[s],o=void 0):(t=void 0,o=e[s]),{desc:t,value:o}}function m(e,t,r,n,i){if("function"==typeof r){var o=r[n];if(o)for(var s=0,a=o.length;a>s;s++)Ember[i](e,o[s],null,t)}}function p(e,t,r){var n=e[t];m(e,t,n,"__ember_observesBefore__","removeBeforeObserver"),m(e,t,n,"__ember_observes__","removeObserver"),m(e,t,r,"__ember_observesBefore__","addBeforeObserver"),m(e,t,r,"__ember_observes__","addObserver")}function E(t,r,n){var i,o,s,a={},u={},l=Ember.meta(t),m=[];c(r,e(t),a,u,t,m);for(var E=0,d=m.length;d>E;E++)if(i=m[E],"constructor"!==i&&u.hasOwnProperty(i)&&(s=a[i],o=u[i],s!==y)){for(;s&&s instanceof _;){var v=b(t,s,l,a,u);s=v.desc,o=v.value}(void 0!==s||void 0!==o)&&(p(t,i,o),h(t,i,o,l),j(t,i,s,o,l))}return n||f(t,l),t}function d(e,t,r){var n=S(e);if(r[n])return!1;if(r[n]=!0,e===t)return!0;for(var i=e.mixins,o=i?i.length:0;--o>=0;)if(d(i[o],t,r))return!0;return!1}function v(e,t,r){if(!r[S(t)])if(r[S(t)]=!0,t.properties){var n=t.properties;for(var i in n)n.hasOwnProperty(i)&&(e[i]=!0)}else t.mixins&&w.call(t.mixins,function(t){v(e,t,r)})}var g,y,_,O=Ember.ArrayPolyfills.map,C=Ember.ArrayPolyfills.indexOf,w=Ember.ArrayPolyfills.forEach,P=[].slice,A=Ember.create,j=Ember.defineProperty,S=Ember.guidFor,D={},x=Ember.IS_BINDING=/^.+Binding$/;Ember.mixin=function(e){var t=P.call(arguments,1);return E(e,t,!1),e},Ember.Mixin=function(){return t(this,arguments)},g=Ember.Mixin,g.prototype={properties:null,mixins:null,ownerConstructor:null},g._apply=E,g.applyPartial=function(e){var t=P.call(arguments,1);return E(e,t,!0)},g.finishPartial=f,Ember.anyUnprocessedMixins=!1,g.create=function(){Ember.anyUnprocessedMixins=!0;var e=this;return t(new e,arguments)};var N=g.prototype;N.reopen=function(){var e,t;this.properties?(e=g.create(),e.properties=this.properties,delete this.properties,this.mixins=[e]):this.mixins||(this.mixins=[]);var r,n=arguments.length,i=this.mixins;for(r=0;n>r;r++)e=arguments[r],e instanceof g?i.push(e):(t=g.create(),t.properties=e,i.push(t));return this},N.apply=function(e){return E(e,[this],!1)},N.applyPartial=function(e){return E(e,[this],!0)},N.detect=function(e){if(!e)return!1;if(e instanceof g)return d(e,this,{});var t=Ember.meta(e,!1).mixins;return t?!!t[S(this)]:!1},N.without=function(){var e=new g(this);return e._without=P.call(arguments),e},N.keys=function(){var e={},t={},r=[];v(e,this,t);for(var n in e)e.hasOwnProperty(n)&&r.push(n);return r},g.mixins=function(e){var t=Ember.meta(e,!1).mixins,r=[];if(!t)return r;for(var n in t){var i=t[n];i.properties||r.push(i)}return r},y=new Ember.Descriptor,y.toString=function(){return"(Required Property)"},Ember.required=function(){return y},_=function(e){this.methodName=e},_.prototype=new Ember.Descriptor,Ember.alias=function(e){return new _(e)},Ember.alias=Ember.deprecateFunc("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.",Ember.alias),Ember.aliasMethod=function(e){return new _(e)},Ember.observer=function(e){var t=P.call(arguments,1);return e.__ember_observes__=t,e},Ember.immediateObserver=function(){for(var e=0,t=arguments.length;t>e;e++)arguments[e];return Ember.observer.apply(this,arguments)},Ember.beforeObserver=function(e){var t=P.call(arguments,1);return e.__ember_observesBefore__=t,e}}(),function(){e("rsvp",[],function(){"use strict";function e(e,t){n.async(function(){e.trigger("promise:resolved",{detail:t}),e.isResolved=!0,e.resolvedValue=t})}function t(e,t){n.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedValue=t})}function r(e){var t,r=[],n=new m,i=e.length;0===i&&n.resolve([]);var o=function(e){return function(t){s(e,t)}},s=function(e,t){r[e]=t,0===--i&&n.resolve(r)},a=function(e){n.reject(e)};for(t=0;i>t;t++)e[t].then(o(t),a);return n}var n,i,o="undefined"!=typeof window?window:{},s=o.MutationObserver||o.WebKitMutationObserver;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))i=function(e,t){process.nextTick(function(){e.call(t)})};else if(s){var a=[],u=new s(function(){var e=a.slice();a=[],e.forEach(function(e){var t=e[0],r=e[1];t.call(r)})}),c=document.createElement("div");u.observe(c,{attributes:!0}),window.addEventListener("unload",function(){u.disconnect(),u=null}),i=function(e,t){a.push([e,t]),c.setAttribute("drainQueue","drainQueue")}}else i=function(e,t){setTimeout(function(){e.call(t)},1)};var h=function(e,t){this.type=e;for(var r in t)t.hasOwnProperty(r)&&(this[r]=t[r])},l=function(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r][0]===t)return r;return-1},f=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},b={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,r){var n,i,o=f(this);for(e=e.split(/\s+/),r=r||this;i=e.shift();)n=o[i],n||(n=o[i]=[]),-1===l(n,t)&&n.push([t,r])},off:function(e,t){var r,n,i,o=f(this);for(e=e.split(/\s+/);n=e.shift();)t?(r=o[n],i=l(r,t),-1!==i&&r.splice(i,1)):o[n]=[]},trigger:function(e,t){var r,n,i,o,s,a=f(this);if(r=a[e])for(var u=0;r.length>u;u++)n=r[u],i=n[0],o=n[1],"object"!=typeof t&&(t={detail:t}),s=new h(e,t),i.call(o,s)}},m=function(){this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this)},p=function(){},E=function(e,t,r,n){var i,o,s,a,u="function"==typeof r;if(u)try{i=r(n.detail),s=!0}catch(c){a=!0,o=c}else i=n.detail,s=!0;i&&"function"==typeof i.then?i.then(function(e){t.resolve(e)},function(e){t.reject(e)}):u&&s?t.resolve(i):a?t.reject(o):t[e](i)};return m.prototype={then:function(e,t){var r=new m;return this.isResolved&&n.async(function(){E("resolve",r,e,{detail:this.resolvedValue})},this),this.isRejected&&n.async(function(){E("reject",r,t,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(t){E("resolve",r,e,t)}),this.on("promise:failed",function(e){E("reject",r,t,e)}),r},resolve:function(t){e(this,t),this.resolve=p,this.reject=p},reject:function(e){t(this,e),this.resolve=p,this.reject=p}},b.mixin(m.prototype),n={async:i,Promise:m,Event:h,EventTarget:b,all:r,raiseOnUncaughtExceptions:!0}})}(),function(){e("container",[],function(){function e(e){this.parent=e,this.dict={}}function t(t){this.parent=t,this.children=[],this.resolver=t&&t.resolver||function(){},this.registry=new e(t&&t.registry),this.cache=new e(t&&t.cache),this.typeInjections=new e(t&&t.typeInjections),this.injections={},this._options=new e(t&&t._options),this._typeOptions=new e(t&&t._typeOptions)}function r(e){throw new Error(e+" is not currently supported on child containers")}function n(e,t){var r=o(e,t,"singleton");return r!==!1}function i(e,t){var r={};if(!t)return r;for(var n,i,o=0,s=t.length;s>o;o++)n=t[o],i=e.lookup(n.fullName),r[n.property]=i;return r}function o(e,t,r){var n=e._options.get(t);if(n&&void 0!==n[r])return n[r];var i=t.split(":")[0];return n=e._typeOptions.get(i),n?n[r]:void 0}function s(e,t){var r=e.normalize(t);return e.resolve(r)}function a(e,t){var r,n=s(e,t),a=t.split(":"),u=a[0];if(o(e,t,"instantiate")===!1)return n;if(n){var c=[];c=c.concat(e.typeInjections.get(u)||[]),c=c.concat(e.injections[t]||[]);var h=i(e,c);return h.container=e,h._debugContainerKey=t,r=n.create(h)}}function u(e,t){e.cache.eachLocal(function(r,n){o(e,r,"instantiate")!==!1&&t(n)})}function c(e){e.cache.eachLocal(function(t,r){o(e,t,"instantiate")!==!1&&r.destroy()}),e.cache.dict={}}return e.prototype={get:function(e){var t=this.dict;return t.hasOwnProperty(e)?t[e]:this.parent?this.parent.get(e):void 0},set:function(e,t){this.dict[e]=t},has:function(e){var t=this.dict;return t.hasOwnProperty(e)?!0:this.parent?this.parent.has(e):!1},eachLocal:function(e,t){var r=this.dict;for(var n in r)r.hasOwnProperty(n)&&e.call(t,n,r[n])}},t.prototype={child:function(){var e=new t(this);return this.children.push(e),e},set:function(e,t,r){e[t]=r},register:function(e,t,r,n){var i;-1!==e.indexOf(":")?(n=r,r=t,i=e):i=e+":"+t;var o=this.normalize(i);this.registry.set(o,r),this._options.set(o,n||{})},resolve:function(e){return this.resolver(e)||this.registry.get(e)},normalize:function(e){return e},lookup:function(e,t){if(e=this.normalize(e),t=t||{},this.cache.has(e)&&t.singleton!==!1)return this.cache.get(e);var r=a(this,e);return r?(n(this,e)&&t.singleton!==!1&&this.cache.set(e,r),r):void 0},has:function(e){return this.cache.has(e)?!0:!!s(this,e)},optionsForType:function(e,t){this.parent&&r("optionsForType"),this._typeOptions.set(e,t)},options:function(e,t){this.optionsForType(e,t)},typeInjection:function(e,t,n){this.parent&&r("typeInjection");var i=this.typeInjections.get(e);i||(i=[],this.typeInjections.set(e,i)),i.push({property:t,fullName:n})},injection:function(e,t,n){if(this.parent&&r("injection"),-1===e.indexOf(":"))return this.typeInjection(e,t,n);var i=this.injections[e]=this.injections[e]||[];i.push({property:t,fullName:n})},destroy:function(){this.isDestroyed=!0;for(var e=0,t=this.children.length;t>e;e++)this.children[e].destroy();this.children=[],u(this,function(e){e.isDestroying=!0}),u(this,function(e){e.destroy()}),delete this.parent,this.isDestroyed=!0},reset:function(){for(var e=0,t=this.children.length;t>e;e++)c(this.children[e]);c(this)}},t})}(),function(){function e(r,n,i,o){var s,a,u;if("object"!=typeof r||null===r)return r;if(n&&(a=t(i,r))>=0)return o[a];if("array"===Ember.typeOf(r)){if(s=r.slice(),n)for(a=s.length;--a>=0;)s[a]=e(s[a],n,i,o)}else if(Ember.Copyable&&Ember.Copyable.detect(r))s=r.copy(n,i,o);else{s={};for(u in r)r.hasOwnProperty(u)&&"__"!==u.substring(0,2)&&(s[u]=n?e(r[u],n,i,o):r[u])}return n&&(i.push(r),o.push(s)),s}var t=Ember.EnumerableUtils.indexOf;Ember.compare=function r(e,t){if(e===t)return 0;var n=Ember.typeOf(e),i=Ember.typeOf(t),o=Ember.Comparable;if(o){if("instance"===n&&o.detect(e.constructor))return e.constructor.compare(e,t);if("instance"===i&&o.detect(t.constructor))return 1-t.constructor.compare(t,e)}var s=Ember.ORDER_DEFINITION_MAPPING;if(!s){var a=Ember.ORDER_DEFINITION;s=Ember.ORDER_DEFINITION_MAPPING={};var u,c;for(u=0,c=a.length;c>u;++u)s[a[u]]=u;delete Ember.ORDER_DEFINITION}var h=s[n],l=s[i];if(l>h)return-1;if(h>l)return 1;switch(n){case"boolean":case"number":return t>e?-1:e>t?1:0;case"string":var f=e.localeCompare(t);return 0>f?-1:f>0?1:0;case"array":for(var b=e.length,m=t.length,p=Math.min(b,m),E=0,d=0;0===E&&p>d;)E=r(e[d],t[d]),d++;return 0!==E?E:m>b?-1:b>m?1:0;case"instance":return Ember.Comparable&&Ember.Comparable.detect(e)?e.compare(e,t):0;case"date":var v=e.getTime(),g=t.getTime();return g>v?-1:v>g?1:0;default:return 0}},Ember.copy=function(t,r){return"object"!=typeof t||null===t?t:Ember.Copyable&&Ember.Copyable.detect(t)?t.copy(r):e(t,r,r?[]:null,r?[]:null)},Ember.inspect=function(e){if("object"!=typeof e||null===e)return e+"";var t,r=[];for(var n in e)if(e.hasOwnProperty(n)){if(t=e[n],"toString"===t)continue;"function"===Ember.typeOf(t)&&(t="function() { ... }"),r.push(n+": "+t)}return"{"+r.join(", ")+"}"},Ember.isEqual=function(e,t){return e&&"function"==typeof e.isEqual?e.isEqual(t):e===t},Ember.ORDER_DEFINITION=Ember.ENV.ORDER_DEFINITION||["undefined","null","boolean","number","string","array","object","instance","function","class","date"],Ember.keys=Object.keys,Ember.keys||(Ember.keys=function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r);return t});var n=["description","fileName","lineNumber","message","name","number","stack"];Ember.Error=function(){for(var e=Error.prototype.constructor.apply(this,arguments),t=0;n.length>t;t++)this[n[t]]=e[n[t]]},Ember.Error.prototype=Ember.create(Error.prototype)}(),function(){Ember.RSVP=t("rsvp")}(),function(){var e=/[ _]/g,t={},r=/([a-z])([A-Z])/g,n=/(\-|_|\.|\s)+(.)?/g,i=/([a-z\d])([A-Z]+)/g,o=/\-|\s+/g;Ember.STRINGS={},Ember.String={fmt:function(e,t){var r=0;return e.replace(/%@([0-9]+)?/g,function(e,n){return n=n?parseInt(n,0)-1:r++,e=t[n],(null===e?"(null)":void 0===e?"":e).toString()})},loc:function(e,t){return e=Ember.STRINGS[e]||e,Ember.String.fmt(e,t)},w:function(e){return e.split(/\s+/)},decamelize:function(e){return e.replace(r,"$1_$2").toLowerCase()},dasherize:function(r){var n,i=t,o=i.hasOwnProperty(r);return o?i[r]:(n=Ember.String.decamelize(r).replace(e,"-"),i[r]=n,n)},camelize:function(e){return e.replace(n,function(e,t,r){return r?r.toUpperCase():""}).replace(/^([A-Z])/,function(e){return e.toLowerCase()})},classify:function(e){for(var t=e.split("."),r=[],n=0,i=t.length;i>n;n++){var o=Ember.String.camelize(t[n]);r.push(o.charAt(0).toUpperCase()+o.substr(1))}return r.join(".")},underscore:function(e){return e.replace(i,"$1_$2").replace(o,"_").toLowerCase()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.substr(1)}}}(),function(){var e=Ember.String.fmt,t=Ember.String.w,r=Ember.String.loc,n=Ember.String.camelize,i=Ember.String.decamelize,o=Ember.String.dasherize,s=Ember.String.underscore,a=Ember.String.capitalize,u=Ember.String.classify;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.fmt=function(){return e(this,arguments)},String.prototype.w=function(){return t(this)},String.prototype.loc=function(){return r(this,arguments)},String.prototype.camelize=function(){return n(this)},String.prototype.decamelize=function(){return i(this)},String.prototype.dasherize=function(){return o(this)},String.prototype.underscore=function(){return s(this)},String.prototype.classify=function(){return u(this)},String.prototype.capitalize=function(){return a(this)})}(),function(){var e=Array.prototype.slice;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Function)&&(Function.prototype.property=function(){var e=Ember.computed(this);return e.property.apply(e,arguments)},Function.prototype.observes=function(){return this.__ember_observes__=e.call(arguments),this},Function.prototype.observesBefore=function(){return this.__ember_observesBefore__=e.call(arguments),this})}(),function(){function e(){return 0===a.length?{}:a.pop()}function t(e){return a.push(e),null}function r(e,t){function r(r){var o=n(r,e);return i?t===o:!!o}var i=2===arguments.length;return r}var n=Ember.get,i=Ember.set,o=Array.prototype.slice,s=Ember.EnumerableUtils.indexOf,a=[];Ember.Enumerable=Ember.Mixin.create({isEnumerable:!0,nextObject:Ember.required(Function),firstObject:Ember.computed(function(){if(0===n(this,"length"))return void 0;var r,i=e();return r=this.nextObject(0,null,i),t(i),r}).property("[]"),lastObject:Ember.computed(function(){var r=n(this,"length");if(0===r)return void 0;var i,o=e(),s=0,a=null;do a=i,i=this.nextObject(s++,a,o);while(void 0!==i);return t(o),a}).property("[]"),contains:function(e){return void 0!==this.find(function(t){return t===e})},forEach:function(r,i){if("function"!=typeof r)throw new TypeError;var o=n(this,"length"),s=null,a=e();void 0===i&&(i=null);for(var u=0;o>u;u++){var c=this.nextObject(u,s,a);r.call(i,c,u,this),s=c}return s=null,a=t(a),this},getEach:function(e){return this.mapProperty(e)},setEach:function(e,t){return this.forEach(function(r){i(r,e,t)})},map:function(e,t){var r=Ember.A([]);return this.forEach(function(n,i,o){r[i]=e.call(t,n,i,o)}),r},mapProperty:function(e){return this.map(function(t){return n(t,e)})},filter:function(e,t){var r=Ember.A([]);return this.forEach(function(n,i,o){e.call(t,n,i,o)&&r.push(n)}),r},reject:function(e,t){return this.filter(function(){return!e.apply(t,arguments)})},filterProperty:function(){return this.filter(r.apply(this,arguments))},rejectProperty:function(e,t){var r=function(r){return n(r,e)===t},i=function(t){return!!n(t,e)},o=2===arguments.length?r:i;return this.reject(o)},find:function(r,i){var o=n(this,"length");void 0===i&&(i=null);for(var s,a,u=null,c=!1,h=e(),l=0;o>l&&!c;l++)s=this.nextObject(l,u,h),(c=r.call(i,s,l,this))&&(a=s),u=s;return s=u=null,h=t(h),a},findProperty:function(){return this.find(r.apply(this,arguments))},every:function(e,t){return!this.find(function(r,n,i){return!e.call(t,r,n,i)})},everyProperty:function(){return this.every(r.apply(this,arguments))},some:function(e,t){return!!this.find(function(r,n,i){return!!e.call(t,r,n,i)})},someProperty:function(){return this.some(r.apply(this,arguments))},reduce:function(e,t,r){if("function"!=typeof e)throw new TypeError;var n=t;return this.forEach(function(t,i){n=e.call(null,n,t,i,this,r)},this),n},invoke:function(e){var t,r=Ember.A([]);return arguments.length>1&&(t=o.call(arguments,1)),this.forEach(function(n,i){var o=n&&n[e];"function"==typeof o&&(r[i]=t?o.apply(n,t):o.call(n))},this),r},toArray:function(){var e=Ember.A([]);return this.forEach(function(t,r){e[r]=t}),e},compact:function(){return this.filter(function(e){return null!=e})},without:function(e){if(!this.contains(e))return this;var t=Ember.A([]);return this.forEach(function(r){r!==e&&(t[t.length]=r)}),t},uniq:function(){var e=Ember.A([]);return this.forEach(function(t){0>s(e,t)&&e.push(t)}),e},"[]":Ember.computed(function(){return this}),addEnumerableObserver:function(e,t){var r=t&&t.willChange||"enumerableWillChange",i=t&&t.didChange||"enumerableDidChange",o=n(this,"hasEnumerableObservers");return o||Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.addListener(this,"@enumerable:before",e,r),Ember.addListener(this,"@enumerable:change",e,i),o||Ember.propertyDidChange(this,"hasEnumerableObservers"),this},removeEnumerableObserver:function(e,t){var r=t&&t.willChange||"enumerableWillChange",i=t&&t.didChange||"enumerableDidChange",o=n(this,"hasEnumerableObservers");return o&&Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.removeListener(this,"@enumerable:before",e,r),Ember.removeListener(this,"@enumerable:change",e,i),o&&Ember.propertyDidChange(this,"hasEnumerableObservers"),this},hasEnumerableObservers:Ember.computed(function(){return Ember.hasListeners(this,"@enumerable:change")||Ember.hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(e,t){var r,i,o;return r="number"==typeof e?e:e?n(e,"length"):e=-1,i="number"==typeof t?t:t?n(t,"length"):t=-1,o=0>i||0>r||0!==i-r,-1===e&&(e=null),-1===t&&(t=null),Ember.propertyWillChange(this,"[]"),o&&Ember.propertyWillChange(this,"length"),Ember.sendEvent(this,"@enumerable:before",[this,e,t]),this},enumerableContentDidChange:function(e,t){var r,i,o;return r="number"==typeof e?e:e?n(e,"length"):e=-1,i="number"==typeof t?t:t?n(t,"length"):t=-1,o=0>i||0>r||0!==i-r,-1===e&&(e=null),-1===t&&(t=null),Ember.sendEvent(this,"@enumerable:change",[this,e,t]),o&&Ember.propertyDidChange(this,"length"),Ember.propertyDidChange(this,"[]"),this}})}(),function(){function e(e){return null===e||void 0===e}var t=Ember.get,r=(Ember.set,Ember.EnumerableUtils.map),n=Ember.cacheFor;Ember.Array=Ember.Mixin.create(Ember.Enumerable,{isSCArray:!0,length:Ember.required(),objectAt:function(e){return 0>e||e>=t(this,"length")?void 0:t(this,e)},objectsAt:function(e){var t=this;return r(e,function(e){return t.objectAt(e)})},nextObject:function(e){return this.objectAt(e)},"[]":Ember.computed(function(e,r){return void 0!==r&&this.replace(0,t(this,"length"),r),this}),firstObject:Ember.computed(function(){return this.objectAt(0)}),lastObject:Ember.computed(function(){return this.objectAt(t(this,"length")-1)}),contains:function(e){return this.indexOf(e)>=0},slice:function(r,n){var i=Ember.A([]),o=t(this,"length");for(e(r)&&(r=0),(e(n)||n>o)&&(n=o),0>r&&(r=o+r),0>n&&(n=o+n);n>r;)i[i.length]=this.objectAt(r++);return i},indexOf:function(e,r){var n,i=t(this,"length");for(void 0===r&&(r=0),0>r&&(r+=i),n=r;i>n;n++)if(this.objectAt(n,!0)===e)return n;return-1},lastIndexOf:function(e,r){var n,i=t(this,"length");for((void 0===r||r>=i)&&(r=i-1),0>r&&(r+=i),n=r;n>=0;n--)if(this.objectAt(n)===e)return n;return-1},addArrayObserver:function(e,r){var n=r&&r.willChange||"arrayWillChange",i=r&&r.didChange||"arrayDidChange",o=t(this,"hasArrayObservers");return o||Ember.propertyWillChange(this,"hasArrayObservers"),Ember.addListener(this,"@array:before",e,n),Ember.addListener(this,"@array:change",e,i),o||Ember.propertyDidChange(this,"hasArrayObservers"),this},removeArrayObserver:function(e,r){var n=r&&r.willChange||"arrayWillChange",i=r&&r.didChange||"arrayDidChange",o=t(this,"hasArrayObservers");return o&&Ember.propertyWillChange(this,"hasArrayObservers"),Ember.removeListener(this,"@array:before",e,n),Ember.removeListener(this,"@array:change",e,i),o&&Ember.propertyDidChange(this,"hasArrayObservers"),this},hasArrayObservers:Ember.computed(function(){return Ember.hasListeners(this,"@array:change")||Ember.hasListeners(this,"@array:before")}),arrayContentWillChange:function(e,r,n){void 0===e?(e=0,r=n=-1):(void 0===r&&(r=-1),void 0===n&&(n=-1)),Ember.isWatching(this,"@each")&&t(this,"@each"),Ember.sendEvent(this,"@array:before",[this,e,r,n]);var i,o;if(e>=0&&r>=0&&t(this,"hasEnumerableObservers")){i=[],o=e+r;for(var s=e;o>s;s++)i.push(this.objectAt(s))}else i=r;return this.enumerableContentWillChange(i,n),this},arrayContentDidChange:function(e,r,i){void 0===e?(e=0,r=i=-1):(void 0===r&&(r=-1),void 0===i&&(i=-1));var o,s;if(e>=0&&i>=0&&t(this,"hasEnumerableObservers")){o=[],s=e+i;for(var a=e;s>a;a++)o.push(this.objectAt(a))}else o=i;this.enumerableContentDidChange(r,o),Ember.sendEvent(this,"@array:change",[this,e,r,i]);var u=t(this,"length"),c=n(this,"firstObject"),h=n(this,"lastObject");return this.objectAt(0)!==c&&(Ember.propertyWillChange(this,"firstObject"),Ember.propertyDidChange(this,"firstObject")),this.objectAt(u-1)!==h&&(Ember.propertyWillChange(this,"lastObject"),Ember.propertyDidChange(this,"lastObject")),this},"@each":Ember.computed(function(){return this.__each||(this.__each=new Ember.EachProxy(this)),this.__each})})}(),function(){Ember.Comparable=Ember.Mixin.create({isComparable:!0,compare:Ember.required(Function)})}(),function(){var e=Ember.get;Ember.set,Ember.Copyable=Ember.Mixin.create({copy:Ember.required(Function),frozenCopy:function(){if(Ember.Freezable&&Ember.Freezable.detect(this))return e(this,"isFrozen")?this:this.copy().freeze();throw new Error(Ember.String.fmt("%@ does not support freezing",[this]))}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Freezable=Ember.Mixin.create({isFrozen:!1,freeze:function(){return e(this,"isFrozen")?this:(t(this,"isFrozen",!0),this)}}),Ember.FROZEN_ERROR="Frozen object cannot be modified."}(),function(){var e=Ember.EnumerableUtils.forEach;Ember.MutableEnumerable=Ember.Mixin.create(Ember.Enumerable,{addObject:Ember.required(Function),addObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.addObject(e)},this),Ember.endPropertyChanges(this),this},removeObject:Ember.required(Function),removeObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.removeObject(e)},this),Ember.endPropertyChanges(this),this}})}(),function(){var e="Index out of range",t=[],r=Ember.get;Ember.set,Ember.MutableArray=Ember.Mixin.create(Ember.Array,Ember.MutableEnumerable,{replace:Ember.required(),clear:function(){var e=r(this,"length");return 0===e?this:(this.replace(0,e,t),this)},insertAt:function(t,n){if(t>r(this,"length"))throw new Error(e);return this.replace(t,0,[n]),this},removeAt:function(n,i){if("number"==typeof n){if(0>n||n>=r(this,"length"))throw new Error(e);void 0===i&&(i=1),this.replace(n,i,t)}return this},pushObject:function(e){return this.insertAt(r(this,"length"),e),e},pushObjects:function(e){return this.replace(r(this,"length"),0,e),this},popObject:function(){var e=r(this,"length");if(0===e)return null;var t=this.objectAt(e-1);return this.removeAt(e-1,1),t},shiftObject:function(){if(0===r(this,"length"))return null;var e=this.objectAt(0);return this.removeAt(0),e},unshiftObject:function(e){return this.insertAt(0,e),e},unshiftObjects:function(e){return this.replace(0,0,e),this},reverseObjects:function(){var e=r(this,"length");if(0===e)return this;var t=this.toArray().reverse();return this.replace(0,e,t),this},setObjects:function(e){if(0===e.length)return this.clear();var t=r(this,"length");return this.replace(0,t,e),this},removeObject:function(e){for(var t=r(this,"length")||0;--t>=0;){var n=this.objectAt(t);n===e&&this.removeAt(t)}return this},addObject:function(e){return this.contains(e)||this.pushObject(e),this}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Observable=Ember.Mixin.create({get:function(t){return e(this,t)},getProperties:function(){var t={},r=arguments;1===arguments.length&&"array"===Ember.typeOf(arguments[0])&&(r=arguments[0]);for(var n=0;r.length>n;n++)t[r[n]]=e(this,r[n]);return t},set:function(e,r){return t(this,e,r),this},setProperties:function(e){return Ember.setProperties(this,e)},beginPropertyChanges:function(){return Ember.beginPropertyChanges(),this},endPropertyChanges:function(){return Ember.endPropertyChanges(),this},propertyWillChange:function(e){return Ember.propertyWillChange(this,e),this},propertyDidChange:function(e){return Ember.propertyDidChange(this,e),this},notifyPropertyChange:function(e){return this.propertyWillChange(e),this.propertyDidChange(e),this},addBeforeObserver:function(e,t,r){Ember.addBeforeObserver(this,e,t,r)},addObserver:function(e,t,r){Ember.addObserver(this,e,t,r)},removeObserver:function(e,t,r){Ember.removeObserver(this,e,t,r)},hasObserverFor:function(e){return Ember.hasListeners(this,e+":change")},getPath:function(e){return this.get(e)},setPath:function(e,t){return this.set(e,t)},getWithDefault:function(e,t){return Ember.getWithDefault(this,e,t)},incrementProperty:function(r,n){return n||(n=1),t(this,r,(e(this,r)||0)+n),e(this,r)},decrementProperty:function(r,n){return n||(n=1),t(this,r,(e(this,r)||0)-n),e(this,r)},toggleProperty:function(r){return t(this,r,!e(this,r)),e(this,r)},cacheFor:function(e){return Ember.cacheFor(this,e)},observersForKey:function(e){return Ember.observersFor(this,e)}})}(),function(){var e=Ember.get;Ember.set,Ember.TargetActionSupport=Ember.Mixin.create({target:null,action:null,actionContext:null,targetObject:Ember.computed(function(){var t=e(this,"target");if("string"===Ember.typeOf(t)){var r=e(this,t);return void 0===r&&(r=e(Ember.lookup,t)),r}return t}).property("target"),actionContextObject:Ember.computed(function(){var t=e(this,"actionContext");if("string"===Ember.typeOf(t)){var r=e(this,t);return void 0===r&&(r=e(Ember.lookup,t)),r}return t}).property("actionContext"),triggerAction:function(t){t=t||{};var r=t.action||e(this,"action"),n=t.target||e(this,"targetObject"),i=t.actionContext||e(this,"actionContextObject")||this;if(n&&r){var o;return o=n.send?n.send.apply(n,[r,i]):n[r].apply(n,[i]),o!==!1&&(o=!0),o}return!1
17
- }})}(),function(){Ember.Evented=Ember.Mixin.create({on:function(e,t,r){return Ember.addListener(this,e,t,r),this},one:function(e,t,r){return r||(r=t,t=null),Ember.addListener(this,e,t,r,!0),this},trigger:function(e){var t,r,n=[];for(t=1,r=arguments.length;r>t;t++)n.push(arguments[t]);Ember.sendEvent(this,e,n)},fire:function(){this.trigger.apply(this,arguments)},off:function(e,t,r){return Ember.removeListener(this,e,t,r),this},has:function(e){return Ember.hasListeners(this,e)}})}(),function(){var e=t("rsvp");e.async=function(e,t){Ember.run.schedule("actions",t,e)};var r=Ember.get;Ember.DeferredMixin=Ember.Mixin.create({then:function(){var e=r(this,"promise");return e.then.apply(e,arguments)},resolve:function(e){r(this,"promise").resolve(e)},reject:function(e){r(this,"promise").reject(e)},promise:Ember.computed(function(){return new e.Promise})})}(),function(){Ember.Container=t("container"),Ember.Container.set=Ember.set}(),function(){function e(){var e,t,o=!1,s=function(){o||s.proto(),n(this,i,v),n(this,"_super",v);var u=a(this);if(u.proto=this,e){var h=e;e=null,this.reopen.apply(this,h)}if(t){var l=t;t=null;for(var f=this.concatenatedProperties,b=0,p=l.length;p>b;b++){var g=l[b];for(var y in g)if(g.hasOwnProperty(y)){var _=g[y],O=Ember.IS_BINDING;if(O.test(y)){var C=u.bindings;C?u.hasOwnProperty("bindings")||(C=u.bindings=r(u.bindings)):C=u.bindings={},C[y]=_}var w=u.descs[y];if(f&&d(f,y)>=0){var P=this[y];_=P?"function"==typeof P.concat?P.concat(_):Ember.makeArray(P).concat(_):Ember.makeArray(_)}w?w.set(this,y,_):"function"!=typeof this.setUnknownProperty||y in this?E?Ember.defineProperty(this,y,null,_):this[y]=_:this.setUnknownProperty(y,_)}}}m(this,u),delete u.proto,c(this),this.init.apply(this,arguments)};return s.toString=f.prototype.toString,s.willReopen=function(){o&&(s.PrototypeMixin=f.create(s.PrototypeMixin)),o=!1},s._initMixins=function(t){e=t},s._initProperties=function(e){t=e},s.proto=function(){var e=s.superclass;return e&&e.proto(),o||(o=!0,s.PrototypeMixin.applyPartial(s.prototype),u(s.prototype)),this.prototype},s}function t(e){return function(){return e}}var r=(Ember.set,Ember.get,Ember.create),n=Ember.platform.defineProperty,i=Ember.GUID_KEY,o=Ember.guidFor,s=Ember.generateGuid,a=Ember.meta,u=Ember.rewatch,c=Ember.finishChains,h=Ember.destroy,l=Ember.run.schedule,f=Ember.Mixin,b=f._apply,m=f.finishPartial,p=f.prototype.reopen,E=Ember.ENV.MANDATORY_SETTER,d=Ember.EnumerableUtils.indexOf,v={configurable:!0,writable:!0,enumerable:!1,value:void 0},g=e();g.toString=function(){return"Ember.CoreObject"},g.PrototypeMixin=f.create({reopen:function(){return b(this,arguments,!0),this},isInstance:!0,init:function(){},concatenatedProperties:null,isDestroyed:!1,isDestroying:!1,destroy:function(){return this._didCallDestroy?void 0:(this.isDestroying=!0,this._didCallDestroy=!0,l("destroy",this,this._scheduledDestroy),this)},willDestroy:Ember.K,_scheduledDestroy:function(){this.willDestroy&&this.willDestroy(),h(this),this.isDestroyed=!0,this.didDestroy&&this.didDestroy()},bind:function(e,t){return t instanceof Ember.Binding||(t=Ember.Binding.from(t)),t.to(e).connect(this),t},toString:function(){var e="function"==typeof this.toStringExtension,r=e?":"+this.toStringExtension():"",n="<"+this.constructor.toString()+":"+o(this)+r+">";return this.toString=t(n),n}}),g.PrototypeMixin.ownerConstructor=g,Ember.config.overridePrototypeMixin&&Ember.config.overridePrototypeMixin(g.PrototypeMixin),g.__super__=null;var y=f.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var t,n=e();return n.ClassMixin=f.create(this.ClassMixin),n.PrototypeMixin=f.create(this.PrototypeMixin),n.ClassMixin.ownerConstructor=n,n.PrototypeMixin.ownerConstructor=n,p.apply(n.PrototypeMixin,arguments),n.superclass=this,n.__super__=this.prototype,t=n.prototype=r(this.prototype),t.constructor=n,s(t,"ember"),a(t).proto=t,n.ClassMixin.apply(n),n},createWithMixins:function(){var e=this;return arguments.length>0&&this._initMixins(arguments),new e},create:function(){var e=this;return arguments.length>0&&this._initProperties(arguments),new e},reopen:function(){return this.willReopen(),p.apply(this.PrototypeMixin,arguments),this},reopenClass:function(){return p.apply(this.ClassMixin,arguments),b(this,arguments,!1),this},detect:function(e){if("function"!=typeof e)return!1;for(;e;){if(e===this)return!0;e=e.superclass}return!1},detectInstance:function(e){return e instanceof this},metaForProperty:function(e){var t=a(this.proto(),!1).descs[e];return t._meta||{}},eachComputedProperty:function(e,t){var r,n=this.proto(),i=a(n).descs,o={};for(var s in i)r=i[s],r instanceof Ember.ComputedProperty&&e.call(t||this,s,r._meta||o)}});y.ownerConstructor=g,Ember.config.overrideClassMixin&&Ember.config.overrideClassMixin(y),g.ClassMixin=y,y.apply(g),Ember.CoreObject=g}(),function(){Ember.Object=Ember.CoreObject.extend(Ember.Observable),Ember.Object.toString=function(){return"Ember.Object"}}(),function(){function e(t,r,i){var s=t.length;c[t.join(".")]=r;for(var a in r)if(h.call(r,a)){var u=r[a];if(t[s]=a,u&&u.toString===n)u.toString=o(t.join(".")),u[f]=t.join(".");else if(u&&u.isNamespace){if(i[l(u)])continue;i[l(u)]=!0,e(t,u,i)}}t.length=s}function t(){var e,t,r=Ember.Namespace,n=Ember.lookup;if(!r.PROCESSED)for(var i in n)if("parent"!==i&&"top"!==i&&"frameElement"!==i&&"webkitStorageInfo"!==i&&!("globalStorage"===i&&n.StorageList&&n.globalStorage instanceof n.StorageList||n.hasOwnProperty&&!n.hasOwnProperty(i))){try{e=Ember.lookup[i],t=e&&e.isNamespace}catch(o){continue}t&&(e[f]=i)}}function r(e){var t=e.superclass;return t?t[f]?t[f]:r(t):void 0}function n(){Ember.BOOTED||this[f]||i();var e;if(this[f])e=this[f];else{var t=r(this);e=t?"(subclass of "+t+")":"(unknown mixin)",this.toString=o(e)}return e}function i(){var r=!u.PROCESSED,n=Ember.anyUnprocessedMixins;if(r&&(t(),u.PROCESSED=!0),r||n){for(var i,o=u.NAMESPACES,s=0,a=o.length;a>s;s++)i=o[s],e([i.toString()],i,{});Ember.anyUnprocessedMixins=!1}}function o(e){return function(){return e}}var s=Ember.get,a=Ember.ArrayPolyfills.indexOf,u=Ember.Namespace=Ember.Object.extend({isNamespace:!0,init:function(){Ember.Namespace.NAMESPACES.push(this),Ember.Namespace.PROCESSED=!1},toString:function(){var e=s(this,"name");return e?e:(t(),this[Ember.GUID_KEY+"_name"])},nameClasses:function(){e([this.toString()],this,{})},destroy:function(){var e=Ember.Namespace.NAMESPACES;Ember.lookup[this.toString()]=void 0,e.splice(a.call(e,this),1),this._super()}});u.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:!1,processAll:i,byName:function(e){return Ember.BOOTED||i(),c[e]}});var c=u.NAMESPACES_BY_ID,h={}.hasOwnProperty,l=Ember.guidFor,f=Ember.NAME_KEY=Ember.GUID_KEY+"_name";Ember.Mixin.prototype.toString=n}(),function(){Ember.Application=Ember.Namespace.extend()}(),function(){var e="Index out of range",t=[],r=Ember.get;Ember.set,Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,arrangedContent:Ember.computed.alias("content"),objectAtContent:function(e){return r(this,"arrangedContent").objectAt(e)},replaceContent:function(e,t,n){r(this,"content").replace(e,t,n)},_contentWillChange:Ember.beforeObserver(function(){this._teardownContent()},"content"),_teardownContent:function(){var e=r(this,"content");e&&e.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},contentArrayWillChange:Ember.K,contentArrayDidChange:Ember.K,_contentDidChange:Ember.observer(function(){r(this,"content"),this._setupContent()},"content"),_setupContent:function(){var e=r(this,"content");e&&e.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},_arrangedContentWillChange:Ember.beforeObserver(function(){var e=r(this,"arrangedContent"),t=e?r(e,"length"):0;this.arrangedContentArrayWillChange(this,0,t,void 0),this.arrangedContentWillChange(this),this._teardownArrangedContent(e)},"arrangedContent"),_arrangedContentDidChange:Ember.observer(function(){var e=r(this,"arrangedContent"),t=e?r(e,"length"):0;this._setupArrangedContent(),this.arrangedContentDidChange(this),this.arrangedContentArrayDidChange(this,0,void 0,t)},"arrangedContent"),_setupArrangedContent:function(){var e=r(this,"arrangedContent");e&&e.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},_teardownArrangedContent:function(){var e=r(this,"arrangedContent");e&&e.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},arrangedContentWillChange:Ember.K,arrangedContentDidChange:Ember.K,objectAt:function(e){return r(this,"content")&&this.objectAtContent(e)},length:Ember.computed(function(){var e=r(this,"arrangedContent");return e?r(e,"length"):0}),_replace:function(e,t,n){var i=r(this,"content");return i&&this.replaceContent(e,t,n),this},replace:function(){if(r(this,"arrangedContent")!==r(this,"content"))throw new Ember.Error("Using replace on an arranged ArrayProxy is not allowed.");this._replace.apply(this,arguments)},_insertAt:function(t,n){if(t>r(this,"content.length"))throw new Error(e);return this._replace(t,0,[n]),this},insertAt:function(e,t){if(r(this,"arrangedContent")===r(this,"content"))return this._insertAt(e,t);throw new Ember.Error("Using insertAt on an arranged ArrayProxy is not allowed.")},removeAt:function(n,i){if("number"==typeof n){var o,s=r(this,"content"),a=r(this,"arrangedContent"),u=[];if(0>n||n>=r(this,"length"))throw new Error(e);for(void 0===i&&(i=1),o=n;n+i>o;o++)u.push(s.indexOf(a.objectAt(o)));for(u.sort(function(e,t){return t-e}),Ember.beginPropertyChanges(),o=0;u.length>o;o++)this._replace(u[o],1,t);Ember.endPropertyChanges()}return this},pushObject:function(e){return this._insertAt(r(this,"content.length"),e),e},pushObjects:function(e){return this._replace(r(this,"length"),0,e),this},setObjects:function(e){if(0===e.length)return this.clear();var t=r(this,"length");return this._replace(0,t,e),this},unshiftObject:function(e){return this._insertAt(0,e),e},unshiftObjects:function(e){return this._replace(0,0,e),this},slice:function(){var e=this.toArray();return e.slice.apply(e,arguments)},arrangedContentArrayWillChange:function(e,t,r,n){this.arrayContentWillChange(t,r,n)},arrangedContentArrayDidChange:function(e,t,r,n){this.arrayContentDidChange(t,r,n)},init:function(){this._super(),this._setupContent(),this._setupArrangedContent()},willDestroy:function(){this._teardownArrangedContent(),this._teardownContent()}})}(),function(){function e(e,t){var r=t.slice(8);r in this||u(this,r)}function t(e,t){var r=t.slice(8);r in this||c(this,r)}var r=Ember.get,n=Ember.set,i=(Ember.String.fmt,Ember.addBeforeObserver),o=Ember.addObserver,s=Ember.removeBeforeObserver,a=Ember.removeObserver,u=Ember.propertyWillChange,c=Ember.propertyDidChange;Ember.ObjectProxy=Ember.Object.extend({content:null,_contentDidChange:Ember.observer(function(){},"content"),isTruthy:Ember.computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(r){var n="content."+r;i(this,n,null,e),o(this,n,null,t)},didUnwatchProperty:function(r){var n="content."+r;s(this,n,null,e),a(this,n,null,t)},unknownProperty:function(e){var t=r(this,"content");return t?r(t,e):void 0},setUnknownProperty:function(e,t){var i=r(this,"content");return n(i,e,t)}}),Ember.ObjectProxy.reopenClass({create:function(){var e,t,r,n,i,o;if(arguments.length){for(t=this.proto(),r=0,n=arguments.length;n>r;r++){i=arguments[r];for(o in i)!i.hasOwnProperty(o)||o in t||(e||(e={}),e[o]=null)}e&&this._initMixins([e])}return this._super.apply(this,arguments)}})}(),function(){function e(e,t,r,i,o){var s,a=r._objects;for(a||(a=r._objects={});--o>=i;){var u=e.objectAt(o);u&&(Ember.addBeforeObserver(u,t,r,"contentKeyWillChange"),Ember.addObserver(u,t,r,"contentKeyDidChange"),s=n(u),a[s]||(a[s]=[]),a[s].push(o))}}function t(e,t,r,i,o){var s=r._objects;s||(s=r._objects={});for(var a,u;--o>=i;){var c=e.objectAt(o);c&&(Ember.removeBeforeObserver(c,t,r,"contentKeyWillChange"),Ember.removeObserver(c,t,r,"contentKeyDidChange"),u=n(c),a=s[u],a[a.indexOf(o)]=null)}}var r=(Ember.set,Ember.get),n=Ember.guidFor,i=Ember.EnumerableUtils.forEach,o=Ember.Object.extend(Ember.Array,{init:function(e,t,r){this._super(),this._keyName=t,this._owner=r,this._content=e},objectAt:function(e){var t=this._content.objectAt(e);return t&&r(t,this._keyName)},length:Ember.computed(function(){var e=this._content;return e?r(e,"length"):0})}),s=/^.+:(before|change)$/;Ember.EachProxy=Ember.Object.extend({init:function(e){this._super(),this._content=e,e.addArrayObserver(this),i(Ember.watchedEvents(this),function(e){this.didAddListener(e)},this)},unknownProperty:function(e){var t;return t=new o(this._content,e,this),Ember.defineProperty(this,e,null,t),this.beginObservingContentKey(e),t},arrayWillChange:function(e,r,n){var i,o,s=this._keys;o=n>0?r+n:-1,Ember.beginPropertyChanges(this);for(i in s)s.hasOwnProperty(i)&&(o>0&&t(e,i,this,r,o),Ember.propertyWillChange(this,i));Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(t,r,n,i){var o,s,a=this._keys;s=i>0?r+i:-1,Ember.beginPropertyChanges(this);for(o in a)a.hasOwnProperty(o)&&(s>0&&e(t,o,this,r,s),Ember.propertyDidChange(this,o));Ember.propertyDidChange(this._content,"@each"),Ember.endPropertyChanges(this)},didAddListener:function(e){s.test(e)&&this.beginObservingContentKey(e.slice(0,-7))},didRemoveListener:function(e){s.test(e)&&this.stopObservingContentKey(e.slice(0,-7))},beginObservingContentKey:function(t){var n=this._keys;if(n||(n=this._keys={}),n[t])n[t]++;else{n[t]=1;var i=this._content,o=r(i,"length");e(i,t,this,0,o)}},stopObservingContentKey:function(e){var n=this._keys;if(n&&n[e]>0&&0>=--n[e]){var i=this._content,o=r(i,"length");t(i,e,this,0,o)}},contentKeyWillChange:function(e,t){Ember.propertyWillChange(this,t)},contentKeyDidChange:function(e,t){Ember.propertyDidChange(this,t)}})}(),function(){var e=Ember.get;Ember.set;var t=Ember.Mixin.create(Ember.MutableArray,Ember.Observable,Ember.Copyable,{get:function(e){return"length"===e?this.length:"number"==typeof e?this[e]:this._super(e)},objectAt:function(e){return this[e]},replace:function(t,r,n){if(this.isFrozen)throw Ember.FROZEN_ERROR;var i=n?e(n,"length"):0;if(this.arrayContentWillChange(t,r,i),n&&0!==n.length){var o=[t,r].concat(n);this.splice.apply(this,o)}else this.splice(t,r);return this.arrayContentDidChange(t,r,i),this},unknownProperty:function(e,t){var r;return void 0!==t&&void 0===r&&(r=this[e]=t),r},indexOf:function(e,t){var r,n=this.length;for(t=void 0===t?0:0>t?Math.ceil(t):Math.floor(t),0>t&&(t+=n),r=t;n>r;r++)if(this[r]===e)return r;return-1},lastIndexOf:function(e,t){var r,n=this.length;for(t=void 0===t?n-1:0>t?Math.ceil(t):Math.floor(t),0>t&&(t+=n),r=t;r>=0;r--)if(this[r]===e)return r;return-1},copy:function(e){return e?this.map(function(e){return Ember.copy(e,!0)}):this.slice()}}),r=["length"];Ember.EnumerableUtils.forEach(t.keys(),function(e){Array.prototype[e]&&r.push(e)}),r.length>0&&(t=t.without.apply(t,r)),Ember.NativeArray=t,Ember.A=function(e){return void 0===e&&(e=[]),Ember.Array.detect(e)?e:Ember.NativeArray.apply(e)},Ember.NativeArray.activate=function(){t.apply(Array.prototype),Ember.A=function(e){return e||[]}},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Array)&&Ember.NativeArray.activate()}(),function(){var e=Ember.get,t=Ember.set,r=Ember.guidFor,n=Ember.isNone,i=Ember.String.fmt;Ember.Set=Ember.CoreObject.extend(Ember.MutableEnumerable,Ember.Copyable,Ember.Freezable,{length:0,clear:function(){if(this.isFrozen)throw new Error(Ember.FROZEN_ERROR);var n=e(this,"length");if(0===n)return this;var i;this.enumerableContentWillChange(n,0),Ember.propertyWillChange(this,"firstObject"),Ember.propertyWillChange(this,"lastObject");for(var o=0;n>o;o++)i=r(this[o]),delete this[i],delete this[o];return t(this,"length",0),Ember.propertyDidChange(this,"firstObject"),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(n,0),this},isEqual:function(t){if(!Ember.Enumerable.detect(t))return!1;var r=e(this,"length");if(e(t,"length")!==r)return!1;for(;--r>=0;)if(!t.contains(this[r]))return!1;return!0},add:Ember.aliasMethod("addObject"),remove:Ember.aliasMethod("removeObject"),pop:function(){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);var t=this.length>0?this[this.length-1]:null;return this.remove(t),t},push:Ember.aliasMethod("addObject"),shift:Ember.aliasMethod("pop"),unshift:Ember.aliasMethod("push"),addEach:Ember.aliasMethod("addObjects"),removeEach:Ember.aliasMethod("removeObjects"),init:function(e){this._super(),e&&this.addObjects(e)},nextObject:function(e){return this[e]},firstObject:Ember.computed(function(){return this.length>0?this[0]:void 0}),lastObject:Ember.computed(function(){return this.length>0?this[this.length-1]:void 0}),addObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(n(i))return this;var o,s=r(i),a=this[s],u=e(this,"length");return a>=0&&u>a&&this[a]===i?this:(o=[i],this.enumerableContentWillChange(null,o),Ember.propertyWillChange(this,"lastObject"),u=e(this,"length"),this[s]=u,this[u]=i,t(this,"length",u+1),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(null,o),this)},removeObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(n(i))return this;var o,s,a=r(i),u=this[a],c=e(this,"length"),h=0===u,l=u===c-1;return u>=0&&c>u&&this[u]===i&&(s=[i],this.enumerableContentWillChange(s,null),h&&Ember.propertyWillChange(this,"firstObject"),l&&Ember.propertyWillChange(this,"lastObject"),c-1>u&&(o=this[c-1],this[u]=o,this[r(o)]=u),delete this[a],delete this[c-1],t(this,"length",c-1),h&&Ember.propertyDidChange(this,"firstObject"),l&&Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(s,null)),this},contains:function(e){return this[r(e)]>=0},copy:function(){var n=this.constructor,i=new n,o=e(this,"length");for(t(i,"length",o);--o>=0;)i[o]=this[o],i[r(this[o])]=o;return i},toString:function(){var e,t=this.length,r=[];for(e=0;t>e;e++)r[e]=this[e];return i("Ember.Set<%@>",[r.join(",")])}})}(),function(){var e=Ember.DeferredMixin,t=Ember.get,r=Ember.Object.extend(e);r.reopenClass({promise:function(e,n){var i=r.create();return e.call(n,i),t(i,"promise")}}),Ember.Deferred=r}(),function(){var e=Ember.ENV.EMBER_LOAD_HOOKS||{},t={};Ember.onLoad=function(r,n){var i;e[r]=e[r]||Ember.A(),e[r].pushObject(n),(i=t[r])&&n(i)},Ember.runLoadHooks=function(r,n){var i;t[r]=n,(i=e[r])&&e[r].forEach(function(e){e(n)})}}(),function(){var e=Ember.get;Ember.ControllerMixin=Ember.Mixin.create({isController:!0,target:null,container:null,store:null,model:Ember.computed.alias("content"),send:function(t){var r,n=[].slice.call(arguments,1);this[t]?this[t].apply(this,n):(r=e(this,"target"))&&r.send.apply(r,arguments)}}),Ember.Controller=Ember.Object.extend(Ember.ControllerMixin)}(),function(){var e=Ember.get,t=(Ember.set,Ember.EnumerableUtils.forEach);Ember.SortableMixin=Ember.Mixin.create(Ember.MutableEnumerable,{sortProperties:null,sortAscending:!0,orderBy:function(r,n){var i=0,o=e(this,"sortProperties"),s=e(this,"sortAscending");return t(o,function(t){0===i&&(i=Ember.compare(e(r,t),e(n,t)),0===i||s||(i=-1*i))}),i},destroy:function(){var r=e(this,"content"),n=e(this,"sortProperties");return r&&n&&t(r,function(e){t(n,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},isSorted:Ember.computed.bool("sortProperties"),arrangedContent:Ember.computed("content","sortProperties.@each",function(){var r=e(this,"content"),n=e(this,"isSorted"),i=e(this,"sortProperties"),o=this;return r&&n?(r=r.slice(),r.sort(function(e,t){return o.orderBy(e,t)}),t(r,function(e){t(i,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),Ember.A(r)):r}),_contentWillChange:Ember.beforeObserver(function(){var r=e(this,"content"),n=e(this,"sortProperties");r&&n&&t(r,function(e){t(n,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},"content"),sortAscendingWillChange:Ember.beforeObserver(function(){this._lastSortAscending=e(this,"sortAscending")},"sortAscending"),sortAscendingDidChange:Ember.observer(function(){if(e(this,"sortAscending")!==this._lastSortAscending){var t=e(this,"arrangedContent");t.reverseObjects()}},"sortAscending"),contentArrayWillChange:function(r,n,i,o){var s=e(this,"isSorted");if(s){var a=e(this,"arrangedContent"),u=r.slice(n,n+i),c=e(this,"sortProperties");t(u,function(e){a.removeObject(e),t(c,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(r,n,i,o)},contentArrayDidChange:function(r,n,i,o){var s=e(this,"isSorted"),a=e(this,"sortProperties");if(s){var u=r.slice(n,n+o);t(u,function(e){this.insertItemSorted(e),t(a,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(r,n,i,o)},insertItemSorted:function(t){var r=e(this,"arrangedContent"),n=e(r,"length"),i=this._binarySearch(t,0,n);r.insertAt(i,t)},contentItemSortPropertyDidChange:function(t){var r=e(this,"arrangedContent"),n=r.indexOf(t),i=r.objectAt(n-1),o=r.objectAt(n+1),s=i&&this.orderBy(t,i),a=o&&this.orderBy(t,o);(0>s||a>0)&&(r.removeObject(t),this.insertItemSorted(t))},_binarySearch:function(t,r,n){var i,o,s,a;return r===n?r:(a=e(this,"arrangedContent"),i=r+Math.floor((n-r)/2),o=a.objectAt(i),s=this.orderBy(o,t),0>s?this._binarySearch(t,i+1,n):s>0?this._binarySearch(t,r,i):i)}})}(),function(){var e=Ember.get,t=(Ember.set,Ember.EnumerableUtils.forEach),r=Ember.EnumerableUtils.replace;Ember.ArrayController=Ember.ArrayProxy.extend(Ember.ControllerMixin,Ember.SortableMixin,{itemController:null,lookupItemController:function(){return e(this,"itemController")},objectAtContent:function(t){var r=e(this,"length"),n=e(this,"arrangedContent"),i=n&&n.objectAt(t);if(t>=0&&r>t){var o=this.lookupItemController(i);if(o)return this.controllerAt(t,i,o)}return i},arrangedContentDidChange:function(){this._super(),this._resetSubControllers()},arrayContentDidChange:function(n,i,o){var s=e(this,"_subControllers"),a=s.slice(n,n+i);t(a,function(e){e&&e.destroy()}),r(s,n,i,new Array(o)),this._super(n,i,o)},init:function(){this.get("content")||Ember.defineProperty(this,"content",void 0,Ember.A()),this._super(),this.set("_subControllers",Ember.A())},controllerAt:function(t,r,n){var i=e(this,"container"),o=e(this,"_subControllers"),s=o[t];if(s||(s=i.lookup("controller:"+n,{singleton:!1}),o[t]=s),!s)throw new Error('Could not resolve itemController: "'+n+'"');return s.set("target",this),s.set("content",r),s},_subControllers:null,_resetSubControllers:function(){var r=e(this,"_subControllers");r&&t(r,function(e){e&&e.destroy()}),this.set("_subControllers",Ember.A())}})}(),function(){Ember.ObjectController=Ember.ObjectProxy.extend(Ember.ControllerMixin)}()})(),"undefined"==typeof location||"localhost"!==location.hostname&&"127.0.0.1"!==location.hostname||console.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. If you want full error messages please use the non-minified build provided on the Ember website.");
15
+ !function(){var e,t;!function(){var r={},n={};e=function(e,t,n){r[e]={deps:t,callback:n}},t=function(e){if(n[e])return n[e];n[e]={};var i,o,s,a,u;if(i=r[e],!i)throw new Error("Module '"+e+"' not found.");o=i.deps,s=i.callback,a=[];for(var c=0,h=o.length;h>c;c++)"exports"===o[c]?a.push(u={}):a.push(t(o[c]));var l=s.apply(this,a);return n[e]=u||l}}(),function(){function e(e){return t.console&&t.console[e]?t.console[e].apply?function(){t.console[e].apply(t.console,arguments)}:function(){var r=Array.prototype.join.call(arguments,", ");t.console[e](r)}:void 0}"undefined"==typeof Ember&&(Ember={});var t=Ember.imports=Ember.imports||this,r=Ember.exports=Ember.exports||this;Ember.lookup=Ember.lookup||this,r.Em=r.Ember=Em=Ember,Ember.isNamespace=!0,Ember.toString=function(){return"Ember"},Ember.VERSION="1.0.0-rc4",Ember.ENV=Ember.ENV||("undefined"==typeof ENV?{}:ENV),Ember.config=Ember.config||{},Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES,"undefined"==typeof Ember.EXTEND_PROTOTYPES&&(Ember.EXTEND_PROTOTYPES=!0),Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==!1,Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===!1?!1:Ember.EXTEND_PROTOTYPES,Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===!1?!1:!0,Ember.K=function(){return this},"undefined"==typeof Ember.assert&&(Ember.assert=Ember.K),"undefined"==typeof Ember.warn&&(Ember.warn=Ember.K),"undefined"==typeof Ember.debug&&(Ember.debug=Ember.K),"undefined"==typeof Ember.deprecate&&(Ember.deprecate=Ember.K),"undefined"==typeof Ember.deprecateFunc&&(Ember.deprecateFunc=function(e,t){return t}),Ember.uuid=0,Ember.Logger={log:e("log")||Ember.K,warn:e("warn")||Ember.K,error:e("error")||Ember.K,info:e("info")||Ember.K,debug:e("debug")||e("info")||Ember.K},Ember.onerror=null,Ember.handleErrors=function(e,t){if("function"!=typeof Ember.onerror)return e.call(t||this);try{return e.call(t||this)}catch(r){Ember.onerror(r)}},Ember.merge=function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e},Ember.isNone=function(e){return null===e||void 0===e},Ember.none=Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.",Ember.isNone),Ember.isEmpty=function(e){return Ember.isNone(e)||0===e.length&&"function"!=typeof e||"object"==typeof e&&0===Ember.get(e,"length")},Ember.empty=Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.",Ember.isEmpty)}(),function(){var e=Ember.platform={};if(Ember.create=Object.create,Ember.create&&2!==Ember.create({a:1},{a:{value:2}}).a&&(Ember.create=null),!Ember.create||Ember.ENV.STUB_OBJECT_CREATE){var t=function(){};Ember.create=function(e,r){if(t.prototype=e,e=new t,r){t.prototype=e;for(var n in r)t.prototype[n]=r[n].value;e=new t}return t.prototype=null,e},Ember.create.isSimulated=!0}var r,n,i=Object.defineProperty;if(i)try{i({},"a",{get:function(){}})}catch(o){i=null}i&&(r=function(){var e={};return i(e,"a",{configurable:!0,enumerable:!0,get:function(){},set:function(){}}),i(e,"a",{configurable:!0,enumerable:!0,writable:!0,value:!0}),e.a===!0}(),n=function(){try{return i(document.createElement("div"),"definePropertyOnDOM",{}),!0}catch(e){}return!1}(),r?n||(i=function(e,t,r){var n;return n="object"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName,n?e[t]=r.value:Object.defineProperty(e,t,r)}):i=null),e.defineProperty=i,e.hasPropertyAccessors=!0,e.defineProperty||(e.hasPropertyAccessors=!1,e.defineProperty=function(e,t,r){r.get||(e[t]=r.value)},e.defineProperty.isSimulated=!0),Ember.ENV.MANDATORY_SETTER&&!e.hasPropertyAccessors&&(Ember.ENV.MANDATORY_SETTER=!1)}(),function(){var e=function(e){return e&&Function.prototype.toString.call(e).indexOf("[native code]")>-1},t=e(Array.prototype.map)?Array.prototype.map:function(e){if(void 0===this||null===this)throw new TypeError;var t=Object(this),r=t.length>>>0;if("function"!=typeof e)throw new TypeError;for(var n=new Array(r),i=arguments[1],o=0;r>o;o++)o in t&&(n[o]=e.call(i,t[o],o,t));return n},r=e(Array.prototype.forEach)?Array.prototype.forEach:function(e){if(void 0===this||null===this)throw new TypeError;var t=Object(this),r=t.length>>>0;if("function"!=typeof e)throw new TypeError;for(var n=arguments[1],i=0;r>i;i++)i in t&&e.call(n,t[i],i,t)},n=e(Array.prototype.indexOf)?Array.prototype.indexOf:function(e,t){null===t||void 0===t?t=0:0>t&&(t=Math.max(0,this.length+t));for(var r=t,n=this.length;n>r;r++)if(this[r]===e)return r;return-1};Ember.ArrayPolyfills={map:t,forEach:r,indexOf:n},Ember.SHIM_ES5&&(Array.prototype.map||(Array.prototype.map=t),Array.prototype.forEach||(Array.prototype.forEach=r),Array.prototype.indexOf||(Array.prototype.indexOf=n))}(),function(){function e(e){this.descs={},this.watching={},this.cache={},this.source=e}function t(e,t){return!(!e||"function"!=typeof e[t])}var r=Ember.platform.defineProperty,n=Ember.create,i="__ember"+ +new Date,o=0,s=[],a={},u=Ember.ENV.MANDATORY_SETTER;Ember.GUID_KEY=i;var c={writable:!1,configurable:!1,enumerable:!1,value:null};Ember.generateGuid=function(e,t){t||(t="ember");var n=t+o++;return e&&(c.value=n,r(e,i,c)),n},Ember.guidFor=function(e){if(void 0===e)return"(undefined)";if(null===e)return"(null)";var t,n=typeof e;switch(n){case"number":return t=s[e],t||(t=s[e]="nu"+e),t;case"string":return t=a[e],t||(t=a[e]="st"+o++),t;case"boolean":return e?"(true)":"(false)";default:return e[i]?e[i]:e===Object?"(Object)":e===Array?"(Array)":(t="ember"+o++,c.value=t,r(e,i,c),t)}};var h={writable:!0,configurable:!1,enumerable:!1,value:null},l=Ember.GUID_KEY+"_meta";Ember.META_KEY=l;var f={descs:{},watching:{}};u&&(f.values={}),Ember.EMPTY_META=f,Object.freeze&&Object.freeze(f);var m=Ember.platform.defineProperty.isSimulated;m&&(e.prototype.__preventPlainObject__=!0,e.prototype.toJSON=function(){}),Ember.meta=function(t,i){var o=t[l];return i===!1?o||f:(o?o.source!==t&&(m||r(t,l,h),o=n(o),o.descs=n(o.descs),o.watching=n(o.watching),o.cache={},o.source=t,u&&(o.values=n(o.values)),t[l]=o):(m||r(t,l,h),o=new e(t),u&&(o.values={}),t[l]=o,o.descs.constructor=null),o)},Ember.getMeta=function(e,t){var r=Ember.meta(e,!1);return r[t]},Ember.setMeta=function(e,t,r){var n=Ember.meta(e,!0);return n[t]=r,r},Ember.metaPath=function(e,t,r){for(var i,o,s=Ember.meta(e,r),a=0,u=t.length;u>a;a++){if(i=t[a],o=s[i]){if(o.__ember_source__!==e){if(!r)return void 0;o=s[i]=n(o),o.__ember_source__=e}}else{if(!r)return void 0;o=s[i]={__ember_source__:e}}s=o}return o},Ember.wrap=function(e,t){function r(){}function n(){var n,i=this._super;return this._super=t||r,n=e.apply(this,arguments),this._super=i,n}return n.wrappedFunction=e,n.__ember_observes__=e.__ember_observes__,n.__ember_observesBefore__=e.__ember_observesBefore__,n},Ember.isArray=function(e){return!e||e.setInterval?!1:Array.isArray&&Array.isArray(e)?!0:Ember.Array&&Ember.Array.detect(e)?!0:void 0!==e.length&&"object"==typeof e?!0:!1},Ember.makeArray=function(e){return null===e||void 0===e?[]:Ember.isArray(e)?e:[e]},Ember.canInvoke=t,Ember.tryInvoke=function(e,r,n){return t(e,r)?e[r].apply(e,n||[]):void 0};var b=function(){var e=0;try{try{}finally{throw e++,new Error("needsFinallyFixTest")}}catch(t){}return 1!==e}();Ember.tryFinally=b?function(e,t,r){var n,i,o;r=r||this;try{n=e.call(r)}finally{try{i=t.call(r)}catch(s){o=s}}if(o)throw o;return void 0===i?n:i}:function(e,t,r){var n,i;r=r||this;try{n=e.call(r)}finally{i=t.call(r)}return void 0===i?n:i},Ember.tryCatchFinally=b?function(e,t,r,n){var i,o,s;n=n||this;try{i=e.call(n)}catch(a){i=t.call(n,a)}finally{try{o=r.call(n)}catch(u){s=u}}if(s)throw s;return void 0===o?i:o}:function(e,t,r,n){var i,o;n=n||this;try{i=e.call(n)}catch(s){i=t.call(n,s)}finally{o=r.call(n)}return void 0===o?i:o};var p={},E="Boolean Number String Function Array Date RegExp Object".split(" ");Ember.ArrayPolyfills.forEach.call(E,function(e){p["[object "+e+"]"]=e.toLowerCase()});var d=Object.prototype.toString;Ember.typeOf=function(e){var t;return t=null===e||void 0===e?String(e):p[d.call(e)]||"object","function"===t?Ember.Object&&Ember.Object.detect(e)&&(t="class"):"object"===t&&(t=e instanceof Error?"error":Ember.Object&&e instanceof Ember.Object?"instance":"object"),t}}(),function(){Ember.Instrumentation={};var e=[],t={},r=function(r){for(var n,i=[],o=0,s=e.length;s>o;o++)n=e[o],n.regex.test(r)&&i.push(n.object);return t[r]=i,i},n=function(){var e="undefined"!=typeof window?window.performance||{}:{},t=e.now||e.mozNow||e.webkitNow||e.msNow||e.oNow;return t?t.bind(e):function(){return+new Date}}();Ember.Instrumentation.instrument=function(e,i,o,s){function a(){for(b=0,p=f.length;p>b;b++)m=f[b],E[b]=m.before(e,n(),i);return o.call(s)}function u(e){i=i||{},i.exception=e}function c(){for(b=0,p=f.length;p>b;b++)m=f[b],m.after(e,n(),i,E[b]);Ember.STRUCTURED_PROFILE&&console.timeEnd(h)}var h,l,f=t[e];if(Ember.STRUCTURED_PROFILE&&(h=e+": "+i.object,console.time(h)),f||(f=r(e)),0===f.length)return l=o.call(s),Ember.STRUCTURED_PROFILE&&console.timeEnd(h),l;var m,b,p,E=[];return Ember.tryCatchFinally(a,u,c)},Ember.Instrumentation.subscribe=function(r,n){for(var i,o=r.split("."),s=[],a=0,u=o.length;u>a;a++)i=o[a],"*"===i?s.push("[^\\.]*"):s.push(i);s=s.join("\\."),s+="(\\..*)?";var c={pattern:r,regex:new RegExp("^"+s+"$"),object:n};return e.push(c),t={},c},Ember.Instrumentation.unsubscribe=function(r){for(var n,i=0,o=e.length;o>i;i++)e[i]===r&&(n=i);e.splice(n,1),t={}},Ember.Instrumentation.reset=function(){e=[],t={}},Ember.instrument=Ember.Instrumentation.instrument,Ember.subscribe=Ember.Instrumentation.subscribe}(),function(){var e,t,r,n;n=Array.prototype.concat,e=Array.prototype.map||Ember.ArrayPolyfills.map,t=Array.prototype.forEach||Ember.ArrayPolyfills.forEach,r=Array.prototype.indexOf||Ember.ArrayPolyfills.indexOf;var i=Ember.EnumerableUtils={map:function(t,r,n){return t.map?t.map.call(t,r,n):e.call(t,r,n)},forEach:function(e,r,n){return e.forEach?e.forEach.call(e,r,n):t.call(e,r,n)},indexOf:function(e,t,n){return e.indexOf?e.indexOf.call(e,t,n):r.call(e,t,n)},indexesOf:function(e,t){return void 0===t?[]:i.map(t,function(t){return i.indexOf(e,t)})},addObject:function(e,t){var r=i.indexOf(e,t);-1===r&&e.push(t)},removeObject:function(e,t){var r=i.indexOf(e,t);-1!==r&&e.splice(r,1)},replace:function(e,t,r,i){if(e.replace)return e.replace(t,r,i);var o=n.apply([t,r],i);return e.splice.apply(e,o)},intersection:function(e,t){var r=[];return i.forEach(e,function(e){i.indexOf(t,e)>=0&&r.push(e)}),r}}}(),function(){function e(e){return e.match(a)[0]}function t(t,n){var i,a=s.test(n),u=!a&&o.test(n);if((!t||u)&&(t=Ember.lookup),a&&(n=n.slice(5)),t===Ember.lookup&&(i=e(n),t=r(t,i),n=n.slice(i.length+1)),!n||0===n.length)throw new Error("Invalid Path");return[t,n]}var r,n=Ember.META_KEY,i=Ember.ENV.MANDATORY_SETTER,o=/^([A-Z$]|([0-9][A-Z$])).*[\.\*]/,s=/^this[\.\*]/,a=/^([^\.\*]+)/;r=function(e,t){if(""===t)return e;if(t||"string"!=typeof e||(t=e,e=null),null===e||-1!==t.indexOf("."))return u(e,t);var r,o=e[n],s=o&&o.descs[t];return s?s.get(e,t):(r=i&&o&&o.watching[t]>0?o.values[t]:e[t],void 0!==r||"object"!=typeof e||t in e||"function"!=typeof e.unknownProperty?r:e.unknownProperty(t))},Ember.config.overrideAccessors&&(Ember.get=r,Ember.config.overrideAccessors(),r=Ember.get);var u=Ember._getPath=function(e,n){var i,o,a,u,c;if(null===e&&-1===n.indexOf("."))return r(Ember.lookup,n);for(i=s.test(n),(!e||i)&&(a=t(e,n),e=a[0],n=a[1],a.length=0),o=n.split("."),c=o.length,u=0;null!=e&&c>u;u++)if(e=r(e,o[u],!0),e&&e.isDestroyed)return void 0;return e};Ember.normalizeTuple=function(e,r){return t(e,r)},Ember.getWithDefault=function(e,t,n){var i=r(e,t);return void 0===i?n:i},Ember.get=r,Ember.getPath=Ember.deprecateFunc("getPath is deprecated since get now supports paths",Ember.get)}(),function(){function e(e,t,r){for(var n=-1,i=0,o=e.length;o>i;i++)if(t===e[i][0]&&r===e[i][1]){n=i;break}return n}function t(e,t){var r,n=m(e,!0);return n.listeners||(n.listeners={}),n.hasOwnProperty("listeners")||(n.listeners=f(n.listeners)),r=n.listeners[t],r&&!n.listeners.hasOwnProperty(t)?r=n.listeners[t]=n.listeners[t].slice():r||(r=n.listeners[t]=[]),r}function r(t,r,n){var i=t[b],o=i&&i.listeners&&i.listeners[r];if(o)for(var s=o.length-1;s>=0;s--){var a=o[s][0],u=o[s][1],c=o[s][2],h=e(n,a,u);-1===h&&n.push([a,u,c])}}function n(t,r,n){var i=t[b],o=i&&i.listeners&&i.listeners[r],s=[];if(o){for(var a=o.length-1;a>=0;a--){var u=o[a][0],c=o[a][1],h=o[a][2],l=e(n,u,c);-1===l&&(n.push([u,c,h]),s.push([u,c,h]))}return s}}function i(r,n,i,o,s){o||"function"!=typeof i||(o=i,i=null);var a=t(r,n),u=e(a,i,o),c=0;s&&(c|=p),-1===u&&(a.push([i,o,c]),"function"==typeof r.didAddListener&&r.didAddListener(n,i,o))}function o(r,n,i,o){function s(i,o){var s=t(r,n),a=e(s,i,o);-1!==a&&(s.splice(a,1),"function"==typeof r.didRemoveListener&&r.didRemoveListener(n,i,o))}if(o||"function"!=typeof i||(o=i,i=null),o)s(i,o);else{var a=r[b],u=a&&a.listeners&&a.listeners[n];if(!u)return;for(var c=u.length-1;c>=0;c--)s(u[c][0],u[c][1])}}function s(r,n,i,o,s){function a(){return s.call(i)}function u(){c&&(c[2]&=~E)}o||"function"!=typeof i||(o=i,i=null);var c,h=t(r,n),l=e(h,i,o);return-1!==l&&(c=h[l].slice(),c[2]|=E,h[l]=c),Ember.tryFinally(a,u)}function a(r,n,i,o,s){function a(){return s.call(i)}function u(){for(f=0,m=b.length;m>f;f++)b[f][2]&=~E}o||"function"!=typeof i||(o=i,i=null);var c,h,l,f,m,b=[];for(f=0,m=n.length;m>f;f++){c=n[f],h=t(r,c);var p=e(h,i,o);-1!==p&&(l=h[p].slice(),l[2]|=E,h[p]=l,b.push(l))}return Ember.tryFinally(a,u)}function u(e){var t=e[b].listeners,r=[];if(t)for(var n in t)t[n]&&r.push(n);return r}function c(e,t,r,n){if(e!==Ember&&"function"==typeof e.sendEvent&&e.sendEvent(t,r),!n){var i=e[b];n=i&&i.listeners&&i.listeners[t]}if(n){for(var s=n.length-1;s>=0;s--){var a=n[s];if(a){var u=a[0],c=a[1],h=a[2];h&E||(h&p&&o(e,t,u,c),u||(u=e),"string"==typeof c&&(c=u[c]),r?c.apply(u,r):c.call(u))}}return!0}}function h(e,t){var r=e[b],n=r&&r.listeners&&r.listeners[t];return!(!n||!n.length)}function l(e,t){var r=[],n=e[b],i=n&&n.listeners&&n.listeners[t];if(!i)return r;for(var o=0,s=i.length;s>o;o++){var a=i[o][0],u=i[o][1];r.push([a,u])}return r}var f=Ember.create,m=Ember.meta,b=Ember.META_KEY,p=1,E=2;Ember.addListener=i,Ember.removeListener=o,Ember._suspendListener=s,Ember._suspendListeners=a,Ember.sendEvent=c,Ember.hasListeners=h,Ember.watchedEvents=u,Ember.listenersFor=l,Ember.listenersDiff=n,Ember.listenersUnion=r}(),function(){var e=Ember.guidFor,t=Ember.sendEvent,r=Ember._ObserverSet=function(){this.clear()};r.prototype.add=function(t,r,n){var i,o=this.observerSet,s=this.observers,a=e(t),u=o[a];return u||(o[a]=u={}),i=u[r],void 0===i&&(i=s.push({sender:t,keyName:r,eventName:n,listeners:[]})-1,u[r]=i),s[i].listeners},r.prototype.flush=function(){var e,r,n,i,o=this.observers;for(this.clear(),e=0,r=o.length;r>e;++e)n=o[e],i=n.sender,i.isDestroying||i.isDestroyed||t(i,n.eventName,[i,n.keyName],n.listeners)},r.prototype.clear=function(){this.observerSet={},this.observers=[]}}(),function(){function e(e,t,i){if(!e.isDestroying){var o=n,s=!o;s&&(o=n={}),r(p,e,t,o,i),s&&(n=null)}}function t(e,t,n){if(!e.isDestroying){var o=i,s=!o;s&&(o=i={}),r(E,e,t,o,n),s&&(i=null)}}function r(e,t,r,n,i){var o=s(t);if(n[o]||(n[o]={}),!n[o][r]){n[o][r]=!0;var a=i.deps;if(a=a&&a[r])for(var u in a){var c=i.descs[u];c&&c._suspended===t||e(t,u)}}}var n,i,o=Ember.meta,s=Ember.guidFor,a=Ember.tryFinally,u=Ember.sendEvent,c=Ember.listenersUnion,h=Ember.listenersDiff,l=Ember._ObserverSet,f=new l,m=new l,b=0,p=Ember.propertyWillChange=function(t,r){var n=o(t,!1),i=n.watching[r]>0||"length"===r,s=n.proto,a=n.descs[r];i&&s!==t&&(a&&a.willChange&&a.willChange(t,r),e(t,r,n),d(t,r,n),_(t,r))},E=Ember.propertyDidChange=function(e,r){var n=o(e,!1),i=n.watching[r]>0||"length"===r,s=n.proto,a=n.descs[r];s!==e&&(a&&a.didChange&&a.didChange(e,r),(i||"length"===r)&&(t(e,r,n),v(e,r,n),O(e,r)))},d=function(e,t,r,n){if(r.hasOwnProperty("chainWatchers")){var i=r.chainWatchers;if(i=i[t])for(var o=0,s=i.length;s>o;o++)i[o].willChange(n)}},v=function(e,t,r,n){if(r.hasOwnProperty("chainWatchers")){var i=r.chainWatchers;if(i=i[t])for(var o=i.length-1;o>=0;o--)i[o].didChange(n)}};Ember.overrideChains=function(e,t,r){v(e,t,r,!0)};var g=Ember.beginPropertyChanges=function(){b++},y=Ember.endPropertyChanges=function(){b--,0>=b&&(f.clear(),m.flush())};Ember.changeProperties=function(e,t){g(),a(e,y,t)};var _=function(e,t){if(!e.isDestroying){var r,n,i=t+":before";b?(r=f.add(e,t,i),n=h(e,i,r),u(e,i,[e,t],n)):u(e,i,[e,t])}},O=function(e,t){if(!e.isDestroying){var r,n=t+":change";b?(r=m.add(e,t,n),c(e,n,r)):u(e,n,[e,t])}}}(),function(){function e(e,t,r,o){var s;if(s=t.slice(t.lastIndexOf(".")+1),t=t.slice(0,t.length-(s.length+1)),"this"!==t&&(e=n(e,t)),!s||0===s.length)throw new Error("You passed an empty path");if(!e){if(o)return;throw new Error("Object in path "+t+" could not be found or was destroyed.")}return i(e,s,r)}var t=Ember.META_KEY,r=Ember.ENV.MANDATORY_SETTER,n=Ember._getPath,i=function(n,i,o,s){if("string"==typeof n&&(o=i,i=n,n=null),!n||-1!==i.indexOf("."))return e(n,i,o,s);var a,u,c=n[t],h=c&&c.descs[i];return h?h.set(n,i,o):(a="object"==typeof n&&!(i in n),a&&"function"==typeof n.setUnknownProperty?n.setUnknownProperty(i,o):c&&c.watching[i]>0?(u=r?c.values[i]:n[i],o!==u&&(Ember.propertyWillChange(n,i),r?void 0!==u||i in n?c.values[i]=o:Ember.defineProperty(n,i,null,o):n[i]=o,Ember.propertyDidChange(n,i))):n[i]=o),o};Ember.config.overrideAccessors&&(Ember.set=i,Ember.config.overrideAccessors(),i=Ember.set),Ember.set=i,Ember.setPath=Ember.deprecateFunc("setPath is deprecated since set now supports paths",Ember.set),Ember.trySet=function(e,t,r){return i(e,t,r,!0)},Ember.trySetPath=Ember.deprecateFunc("trySetPath has been renamed to trySet",Ember.trySet)}(),function(){var e=(Ember.get,Ember.set),t=Ember.guidFor,r=Ember.ArrayPolyfills.indexOf,n=function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},i=function(e,t){var r=e.keys.copy(),i=n(e.values);return t.keys=r,t.values=i,t.length=e.length,t},o=Ember.OrderedSet=function(){this.clear()};o.create=function(){return new o},o.prototype={clear:function(){this.presenceSet={},this.list=[]},add:function(e){var r=t(e),n=this.presenceSet,i=this.list;r in n||(n[r]=!0,i.push(e))},remove:function(e){var n=t(e),i=this.presenceSet,o=this.list;delete i[n];var s=r.call(o,e);s>-1&&o.splice(s,1)},isEmpty:function(){return 0===this.list.length},has:function(e){var r=t(e),n=this.presenceSet;return r in n},forEach:function(e,t){for(var r=this.toArray(),n=0,i=r.length;i>n;n++)e.call(t,r[n])},toArray:function(){return this.list.slice()},copy:function(){var e=new o;return e.presenceSet=n(this.presenceSet),e.list=this.toArray(),e}};var s=Ember.Map=function(){this.keys=Ember.OrderedSet.create(),this.values={}};s.create=function(){return new s},s.prototype={length:0,get:function(e){var r=this.values,n=t(e);return r[n]},set:function(r,n){var i=this.keys,o=this.values,s=t(r);i.add(r),o[s]=n,e(this,"length",i.list.length)},remove:function(r){var n=this.keys,i=this.values,o=t(r);return i.hasOwnProperty(o)?(n.remove(r),delete i[o],e(this,"length",n.list.length),!0):!1},has:function(e){var r=this.values,n=t(e);return r.hasOwnProperty(n)},forEach:function(e,r){var n=this.keys,i=this.values;n.forEach(function(n){var o=t(n);e.call(r,n,i[o])})},copy:function(){return i(this,new s)}};var a=Ember.MapWithDefault=function(e){s.call(this),this.defaultValue=e.defaultValue};a.create=function(e){return e?new a(e):new s},a.prototype=Ember.create(s.prototype),a.prototype.get=function(e){var t=this.has(e);if(t)return s.prototype.get.call(this,e);var r=this.defaultValue(e);return this.set(e,r),r},a.prototype.copy=function(){return i(this,new a({defaultValue:this.defaultValue}))}}(),function(){var e=Ember.META_KEY,t=Ember.meta,r=Ember.platform.defineProperty,n=Ember.ENV.MANDATORY_SETTER;Ember.Descriptor=function(){};var i=Ember.MANDATORY_SETTER_FUNCTION=function(){},o=Ember.DEFAULT_GETTER_FUNCTION=function(t){return function(){var r=this[e];return r&&r.values[t]}};Ember.defineProperty=function(e,s,a,u,c){var h,l,f,m;return c||(c=t(e)),h=c.descs,l=c.descs[s],f=c.watching[s]>0,l instanceof Ember.Descriptor&&l.teardown(e,s),a instanceof Ember.Descriptor?(m=a,h[s]=a,n&&f?r(e,s,{configurable:!0,enumerable:!0,writable:!0,value:void 0}):e[s]=void 0,a.setup(e,s)):(h[s]=void 0,null==a?(m=u,n&&f?(c.values[s]=u,r(e,s,{configurable:!0,enumerable:!0,set:i,get:o(s)})):e[s]=u):(m=a,r(e,s,a))),f&&Ember.overrideChains(e,s,c),e.didDefineProperty&&e.didDefineProperty(e,s,m),this}}(),function(){var e=Ember.changeProperties,t=Ember.set;Ember.setProperties=function(r,n){return e(function(){for(var e in n)n.hasOwnProperty(e)&&t(r,e,n[e])}),r}}(),function(){var e=Ember.meta,t=Ember.typeOf,r=Ember.ENV.MANDATORY_SETTER,n=Ember.platform.defineProperty;Ember.watchKey=function(i,o){if("length"!==o||"array"!==t(i)){var s,a=e(i),u=a.watching;u[o]?u[o]=(u[o]||0)+1:(u[o]=1,s=a.descs[o],s&&s.willWatch&&s.willWatch(i,o),"function"==typeof i.willWatchProperty&&i.willWatchProperty(o),r&&o in i&&(a.values[o]=i[o],n(i,o,{configurable:!0,enumerable:!0,set:Ember.MANDATORY_SETTER_FUNCTION,get:Ember.DEFAULT_GETTER_FUNCTION(o)})))}},Ember.unwatchKey=function(t,i){var o,s=e(t),a=s.watching;1===a[i]?(a[i]=0,o=s.descs[i],o&&o.didUnwatch&&o.didUnwatch(t,i),"function"==typeof t.didUnwatchProperty&&t.didUnwatchProperty(i),r&&i in t&&(n(t,i,{configurable:!0,enumerable:!0,writable:!0,value:s.values[i]}),delete s.values[i])):a[i]>1&&a[i]--}}(),function(){function e(e){return e.match(f)[0]}function t(e,t,r){if(e&&"object"==typeof e){var i=n(e),o=i.chainWatchers;i.hasOwnProperty("chainWatchers")||(o=i.chainWatchers={}),o[t]||(o[t]=[]),o[t].push(r),u(e,t)}}function r(e){return n(e,!1).proto===e}var n=Ember.meta,i=Ember.get,o=Ember.normalizeTuple,s=Ember.ArrayPolyfills.forEach,a=Ember.warn,u=Ember.watchKey,c=Ember.unwatchKey,h=Ember.propertyWillChange,l=Ember.propertyDidChange,f=/^([^\.\*]+)/,m=[];Ember.flushPendingChains=function(){if(0!==m.length){var e=m;m=[],s.call(e,function(e){e[0].add(e[1])}),a("Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos",0===m.length)}};var b=Ember.removeChainWatcher=function(e,t,r){if(e&&"object"==typeof e){var i=n(e,!1);if(i.hasOwnProperty("chainWatchers")){var o=i.chainWatchers;if(o[t]){o=o[t];for(var s=0,a=o.length;a>s;s++)o[s]===r&&o.splice(s,1)}c(e,t)}}},p=Ember._ChainNode=function(e,r,n){this._parent=e,this._key=r,this._watching=void 0===n,this._value=n,this._paths={},this._watching&&(this._object=e.value(),this._object&&t(this._object,this._key,this)),this._parent&&"@each"===this._parent._key&&this.value()},E=p.prototype;E.value=function(){if(void 0===this._value&&this._watching){var e=this._parent.value();this._value=e&&!r(e)?i(e,this._key):void 0}return this._value},E.destroy=function(){if(this._watching){var e=this._object;e&&b(e,this._key,this),this._watching=!1}},E.copy=function(e){var t,r=new p(null,null,e),n=this._paths;for(t in n)n[t]<=0||r.add(t);return r},E.add=function(t){var r,n,i,s,a;if(a=this._paths,a[t]=(a[t]||0)+1,r=this.value(),n=o(r,t),n[0]&&n[0]===r)t=n[1],i=e(t),t=t.slice(i.length+1);else{if(!n[0])return m.push([this,t]),n.length=0,void 0;s=n[0],i=t.slice(0,0-(n[1].length+1)),t=n[1]}n.length=0,this.chain(i,t,s)},E.remove=function(t){var r,n,i,s,a;a=this._paths,a[t]>0&&a[t]--,r=this.value(),n=o(r,t),n[0]===r?(t=n[1],i=e(t),t=t.slice(i.length+1)):(s=n[0],i=t.slice(0,0-(n[1].length+1)),t=n[1]),n.length=0,this.unchain(i,t)},E.count=0,E.chain=function(t,r,n){var i,o=this._chains;o||(o=this._chains={}),i=o[t],i||(i=o[t]=new p(this,t,n)),i.count++,r&&r.length>0&&(t=e(r),r=r.slice(t.length+1),i.chain(t,r))},E.unchain=function(t,r){var n=this._chains,i=n[t];r&&r.length>1&&(t=e(r),r=r.slice(t.length+1),i.unchain(t,r)),i.count--,i.count<=0&&(delete n[i._key],i.destroy())},E.willChange=function(){var e=this._chains;if(e)for(var t in e)e.hasOwnProperty(t)&&e[t].willChange();this._parent&&this._parent.chainWillChange(this,this._key,1)},E.chainWillChange=function(e,t,r){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainWillChange(this,t,r+1):(r>1&&h(this.value(),t),t="this."+t,this._paths[t]>0&&h(this.value(),t))},E.chainDidChange=function(e,t,r){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainDidChange(this,t,r+1):(r>1&&l(this.value(),t),t="this."+t,this._paths[t]>0&&l(this.value(),t))},E.didChange=function(e){if(this._watching){var r=this._parent.value();r!==this._object&&(b(this._object,this._key,this),this._object=r,t(r,this._key,this)),this._value=void 0,this._parent&&"@each"===this._parent._key&&this.value()}var n=this._chains;if(n)for(var i in n)n.hasOwnProperty(i)&&n[i].didChange(e);e||this._parent&&this._parent.chainDidChange(this,this._key,1)},Ember.finishChains=function(e){var t=n(e,!1),r=t.chains;r&&(r.value()!==e&&(t.chains=r=r.copy(e)),r.didChange(!0))}}(),function(){function e(e){var r=t(e),i=r.chains;return i?i.value()!==e&&(i=r.chains=i.copy(e)):i=r.chains=new n(null,null,e),i}var t=Ember.meta,r=Ember.typeOf,n=Ember._ChainNode;Ember.watchPath=function(n,i){if("length"!==i||"array"!==r(n)){var o=t(n),s=o.watching;s[i]?s[i]=(s[i]||0)+1:(s[i]=1,e(n).add(i))}},Ember.unwatchPath=function(r,n){var i=t(r),o=i.watching;1===o[n]?(o[n]=0,e(r).remove(n)):o[n]>1&&o[n]--}}(),function(){function e(e){return"*"===e||!l.test(e)}var t=Ember.meta,r=Ember.GUID_KEY,n=Ember.META_KEY,i=Ember.removeChainWatcher,o=Ember.watchKey,s=Ember.unwatchKey,a=Ember.watchPath,u=Ember.unwatchPath,c=Ember.typeOf,h=Ember.generateGuid,l=/[\.\*]/;Ember.watch=function(t,r){("length"!==r||"array"!==c(t))&&(e(r)?o(t,r):a(t,r))},Ember.isWatching=function(e,t){var r=e[n];return(r&&r.watching[t])>0},Ember.watch.flushPending=Ember.flushPendingChains,Ember.unwatch=function(t,r){("length"!==r||"array"!==c(t))&&(e(r)?s(t,r):u(t,r))},Ember.rewatch=function(e){var n=t(e,!1),i=n.chains;r in e&&!e.hasOwnProperty(r)&&h(e,"ember"),i&&i.value()!==e&&(n.chains=i.copy(e))};var f=[];Ember.destroy=function(e){var t,r,o,s,a=e[n];if(a&&(e[n]=null,t=a.chains))for(f.push(t);f.length>0;){if(t=f.pop(),r=t._chains)for(o in r)r.hasOwnProperty(o)&&f.push(r[o]);t._watching&&(s=t._object,s&&i(s,t._key,t))}}}(),function(){function e(e,t){var r=e[t];return r?e.hasOwnProperty(t)||(r=e[t]=f(r)):r=e[t]={},r}function t(t){return e(t,"deps")}function r(r,n,i,o){var s,a,u,c,h,l=r._dependentKeys;if(l)for(s=t(o),a=0,u=l.length;u>a;a++)c=l[a],h=e(s,c),h[i]=(h[i]||0)+1,b(n,c)}function n(r,n,i,o){var s,a,u,c,h,l=r._dependentKeys;if(l)for(s=t(o),a=0,u=l.length;u>a;a++)c=l[a],h=e(s,c),h[i]=(h[i]||0)-1,p(n,c)}function i(e,t){this.func=e,this._cacheable=t&&void 0!==t.cacheable?t.cacheable:!0,this._dependentKeys=t&&t.dependentKeys,this._readOnly=t&&(void 0!==t.readOnly||!!t.readOnly)}function o(e,t){for(var r={},n=0;n<t.length;n++)r[t[n]]=u(e,t[n]);return r}function s(e,t){Ember.computed[e]=function(e){var r=l.call(arguments);return Ember.computed(e,function(){return t.apply(this,r)})}}function a(e,t){Ember.computed[e]=function(){var e=l.call(arguments),r=Ember.computed(function(){return t.apply(this,[o(this,e)])});return r.property.apply(r,e)}}var u=Ember.get,c=Ember.set,h=Ember.meta,l=[].slice,f=Ember.create,m=Ember.META_KEY,b=Ember.watch,p=Ember.unwatch;Ember.ComputedProperty=i,i.prototype=new Ember.Descriptor;var E=i.prototype;E.cacheable=function(e){return this._cacheable=e!==!1,this},E.volatile=function(){return this.cacheable(!1)},E.readOnly=function(e){return this._readOnly=void 0===e||!!e,this},E.property=function(){for(var e=[],t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return this._dependentKeys=e,this},E.meta=function(e){return 0===arguments.length?this._meta||{}:(this._meta=e,this)},E.willWatch=function(e,t){var n=e[m];t in n.cache||r(this,e,t,n)},E.didUnwatch=function(e,t){var r=e[m];t in r.cache||n(this,e,t,r)},E.didChange=function(e,t){if(this._cacheable&&this._suspended!==e){var r=h(e);t in r.cache&&(delete r.cache[t],r.watching[t]||n(this,e,t,r))}},E.get=function(e,t){var n,i,o;if(this._cacheable){if(o=h(e),i=o.cache,t in i)return i[t];n=i[t]=this.func.call(e,t),o.watching[t]||r(this,e,t,o)}else n=this.func.call(e,t);return n},E.set=function(e,t,n){var i,o,s=this._cacheable,a=this.func,u=h(e,s),c=u.watching[t],l=this._suspended,f=!1,m=u.cache;if(this._readOnly)throw new Error("Cannot Set: "+t+" on: "+e.toString());this._suspended=e;try{if(s&&m.hasOwnProperty(t)&&(i=m[t],f=!0),a.wrappedFunction&&(a=a.wrappedFunction),3===a.length)o=a.call(e,t,n,i);else{if(2!==a.length)return Ember.defineProperty(e,t,null,i),Ember.set(e,t,n),void 0;o=a.call(e,t,n)}if(f&&i===o)return;c&&Ember.propertyWillChange(e,t),f&&delete m[t],s&&(c||f||r(this,e,t,u),m[t]=o),c&&Ember.propertyDidChange(e,t)}finally{this._suspended=l}return o},E.setup=function(e,t){var n=e[m];n&&n.watching[t]&&r(this,e,t,h(e))},E.teardown=function(e,t){var r=h(e);return(r.watching[t]||t in r.cache)&&n(this,e,t,r),this._cacheable&&delete r.cache[t],null},Ember.computed=function(e){var t;if(arguments.length>1&&(t=l.call(arguments,0,-1),e=l.call(arguments,-1)[0]),"function"!=typeof e)throw new Error("Computed Property declared without a property function");var r=new i(e);return t&&r.property.apply(r,t),r},Ember.cacheFor=function(e,t){var r=h(e,!1).cache;return r&&t in r?r[t]:void 0},s("empty",function(e){return Ember.isEmpty(u(this,e))}),s("notEmpty",function(e){return!Ember.isEmpty(u(this,e))}),s("none",function(e){return Ember.isNone(u(this,e))}),s("not",function(e){return!u(this,e)}),s("bool",function(e){return!!u(this,e)}),s("match",function(e,t){var r=u(this,e);return"string"==typeof r?!!r.match(t):!1}),s("equal",function(e,t){return u(this,e)===t}),s("gt",function(e,t){return u(this,e)>t}),s("gte",function(e,t){return u(this,e)>=t}),s("lt",function(e,t){return u(this,e)<t}),s("lte",function(e,t){return u(this,e)<=t}),a("and",function(e){for(var t in e)if(e.hasOwnProperty(t)&&!e[t])return!1;return!0}),a("or",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1}),a("any",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return e[t];return null}),a("map",function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&(Ember.isNone(e[r])?t.push(null):t.push(e[r]));return t}),Ember.computed.alias=function(e){return Ember.computed(e,function(t,r){return arguments.length>1?(c(this,e,r),r):u(this,e)})},Ember.computed.oneWay=function(e){return Ember.computed(e,function(){return u(this,e)})},Ember.computed.defaultTo=function(e){return Ember.computed(function(t,r,n){return 1===arguments.length?null!=n?n:u(this,e):null!=r?r:u(this,e)})}}(),function(){function e(e){return e+r}function t(e){return e+n}var r=":change",n=":before";Ember.addObserver=function(t,r,n,i){return Ember.addListener(t,e(r),n,i),Ember.watch(t,r),this},Ember.observersFor=function(t,r){return Ember.listenersFor(t,e(r))},Ember.removeObserver=function(t,r,n,i){return Ember.unwatch(t,r),Ember.removeListener(t,e(r),n,i),this},Ember.addBeforeObserver=function(e,r,n,i){return Ember.addListener(e,t(r),n,i),Ember.watch(e,r),this},Ember._suspendBeforeObserver=function(e,r,n,i,o){return Ember._suspendListener(e,t(r),n,i,o)},Ember._suspendObserver=function(t,r,n,i,o){return Ember._suspendListener(t,e(r),n,i,o)};var i=Ember.ArrayPolyfills.map;Ember._suspendBeforeObservers=function(e,r,n,o,s){var a=i.call(r,t);return Ember._suspendListeners(e,a,n,o,s)},Ember._suspendObservers=function(t,r,n,o,s){var a=i.call(r,e);return Ember._suspendListeners(t,a,n,o,s)},Ember.beforeObserversFor=function(e,r){return Ember.listenersFor(e,t(r))},Ember.removeBeforeObserver=function(e,r,n,i){return Ember.unwatch(e,r),Ember.removeListener(e,t(r),n,i),this}}(),function(){e("backburner",["backburner/deferred_action_queues","exports"],function(e,t){"use strict";function r(e,t){this.queueNames=e,this.options=t||{},this.options.defaultQueue||(this.options.defaultQueue=e[0]),this.instanceStack=[]}function n(e){e.begin(),o=setTimeout(function(){e.end(),o=null})}function i(e){var t,r,n,o,u=+new Date;e.run(function(){for(n=0,o=f.length;o>n&&(t=f[n],!(t>u));n+=2);for(r=f.splice(0,n),n=1,o=r.length;o>n;n+=2)e.schedule(e.options.defaultQueue,null,r[n])}),f.length&&(s=setTimeout(function(){i(e),s=null,a=null},f[0]-u),a=f[0])}var o,s,a,u=e.DeferredActionQueues,c=[].slice,h=[].pop,l=[],f=[];r.prototype={queueNames:null,options:null,currentInstance:null,instanceStack:null,begin:function(){var e=this.options&&this.options.onBegin,t=this.currentInstance;t&&this.instanceStack.push(t),this.currentInstance=new u(this.queueNames,this.options),e&&e(this.currentInstance,t)},end:function(){var e=this.options&&this.options.onEnd,t=this.currentInstance,r=null;try{t.flush()}finally{this.currentInstance=null,this.instanceStack.length&&(r=this.instanceStack.pop(),this.currentInstance=r),e&&e(t,r)
16
+ }},run:function(e,t){var r;this.begin(),t||(t=e,e=null),"string"==typeof t&&(t=e[t]);var n=!1;try{r=arguments.length>2?t.apply(e,c.call(arguments,2)):t.call(e)}finally{n||(n=!0,this.end())}return r},defer:function(e,t,r){r||(r=t,t=null),"string"==typeof r&&(r=t[r]);var i=(new Error).stack,o=arguments.length>3?c.call(arguments,3):void 0;return this.currentInstance||n(this),this.currentInstance.schedule(e,t,r,o,!1,i)},deferOnce:function(e,t,r){r||(r=t,t=null),"string"==typeof r&&(r=t[r]);var i=(new Error).stack,o=arguments.length>3?c.call(arguments,3):void 0;return this.currentInstance||n(this),this.currentInstance.schedule(e,t,r,o,!0,i)},setTimeout:function(){var e=this,t=h.call(arguments),r=arguments[0],n=arguments[1],o=+new Date+t;n||(n=r,r=null),"string"==typeof n&&(n=r[n]);var u,l;arguments.length>2?(l=c.call(arguments,2),u=function(){n.apply(r,l)}):u=function(){n.call(r)};var m,b;for(m=0,b=f.length;b>m&&!(o<f[m]);m+=2);return f.splice(m,0,o,u),s&&o>a?u:(s&&(clearTimeout(s),s=null),s=setTimeout(function(){i(e),s=null,a=null},t),a=o,u)},debounce:function(e,t){for(var r,n=this,i=arguments,o=h.call(i),s=0,a=l.length;a>s;s++)if(r=l[s],r[0]===e&&r[1]===t)return;var u=setTimeout(function(){n.run.apply(n,i);for(var o=-1,s=0,a=l.length;a>s;s++)if(r=l[s],r[0]===e&&r[1]===t){o=s;break}o>-1&&l.splice(o,1)},o);l.push([e,t,u])},cancelTimers:function(){for(var e=0,t=l.length;t>e;e++)clearTimeout(l[e][2]);l=[],s&&(clearTimeout(s),s=null),f=[],o&&(clearTimeout(o),o=null)},hasTimers:function(){return!!f.length||o},cancel:function(e){if("object"==typeof e&&e.queue&&e.method)return e.queue.cancel(e);if("function"==typeof e)for(var t=0,r=f.length;r>t;t+=2)if(f[t+1]===e)return f.splice(t,2),!0}},r.prototype.schedule=r.prototype.defer,r.prototype.scheduleOnce=r.prototype.deferOnce,r.prototype.later=r.prototype.setTimeout,t.Backburner=r}),e("backburner/deferred_action_queues",["backburner/queue","exports"],function(e,t){"use strict";function r(e,t){var r=this.queues={};this.queueNames=e=e||[];for(var n,o=0,s=e.length;s>o;o++)n=e[o],r[n]=new i(this,n,t[n])}function n(e,t){for(var r,n,i=0,o=t;o>=i;i++)if(r=e.queueNames[i],n=e.queues[r],n._queue.length)return i;return-1}var i=e.Queue;r.prototype={queueNames:null,queues:null,schedule:function(e,t,r,n,i,o){var s=this.queues,a=s[e];if(!a)throw new Error("You attempted to schedule an action in a queue ("+e+") that doesn't exist");return i?a.pushUnique(t,r,n,o):a.push(t,r,n,o)},flush:function(){for(var e,t,r,i,o=this.queues,s=this.queueNames,a=0,u=s.length;u>a;){e=s[a],t=o[e],r=t._queue.slice(),t._queue=[];var c,h,l,f,m=t.options,b=m&&m.before,p=m&&m.after,E=0,d=r.length;for(d&&b&&b();d>E;)c=r[E],h=r[E+1],l=r[E+2],f=r[E+3],"string"==typeof h&&(h=c[h]),l&&l.length>0?h.apply(c,l):h.call(c),E+=4;d&&p&&p(),-1===(i=n(this,a))?a++:a=i}}},t.DeferredActionQueues=r}),e("backburner/queue",["exports"],function(e){"use strict";function t(e,t,r){this.daq=e,this.name=t,this.options=r,this._queue=[]}t.prototype={daq:null,name:null,options:null,_queue:null,push:function(e,t,r,n){var i=this._queue;return i.push(e,t,r,n),{queue:this,target:e,method:t}},pushUnique:function(e,t,r,n){var i,o,s,a,u=this._queue;for(s=0,a=u.length;a>s;s+=4)if(i=u[s],o=u[s+1],i===e&&o===t)return u[s+2]=r,u[s+3]=n,{queue:this,target:e,method:t};return this._queue.push(e,t,r,n),{queue:this,target:e,method:t}},flush:function(){var e,t,r,n,i,o=this._queue,s=this.options,a=s&&s.before,u=s&&s.after,c=o.length;for(c&&a&&a(),i=0;c>i;i+=4)e=o[i],t=o[i+1],r=o[i+2],n=o[i+3],r&&r.length>0?t.apply(e,r):t.call(e);c&&u&&u(),o.length>c?(this._queue=o.slice(c),this.flush()):this._queue.length=0},cancel:function(e){var t,r,n,i,o=this._queue;for(n=0,i=o.length;i>n;n+=4)if(t=o[n],r=o[n+1],t===e.target&&r===e.method)return o.splice(n,4),!0}},e.Queue=t})}(),function(){function e(){!Ember.run.currentRunLoop}var r=function(e){Ember.run.currentRunLoop=e},n=function(e,t){Ember.run.currentRunLoop=t},i=t("backburner").Backburner,o=new i(["sync","actions","destroy"],{sync:{before:Ember.beginPropertyChanges,after:Ember.endPropertyChanges},defaultQueue:"actions",onBegin:r,onEnd:n}),s=[].slice;Ember.run=function(){var e;if(Ember.onerror)try{e=o.run.apply(o,arguments)}catch(t){Ember.onerror(t)}else e=o.run.apply(o,arguments);return e},Ember.run.join=function(){if(!Ember.run.currentRunLoop)return Ember.run.apply(Ember.run,arguments);var e=s.call(arguments);e.unshift("actions"),Ember.run.schedule.apply(Ember.run,e)},Ember.run.backburner=o,Ember.run,Ember.run.currentRunLoop=null,Ember.run.queues=o.queueNames,Ember.run.begin=function(){o.begin()},Ember.run.end=function(){o.end()},Ember.run.schedule=function(){e(),o.schedule.apply(o,arguments)},Ember.run.hasScheduledTimers=function(){return o.hasTimers()},Ember.run.cancelTimers=function(){o.cancelTimers()},Ember.run.sync=function(){o.currentInstance.queues.sync.flush()},Ember.run.later=function(){return o.later.apply(o,arguments)},Ember.run.once=function(){e();var t=s.call(arguments);return t.unshift("actions"),o.scheduleOnce.apply(o,t)},Ember.run.scheduleOnce=function(){return e(),o.scheduleOnce.apply(o,arguments)},Ember.run.next=function(){var e=s.call(arguments);return e.push(1),o.later.apply(o,e)},Ember.run.cancel=function(e){return o.cancel(e)}}(),function(){function e(e,t){return r(o(t)?Ember.lookup:e,t)}function t(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])}Ember.LOG_BINDINGS=!1||!!Ember.ENV.LOG_BINDINGS;var r=Ember.get,n=(Ember.set,Ember.guidFor),i=/^([A-Z$]|([0-9][A-Z$]))/,o=Ember.isGlobalPath=function(e){return i.test(e)},s=function(e,t){this._direction="fwd",this._from=t,this._to=e,this._directionMap=Ember.Map.create()};s.prototype={copy:function(){var e=new s(this._to,this._from);return this._oneWay&&(e._oneWay=!0),e},from:function(e){return this._from=e,this},to:function(e){return this._to=e,this},oneWay:function(){return this._oneWay=!0,this},toString:function(){var e=this._oneWay?"[oneWay]":"";return"Ember.Binding<"+n(this)+">("+this._from+" -> "+this._to+")"+e},connect:function(t){var r=this._from,n=this._to;return Ember.trySet(t,n,e(t,r)),Ember.addObserver(t,r,this,this.fromDidChange),this._oneWay||Ember.addObserver(t,n,this,this.toDidChange),this._readyToSync=!0,this},disconnect:function(e){var t=!this._oneWay;return Ember.removeObserver(e,this._from,this,this.fromDidChange),t&&Ember.removeObserver(e,this._to,this,this.toDidChange),this._readyToSync=!1,this},fromDidChange:function(e){this._scheduleSync(e,"fwd")},toDidChange:function(e){this._scheduleSync(e,"back")},_scheduleSync:function(e,t){var r=this._directionMap,n=r.get(e);n||(Ember.run.schedule("sync",this,this._sync,e),r.set(e,t)),"back"===n&&"fwd"===t&&r.set(e,"fwd")},_sync:function(t){var n=Ember.LOG_BINDINGS;if(!t.isDestroyed&&this._readyToSync){var i=this._directionMap,o=i.get(t),s=this._from,a=this._to;if(i.remove(t),"fwd"===o){var u=e(t,this._from);n&&Ember.Logger.log(" ",this.toString(),"->",u,t),this._oneWay?Ember.trySet(t,a,u):Ember._suspendObserver(t,a,this,this.toDidChange,function(){Ember.trySet(t,a,u)})}else if("back"===o){var c=r(t,this._to);n&&Ember.Logger.log(" ",this.toString(),"<-",c,t),Ember._suspendObserver(t,s,this,this.fromDidChange,function(){Ember.trySet(Ember.isGlobalPath(s)?Ember.lookup:t,s,c)})}}}},t(s,{from:function(){var e=this,t=new e;return t.from.apply(t,arguments)},to:function(){var e=this,t=new e;return t.to.apply(t,arguments)},oneWay:function(e,t){var r=this,n=new r(null,e);return n.oneWay(t)}}),Ember.Binding=s,Ember.bind=function(e,t,r){return new Ember.Binding(t,r).connect(e)},Ember.oneWay=function(e,t,r){return new Ember.Binding(t,r).oneWay().connect(e)}}(),function(){function e(e){var t=Ember.meta(e,!0),r=t.mixins;return r?t.hasOwnProperty("mixins")||(r=t.mixins=A(r)):r=t.mixins={},r}function t(e,t){return t&&t.length>0&&(e.mixins=O.call(t,function(e){if(e instanceof g)return e;var t=new g;return t.properties=e,t})),e}function r(e){return"function"==typeof e&&e.isMethod!==!1&&e!==Boolean&&e!==Object&&e!==Number&&e!==Array&&e!==Date&&e!==String}function n(e,t){var r;return t instanceof g?(r=S(t),e[r]?x:(e[r]=t,t.properties)):t}function i(e,t,r){var n;return n=t.concatenatedProperties||r.concatenatedProperties,e.concatenatedProperties&&(n=n?n.concat(e.concatenatedProperties):e.concatenatedProperties),n}function o(e,t,r,n,i){var o;return void 0===n[t]&&(o=i[t]),o=o||e.descs[t],o&&o instanceof Ember.ComputedProperty?(r=A(r),r.func=Ember.wrap(r.func,o.func),r):r}function s(e,t,r,n,i){var o;return void 0===i[t]&&(o=n[t]),o=o||e[t],"function"!=typeof o?r:Ember.wrap(r,o)}function a(e,t,r,n){var i=n[t]||e[t];return i?"function"==typeof i.concat?i.concat(r):Ember.makeArray(i).concat(r):Ember.makeArray(r)}function u(e,t,n,i,u,c,h){if(n instanceof Ember.Descriptor){if(n===y&&u[t])return x;n.func&&(n=o(i,t,n,c,u)),u[t]=n,c[t]=void 0}else r(n)?n=s(e,t,n,c,u):(h&&C.call(h,t)>=0||"concatenatedProperties"===t)&&(n=a(e,t,n,c)),u[t]=void 0,c[t]=n}function c(e,t,r,o,s,a){function h(e){delete r[e],delete o[e]}for(var l,f,m,b,p,E=0,d=e.length;d>E;E++)if(l=e[E],f=n(t,l),f!==x)if(f){p=Ember.meta(s),b=i(f,o,s);for(m in f)f.hasOwnProperty(m)&&(a.push(m),u(s,m,f[m],p,r,o,b));f.hasOwnProperty("toString")&&(s.toString=f.toString)}else l.mixins&&(c(l.mixins,t,r,o,s,a),l._without&&w.call(l._without,h))}function h(e,t,r,n){if(D.test(t)){var i=n.bindings;i?n.hasOwnProperty("bindings")||(i=n.bindings=A(n.bindings)):i=n.bindings={},i[t]=r}}function l(e,t){var r,n,i,o=t.bindings;if(o){for(r in o)n=o[r],n&&(i=r.slice(0,-7),n instanceof Ember.Binding?(n=n.copy(),n.to(i)):n=new Ember.Binding(i,n),n.connect(e),e[r]=n);t.bindings={}}}function f(e,t){return l(e,t||Ember.meta(e)),e}function m(e,t,r,n,i){var o,s=t.methodName;return n[s]||i[s]?(o=i[s],t=n[s]):r.descs[s]?(t=r.descs[s],o=void 0):(t=void 0,o=e[s]),{desc:t,value:o}}function b(e,t,r,n,i){if("function"==typeof r){var o=r[n];if(o)for(var s=0,a=o.length;a>s;s++)Ember[i](e,o[s],null,t)}}function p(e,t,r){var n=e[t];b(e,t,n,"__ember_observesBefore__","removeBeforeObserver"),b(e,t,n,"__ember_observes__","removeObserver"),b(e,t,r,"__ember_observesBefore__","addBeforeObserver"),b(e,t,r,"__ember_observes__","addObserver")}function E(t,r,n){var i,o,s,a={},u={},l=Ember.meta(t),b=[];c(r,e(t),a,u,t,b);for(var E=0,d=b.length;d>E;E++)if(i=b[E],"constructor"!==i&&u.hasOwnProperty(i)&&(s=a[i],o=u[i],s!==y)){for(;s&&s instanceof _;){var v=m(t,s,l,a,u);s=v.desc,o=v.value}(void 0!==s||void 0!==o)&&(p(t,i,o),h(t,i,o,l),j(t,i,s,o,l))}return n||f(t,l),t}function d(e,t,r){var n=S(e);if(r[n])return!1;if(r[n]=!0,e===t)return!0;for(var i=e.mixins,o=i?i.length:0;--o>=0;)if(d(i[o],t,r))return!0;return!1}function v(e,t,r){if(!r[S(t)])if(r[S(t)]=!0,t.properties){var n=t.properties;for(var i in n)n.hasOwnProperty(i)&&(e[i]=!0)}else t.mixins&&w.call(t.mixins,function(t){v(e,t,r)})}var g,y,_,O=Ember.ArrayPolyfills.map,C=Ember.ArrayPolyfills.indexOf,w=Ember.ArrayPolyfills.forEach,P=[].slice,A=Ember.create,j=Ember.defineProperty,S=Ember.guidFor,x={},D=Ember.IS_BINDING=/^.+Binding$/;Ember.mixin=function(e){var t=P.call(arguments,1);return E(e,t,!1),e},Ember.Mixin=function(){return t(this,arguments)},g=Ember.Mixin,g.prototype={properties:null,mixins:null,ownerConstructor:null},g._apply=E,g.applyPartial=function(e){var t=P.call(arguments,1);return E(e,t,!0)},g.finishPartial=f,Ember.anyUnprocessedMixins=!1,g.create=function(){Ember.anyUnprocessedMixins=!0;var e=this;return t(new e,arguments)};var N=g.prototype;N.reopen=function(){var e,t;this.properties?(e=g.create(),e.properties=this.properties,delete this.properties,this.mixins=[e]):this.mixins||(this.mixins=[]);var r,n=arguments.length,i=this.mixins;for(r=0;n>r;r++)e=arguments[r],e instanceof g?i.push(e):(t=g.create(),t.properties=e,i.push(t));return this},N.apply=function(e){return E(e,[this],!1)},N.applyPartial=function(e){return E(e,[this],!0)},N.detect=function(e){if(!e)return!1;if(e instanceof g)return d(e,this,{});var t=Ember.meta(e,!1).mixins;return t?!!t[S(this)]:!1},N.without=function(){var e=new g(this);return e._without=P.call(arguments),e},N.keys=function(){var e={},t={},r=[];v(e,this,t);for(var n in e)e.hasOwnProperty(n)&&r.push(n);return r},g.mixins=function(e){var t=Ember.meta(e,!1).mixins,r=[];if(!t)return r;for(var n in t){var i=t[n];i.properties||r.push(i)}return r},y=new Ember.Descriptor,y.toString=function(){return"(Required Property)"},Ember.required=function(){return y},_=function(e){this.methodName=e},_.prototype=new Ember.Descriptor,Ember.alias=function(e){return new _(e)},Ember.alias=Ember.deprecateFunc("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.",Ember.alias),Ember.aliasMethod=function(e){return new _(e)},Ember.observer=function(e){var t=P.call(arguments,1);return e.__ember_observes__=t,e},Ember.immediateObserver=function(){for(var e=0,t=arguments.length;t>e;e++)arguments[e];return Ember.observer.apply(this,arguments)},Ember.beforeObserver=function(e){var t=P.call(arguments,1);return e.__ember_observesBefore__=t,e}}(),function(){e("rsvp/all",["rsvp/defer","exports"],function(e,t){"use strict";function r(e){var t=[],r=n(),i=e.length;0===i&&r.resolve([]);for(var o=function(e){return function(t){s(e,t)}},s=function(e,n){t[e]=n,0===--i&&r.resolve(t)},a=function(e){r.reject(e)},u=0;u<e.length;u++)e[u]&&"function"==typeof e[u].then?e[u].then(o(u),a):s(u,e[u]);return r.promise}var n=e.defer;t.all=r}),e("rsvp/async",["exports"],function(e){"use strict";var t,r="undefined"!=typeof window?window:{},n=r.MutationObserver||r.WebKitMutationObserver;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))t=function(e,t){process.nextTick(function(){e.call(t)})};else if(n){var i=[],o=new n(function(){var e=i.slice();i=[],e.forEach(function(e){var t=e[0],r=e[1];t.call(r)})}),s=document.createElement("div");o.observe(s,{attributes:!0}),window.addEventListener("unload",function(){o.disconnect(),o=null}),t=function(e,t){i.push([e,t]),s.setAttribute("drainQueue","drainQueue")}}else t=function(e,t){setTimeout(function(){e.call(t)},1)};e.async=t}),e("rsvp/config",["rsvp/async","exports"],function(e,t){"use strict";var r=e.async,n={};n.async=r,t.config=n}),e("rsvp/defer",["rsvp/promise","exports"],function(e,t){"use strict";function r(){var e={},t=new n(function(t,r){e.resolve=t,e.reject=r});return e.promise=t,e}var n=e.Promise;t.defer=r}),e("rsvp/events",["exports"],function(e){"use strict";var t=function(e,t){this.type=e;for(var r in t)t.hasOwnProperty(r)&&(this[r]=t[r])},r=function(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r][0]===t)return r;return-1},n=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},i={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,i){var o,s,a=n(this);for(e=e.split(/\s+/),i=i||this;s=e.shift();)o=a[s],o||(o=a[s]=[]),-1===r(o,t)&&o.push([t,i])},off:function(e,t){var i,o,s,a=n(this);for(e=e.split(/\s+/);o=e.shift();)t?(i=a[o],s=r(i,t),-1!==s&&i.splice(s,1)):a[o]=[]},trigger:function(e,r){var i,o,s,a,u,c=n(this);if(i=c[e])for(var h=0;h<i.length;h++)o=i[h],s=o[0],a=o[1],"object"!=typeof r&&(r={detail:r}),u=new t(e,r),s.call(a,u)}};e.EventTarget=i}),e("rsvp/hash",["rsvp/defer","exports"],function(e,t){"use strict";function r(e){var t=0;for(var r in e)t++;return t}function n(e){var t={},n=i(),o=r(e);0===o&&n.resolve({});var s=function(e){return function(t){a(e,t)}},a=function(e,r){t[e]=r,0===--o&&n.resolve(t)},u=function(e){n.reject(e)};for(var c in e)e[c]&&"function"==typeof e[c].then?e[c].then(s(c),u):a(c,e[c]);return n.promise}var i=e.defer;t.hash=n}),e("rsvp/node",["rsvp/promise","rsvp/all","exports"],function(e,t,r){"use strict";function n(e,t){return function(r,n){r?t(r):arguments.length>2?e(Array.prototype.slice.call(arguments,1)):e(n)}}function i(e){return function(){var t,r,i=Array.prototype.slice.call(arguments),a=new o(function(e,n){t=e,r=n});return s(i).then(function(i){i.push(n(t,r));try{e.apply(this,i)}catch(o){r(o)}}),a}}var o=e.Promise,s=t.all;r.denodeify=i}),e("rsvp/promise",["rsvp/config","rsvp/events","exports"],function(e,t,r){"use strict";function n(e){return i(e)||"object"==typeof e&&null!==e}function i(e){return"function"==typeof e}function o(e,t){e===t?a(e,t):s(e,t)||a(e,t)}function s(e,t){var r=null;if(n(t)){try{r=t.then}catch(s){return u(e,s),!0}if(i(r)){try{r.call(t,function(r){t!==r?o(e,r):a(e,r)},function(t){u(e,t)})}catch(s){u(e,s)}return!0}}return!1}function a(e,t){c.async(function(){e.trigger("promise:resolved",{detail:t}),e.isFulfilled=!0,e.fulfillmentValue=t})}function u(e,t){c.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedReason=t})}var c=e.config,h=t.EventTarget,l=function(e){var t=this,r=!1;if("function"!=typeof e)throw new TypeError("You must pass a resolver function as the sole argument to the promise constructor");if(!(t instanceof l))return new l(e);var n=function(e){r||(r=!0,o(t,e))},i=function(e){r||(r=!0,u(t,e))};this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this);try{e(n,i)}catch(s){i(s)}},f=function(e,t,r,n){var a,c,h,l,f=i(r);if(f)try{a=r(n.detail),h=!0}catch(m){l=!0,c=m}else a=n.detail,h=!0;s(t,a)||(f&&h?o(t,a):l?u(t,c):"resolve"===e?o(t,a):"reject"===e&&u(t,a))};l.prototype={constructor:l,then:function(e,t){var r=new l(function(){});return this.isFulfilled&&c.async(function(){f("resolve",r,e,{detail:this.fulfillmentValue})},this),this.isRejected&&c.async(function(){f("reject",r,t,{detail:this.rejectedReason})},this),this.on("promise:resolved",function(t){f("resolve",r,e,t)}),this.on("promise:failed",function(e){f("reject",r,t,e)}),r}},h.mixin(l.prototype),r.Promise=l}),e("rsvp/reject",["rsvp/promise","exports"],function(e,t){"use strict";function r(e){return new n(function(t,r){r(e)})}var n=e.Promise;t.reject=r}),e("rsvp/resolve",["rsvp/promise","exports"],function(e,t){"use strict";function r(e){return"function"==typeof e||"object"==typeof e&&null!==e}function n(e){var t=new i(function(t,n){var i;try{r(e)?(i=e.then,"function"==typeof i?i.call(e,t,n):t(e)):t(e)}catch(o){n(o)}});return t}var i=e.Promise;t.resolve=n}),e("rsvp",["rsvp/events","rsvp/promise","rsvp/node","rsvp/all","rsvp/hash","rsvp/defer","rsvp/config","rsvp/resolve","rsvp/reject","exports"],function(e,t,r,n,i,o,s,a,u,c){"use strict";function h(e,t){d[e]=t}var l=e.EventTarget,f=t.Promise,m=r.denodeify,b=n.all,p=i.hash,E=o.defer,d=s.config,v=a.resolve,g=u.reject;c.Promise=f,c.EventTarget=l,c.all=b,c.hash=p,c.defer=E,c.denodeify=m,c.configure=h,c.resolve=v,c.reject=g})}(),function(){e("container",[],function(){function e(e){this.parent=e,this.dict={}}function t(t){this.parent=t,this.children=[],this.resolver=t&&t.resolver||function(){},this.registry=new e(t&&t.registry),this.cache=new e(t&&t.cache),this.typeInjections=new e(t&&t.typeInjections),this.injections={},this._options=new e(t&&t._options),this._typeOptions=new e(t&&t._typeOptions)}function r(e){throw new Error(e+" is not currently supported on child containers")}function n(e,t){var r=o(e,t,"singleton");return r!==!1}function i(e,t){var r={};if(!t)return r;for(var n,i,o=0,s=t.length;s>o;o++)n=t[o],i=e.lookup(n.fullName),r[n.property]=i;return r}function o(e,t,r){var n=e._options.get(t);if(n&&void 0!==n[r])return n[r];var i=t.split(":")[0];return n=e._typeOptions.get(i),n?n[r]:void 0}function s(e,t){var r=e.normalize(t);return e.resolve(r)}function a(e,t){var r,n=s(e,t),a=t.split(":"),u=a[0];if(o(e,t,"instantiate")===!1)return n;if(n){var c=[];c=c.concat(e.typeInjections.get(u)||[]),c=c.concat(e.injections[t]||[]);var h=i(e,c);return h.container=e,h._debugContainerKey=t,r=n.create(h)}}function u(e,t){e.cache.eachLocal(function(r,n){o(e,r,"instantiate")!==!1&&t(n)})}function c(e){e.cache.eachLocal(function(t,r){o(e,t,"instantiate")!==!1&&r.destroy()}),e.cache.dict={}}return e.prototype={get:function(e){var t=this.dict;return t.hasOwnProperty(e)?t[e]:this.parent?this.parent.get(e):void 0},set:function(e,t){this.dict[e]=t},has:function(e){var t=this.dict;return t.hasOwnProperty(e)?!0:this.parent?this.parent.has(e):!1},eachLocal:function(e,t){var r=this.dict;for(var n in r)r.hasOwnProperty(n)&&e.call(t,n,r[n])}},t.prototype={child:function(){var e=new t(this);return this.children.push(e),e},set:function(e,t,r){e[t]=r},register:function(e,t,r,n){var i;-1!==e.indexOf(":")?(n=r,r=t,i=e):i=e+":"+t;var o=this.normalize(i);this.registry.set(o,r),this._options.set(o,n||{})},resolve:function(e){return this.resolver(e)||this.registry.get(e)},normalize:function(e){return e},lookup:function(e,t){if(e=this.normalize(e),t=t||{},this.cache.has(e)&&t.singleton!==!1)return this.cache.get(e);var r=a(this,e);return r?(n(this,e)&&t.singleton!==!1&&this.cache.set(e,r),r):void 0},has:function(e){return this.cache.has(e)?!0:!!s(this,e)},optionsForType:function(e,t){this.parent&&r("optionsForType"),this._typeOptions.set(e,t)},options:function(e,t){this.optionsForType(e,t)},typeInjection:function(e,t,n){this.parent&&r("typeInjection");var i=this.typeInjections.get(e);i||(i=[],this.typeInjections.set(e,i)),i.push({property:t,fullName:n})},injection:function(e,t,n){if(this.parent&&r("injection"),-1===e.indexOf(":"))return this.typeInjection(e,t,n);var i=this.injections[e]=this.injections[e]||[];i.push({property:t,fullName:n})},destroy:function(){this.isDestroyed=!0;for(var e=0,t=this.children.length;t>e;e++)this.children[e].destroy();this.children=[],u(this,function(e){e.destroy()}),delete this.parent,this.isDestroyed=!0},reset:function(){for(var e=0,t=this.children.length;t>e;e++)c(this.children[e]);c(this)}},t})}(),function(){function e(r,n,i,o){var s,a,u;if("object"!=typeof r||null===r)return r;if(n&&(a=t(i,r))>=0)return o[a];if("array"===Ember.typeOf(r)){if(s=r.slice(),n)for(a=s.length;--a>=0;)s[a]=e(s[a],n,i,o)}else if(Ember.Copyable&&Ember.Copyable.detect(r))s=r.copy(n,i,o);else{s={};for(u in r)r.hasOwnProperty(u)&&"__"!==u.substring(0,2)&&(s[u]=n?e(r[u],n,i,o):r[u])}return n&&(i.push(r),o.push(s)),s}var t=Ember.EnumerableUtils.indexOf;Ember.compare=function n(e,t){if(e===t)return 0;var r=Ember.typeOf(e),i=Ember.typeOf(t),o=Ember.Comparable;if(o){if("instance"===r&&o.detect(e.constructor))return e.constructor.compare(e,t);if("instance"===i&&o.detect(t.constructor))return 1-t.constructor.compare(t,e)}var s=Ember.ORDER_DEFINITION_MAPPING;if(!s){var a=Ember.ORDER_DEFINITION;s=Ember.ORDER_DEFINITION_MAPPING={};var u,c;for(u=0,c=a.length;c>u;++u)s[a[u]]=u;delete Ember.ORDER_DEFINITION}var h=s[r],l=s[i];if(l>h)return-1;if(h>l)return 1;switch(r){case"boolean":case"number":return t>e?-1:e>t?1:0;case"string":var f=e.localeCompare(t);return 0>f?-1:f>0?1:0;case"array":for(var m=e.length,b=t.length,p=Math.min(m,b),E=0,d=0;0===E&&p>d;)E=n(e[d],t[d]),d++;return 0!==E?E:b>m?-1:m>b?1:0;case"instance":return Ember.Comparable&&Ember.Comparable.detect(e)?e.compare(e,t):0;case"date":var v=e.getTime(),g=t.getTime();return g>v?-1:v>g?1:0;default:return 0}},Ember.copy=function(t,r){return"object"!=typeof t||null===t?t:Ember.Copyable&&Ember.Copyable.detect(t)?t.copy(r):e(t,r,r?[]:null,r?[]:null)},Ember.inspect=function(e){if("object"!=typeof e||null===e)return e+"";var t,r=[];for(var n in e)if(e.hasOwnProperty(n)){if(t=e[n],"toString"===t)continue;"function"===Ember.typeOf(t)&&(t="function() { ... }"),r.push(n+": "+t)}return"{"+r.join(", ")+"}"},Ember.isEqual=function(e,t){return e&&"function"==typeof e.isEqual?e.isEqual(t):e===t},Ember.ORDER_DEFINITION=Ember.ENV.ORDER_DEFINITION||["undefined","null","boolean","number","string","array","object","instance","function","class","date"],Ember.keys=Object.keys,(!Ember.keys||Ember.create.isSimulated)&&(Ember.keys=function(e){var t=[];for(var r in e)"__"!==r.substring(0,2)&&"_super"!==r&&e.hasOwnProperty(r)&&t.push(r);return t});var r=["description","fileName","lineNumber","message","name","number","stack"];Ember.Error=function(){for(var e=Error.apply(this,arguments),t=0;t<r.length;t++)this[r[t]]=e[r[t]]},Ember.Error.prototype=Ember.create(Error.prototype)}(),function(){Ember.RSVP=t("rsvp")}(),function(){var e=/[ _]/g,t={},r=/([a-z])([A-Z])/g,n=/(\-|_|\.|\s)+(.)?/g,i=/([a-z\d])([A-Z]+)/g,o=/\-|\s+/g;Ember.STRINGS={},Ember.String={fmt:function(e,t){var r=0;return e.replace(/%@([0-9]+)?/g,function(e,n){return n=n?parseInt(n,0)-1:r++,e=t[n],(null===e?"(null)":void 0===e?"":e).toString()})},loc:function(e,t){return e=Ember.STRINGS[e]||e,Ember.String.fmt(e,t)},w:function(e){return e.split(/\s+/)},decamelize:function(e){return e.replace(r,"$1_$2").toLowerCase()},dasherize:function(r){var n,i=t,o=i.hasOwnProperty(r);return o?i[r]:(n=Ember.String.decamelize(r).replace(e,"-"),i[r]=n,n)},camelize:function(e){return e.replace(n,function(e,t,r){return r?r.toUpperCase():""}).replace(/^([A-Z])/,function(e){return e.toLowerCase()})},classify:function(e){for(var t=e.split("."),r=[],n=0,i=t.length;i>n;n++){var o=Ember.String.camelize(t[n]);r.push(o.charAt(0).toUpperCase()+o.substr(1))}return r.join(".")},underscore:function(e){return e.replace(i,"$1_$2").replace(o,"_").toLowerCase()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.substr(1)}}}(),function(){var e=Ember.String.fmt,t=Ember.String.w,r=Ember.String.loc,n=Ember.String.camelize,i=Ember.String.decamelize,o=Ember.String.dasherize,s=Ember.String.underscore,a=Ember.String.capitalize,u=Ember.String.classify;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.fmt=function(){return e(this,arguments)},String.prototype.w=function(){return t(this)},String.prototype.loc=function(){return r(this,arguments)},String.prototype.camelize=function(){return n(this)},String.prototype.decamelize=function(){return i(this)},String.prototype.dasherize=function(){return o(this)},String.prototype.underscore=function(){return s(this)},String.prototype.classify=function(){return u(this)},String.prototype.capitalize=function(){return a(this)})}(),function(){var e=Array.prototype.slice;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Function)&&(Function.prototype.property=function(){var e=Ember.computed(this);return e.property.apply(e,arguments)},Function.prototype.observes=function(){return this.__ember_observes__=e.call(arguments),this},Function.prototype.observesBefore=function(){return this.__ember_observesBefore__=e.call(arguments),this})}(),function(){function e(){return 0===a.length?{}:a.pop()}function t(e){return a.push(e),null}function r(e,t){function r(r){var o=n(r,e);return i?t===o:!!o}var i=2===arguments.length;return r}var n=Ember.get,i=Ember.set,o=Array.prototype.slice,s=Ember.EnumerableUtils.indexOf,a=[];Ember.Enumerable=Ember.Mixin.create({isEnumerable:!0,nextObject:Ember.required(Function),firstObject:Ember.computed(function(){if(0===n(this,"length"))return void 0;var r,i=e();return r=this.nextObject(0,null,i),t(i),r}).property("[]"),lastObject:Ember.computed(function(){var r=n(this,"length");if(0===r)return void 0;var i,o=e(),s=0,a=null;do a=i,i=this.nextObject(s++,a,o);while(void 0!==i);return t(o),a}).property("[]"),contains:function(e){return void 0!==this.find(function(t){return t===e})},forEach:function(r,i){if("function"!=typeof r)throw new TypeError;var o=n(this,"length"),s=null,a=e();void 0===i&&(i=null);for(var u=0;o>u;u++){var c=this.nextObject(u,s,a);r.call(i,c,u,this),s=c}return s=null,a=t(a),this},getEach:function(e){return this.mapProperty(e)},setEach:function(e,t){return this.forEach(function(r){i(r,e,t)})},map:function(e,t){var r=Ember.A([]);return this.forEach(function(n,i,o){r[i]=e.call(t,n,i,o)}),r},mapProperty:function(e){return this.map(function(t){return n(t,e)})},filter:function(e,t){var r=Ember.A([]);return this.forEach(function(n,i,o){e.call(t,n,i,o)&&r.push(n)}),r},reject:function(e,t){return this.filter(function(){return!e.apply(t,arguments)})},filterProperty:function(){return this.filter(r.apply(this,arguments))},rejectProperty:function(e,t){var r=function(r){return n(r,e)===t},i=function(t){return!!n(t,e)},o=2===arguments.length?r:i;return this.reject(o)},find:function(r,i){var o=n(this,"length");void 0===i&&(i=null);for(var s,a,u=null,c=!1,h=e(),l=0;o>l&&!c;l++)s=this.nextObject(l,u,h),(c=r.call(i,s,l,this))&&(a=s),u=s;return s=u=null,h=t(h),a},findProperty:function(){return this.find(r.apply(this,arguments))},every:function(e,t){return!this.find(function(r,n,i){return!e.call(t,r,n,i)})},everyProperty:function(){return this.every(r.apply(this,arguments))},some:function(e,t){return!!this.find(function(r,n,i){return!!e.call(t,r,n,i)})},someProperty:function(){return this.some(r.apply(this,arguments))},reduce:function(e,t,r){if("function"!=typeof e)throw new TypeError;var n=t;return this.forEach(function(t,i){n=e.call(null,n,t,i,this,r)},this),n},invoke:function(e){var t,r=Ember.A([]);return arguments.length>1&&(t=o.call(arguments,1)),this.forEach(function(n,i){var o=n&&n[e];"function"==typeof o&&(r[i]=t?o.apply(n,t):o.call(n))},this),r},toArray:function(){var e=Ember.A([]);return this.forEach(function(t,r){e[r]=t}),e},compact:function(){return this.filter(function(e){return null!=e})},without:function(e){if(!this.contains(e))return this;var t=Ember.A([]);return this.forEach(function(r){r!==e&&(t[t.length]=r)}),t},uniq:function(){var e=Ember.A([]);return this.forEach(function(t){s(e,t)<0&&e.push(t)}),e},"[]":Ember.computed(function(){return this}),addEnumerableObserver:function(e,t){var r=t&&t.willChange||"enumerableWillChange",i=t&&t.didChange||"enumerableDidChange",o=n(this,"hasEnumerableObservers");return o||Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.addListener(this,"@enumerable:before",e,r),Ember.addListener(this,"@enumerable:change",e,i),o||Ember.propertyDidChange(this,"hasEnumerableObservers"),this},removeEnumerableObserver:function(e,t){var r=t&&t.willChange||"enumerableWillChange",i=t&&t.didChange||"enumerableDidChange",o=n(this,"hasEnumerableObservers");return o&&Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.removeListener(this,"@enumerable:before",e,r),Ember.removeListener(this,"@enumerable:change",e,i),o&&Ember.propertyDidChange(this,"hasEnumerableObservers"),this},hasEnumerableObservers:Ember.computed(function(){return Ember.hasListeners(this,"@enumerable:change")||Ember.hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(e,t){var r,i,o;return r="number"==typeof e?e:e?n(e,"length"):e=-1,i="number"==typeof t?t:t?n(t,"length"):t=-1,o=0>i||0>r||0!==i-r,-1===e&&(e=null),-1===t&&(t=null),Ember.propertyWillChange(this,"[]"),o&&Ember.propertyWillChange(this,"length"),Ember.sendEvent(this,"@enumerable:before",[this,e,t]),this},enumerableContentDidChange:function(e,t){var r,i,o;return r="number"==typeof e?e:e?n(e,"length"):e=-1,i="number"==typeof t?t:t?n(t,"length"):t=-1,o=0>i||0>r||0!==i-r,-1===e&&(e=null),-1===t&&(t=null),Ember.sendEvent(this,"@enumerable:change",[this,e,t]),o&&Ember.propertyDidChange(this,"length"),Ember.propertyDidChange(this,"[]"),this}})}(),function(){var e=Ember.get,t=(Ember.set,Ember.isNone),r=Ember.EnumerableUtils.map,n=Ember.cacheFor;Ember.Array=Ember.Mixin.create(Ember.Enumerable,{length:Ember.required(),objectAt:function(t){return 0>t||t>=e(this,"length")?void 0:e(this,t)},objectsAt:function(e){var t=this;return r(e,function(e){return t.objectAt(e)})},nextObject:function(e){return this.objectAt(e)},"[]":Ember.computed(function(t,r){return void 0!==r&&this.replace(0,e(this,"length"),r),this}),firstObject:Ember.computed(function(){return this.objectAt(0)}),lastObject:Ember.computed(function(){return this.objectAt(e(this,"length")-1)}),contains:function(e){return this.indexOf(e)>=0},slice:function(r,n){var i=Ember.A([]),o=e(this,"length");for(t(r)&&(r=0),(t(n)||n>o)&&(n=o),0>r&&(r=o+r),0>n&&(n=o+n);n>r;)i[i.length]=this.objectAt(r++);return i},indexOf:function(t,r){var n,i=e(this,"length");for(void 0===r&&(r=0),0>r&&(r+=i),n=r;i>n;n++)if(this.objectAt(n,!0)===t)return n;return-1},lastIndexOf:function(t,r){var n,i=e(this,"length");for((void 0===r||r>=i)&&(r=i-1),0>r&&(r+=i),n=r;n>=0;n--)if(this.objectAt(n)===t)return n;return-1},addArrayObserver:function(t,r){var n=r&&r.willChange||"arrayWillChange",i=r&&r.didChange||"arrayDidChange",o=e(this,"hasArrayObservers");return o||Ember.propertyWillChange(this,"hasArrayObservers"),Ember.addListener(this,"@array:before",t,n),Ember.addListener(this,"@array:change",t,i),o||Ember.propertyDidChange(this,"hasArrayObservers"),this},removeArrayObserver:function(t,r){var n=r&&r.willChange||"arrayWillChange",i=r&&r.didChange||"arrayDidChange",o=e(this,"hasArrayObservers");return o&&Ember.propertyWillChange(this,"hasArrayObservers"),Ember.removeListener(this,"@array:before",t,n),Ember.removeListener(this,"@array:change",t,i),o&&Ember.propertyDidChange(this,"hasArrayObservers"),this},hasArrayObservers:Ember.computed(function(){return Ember.hasListeners(this,"@array:change")||Ember.hasListeners(this,"@array:before")
17
+ }),arrayContentWillChange:function(t,r,n){void 0===t?(t=0,r=n=-1):(void 0===r&&(r=-1),void 0===n&&(n=-1)),Ember.isWatching(this,"@each")&&e(this,"@each"),Ember.sendEvent(this,"@array:before",[this,t,r,n]);var i,o;if(t>=0&&r>=0&&e(this,"hasEnumerableObservers")){i=[],o=t+r;for(var s=t;o>s;s++)i.push(this.objectAt(s))}else i=r;return this.enumerableContentWillChange(i,n),this},arrayContentDidChange:function(t,r,i){void 0===t?(t=0,r=i=-1):(void 0===r&&(r=-1),void 0===i&&(i=-1));var o,s;if(t>=0&&i>=0&&e(this,"hasEnumerableObservers")){o=[],s=t+i;for(var a=t;s>a;a++)o.push(this.objectAt(a))}else o=i;this.enumerableContentDidChange(r,o),Ember.sendEvent(this,"@array:change",[this,t,r,i]);var u=e(this,"length"),c=n(this,"firstObject"),h=n(this,"lastObject");return this.objectAt(0)!==c&&(Ember.propertyWillChange(this,"firstObject"),Ember.propertyDidChange(this,"firstObject")),this.objectAt(u-1)!==h&&(Ember.propertyWillChange(this,"lastObject"),Ember.propertyDidChange(this,"lastObject")),this},"@each":Ember.computed(function(){return this.__each||(this.__each=new Ember.EachProxy(this)),this.__each})})}(),function(){Ember.Comparable=Ember.Mixin.create({isComparable:!0,compare:Ember.required(Function)})}(),function(){var e=Ember.get;Ember.set,Ember.Copyable=Ember.Mixin.create({copy:Ember.required(Function),frozenCopy:function(){if(Ember.Freezable&&Ember.Freezable.detect(this))return e(this,"isFrozen")?this:this.copy().freeze();throw new Error(Ember.String.fmt("%@ does not support freezing",[this]))}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Freezable=Ember.Mixin.create({isFrozen:!1,freeze:function(){return e(this,"isFrozen")?this:(t(this,"isFrozen",!0),this)}}),Ember.FROZEN_ERROR="Frozen object cannot be modified."}(),function(){var e=Ember.EnumerableUtils.forEach;Ember.MutableEnumerable=Ember.Mixin.create(Ember.Enumerable,{addObject:Ember.required(Function),addObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.addObject(e)},this),Ember.endPropertyChanges(this),this},removeObject:Ember.required(Function),removeObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.removeObject(e)},this),Ember.endPropertyChanges(this),this}})}(),function(){var e="Index out of range",t=[],r=Ember.get;Ember.set,Ember.MutableArray=Ember.Mixin.create(Ember.Array,Ember.MutableEnumerable,{replace:Ember.required(),clear:function(){var e=r(this,"length");return 0===e?this:(this.replace(0,e,t),this)},insertAt:function(t,n){if(t>r(this,"length"))throw new Error(e);return this.replace(t,0,[n]),this},removeAt:function(n,i){if("number"==typeof n){if(0>n||n>=r(this,"length"))throw new Error(e);void 0===i&&(i=1),this.replace(n,i,t)}return this},pushObject:function(e){return this.insertAt(r(this,"length"),e),e},pushObjects:function(e){return this.replace(r(this,"length"),0,e),this},popObject:function(){var e=r(this,"length");if(0===e)return null;var t=this.objectAt(e-1);return this.removeAt(e-1,1),t},shiftObject:function(){if(0===r(this,"length"))return null;var e=this.objectAt(0);return this.removeAt(0),e},unshiftObject:function(e){return this.insertAt(0,e),e},unshiftObjects:function(e){return this.replace(0,0,e),this},reverseObjects:function(){var e=r(this,"length");if(0===e)return this;var t=this.toArray().reverse();return this.replace(0,e,t),this},setObjects:function(e){if(0===e.length)return this.clear();var t=r(this,"length");return this.replace(0,t,e),this},removeObject:function(e){for(var t=r(this,"length")||0;--t>=0;){var n=this.objectAt(t);n===e&&this.removeAt(t)}return this},addObject:function(e){return this.contains(e)||this.pushObject(e),this}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Observable=Ember.Mixin.create({get:function(t){return e(this,t)},getProperties:function(){var t={},r=arguments;1===arguments.length&&"array"===Ember.typeOf(arguments[0])&&(r=arguments[0]);for(var n=0;n<r.length;n++)t[r[n]]=e(this,r[n]);return t},set:function(e,r){return t(this,e,r),this},setProperties:function(e){return Ember.setProperties(this,e)},beginPropertyChanges:function(){return Ember.beginPropertyChanges(),this},endPropertyChanges:function(){return Ember.endPropertyChanges(),this},propertyWillChange:function(e){return Ember.propertyWillChange(this,e),this},propertyDidChange:function(e){return Ember.propertyDidChange(this,e),this},notifyPropertyChange:function(e){return this.propertyWillChange(e),this.propertyDidChange(e),this},addBeforeObserver:function(e,t,r){Ember.addBeforeObserver(this,e,t,r)},addObserver:function(e,t,r){Ember.addObserver(this,e,t,r)},removeObserver:function(e,t,r){Ember.removeObserver(this,e,t,r)},hasObserverFor:function(e){return Ember.hasListeners(this,e+":change")},getPath:function(e){return this.get(e)},setPath:function(e,t){return this.set(e,t)},getWithDefault:function(e,t){return Ember.getWithDefault(this,e,t)},incrementProperty:function(r,n){return Ember.isNone(n)&&(n=1),t(this,r,(e(this,r)||0)+n),e(this,r)},decrementProperty:function(r,n){return Ember.isNone(n)&&(n=1),t(this,r,(e(this,r)||0)-n),e(this,r)},toggleProperty:function(r){return t(this,r,!e(this,r)),e(this,r)},cacheFor:function(e){return Ember.cacheFor(this,e)},observersForKey:function(e){return Ember.observersFor(this,e)}})}(),function(){var e=Ember.get;Ember.set,Ember.TargetActionSupport=Ember.Mixin.create({target:null,action:null,actionContext:null,targetObject:Ember.computed(function(){var t=e(this,"target");if("string"===Ember.typeOf(t)){var r=e(this,t);return void 0===r&&(r=e(Ember.lookup,t)),r}return t}).property("target"),actionContextObject:Ember.computed(function(){var t=e(this,"actionContext");if("string"===Ember.typeOf(t)){var r=e(this,t);return void 0===r&&(r=e(Ember.lookup,t)),r}return t}).property("actionContext"),triggerAction:function(t){t=t||{};var r=t.action||e(this,"action"),n=t.target||e(this,"targetObject"),i=t.actionContext||e(this,"actionContextObject")||this;if(n&&r){var o;return o=n.send?n.send.apply(n,[r,i]):n[r].apply(n,[i]),o!==!1&&(o=!0),o}return!1}})}(),function(){Ember.Evented=Ember.Mixin.create({on:function(e,t,r){return Ember.addListener(this,e,t,r),this},one:function(e,t,r){return r||(r=t,t=null),Ember.addListener(this,e,t,r,!0),this},trigger:function(e){var t,r,n=[];for(t=1,r=arguments.length;r>t;t++)n.push(arguments[t]);Ember.sendEvent(this,e,n)},fire:function(){this.trigger.apply(this,arguments)},off:function(e,t,r){return Ember.removeListener(this,e,t,r),this},has:function(e){return Ember.hasListeners(this,e)}})}(),function(){var e=t("rsvp");e.configure("async",function(e,t){Ember.run.schedule("actions",t,e)});var r=Ember.get;Ember.DeferredMixin=Ember.Mixin.create({then:function(e,t){function n(t){return t===o?e(s):e(t)}var i,o,s;return s=this,i=r(this,"_deferred"),o=i.promise,o.then(e&&n,t)},resolve:function(e){var t,n;t=r(this,"_deferred"),n=t.promise,e===this?t.resolve(n):t.resolve(e)},reject:function(e){r(this,"_deferred").reject(e)},_deferred:Ember.computed(function(){return e.defer()})})}(),function(){Ember.Container=t("container"),Ember.Container.set=Ember.set}(),function(){function e(){var e,t,o=!1,s=function(){o||s.proto(),n(this,i,v),n(this,"_super",v);var u=a(this);if(u.proto=this,e){var h=e;e=null,this.reopen.apply(this,h)}if(t){var l=t;t=null;for(var f=this.concatenatedProperties,m=0,p=l.length;p>m;m++){var g=l[m];for(var y in g)if(g.hasOwnProperty(y)){var _=g[y],O=Ember.IS_BINDING;if(O.test(y)){var C=u.bindings;C?u.hasOwnProperty("bindings")||(C=u.bindings=r(u.bindings)):C=u.bindings={},C[y]=_}var w=u.descs[y];if(f&&d(f,y)>=0){var P=this[y];_=P?"function"==typeof P.concat?P.concat(_):Ember.makeArray(P).concat(_):Ember.makeArray(_)}w?w.set(this,y,_):"function"!=typeof this.setUnknownProperty||y in this?E?Ember.defineProperty(this,y,null,_):this[y]=_:this.setUnknownProperty(y,_)}}}b(this,u),delete u.proto,c(this),this.init.apply(this,arguments)};return s.toString=f.prototype.toString,s.willReopen=function(){o&&(s.PrototypeMixin=f.create(s.PrototypeMixin)),o=!1},s._initMixins=function(t){e=t},s._initProperties=function(e){t=e},s.proto=function(){var e=s.superclass;return e&&e.proto(),o||(o=!0,s.PrototypeMixin.applyPartial(s.prototype),u(s.prototype)),this.prototype},s}function t(e){return function(){return e}}var r=(Ember.set,Ember.get,Ember.create),n=Ember.platform.defineProperty,i=Ember.GUID_KEY,o=Ember.guidFor,s=Ember.generateGuid,a=Ember.meta,u=Ember.rewatch,c=Ember.finishChains,h=Ember.destroy,l=Ember.run.schedule,f=Ember.Mixin,m=f._apply,b=f.finishPartial,p=f.prototype.reopen,E=Ember.ENV.MANDATORY_SETTER,d=Ember.EnumerableUtils.indexOf,v={configurable:!0,writable:!0,enumerable:!1,value:void 0},g=e();g.toString=function(){return"Ember.CoreObject"},g.PrototypeMixin=f.create({reopen:function(){return m(this,arguments,!0),this},isInstance:!0,init:function(){},concatenatedProperties:null,isDestroyed:!1,isDestroying:!1,destroy:function(){return this.isDestroying?void 0:(this.isDestroying=!0,l("actions",this,this.willDestroy),l("destroy",this,this._scheduledDestroy),this)},willDestroy:Ember.K,_scheduledDestroy:function(){this.isDestroyed||(h(this),this.isDestroyed=!0)},bind:function(e,t){return t instanceof Ember.Binding||(t=Ember.Binding.from(t)),t.to(e).connect(this),t},toString:function(){var e="function"==typeof this.toStringExtension,r=e?":"+this.toStringExtension():"",n="<"+this.constructor.toString()+":"+o(this)+r+">";return this.toString=t(n),n}}),g.PrototypeMixin.ownerConstructor=g,Ember.config.overridePrototypeMixin&&Ember.config.overridePrototypeMixin(g.PrototypeMixin),g.__super__=null;var y=f.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var t,n=e();return n.ClassMixin=f.create(this.ClassMixin),n.PrototypeMixin=f.create(this.PrototypeMixin),n.ClassMixin.ownerConstructor=n,n.PrototypeMixin.ownerConstructor=n,p.apply(n.PrototypeMixin,arguments),n.superclass=this,n.__super__=this.prototype,t=n.prototype=r(this.prototype),t.constructor=n,s(t,"ember"),a(t).proto=t,n.ClassMixin.apply(n),n},createWithMixins:function(){var e=this;return arguments.length>0&&this._initMixins(arguments),new e},create:function(){var e=this;return arguments.length>0&&this._initProperties(arguments),new e},reopen:function(){return this.willReopen(),p.apply(this.PrototypeMixin,arguments),this},reopenClass:function(){return p.apply(this.ClassMixin,arguments),m(this,arguments,!1),this},detect:function(e){if("function"!=typeof e)return!1;for(;e;){if(e===this)return!0;e=e.superclass}return!1},detectInstance:function(e){return e instanceof this},metaForProperty:function(e){var t=a(this.proto(),!1).descs[e];return t._meta||{}},eachComputedProperty:function(e,t){var r,n=this.proto(),i=a(n).descs,o={};for(var s in i)r=i[s],r instanceof Ember.ComputedProperty&&e.call(t||this,s,r._meta||o)}});y.ownerConstructor=g,Ember.config.overrideClassMixin&&Ember.config.overrideClassMixin(y),g.ClassMixin=y,y.apply(g),Ember.CoreObject=g}(),function(){Ember.Object=Ember.CoreObject.extend(Ember.Observable),Ember.Object.toString=function(){return"Ember.Object"}}(),function(){function e(t,r,i){var s=t.length;c[t.join(".")]=r;for(var a in r)if(h.call(r,a)){var u=r[a];if(t[s]=a,u&&u.toString===n)u.toString=o(t.join(".")),u[f]=t.join(".");else if(u&&u.isNamespace){if(i[l(u)])continue;i[l(u)]=!0,e(t,u,i)}}t.length=s}function t(){var e,t,r=Ember.Namespace,n=Ember.lookup;if(!r.PROCESSED)for(var i in n)if("parent"!==i&&"top"!==i&&"frameElement"!==i&&"webkitStorageInfo"!==i&&!("globalStorage"===i&&n.StorageList&&n.globalStorage instanceof n.StorageList||n.hasOwnProperty&&!n.hasOwnProperty(i))){try{e=Ember.lookup[i],t=e&&e.isNamespace}catch(o){continue}t&&(e[f]=i)}}function r(e){var t=e.superclass;return t?t[f]?t[f]:r(t):void 0}function n(){Ember.BOOTED||this[f]||i();var e;if(this[f])e=this[f];else{var t=r(this);e=t?"(subclass of "+t+")":"(unknown mixin)",this.toString=o(e)}return e}function i(){var r=!u.PROCESSED,n=Ember.anyUnprocessedMixins;if(r&&(t(),u.PROCESSED=!0),r||n){for(var i,o=u.NAMESPACES,s=0,a=o.length;a>s;s++)i=o[s],e([i.toString()],i,{});Ember.anyUnprocessedMixins=!1}}function o(e){return function(){return e}}var s=Ember.get,a=Ember.ArrayPolyfills.indexOf,u=Ember.Namespace=Ember.Object.extend({isNamespace:!0,init:function(){Ember.Namespace.NAMESPACES.push(this),Ember.Namespace.PROCESSED=!1},toString:function(){var e=s(this,"name");return e?e:(t(),this[Ember.GUID_KEY+"_name"])},nameClasses:function(){e([this.toString()],this,{})},destroy:function(){var e=Ember.Namespace.NAMESPACES;Ember.lookup[this.toString()]=void 0,e.splice(a.call(e,this),1),this._super()}});u.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:!1,processAll:i,byName:function(e){return Ember.BOOTED||i(),c[e]}});var c=u.NAMESPACES_BY_ID,h={}.hasOwnProperty,l=Ember.guidFor,f=Ember.NAME_KEY=Ember.GUID_KEY+"_name";Ember.Mixin.prototype.toString=n}(),function(){Ember.Application=Ember.Namespace.extend()}(),function(){var e="Index out of range",t=[],r=Ember.get;Ember.set,Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,arrangedContent:Ember.computed.alias("content"),objectAtContent:function(e){return r(this,"arrangedContent").objectAt(e)},replaceContent:function(e,t,n){r(this,"content").replace(e,t,n)},_contentWillChange:Ember.beforeObserver(function(){this._teardownContent()},"content"),_teardownContent:function(){var e=r(this,"content");e&&e.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},contentArrayWillChange:Ember.K,contentArrayDidChange:Ember.K,_contentDidChange:Ember.observer(function(){r(this,"content"),this._setupContent()},"content"),_setupContent:function(){var e=r(this,"content");e&&e.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},_arrangedContentWillChange:Ember.beforeObserver(function(){var e=r(this,"arrangedContent"),t=e?r(e,"length"):0;this.arrangedContentArrayWillChange(this,0,t,void 0),this.arrangedContentWillChange(this),this._teardownArrangedContent(e)},"arrangedContent"),_arrangedContentDidChange:Ember.observer(function(){var e=r(this,"arrangedContent"),t=e?r(e,"length"):0;this._setupArrangedContent(),this.arrangedContentDidChange(this),this.arrangedContentArrayDidChange(this,0,void 0,t)},"arrangedContent"),_setupArrangedContent:function(){var e=r(this,"arrangedContent");e&&e.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},_teardownArrangedContent:function(){var e=r(this,"arrangedContent");e&&e.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},arrangedContentWillChange:Ember.K,arrangedContentDidChange:Ember.K,objectAt:function(e){return r(this,"content")&&this.objectAtContent(e)},length:Ember.computed(function(){var e=r(this,"arrangedContent");return e?r(e,"length"):0}),_replace:function(e,t,n){var i=r(this,"content");return i&&this.replaceContent(e,t,n),this},replace:function(){if(r(this,"arrangedContent")!==r(this,"content"))throw new Ember.Error("Using replace on an arranged ArrayProxy is not allowed.");this._replace.apply(this,arguments)},_insertAt:function(t,n){if(t>r(this,"content.length"))throw new Error(e);return this._replace(t,0,[n]),this},insertAt:function(e,t){if(r(this,"arrangedContent")===r(this,"content"))return this._insertAt(e,t);throw new Ember.Error("Using insertAt on an arranged ArrayProxy is not allowed.")},removeAt:function(n,i){if("number"==typeof n){var o,s=r(this,"content"),a=r(this,"arrangedContent"),u=[];if(0>n||n>=r(this,"length"))throw new Error(e);for(void 0===i&&(i=1),o=n;n+i>o;o++)u.push(s.indexOf(a.objectAt(o)));for(u.sort(function(e,t){return t-e}),Ember.beginPropertyChanges(),o=0;o<u.length;o++)this._replace(u[o],1,t);Ember.endPropertyChanges()}return this},pushObject:function(e){return this._insertAt(r(this,"content.length"),e),e},pushObjects:function(e){return this._replace(r(this,"length"),0,e),this},setObjects:function(e){if(0===e.length)return this.clear();var t=r(this,"length");return this._replace(0,t,e),this},unshiftObject:function(e){return this._insertAt(0,e),e},unshiftObjects:function(e){return this._replace(0,0,e),this},slice:function(){var e=this.toArray();return e.slice.apply(e,arguments)},arrangedContentArrayWillChange:function(e,t,r,n){this.arrayContentWillChange(t,r,n)},arrangedContentArrayDidChange:function(e,t,r,n){this.arrayContentDidChange(t,r,n)},init:function(){this._super(),this._setupContent(),this._setupArrangedContent()},willDestroy:function(){this._teardownArrangedContent(),this._teardownContent()}})}(),function(){function e(e,t){var r=t.slice(8);r in this||u(this,r)}function t(e,t){var r=t.slice(8);r in this||c(this,r)}var r=Ember.get,n=Ember.set,i=(Ember.String.fmt,Ember.addBeforeObserver),o=Ember.addObserver,s=Ember.removeBeforeObserver,a=Ember.removeObserver,u=Ember.propertyWillChange,c=Ember.propertyDidChange;Ember.ObjectProxy=Ember.Object.extend({content:null,_contentDidChange:Ember.observer(function(){},"content"),isTruthy:Ember.computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(r){var n="content."+r;i(this,n,null,e),o(this,n,null,t)},didUnwatchProperty:function(r){var n="content."+r;s(this,n,null,e),a(this,n,null,t)},unknownProperty:function(e){var t=r(this,"content");return t?r(t,e):void 0},setUnknownProperty:function(e,t){var i=r(this,"content");return n(i,e,t)}}),Ember.ObjectProxy.reopenClass({create:function(){var e,t,r,n,i,o;if(arguments.length){for(t=this.proto(),r=0,n=arguments.length;n>r;r++){i=arguments[r];for(o in i)!i.hasOwnProperty(o)||o in t||(e||(e={}),e[o]=null)}e&&this._initMixins([e])}return this._super.apply(this,arguments)}})}(),function(){function e(e,t,r,i,o){var s,a=r._objects;for(a||(a=r._objects={});--o>=i;){var u=e.objectAt(o);u&&(Ember.addBeforeObserver(u,t,r,"contentKeyWillChange"),Ember.addObserver(u,t,r,"contentKeyDidChange"),s=n(u),a[s]||(a[s]=[]),a[s].push(o))}}function t(e,t,r,i,o){var s=r._objects;s||(s=r._objects={});for(var a,u;--o>=i;){var c=e.objectAt(o);c&&(Ember.removeBeforeObserver(c,t,r,"contentKeyWillChange"),Ember.removeObserver(c,t,r,"contentKeyDidChange"),u=n(c),a=s[u],a[a.indexOf(o)]=null)}}var r=(Ember.set,Ember.get),n=Ember.guidFor,i=Ember.EnumerableUtils.forEach,o=Ember.Object.extend(Ember.Array,{init:function(e,t,r){this._super(),this._keyName=t,this._owner=r,this._content=e},objectAt:function(e){var t=this._content.objectAt(e);return t&&r(t,this._keyName)},length:Ember.computed(function(){var e=this._content;return e?r(e,"length"):0})}),s=/^.+:(before|change)$/;Ember.EachProxy=Ember.Object.extend({init:function(e){this._super(),this._content=e,e.addArrayObserver(this),i(Ember.watchedEvents(this),function(e){this.didAddListener(e)},this)},unknownProperty:function(e){var t;return t=new o(this._content,e,this),Ember.defineProperty(this,e,null,t),this.beginObservingContentKey(e),t},arrayWillChange:function(e,r,n){var i,o,s=this._keys;o=n>0?r+n:-1,Ember.beginPropertyChanges(this);for(i in s)s.hasOwnProperty(i)&&(o>0&&t(e,i,this,r,o),Ember.propertyWillChange(this,i));Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(t,r,n,i){var o,s,a=this._keys;s=i>0?r+i:-1,Ember.beginPropertyChanges(this);for(o in a)a.hasOwnProperty(o)&&(s>0&&e(t,o,this,r,s),Ember.propertyDidChange(this,o));Ember.propertyDidChange(this._content,"@each"),Ember.endPropertyChanges(this)},didAddListener:function(e){s.test(e)&&this.beginObservingContentKey(e.slice(0,-7))},didRemoveListener:function(e){s.test(e)&&this.stopObservingContentKey(e.slice(0,-7))},beginObservingContentKey:function(t){var n=this._keys;if(n||(n=this._keys={}),n[t])n[t]++;else{n[t]=1;var i=this._content,o=r(i,"length");e(i,t,this,0,o)}},stopObservingContentKey:function(e){var n=this._keys;if(n&&n[e]>0&&--n[e]<=0){var i=this._content,o=r(i,"length");t(i,e,this,0,o)}},contentKeyWillChange:function(e,t){Ember.propertyWillChange(this,t)},contentKeyDidChange:function(e,t){Ember.propertyDidChange(this,t)}})}(),function(){var e=Ember.get;Ember.set;var t=Ember.Mixin.create(Ember.MutableArray,Ember.Observable,Ember.Copyable,{get:function(e){return"length"===e?this.length:"number"==typeof e?this[e]:this._super(e)},objectAt:function(e){return this[e]},replace:function(t,r,n){if(this.isFrozen)throw Ember.FROZEN_ERROR;var i=n?e(n,"length"):0;if(this.arrayContentWillChange(t,r,i),n&&0!==n.length){var o=[t,r].concat(n);this.splice.apply(this,o)}else this.splice(t,r);return this.arrayContentDidChange(t,r,i),this},unknownProperty:function(e,t){var r;return void 0!==t&&void 0===r&&(r=this[e]=t),r},indexOf:function(e,t){var r,n=this.length;for(t=void 0===t?0:0>t?Math.ceil(t):Math.floor(t),0>t&&(t+=n),r=t;n>r;r++)if(this[r]===e)return r;return-1},lastIndexOf:function(e,t){var r,n=this.length;for(t=void 0===t?n-1:0>t?Math.ceil(t):Math.floor(t),0>t&&(t+=n),r=t;r>=0;r--)if(this[r]===e)return r;return-1},copy:function(e){return e?this.map(function(e){return Ember.copy(e,!0)}):this.slice()}}),r=["length"];Ember.EnumerableUtils.forEach(t.keys(),function(e){Array.prototype[e]&&r.push(e)}),r.length>0&&(t=t.without.apply(t,r)),Ember.NativeArray=t,Ember.A=function(e){return void 0===e&&(e=[]),Ember.Array.detect(e)?e:Ember.NativeArray.apply(e)},Ember.NativeArray.activate=function(){t.apply(Array.prototype),Ember.A=function(e){return e||[]}},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Array)&&Ember.NativeArray.activate()}(),function(){var e=Ember.get,t=Ember.set,r=Ember.guidFor,n=Ember.isNone,i=Ember.String.fmt;Ember.Set=Ember.CoreObject.extend(Ember.MutableEnumerable,Ember.Copyable,Ember.Freezable,{length:0,clear:function(){if(this.isFrozen)throw new Error(Ember.FROZEN_ERROR);var n=e(this,"length");if(0===n)return this;var i;this.enumerableContentWillChange(n,0),Ember.propertyWillChange(this,"firstObject"),Ember.propertyWillChange(this,"lastObject");for(var o=0;n>o;o++)i=r(this[o]),delete this[i],delete this[o];return t(this,"length",0),Ember.propertyDidChange(this,"firstObject"),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(n,0),this},isEqual:function(t){if(!Ember.Enumerable.detect(t))return!1;var r=e(this,"length");if(e(t,"length")!==r)return!1;for(;--r>=0;)if(!t.contains(this[r]))return!1;return!0},add:Ember.aliasMethod("addObject"),remove:Ember.aliasMethod("removeObject"),pop:function(){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);var t=this.length>0?this[this.length-1]:null;return this.remove(t),t},push:Ember.aliasMethod("addObject"),shift:Ember.aliasMethod("pop"),unshift:Ember.aliasMethod("push"),addEach:Ember.aliasMethod("addObjects"),removeEach:Ember.aliasMethod("removeObjects"),init:function(e){this._super(),e&&this.addObjects(e)},nextObject:function(e){return this[e]},firstObject:Ember.computed(function(){return this.length>0?this[0]:void 0}),lastObject:Ember.computed(function(){return this.length>0?this[this.length-1]:void 0}),addObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(n(i))return this;var o,s=r(i),a=this[s],u=e(this,"length");return a>=0&&u>a&&this[a]===i?this:(o=[i],this.enumerableContentWillChange(null,o),Ember.propertyWillChange(this,"lastObject"),u=e(this,"length"),this[s]=u,this[u]=i,t(this,"length",u+1),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(null,o),this)},removeObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(n(i))return this;var o,s,a=r(i),u=this[a],c=e(this,"length"),h=0===u,l=u===c-1;return u>=0&&c>u&&this[u]===i&&(s=[i],this.enumerableContentWillChange(s,null),h&&Ember.propertyWillChange(this,"firstObject"),l&&Ember.propertyWillChange(this,"lastObject"),c-1>u&&(o=this[c-1],this[u]=o,this[r(o)]=u),delete this[a],delete this[c-1],t(this,"length",c-1),h&&Ember.propertyDidChange(this,"firstObject"),l&&Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(s,null)),this},contains:function(e){return this[r(e)]>=0},copy:function(){var n=this.constructor,i=new n,o=e(this,"length");for(t(i,"length",o);--o>=0;)i[o]=this[o],i[r(this[o])]=o;return i},toString:function(){var e,t=this.length,r=[];for(e=0;t>e;e++)r[e]=this[e];return i("Ember.Set<%@>",[r.join(",")])}})}(),function(){var e=Ember.DeferredMixin;Ember.get;var t=Ember.Object.extend(e);t.reopenClass({promise:function(e,r){var n=t.create();return e.call(r,n),n}}),Ember.Deferred=t}(),function(){var e=Ember.ArrayPolyfills.forEach,t=Ember.ENV.EMBER_LOAD_HOOKS||{},r={};Ember.onLoad=function(e,n){var i;t[e]=t[e]||Ember.A(),t[e].pushObject(n),(i=r[e])&&n(i)},Ember.runLoadHooks=function(n,i){r[n]=i,t[n]&&e.call(t[n],function(e){e(i)})}}(),function(){var e=Ember.get;Ember.ControllerMixin=Ember.Mixin.create({isController:!0,target:null,container:null,parentController:null,store:null,model:Ember.computed.alias("content"),send:function(t){var r,n=[].slice.call(arguments,1);this[t]?this[t].apply(this,n):(r=e(this,"target"))&&r.send.apply(r,arguments)}}),Ember.Controller=Ember.Object.extend(Ember.ControllerMixin)}(),function(){var e=Ember.get,t=(Ember.set,Ember.EnumerableUtils.forEach);Ember.SortableMixin=Ember.Mixin.create(Ember.MutableEnumerable,{sortProperties:null,sortAscending:!0,orderBy:function(r,n){var i=0,o=e(this,"sortProperties"),s=e(this,"sortAscending");return t(o,function(t){0===i&&(i=Ember.compare(e(r,t),e(n,t)),0===i||s||(i=-1*i))}),i},destroy:function(){var r=e(this,"content"),n=e(this,"sortProperties");return r&&n&&t(r,function(e){t(n,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},isSorted:Ember.computed.bool("sortProperties"),arrangedContent:Ember.computed("content","sortProperties.@each",function(){var r=e(this,"content"),n=e(this,"isSorted"),i=e(this,"sortProperties"),o=this;return r&&n?(r=r.slice(),r.sort(function(e,t){return o.orderBy(e,t)}),t(r,function(e){t(i,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),Ember.A(r)):r}),_contentWillChange:Ember.beforeObserver(function(){var r=e(this,"content"),n=e(this,"sortProperties");r&&n&&t(r,function(e){t(n,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},"content"),sortAscendingWillChange:Ember.beforeObserver(function(){this._lastSortAscending=e(this,"sortAscending")},"sortAscending"),sortAscendingDidChange:Ember.observer(function(){if(e(this,"sortAscending")!==this._lastSortAscending){var t=e(this,"arrangedContent");t.reverseObjects()}},"sortAscending"),contentArrayWillChange:function(r,n,i,o){var s=e(this,"isSorted");if(s){var a=e(this,"arrangedContent"),u=r.slice(n,n+i),c=e(this,"sortProperties");t(u,function(e){a.removeObject(e),t(c,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(r,n,i,o)},contentArrayDidChange:function(r,n,i,o){var s=e(this,"isSorted"),a=e(this,"sortProperties");if(s){var u=r.slice(n,n+o);t(u,function(e){this.insertItemSorted(e),t(a,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(r,n,i,o)},insertItemSorted:function(t){var r=e(this,"arrangedContent"),n=e(r,"length"),i=this._binarySearch(t,0,n);r.insertAt(i,t)},contentItemSortPropertyDidChange:function(t){var r=e(this,"arrangedContent"),n=r.indexOf(t),i=r.objectAt(n-1),o=r.objectAt(n+1),s=i&&this.orderBy(t,i),a=o&&this.orderBy(t,o);(0>s||a>0)&&(r.removeObject(t),this.insertItemSorted(t))},_binarySearch:function(t,r,n){var i,o,s,a;return r===n?r:(a=e(this,"arrangedContent"),i=r+Math.floor((n-r)/2),o=a.objectAt(i),s=this.orderBy(o,t),0>s?this._binarySearch(t,i+1,n):s>0?this._binarySearch(t,r,i):i)}})}(),function(){var e=Ember.get,t=(Ember.set,Ember.EnumerableUtils.forEach),r=Ember.EnumerableUtils.replace;Ember.ArrayController=Ember.ArrayProxy.extend(Ember.ControllerMixin,Ember.SortableMixin,{itemController:null,lookupItemController:function(){return e(this,"itemController")},objectAtContent:function(t){var r=e(this,"length"),n=e(this,"arrangedContent"),i=n&&n.objectAt(t);if(t>=0&&r>t){var o=this.lookupItemController(i);if(o)return this.controllerAt(t,i,o)}return i},arrangedContentDidChange:function(){this._super(),this._resetSubControllers()},arrayContentDidChange:function(n,i,o){var s=e(this,"_subControllers"),a=s.slice(n,n+i);t(a,function(e){e&&e.destroy()}),r(s,n,i,new Array(o)),this._super(n,i,o)},init:function(){this.get("content")||Ember.defineProperty(this,"content",void 0,Ember.A()),this._super(),this.set("_subControllers",Ember.A())},controllerAt:function(t,r,n){var i=e(this,"container"),o=e(this,"_subControllers"),s=o[t];if(s||(s=i.lookup("controller:"+n,{singleton:!1}),o[t]=s),!s)throw new Error('Could not resolve itemController: "'+n+'"');return s.set("target",this),s.set("parentController",e(this,"parentController")||this),s.set("content",r),s},_subControllers:null,_resetSubControllers:function(){var r=e(this,"_subControllers");r&&t(r,function(e){e&&e.destroy()}),this.set("_subControllers",Ember.A())}})}(),function(){Ember.ObjectController=Ember.ObjectProxy.extend(Ember.ControllerMixin)}()}(),"undefined"==typeof location||"localhost"!==location.hostname&&"127.0.0.1"!==location.hostname||Ember.Logger.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. If you want full error messages please use the non-minified build provided on the Ember website.");
@@ -12,11 +12,18 @@ var define, requireModule;
12
12
  if (seen[name]) { return seen[name]; }
13
13
  seen[name] = {};
14
14
 
15
- var mod = registry[name],
16
- deps = mod.deps,
17
- callback = mod.callback,
18
- reified = [],
19
- exports;
15
+ var mod, deps, callback, reified, exports;
16
+
17
+ mod = registry[name];
18
+
19
+ if (!mod) {
20
+ throw new Error("Module '" + name + "' not found.");
21
+ }
22
+
23
+ deps = mod.deps;
24
+ callback = mod.callback;
25
+ reified = [];
26
+ exports;
20
27
 
21
28
  for (var i=0, l=deps.length; i<l; i++) {
22
29
  if (deps[i] === 'exports') {
@@ -55,7 +62,7 @@ var define, requireModule;
55
62
 
56
63
  @class Ember
57
64
  @static
58
- @version 1.0.0-rc.3
65
+ @version 1.0.0-rc4
59
66
  */
60
67
 
61
68
  if ('undefined' === typeof Ember) {
@@ -82,10 +89,10 @@ Ember.toString = function() { return "Ember"; };
82
89
  /**
83
90
  @property VERSION
84
91
  @type String
85
- @default '1.0.0-rc.3'
92
+ @default '1.0.0-rc4'
86
93
  @final
87
94
  */
88
- Ember.VERSION = '1.0.0-rc.3';
95
+ Ember.VERSION = '1.0.0-rc4';
89
96
 
90
97
  /**
91
98
  Standard environmental variables. You can define these in a global `ENV`
@@ -234,7 +241,7 @@ Ember.onerror = null;
234
241
  /**
235
242
  @private
236
243
 
237
- Wrap code block in a try/catch if {{#crossLink "Ember/onerror"}}{{/crossLink}} is set.
244
+ Wrap code block in a try/catch if `Ember.onerror` is set.
238
245
 
239
246
  @method handleErrors
240
247
  @for Ember
@@ -310,7 +317,7 @@ Ember.none = Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isN
310
317
  @return {Boolean}
311
318
  */
312
319
  Ember.isEmpty = function(obj) {
313
- return obj === null || obj === undefined || (obj.length === 0 && typeof obj !== 'function') || (typeof obj === 'object' && Ember.get(obj, 'length') === 0);
320
+ return Ember.isNone(obj) || (obj.length === 0 && typeof obj !== 'function') || (typeof obj === 'object' && Ember.get(obj, 'length') === 0);
314
321
  };
315
322
  Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.", Ember.isEmpty) ;
316
323
 
@@ -343,6 +350,13 @@ var platform = Ember.platform = {};
343
350
  */
344
351
  Ember.create = Object.create;
345
352
 
353
+ // IE8 has Object.create but it couldn't treat property descripters.
354
+ if (Ember.create) {
355
+ if (Ember.create({a: 1}, {a: {value: 2}}).a !== 2) {
356
+ Ember.create = null;
357
+ }
358
+ }
359
+
346
360
  // STUB_OBJECT_CREATE allows us to override other libraries that stub
347
361
  // Object.create different than we would prefer
348
362
  if (!Ember.create || Ember.ENV.STUB_OBJECT_CREATE) {
@@ -663,7 +677,7 @@ Ember.guidFor = function guidFor(obj) {
663
677
  if (obj === undefined) return "(undefined)";
664
678
  if (obj === null) return "(null)";
665
679
 
666
- var cache, ret;
680
+ var ret;
667
681
  var type = typeof obj;
668
682
 
669
683
  // Don't allow prototype changes to String etc. to change the guidFor
@@ -812,6 +826,7 @@ Ember.setMeta = function setMeta(obj, property, value) {
812
826
  };
813
827
 
814
828
  /**
829
+ @deprecated
815
830
  @private
816
831
 
817
832
  In order to store defaults for a class, a prototype may need to create
@@ -844,6 +859,7 @@ Ember.setMeta = function setMeta(obj, property, value) {
844
859
  shared with its constructor
845
860
  */
846
861
  Ember.metaPath = function metaPath(obj, path, writable) {
862
+
847
863
  var meta = Ember.meta(obj, writable), keyName, value;
848
864
 
849
865
  for (var i=0, l=path.length; i<l; i++) {
@@ -1064,7 +1080,7 @@ if (needsFinallyFix) {
1064
1080
  */
1065
1081
  if (needsFinallyFix) {
1066
1082
  Ember.tryCatchFinally = function(tryable, catchable, finalizer, binding) {
1067
- var result, finalResult, finalError, finalReturn;
1083
+ var result, finalResult, finalError;
1068
1084
 
1069
1085
  binding = binding || this;
1070
1086
 
@@ -1174,6 +1190,7 @@ Ember.typeOf = function(item) {
1174
1190
 
1175
1191
  return ret;
1176
1192
  };
1193
+
1177
1194
  })();
1178
1195
 
1179
1196
 
@@ -1420,820 +1437,458 @@ var utils = Ember.EnumerableUtils = {
1420
1437
  @module ember-metal
1421
1438
  */
1422
1439
 
1423
- /*
1424
- JavaScript (before ES6) does not have a Map implementation. Objects,
1425
- which are often used as dictionaries, may only have Strings as keys.
1426
-
1427
- Because Ember has a way to get a unique identifier for every object
1428
- via `Ember.guidFor`, we can implement a performant Map with arbitrary
1429
- keys. Because it is commonly used in low-level bookkeeping, Map is
1430
- implemented as a pure JavaScript object for performance.
1431
-
1432
- This implementation follows the current iteration of the ES6 proposal for
1433
- maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
1434
- with two exceptions. First, because we need our implementation to be pleasant
1435
- on older browsers, we do not use the `delete` name (using `remove` instead).
1436
- Second, as we do not have the luxury of in-VM iteration, we implement a
1437
- forEach method for iteration.
1438
-
1439
- Map is mocked out to look like an Ember object, so you can do
1440
- `Ember.Map.create()` for symmetry with other Ember classes.
1441
- */
1442
- var guidFor = Ember.guidFor,
1443
- indexOf = Ember.ArrayPolyfills.indexOf;
1440
+ var META_KEY = Ember.META_KEY, get;
1444
1441
 
1445
- var copy = function(obj) {
1446
- var output = {};
1442
+ var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
1447
1443
 
1448
- for (var prop in obj) {
1449
- if (obj.hasOwnProperty(prop)) { output[prop] = obj[prop]; }
1450
- }
1444
+ var IS_GLOBAL_PATH = /^([A-Z$]|([0-9][A-Z$])).*[\.\*]/;
1445
+ var HAS_THIS = /^this[\.\*]/;
1446
+ var FIRST_KEY = /^([^\.\*]+)/;
1451
1447
 
1452
- return output;
1453
- };
1448
+ // ..........................................................
1449
+ // GET AND SET
1450
+ //
1451
+ // If we are on a platform that supports accessors we can use those.
1452
+ // Otherwise simulate accessors by looking up the property directly on the
1453
+ // object.
1454
1454
 
1455
- var copyMap = function(original, newObject) {
1456
- var keys = original.keys.copy(),
1457
- values = copy(original.values);
1455
+ /**
1456
+ Gets the value of a property on an object. If the property is computed,
1457
+ the function will be invoked. If the property is not defined but the
1458
+ object implements the `unknownProperty` method then that will be invoked.
1458
1459
 
1459
- newObject.keys = keys;
1460
- newObject.values = values;
1460
+ If you plan to run on IE8 and older browsers then you should use this
1461
+ method anytime you want to retrieve a property on an object that you don't
1462
+ know for sure is private. (Properties beginning with an underscore '_'
1463
+ are considered private.)
1461
1464
 
1462
- return newObject;
1463
- };
1465
+ On all newer browsers, you only need to use this method to retrieve
1466
+ properties if the property might not be defined on the object and you want
1467
+ to respect the `unknownProperty` handler. Otherwise you can ignore this
1468
+ method.
1464
1469
 
1465
- /**
1466
- This class is used internally by Ember and Ember Data.
1467
- Please do not use it at this time. We plan to clean it up
1468
- and add many tests soon.
1470
+ Note that if the object itself is `undefined`, this method will throw
1471
+ an error.
1469
1472
 
1470
- @class OrderedSet
1471
- @namespace Ember
1472
- @constructor
1473
- @private
1473
+ @method get
1474
+ @for Ember
1475
+ @param {Object} obj The object to retrieve from.
1476
+ @param {String} keyName The property key to retrieve
1477
+ @return {Object} the property value or `null`.
1474
1478
  */
1475
- var OrderedSet = Ember.OrderedSet = function() {
1476
- this.clear();
1477
- };
1479
+ get = function get(obj, keyName) {
1480
+ // Helpers that operate with 'this' within an #each
1481
+ if (keyName === '') {
1482
+ return obj;
1483
+ }
1478
1484
 
1479
- /**
1480
- @method create
1481
- @static
1482
- @return {Ember.OrderedSet}
1483
- */
1484
- OrderedSet.create = function() {
1485
- return new OrderedSet();
1486
- };
1485
+ if (!keyName && 'string'===typeof obj) {
1486
+ keyName = obj;
1487
+ obj = null;
1488
+ }
1487
1489
 
1488
1490
 
1489
- OrderedSet.prototype = {
1490
- /**
1491
- @method clear
1492
- */
1493
- clear: function() {
1494
- this.presenceSet = {};
1495
- this.list = [];
1496
- },
1491
+ if (obj === null || keyName.indexOf('.') !== -1) {
1492
+ return getPath(obj, keyName);
1493
+ }
1497
1494
 
1498
- /**
1499
- @method add
1500
- @param obj
1501
- */
1502
- add: function(obj) {
1503
- var guid = guidFor(obj),
1504
- presenceSet = this.presenceSet,
1505
- list = this.list;
1495
+ var meta = obj[META_KEY], desc = meta && meta.descs[keyName], ret;
1496
+ if (desc) {
1497
+ return desc.get(obj, keyName);
1498
+ } else {
1499
+ if (MANDATORY_SETTER && meta && meta.watching[keyName] > 0) {
1500
+ ret = meta.values[keyName];
1501
+ } else {
1502
+ ret = obj[keyName];
1503
+ }
1506
1504
 
1507
- if (guid in presenceSet) { return; }
1505
+ if (ret === undefined &&
1506
+ 'object' === typeof obj && !(keyName in obj) && 'function' === typeof obj.unknownProperty) {
1507
+ return obj.unknownProperty(keyName);
1508
+ }
1508
1509
 
1509
- presenceSet[guid] = true;
1510
- list.push(obj);
1511
- },
1510
+ return ret;
1511
+ }
1512
+ };
1512
1513
 
1513
- /**
1514
- @method remove
1515
- @param obj
1516
- */
1517
- remove: function(obj) {
1518
- var guid = guidFor(obj),
1519
- presenceSet = this.presenceSet,
1520
- list = this.list;
1514
+ // Currently used only by Ember Data tests
1515
+ if (Ember.config.overrideAccessors) {
1516
+ Ember.get = get;
1517
+ Ember.config.overrideAccessors();
1518
+ get = Ember.get;
1519
+ }
1521
1520
 
1522
- delete presenceSet[guid];
1521
+ function firstKey(path) {
1522
+ return path.match(FIRST_KEY)[0];
1523
+ }
1523
1524
 
1524
- var index = indexOf.call(list, obj);
1525
- if (index > -1) {
1526
- list.splice(index, 1);
1527
- }
1528
- },
1525
+ // assumes path is already normalized
1526
+ function normalizeTuple(target, path) {
1527
+ var hasThis = HAS_THIS.test(path),
1528
+ isGlobal = !hasThis && IS_GLOBAL_PATH.test(path),
1529
+ key;
1529
1530
 
1530
- /**
1531
- @method isEmpty
1532
- @return {Boolean}
1533
- */
1534
- isEmpty: function() {
1535
- return this.list.length === 0;
1536
- },
1531
+ if (!target || isGlobal) target = Ember.lookup;
1532
+ if (hasThis) path = path.slice(5);
1537
1533
 
1538
- /**
1539
- @method has
1540
- @param obj
1541
- @return {Boolean}
1542
- */
1543
- has: function(obj) {
1544
- var guid = guidFor(obj),
1545
- presenceSet = this.presenceSet;
1534
+ if (target === Ember.lookup) {
1535
+ key = firstKey(path);
1536
+ target = get(target, key);
1537
+ path = path.slice(key.length+1);
1538
+ }
1546
1539
 
1547
- return guid in presenceSet;
1548
- },
1540
+ // must return some kind of path to be valid else other things will break.
1541
+ if (!path || path.length===0) throw new Error('Invalid Path');
1549
1542
 
1550
- /**
1551
- @method forEach
1552
- @param {Function} fn
1553
- @param self
1554
- */
1555
- forEach: function(fn, self) {
1556
- // allow mutation during iteration
1557
- var list = this.toArray();
1543
+ return [ target, path ];
1544
+ }
1558
1545
 
1559
- for (var i = 0, j = list.length; i < j; i++) {
1560
- fn.call(self, list[i]);
1561
- }
1562
- },
1546
+ var getPath = Ember._getPath = function(root, path) {
1547
+ var hasThis, parts, tuple, idx, len;
1563
1548
 
1564
- /**
1565
- @method toArray
1566
- @return {Array}
1567
- */
1568
- toArray: function() {
1569
- return this.list.slice();
1570
- },
1549
+ // If there is no root and path is a key name, return that
1550
+ // property from the global object.
1551
+ // E.g. get('Ember') -> Ember
1552
+ if (root === null && path.indexOf('.') === -1) { return get(Ember.lookup, path); }
1571
1553
 
1572
- /**
1573
- @method copy
1574
- @return {Ember.OrderedSet}
1575
- */
1576
- copy: function() {
1577
- var set = new OrderedSet();
1554
+ // detect complicated paths and normalize them
1555
+ hasThis = HAS_THIS.test(path);
1578
1556
 
1579
- set.presenceSet = copy(this.presenceSet);
1580
- set.list = this.toArray();
1557
+ if (!root || hasThis) {
1558
+ tuple = normalizeTuple(root, path);
1559
+ root = tuple[0];
1560
+ path = tuple[1];
1561
+ tuple.length = 0;
1562
+ }
1581
1563
 
1582
- return set;
1564
+ parts = path.split(".");
1565
+ len = parts.length;
1566
+ for (idx = 0; root != null && idx < len; idx++) {
1567
+ root = get(root, parts[idx], true);
1568
+ if (root && root.isDestroyed) { return undefined; }
1583
1569
  }
1570
+ return root;
1584
1571
  };
1585
1572
 
1586
1573
  /**
1587
- A Map stores values indexed by keys. Unlike JavaScript's
1588
- default Objects, the keys of a Map can be any JavaScript
1589
- object.
1574
+ @private
1590
1575
 
1591
- Internally, a Map has two data structures:
1576
+ Normalizes a target/path pair to reflect that actual target/path that should
1577
+ be observed, etc. This takes into account passing in global property
1578
+ paths (i.e. a path beginning with a captial letter not defined on the
1579
+ target) and * separators.
1592
1580
 
1593
- 1. `keys`: an OrderedSet of all of the existing keys
1594
- 2. `values`: a JavaScript Object indexed by the `Ember.guidFor(key)`
1595
-
1596
- When a key/value pair is added for the first time, we
1597
- add the key to the `keys` OrderedSet, and create or
1598
- replace an entry in `values`. When an entry is deleted,
1599
- we delete its entry in `keys` and `values`.
1600
-
1601
- @class Map
1602
- @namespace Ember
1603
- @private
1604
- @constructor
1605
- */
1606
- var Map = Ember.Map = function() {
1607
- this.keys = Ember.OrderedSet.create();
1608
- this.values = {};
1609
- };
1610
-
1611
- /**
1612
- @method create
1613
- @static
1581
+ @method normalizeTuple
1582
+ @for Ember
1583
+ @param {Object} target The current target. May be `null`.
1584
+ @param {String} path A path on the target or a global property path.
1585
+ @return {Array} a temporary array with the normalized target/path pair.
1614
1586
  */
1615
- Map.create = function() {
1616
- return new Map();
1587
+ Ember.normalizeTuple = function(target, path) {
1588
+ return normalizeTuple(target, path);
1617
1589
  };
1618
1590
 
1619
- Map.prototype = {
1620
- /**
1621
- Retrieve the value associated with a given key.
1591
+ Ember.getWithDefault = function(root, key, defaultValue) {
1592
+ var value = get(root, key);
1622
1593
 
1623
- @method get
1624
- @param {*} key
1625
- @return {*} the value associated with the key, or `undefined`
1626
- */
1627
- get: function(key) {
1628
- var values = this.values,
1629
- guid = guidFor(key);
1594
+ if (value === undefined) { return defaultValue; }
1595
+ return value;
1596
+ };
1630
1597
 
1631
- return values[guid];
1632
- },
1633
1598
 
1634
- /**
1635
- Adds a value to the map. If a value for the given key has already been
1636
- provided, the new value will replace the old value.
1599
+ Ember.get = get;
1600
+ Ember.getPath = Ember.deprecateFunc('getPath is deprecated since get now supports paths', Ember.get);
1637
1601
 
1638
- @method set
1639
- @param {*} key
1640
- @param {*} value
1641
- */
1642
- set: function(key, value) {
1643
- var keys = this.keys,
1644
- values = this.values,
1645
- guid = guidFor(key);
1602
+ })();
1646
1603
 
1647
- keys.add(key);
1648
- values[guid] = value;
1649
- },
1650
1604
 
1651
- /**
1652
- Removes a value from the map for an associated key.
1653
1605
 
1654
- @method remove
1655
- @param {*} key
1656
- @return {Boolean} true if an item was removed, false otherwise
1657
- */
1658
- remove: function(key) {
1659
- // don't use ES6 "delete" because it will be annoying
1660
- // to use in browsers that are not ES6 friendly;
1661
- var keys = this.keys,
1662
- values = this.values,
1663
- guid = guidFor(key);
1606
+ (function() {
1607
+ /**
1608
+ @module ember-metal
1609
+ */
1664
1610
 
1665
- if (values.hasOwnProperty(guid)) {
1666
- keys.remove(key);
1667
- delete values[guid];
1668
- return true;
1669
- } else {
1670
- return false;
1671
- }
1672
- },
1611
+ var o_create = Ember.create,
1612
+ metaFor = Ember.meta,
1613
+ META_KEY = Ember.META_KEY,
1614
+ /* listener flags */
1615
+ ONCE = 1, SUSPENDED = 2;
1673
1616
 
1674
- /**
1675
- Check whether a key is present.
1617
+ /*
1618
+ The event system uses a series of nested hashes to store listeners on an
1619
+ object. When a listener is registered, or when an event arrives, these
1620
+ hashes are consulted to determine which target and action pair to invoke.
1676
1621
 
1677
- @method has
1678
- @param {*} key
1679
- @return {Boolean} true if the item was present, false otherwise
1680
- */
1681
- has: function(key) {
1682
- var values = this.values,
1683
- guid = guidFor(key);
1622
+ The hashes are stored in the object's meta hash, and look like this:
1684
1623
 
1685
- return values.hasOwnProperty(guid);
1686
- },
1624
+ // Object's meta hash
1625
+ {
1626
+ listeners: { // variable name: `listenerSet`
1627
+ "foo:changed": [ // variable name: `actions`
1628
+ [target, method, flags]
1629
+ ]
1630
+ }
1631
+ }
1687
1632
 
1688
- /**
1689
- Iterate over all the keys and values. Calls the function once
1690
- for each key, passing in the key and value, in that order.
1633
+ */
1691
1634
 
1692
- The keys are guaranteed to be iterated over in insertion order.
1635
+ function indexOf(array, target, method) {
1636
+ var index = -1;
1637
+ for (var i = 0, l = array.length; i < l; i++) {
1638
+ if (target === array[i][0] && method === array[i][1]) { index = i; break; }
1639
+ }
1640
+ return index;
1641
+ }
1693
1642
 
1694
- @method forEach
1695
- @param {Function} callback
1696
- @param {*} self if passed, the `this` value inside the
1697
- callback. By default, `this` is the map.
1698
- */
1699
- forEach: function(callback, self) {
1700
- var keys = this.keys,
1701
- values = this.values;
1643
+ function actionsFor(obj, eventName) {
1644
+ var meta = metaFor(obj, true),
1645
+ actions;
1702
1646
 
1703
- keys.forEach(function(key) {
1704
- var guid = guidFor(key);
1705
- callback.call(self, key, values[guid]);
1706
- });
1707
- },
1647
+ if (!meta.listeners) { meta.listeners = {}; }
1708
1648
 
1709
- /**
1710
- @method copy
1711
- @return {Ember.Map}
1712
- */
1713
- copy: function() {
1714
- return copyMap(this, new Map());
1649
+ if (!meta.hasOwnProperty('listeners')) {
1650
+ // setup inherited copy of the listeners object
1651
+ meta.listeners = o_create(meta.listeners);
1715
1652
  }
1716
- };
1717
1653
 
1718
- /**
1719
- @class MapWithDefault
1720
- @namespace Ember
1721
- @extends Ember.Map
1722
- @private
1723
- @constructor
1724
- @param [options]
1725
- @param {*} [options.defaultValue]
1726
- */
1727
- var MapWithDefault = Ember.MapWithDefault = function(options) {
1728
- Map.call(this);
1729
- this.defaultValue = options.defaultValue;
1730
- };
1654
+ actions = meta.listeners[eventName];
1731
1655
 
1732
- /**
1733
- @method create
1734
- @static
1735
- @param [options]
1736
- @param {*} [options.defaultValue]
1737
- @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
1738
- `Ember.MapWithDefault` otherwise returns `Ember.Map`
1739
- */
1740
- MapWithDefault.create = function(options) {
1741
- if (options) {
1742
- return new MapWithDefault(options);
1743
- } else {
1744
- return new Map();
1656
+ // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
1657
+ if (actions && !meta.listeners.hasOwnProperty(eventName)) {
1658
+ actions = meta.listeners[eventName] = meta.listeners[eventName].slice();
1659
+ } else if (!actions) {
1660
+ actions = meta.listeners[eventName] = [];
1745
1661
  }
1746
- };
1747
1662
 
1748
- MapWithDefault.prototype = Ember.create(Map.prototype);
1663
+ return actions;
1664
+ }
1749
1665
 
1750
- /**
1751
- Retrieve the value associated with a given key.
1666
+ function actionsUnion(obj, eventName, otherActions) {
1667
+ var meta = obj[META_KEY],
1668
+ actions = meta && meta.listeners && meta.listeners[eventName];
1752
1669
 
1753
- @method get
1754
- @param {*} key
1755
- @return {*} the value associated with the key, or the default value
1756
- */
1757
- MapWithDefault.prototype.get = function(key) {
1758
- var hasValue = this.has(key);
1670
+ if (!actions) { return; }
1671
+ for (var i = actions.length - 1; i >= 0; i--) {
1672
+ var target = actions[i][0],
1673
+ method = actions[i][1],
1674
+ flags = actions[i][2],
1675
+ actionIndex = indexOf(otherActions, target, method);
1759
1676
 
1760
- if (hasValue) {
1761
- return Map.prototype.get.call(this, key);
1762
- } else {
1763
- var defaultValue = this.defaultValue(key);
1764
- this.set(key, defaultValue);
1765
- return defaultValue;
1677
+ if (actionIndex === -1) {
1678
+ otherActions.push([target, method, flags]);
1679
+ }
1766
1680
  }
1767
- };
1681
+ }
1768
1682
 
1769
- /**
1770
- @method copy
1771
- @return {Ember.MapWithDefault}
1772
- */
1773
- MapWithDefault.prototype.copy = function() {
1774
- return copyMap(this, new MapWithDefault({
1775
- defaultValue: this.defaultValue
1776
- }));
1777
- };
1683
+ function actionsDiff(obj, eventName, otherActions) {
1684
+ var meta = obj[META_KEY],
1685
+ actions = meta && meta.listeners && meta.listeners[eventName],
1686
+ diffActions = [];
1778
1687
 
1779
- })();
1688
+ if (!actions) { return; }
1689
+ for (var i = actions.length - 1; i >= 0; i--) {
1690
+ var target = actions[i][0],
1691
+ method = actions[i][1],
1692
+ flags = actions[i][2],
1693
+ actionIndex = indexOf(otherActions, target, method);
1780
1694
 
1695
+ if (actionIndex !== -1) { continue; }
1781
1696
 
1697
+ otherActions.push([target, method, flags]);
1698
+ diffActions.push([target, method, flags]);
1699
+ }
1700
+
1701
+ return diffActions;
1702
+ }
1782
1703
 
1783
- (function() {
1784
1704
  /**
1785
- @module ember-metal
1705
+ Add an event listener
1706
+
1707
+ @method addListener
1708
+ @for Ember
1709
+ @param obj
1710
+ @param {String} eventName
1711
+ @param {Object|Function} targetOrMethod A target object or a function
1712
+ @param {Function|String} method A function or the name of a function to be called on `target`
1713
+ @param {Boolean} once A flag whether a function should only be called once
1786
1714
  */
1715
+ function addListener(obj, eventName, target, method, once) {
1787
1716
 
1788
- var META_KEY = Ember.META_KEY, get;
1789
1717
 
1790
- var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
1718
+ if (!method && 'function' === typeof target) {
1719
+ method = target;
1720
+ target = null;
1721
+ }
1791
1722
 
1792
- var IS_GLOBAL_PATH = /^([A-Z$]|([0-9][A-Z$])).*[\.\*]/;
1793
- var HAS_THIS = /^this[\.\*]/;
1794
- var FIRST_KEY = /^([^\.\*]+)/;
1723
+ var actions = actionsFor(obj, eventName),
1724
+ actionIndex = indexOf(actions, target, method),
1725
+ flags = 0;
1795
1726
 
1796
- // ..........................................................
1797
- // GET AND SET
1798
- //
1799
- // If we are on a platform that supports accessors we can use those.
1800
- // Otherwise simulate accessors by looking up the property directly on the
1801
- // object.
1727
+ if (once) flags |= ONCE;
1802
1728
 
1803
- /**
1804
- Gets the value of a property on an object. If the property is computed,
1805
- the function will be invoked. If the property is not defined but the
1806
- object implements the `unknownProperty` method then that will be invoked.
1729
+ if (actionIndex !== -1) { return; }
1807
1730
 
1808
- If you plan to run on IE8 and older browsers then you should use this
1809
- method anytime you want to retrieve a property on an object that you don't
1810
- know for sure is private. (Properties beginning with an underscore '_'
1811
- are considered private.)
1731
+ actions.push([target, method, flags]);
1812
1732
 
1813
- On all newer browsers, you only need to use this method to retrieve
1814
- properties if the property might not be defined on the object and you want
1815
- to respect the `unknownProperty` handler. Otherwise you can ignore this
1816
- method.
1733
+ if ('function' === typeof obj.didAddListener) {
1734
+ obj.didAddListener(eventName, target, method);
1735
+ }
1736
+ }
1817
1737
 
1818
- Note that if the object itself is `undefined`, this method will throw
1819
- an error.
1738
+ /**
1739
+ Remove an event listener
1820
1740
 
1821
- @method get
1741
+ Arguments should match those passed to `Ember.addListener`.
1742
+
1743
+ @method removeListener
1822
1744
  @for Ember
1823
- @param {Object} obj The object to retrieve from.
1824
- @param {String} keyName The property key to retrieve
1825
- @return {Object} the property value or `null`.
1745
+ @param obj
1746
+ @param {String} eventName
1747
+ @param {Object|Function} targetOrMethod A target object or a function
1748
+ @param {Function|String} method A function or the name of a function to be called on `target`
1826
1749
  */
1827
- get = function get(obj, keyName) {
1828
- // Helpers that operate with 'this' within an #each
1829
- if (keyName === '') {
1830
- return obj;
1831
- }
1750
+ function removeListener(obj, eventName, target, method) {
1832
1751
 
1833
- if (!keyName && 'string'===typeof obj) {
1834
- keyName = obj;
1835
- obj = null;
1752
+
1753
+ if (!method && 'function' === typeof target) {
1754
+ method = target;
1755
+ target = null;
1836
1756
  }
1837
1757
 
1838
- if (!obj || keyName.indexOf('.') !== -1) {
1758
+ function _removeListener(target, method) {
1759
+ var actions = actionsFor(obj, eventName),
1760
+ actionIndex = indexOf(actions, target, method);
1839
1761
 
1840
- return getPath(obj, keyName);
1841
- }
1762
+ // action doesn't exist, give up silently
1763
+ if (actionIndex === -1) { return; }
1842
1764
 
1765
+ actions.splice(actionIndex, 1);
1843
1766
 
1844
- var meta = obj[META_KEY], desc = meta && meta.descs[keyName], ret;
1845
- if (desc) {
1846
- return desc.get(obj, keyName);
1847
- } else {
1848
- if (MANDATORY_SETTER && meta && meta.watching[keyName] > 0) {
1849
- ret = meta.values[keyName];
1850
- } else {
1851
- ret = obj[keyName];
1767
+ if ('function' === typeof obj.didRemoveListener) {
1768
+ obj.didRemoveListener(eventName, target, method);
1852
1769
  }
1770
+ }
1853
1771
 
1854
- if (ret === undefined &&
1855
- 'object' === typeof obj && !(keyName in obj) && 'function' === typeof obj.unknownProperty) {
1856
- return obj.unknownProperty(keyName);
1857
- }
1772
+ if (method) {
1773
+ _removeListener(target, method);
1774
+ } else {
1775
+ var meta = obj[META_KEY],
1776
+ actions = meta && meta.listeners && meta.listeners[eventName];
1858
1777
 
1859
- return ret;
1778
+ if (!actions) { return; }
1779
+ for (var i = actions.length - 1; i >= 0; i--) {
1780
+ _removeListener(actions[i][0], actions[i][1]);
1781
+ }
1860
1782
  }
1861
- };
1862
-
1863
- // Currently used only by Ember Data tests
1864
- if (Ember.config.overrideAccessors) {
1865
- Ember.get = get;
1866
- Ember.config.overrideAccessors();
1867
- get = Ember.get;
1868
1783
  }
1869
1784
 
1870
- function firstKey(path) {
1871
- return path.match(FIRST_KEY)[0];
1872
- }
1785
+ /**
1786
+ @private
1873
1787
 
1874
- // assumes path is already normalized
1875
- function normalizeTuple(target, path) {
1876
- var hasThis = HAS_THIS.test(path),
1877
- isGlobal = !hasThis && IS_GLOBAL_PATH.test(path),
1878
- key;
1788
+ Suspend listener during callback.
1879
1789
 
1880
- if (!target || isGlobal) target = Ember.lookup;
1881
- if (hasThis) path = path.slice(5);
1790
+ This should only be used by the target of the event listener
1791
+ when it is taking an action that would cause the event, e.g.
1792
+ an object might suspend its property change listener while it is
1793
+ setting that property.
1882
1794
 
1883
- if (target === Ember.lookup) {
1884
- key = firstKey(path);
1885
- target = get(target, key);
1886
- path = path.slice(key.length+1);
1795
+ @method suspendListener
1796
+ @for Ember
1797
+ @param obj
1798
+ @param {String} eventName
1799
+ @param {Object|Function} targetOrMethod A target object or a function
1800
+ @param {Function|String} method A function or the name of a function to be called on `target`
1801
+ @param {Function} callback
1802
+ */
1803
+ function suspendListener(obj, eventName, target, method, callback) {
1804
+ if (!method && 'function' === typeof target) {
1805
+ method = target;
1806
+ target = null;
1887
1807
  }
1888
1808
 
1889
- // must return some kind of path to be valid else other things will break.
1890
- if (!path || path.length===0) throw new Error('Invalid Path');
1891
-
1892
- return [ target, path ];
1893
- }
1894
-
1895
- var getPath = Ember._getPath = function(root, path) {
1896
- var hasThis, parts, tuple, idx, len;
1897
-
1898
- // If there is no root and path is a key name, return that
1899
- // property from the global object.
1900
- // E.g. get('Ember') -> Ember
1901
- if (root === null && path.indexOf('.') === -1) { return get(Ember.lookup, path); }
1902
-
1903
- // detect complicated paths and normalize them
1904
- hasThis = HAS_THIS.test(path);
1809
+ var actions = actionsFor(obj, eventName),
1810
+ actionIndex = indexOf(actions, target, method),
1811
+ action;
1905
1812
 
1906
- if (!root || hasThis) {
1907
- tuple = normalizeTuple(root, path);
1908
- root = tuple[0];
1909
- path = tuple[1];
1910
- tuple.length = 0;
1813
+ if (actionIndex !== -1) {
1814
+ action = actions[actionIndex].slice(); // copy it, otherwise we're modifying a shared object
1815
+ action[2] |= SUSPENDED; // mark the action as suspended
1816
+ actions[actionIndex] = action; // replace the shared object with our copy
1911
1817
  }
1912
1818
 
1913
- parts = path.split(".");
1914
- len = parts.length;
1915
- for (idx=0; root && idx<len; idx++) {
1916
- root = get(root, parts[idx], true);
1917
- if (root && root.isDestroyed) { return undefined; }
1918
- }
1919
- return root;
1920
- };
1819
+ function tryable() { return callback.call(target); }
1820
+ function finalizer() { if (action) { action[2] &= ~SUSPENDED; } }
1821
+
1822
+ return Ember.tryFinally(tryable, finalizer);
1823
+ }
1921
1824
 
1922
1825
  /**
1923
1826
  @private
1924
1827
 
1925
- Normalizes a target/path pair to reflect that actual target/path that should
1926
- be observed, etc. This takes into account passing in global property
1927
- paths (i.e. a path beginning with a captial letter not defined on the
1928
- target) and * separators.
1828
+ Suspend listener during callback.
1929
1829
 
1930
- @method normalizeTuple
1830
+ This should only be used by the target of the event listener
1831
+ when it is taking an action that would cause the event, e.g.
1832
+ an object might suspend its property change listener while it is
1833
+ setting that property.
1834
+
1835
+ @method suspendListener
1931
1836
  @for Ember
1932
- @param {Object} target The current target. May be `null`.
1933
- @param {String} path A path on the target or a global property path.
1934
- @return {Array} a temporary array with the normalized target/path pair.
1837
+ @param obj
1838
+ @param {Array} eventName Array of event names
1839
+ @param {Object|Function} targetOrMethod A target object or a function
1840
+ @param {Function|String} method A function or the name of a function to be called on `target`
1841
+ @param {Function} callback
1935
1842
  */
1936
- Ember.normalizeTuple = function(target, path) {
1937
- return normalizeTuple(target, path);
1938
- };
1843
+ function suspendListeners(obj, eventNames, target, method, callback) {
1844
+ if (!method && 'function' === typeof target) {
1845
+ method = target;
1846
+ target = null;
1847
+ }
1939
1848
 
1940
- Ember.getWithDefault = function(root, key, defaultValue) {
1941
- var value = get(root, key);
1849
+ var suspendedActions = [],
1850
+ eventName, actions, action, i, l;
1942
1851
 
1943
- if (value === undefined) { return defaultValue; }
1944
- return value;
1945
- };
1852
+ for (i=0, l=eventNames.length; i<l; i++) {
1853
+ eventName = eventNames[i];
1854
+ actions = actionsFor(obj, eventName);
1855
+ var actionIndex = indexOf(actions, target, method);
1946
1856
 
1857
+ if (actionIndex !== -1) {
1858
+ action = actions[actionIndex].slice();
1859
+ action[2] |= SUSPENDED;
1860
+ actions[actionIndex] = action;
1861
+ suspendedActions.push(action);
1862
+ }
1863
+ }
1947
1864
 
1948
- Ember.get = get;
1949
- Ember.getPath = Ember.deprecateFunc('getPath is deprecated since get now supports paths', Ember.get);
1950
- })();
1865
+ function tryable() { return callback.call(target); }
1951
1866
 
1867
+ function finalizer() {
1868
+ for (i = 0, l = suspendedActions.length; i < l; i++) {
1869
+ suspendedActions[i][2] &= ~SUSPENDED;
1870
+ }
1871
+ }
1952
1872
 
1873
+ return Ember.tryFinally(tryable, finalizer);
1874
+ }
1953
1875
 
1954
- (function() {
1955
1876
  /**
1956
- @module ember-metal
1957
- */
1958
-
1959
- var o_create = Ember.create,
1960
- metaFor = Ember.meta,
1961
- META_KEY = Ember.META_KEY;
1962
-
1963
- /*
1964
- The event system uses a series of nested hashes to store listeners on an
1965
- object. When a listener is registered, or when an event arrives, these
1966
- hashes are consulted to determine which target and action pair to invoke.
1967
-
1968
- The hashes are stored in the object's meta hash, and look like this:
1877
+ @private
1969
1878
 
1970
- // Object's meta hash
1971
- {
1972
- listeners: { // variable name: `listenerSet`
1973
- "foo:changed": [ // variable name: `actions`
1974
- [target, method, onceFlag, suspendedFlag]
1975
- ]
1976
- }
1977
- }
1879
+ Return a list of currently watched events
1978
1880
 
1881
+ @method watchedEvents
1882
+ @for Ember
1883
+ @param obj
1979
1884
  */
1885
+ function watchedEvents(obj) {
1886
+ var listeners = obj[META_KEY].listeners, ret = [];
1980
1887
 
1981
- function indexOf(array, target, method) {
1982
- var index = -1;
1983
- for (var i = 0, l = array.length; i < l; i++) {
1984
- if (target === array[i][0] && method === array[i][1]) { index = i; break; }
1985
- }
1986
- return index;
1987
- }
1988
-
1989
- function actionsFor(obj, eventName) {
1990
- var meta = metaFor(obj, true),
1991
- actions;
1992
-
1993
- if (!meta.listeners) { meta.listeners = {}; }
1994
-
1995
- if (!meta.hasOwnProperty('listeners')) {
1996
- // setup inherited copy of the listeners object
1997
- meta.listeners = o_create(meta.listeners);
1998
- }
1999
-
2000
- actions = meta.listeners[eventName];
2001
-
2002
- // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
2003
- if (actions && !meta.listeners.hasOwnProperty(eventName)) {
2004
- actions = meta.listeners[eventName] = meta.listeners[eventName].slice();
2005
- } else if (!actions) {
2006
- actions = meta.listeners[eventName] = [];
2007
- }
2008
-
2009
- return actions;
2010
- }
2011
-
2012
- function actionsUnion(obj, eventName, otherActions) {
2013
- var meta = obj[META_KEY],
2014
- actions = meta && meta.listeners && meta.listeners[eventName];
2015
-
2016
- if (!actions) { return; }
2017
- for (var i = actions.length - 1; i >= 0; i--) {
2018
- var target = actions[i][0],
2019
- method = actions[i][1],
2020
- once = actions[i][2],
2021
- suspended = actions[i][3],
2022
- actionIndex = indexOf(otherActions, target, method);
2023
-
2024
- if (actionIndex === -1) {
2025
- otherActions.push([target, method, once, suspended]);
2026
- }
2027
- }
2028
- }
2029
-
2030
- function actionsDiff(obj, eventName, otherActions) {
2031
- var meta = obj[META_KEY],
2032
- actions = meta && meta.listeners && meta.listeners[eventName],
2033
- diffActions = [];
2034
-
2035
- if (!actions) { return; }
2036
- for (var i = actions.length - 1; i >= 0; i--) {
2037
- var target = actions[i][0],
2038
- method = actions[i][1],
2039
- once = actions[i][2],
2040
- suspended = actions[i][3],
2041
- actionIndex = indexOf(otherActions, target, method);
2042
-
2043
- if (actionIndex !== -1) { continue; }
2044
-
2045
- otherActions.push([target, method, once, suspended]);
2046
- diffActions.push([target, method, once, suspended]);
2047
- }
2048
-
2049
- return diffActions;
2050
- }
2051
-
2052
- /**
2053
- Add an event listener
2054
-
2055
- @method addListener
2056
- @for Ember
2057
- @param obj
2058
- @param {String} eventName
2059
- @param {Object|Function} targetOrMethod A target object or a function
2060
- @param {Function|String} method A function or the name of a function to be called on `target`
2061
- @param {Boolean} once A flag whether a function should only be called once
2062
- */
2063
- function addListener(obj, eventName, target, method, once) {
2064
-
2065
-
2066
- if (!method && 'function' === typeof target) {
2067
- method = target;
2068
- target = null;
2069
- }
2070
-
2071
- var actions = actionsFor(obj, eventName),
2072
- actionIndex = indexOf(actions, target, method);
2073
-
2074
- if (actionIndex !== -1) { return; }
2075
-
2076
- actions.push([target, method, once, undefined]);
2077
-
2078
- if ('function' === typeof obj.didAddListener) {
2079
- obj.didAddListener(eventName, target, method);
2080
- }
2081
- }
2082
-
2083
- /**
2084
- Remove an event listener
2085
-
2086
- Arguments should match those passed to {{#crossLink "Ember/addListener"}}{{/crossLink}}
2087
-
2088
- @method removeListener
2089
- @for Ember
2090
- @param obj
2091
- @param {String} eventName
2092
- @param {Object|Function} targetOrMethod A target object or a function
2093
- @param {Function|String} method A function or the name of a function to be called on `target`
2094
- */
2095
- function removeListener(obj, eventName, target, method) {
2096
-
2097
-
2098
- if (!method && 'function' === typeof target) {
2099
- method = target;
2100
- target = null;
2101
- }
2102
-
2103
- function _removeListener(target, method, once) {
2104
- var actions = actionsFor(obj, eventName),
2105
- actionIndex = indexOf(actions, target, method);
2106
-
2107
- // action doesn't exist, give up silently
2108
- if (actionIndex === -1) { return; }
2109
-
2110
- actions.splice(actionIndex, 1);
2111
-
2112
- if ('function' === typeof obj.didRemoveListener) {
2113
- obj.didRemoveListener(eventName, target, method);
2114
- }
2115
- }
2116
-
2117
- if (method) {
2118
- _removeListener(target, method);
2119
- } else {
2120
- var meta = obj[META_KEY],
2121
- actions = meta && meta.listeners && meta.listeners[eventName];
2122
-
2123
- if (!actions) { return; }
2124
- for (var i = actions.length - 1; i >= 0; i--) {
2125
- _removeListener(actions[i][0], actions[i][1]);
2126
- }
2127
- }
2128
- }
2129
-
2130
- /**
2131
- @private
2132
-
2133
- Suspend listener during callback.
2134
-
2135
- This should only be used by the target of the event listener
2136
- when it is taking an action that would cause the event, e.g.
2137
- an object might suspend its property change listener while it is
2138
- setting that property.
2139
-
2140
- @method suspendListener
2141
- @for Ember
2142
- @param obj
2143
- @param {String} eventName
2144
- @param {Object|Function} targetOrMethod A target object or a function
2145
- @param {Function|String} method A function or the name of a function to be called on `target`
2146
- @param {Function} callback
2147
- */
2148
- function suspendListener(obj, eventName, target, method, callback) {
2149
- if (!method && 'function' === typeof target) {
2150
- method = target;
2151
- target = null;
2152
- }
2153
-
2154
- var actions = actionsFor(obj, eventName),
2155
- actionIndex = indexOf(actions, target, method),
2156
- action;
2157
-
2158
- if (actionIndex !== -1) {
2159
- action = actions[actionIndex].slice(); // copy it, otherwise we're modifying a shared object
2160
- action[3] = true; // mark the action as suspended
2161
- actions[actionIndex] = action; // replace the shared object with our copy
2162
- }
2163
-
2164
- function tryable() { return callback.call(target); }
2165
- function finalizer() { if (action) { action[3] = undefined; } }
2166
-
2167
- return Ember.tryFinally(tryable, finalizer);
2168
- }
2169
-
2170
- /**
2171
- @private
2172
-
2173
- Suspend listener during callback.
2174
-
2175
- This should only be used by the target of the event listener
2176
- when it is taking an action that would cause the event, e.g.
2177
- an object might suspend its property change listener while it is
2178
- setting that property.
2179
-
2180
- @method suspendListener
2181
- @for Ember
2182
- @param obj
2183
- @param {Array} eventName Array of event names
2184
- @param {Object|Function} targetOrMethod A target object or a function
2185
- @param {Function|String} method A function or the name of a function to be called on `target`
2186
- @param {Function} callback
2187
- */
2188
- function suspendListeners(obj, eventNames, target, method, callback) {
2189
- if (!method && 'function' === typeof target) {
2190
- method = target;
2191
- target = null;
2192
- }
2193
-
2194
- var suspendedActions = [],
2195
- eventName, actions, action, i, l;
2196
-
2197
- for (i=0, l=eventNames.length; i<l; i++) {
2198
- eventName = eventNames[i];
2199
- actions = actionsFor(obj, eventName);
2200
- var actionIndex = indexOf(actions, target, method);
2201
-
2202
- if (actionIndex !== -1) {
2203
- action = actions[actionIndex].slice();
2204
- action[3] = true;
2205
- actions[actionIndex] = action;
2206
- suspendedActions.push(action);
2207
- }
2208
- }
2209
-
2210
- function tryable() { return callback.call(target); }
2211
-
2212
- function finalizer() {
2213
- for (i = 0, l = suspendedActions.length; i < l; i++) {
2214
- suspendedActions[i][3] = undefined;
2215
- }
2216
- }
2217
-
2218
- return Ember.tryFinally(tryable, finalizer);
2219
- }
2220
-
2221
- /**
2222
- @private
2223
-
2224
- Return a list of currently watched events
2225
-
2226
- @method watchedEvents
2227
- @for Ember
2228
- @param obj
2229
- */
2230
- function watchedEvents(obj) {
2231
- var listeners = obj[META_KEY].listeners, ret = [];
2232
-
2233
- if (listeners) {
2234
- for(var eventName in listeners) {
2235
- if (listeners[eventName]) { ret.push(eventName); }
2236
- }
1888
+ if (listeners) {
1889
+ for(var eventName in listeners) {
1890
+ if (listeners[eventName]) { ret.push(eventName); }
1891
+ }
2237
1892
  }
2238
1893
  return ret;
2239
1894
  }
@@ -2261,13 +1916,11 @@ function sendEvent(obj, eventName, params, actions) {
2261
1916
  if (!actions) { return; }
2262
1917
 
2263
1918
  for (var i = actions.length - 1; i >= 0; i--) { // looping in reverse for once listeners
2264
- if (!actions[i] || actions[i][3] === true) { continue; }
2265
-
2266
- var target = actions[i][0],
2267
- method = actions[i][1],
2268
- once = actions[i][2];
2269
-
2270
- if (once) { removeListener(obj, eventName, target, method); }
1919
+ var action = actions[i];
1920
+ if (!action) { continue; }
1921
+ var target = action[0], method = action[1], flags = action[2];
1922
+ if (flags & SUSPENDED) { continue; }
1923
+ if (flags & ONCE) { removeListener(obj, eventName, target, method); }
2271
1924
  if (!target) { target = obj; }
2272
1925
  if ('string' === typeof method) { method = target[method]; }
2273
1926
  if (params) {
@@ -2347,7 +2000,7 @@ var guidFor = Ember.guidFor,
2347
2000
  keyName: keyName,
2348
2001
  eventName: eventName,
2349
2002
  listeners: [
2350
- [target, method, onceFlag, suspendedFlag]
2003
+ [target, method, flags]
2351
2004
  ]
2352
2005
  },
2353
2006
  ...
@@ -2576,11 +2229,11 @@ var endPropertyChanges = Ember.endPropertyChanges = function() {
2576
2229
  });
2577
2230
  ```
2578
2231
 
2579
- @method changePropertiess
2232
+ @method changeProperties
2580
2233
  @param {Function} callback
2581
2234
  @param [binding]
2582
2235
  */
2583
- var changeProperties = Ember.changeProperties = function(cb, binding){
2236
+ Ember.changeProperties = function(cb, binding){
2584
2237
  beginPropertyChanges();
2585
2238
  tryFinally(cb, endPropertyChanges, binding);
2586
2239
  };
@@ -2693,66 +2346,446 @@ var set = function set(obj, keyName, value, tolerant) {
2693
2346
  Ember.propertyDidChange(obj, keyName);
2694
2347
  }
2695
2348
  } else {
2696
- obj[keyName] = value;
2349
+ obj[keyName] = value;
2350
+ }
2351
+ }
2352
+ return value;
2353
+ };
2354
+
2355
+ // Currently used only by Ember Data tests
2356
+ if (Ember.config.overrideAccessors) {
2357
+ Ember.set = set;
2358
+ Ember.config.overrideAccessors();
2359
+ set = Ember.set;
2360
+ }
2361
+
2362
+ function setPath(root, path, value, tolerant) {
2363
+ var keyName;
2364
+
2365
+ // get the last part of the path
2366
+ keyName = path.slice(path.lastIndexOf('.') + 1);
2367
+
2368
+ // get the first part of the part
2369
+ path = path.slice(0, path.length-(keyName.length+1));
2370
+
2371
+ // unless the path is this, look up the first part to
2372
+ // get the root
2373
+ if (path !== 'this') {
2374
+ root = getPath(root, path);
2375
+ }
2376
+
2377
+ if (!keyName || keyName.length === 0) {
2378
+ throw new Error('You passed an empty path');
2379
+ }
2380
+
2381
+ if (!root) {
2382
+ if (tolerant) { return; }
2383
+ else { throw new Error('Object in path '+path+' could not be found or was destroyed.'); }
2384
+ }
2385
+
2386
+ return set(root, keyName, value);
2387
+ }
2388
+
2389
+ Ember.set = set;
2390
+ Ember.setPath = Ember.deprecateFunc('setPath is deprecated since set now supports paths', Ember.set);
2391
+
2392
+ /**
2393
+ Error-tolerant form of `Ember.set`. Will not blow up if any part of the
2394
+ chain is `undefined`, `null`, or destroyed.
2395
+
2396
+ This is primarily used when syncing bindings, which may try to update after
2397
+ an object has been destroyed.
2398
+
2399
+ @method trySet
2400
+ @for Ember
2401
+ @param {Object} obj The object to modify.
2402
+ @param {String} path The property path to set
2403
+ @param {Object} value The value to set
2404
+ */
2405
+ Ember.trySet = function(root, path, value) {
2406
+ return set(root, path, value, true);
2407
+ };
2408
+ Ember.trySetPath = Ember.deprecateFunc('trySetPath has been renamed to trySet', Ember.trySet);
2409
+
2410
+ })();
2411
+
2412
+
2413
+
2414
+ (function() {
2415
+ /**
2416
+ @module ember-metal
2417
+ */
2418
+
2419
+ /*
2420
+ JavaScript (before ES6) does not have a Map implementation. Objects,
2421
+ which are often used as dictionaries, may only have Strings as keys.
2422
+
2423
+ Because Ember has a way to get a unique identifier for every object
2424
+ via `Ember.guidFor`, we can implement a performant Map with arbitrary
2425
+ keys. Because it is commonly used in low-level bookkeeping, Map is
2426
+ implemented as a pure JavaScript object for performance.
2427
+
2428
+ This implementation follows the current iteration of the ES6 proposal for
2429
+ maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
2430
+ with two exceptions. First, because we need our implementation to be pleasant
2431
+ on older browsers, we do not use the `delete` name (using `remove` instead).
2432
+ Second, as we do not have the luxury of in-VM iteration, we implement a
2433
+ forEach method for iteration.
2434
+
2435
+ Map is mocked out to look like an Ember object, so you can do
2436
+ `Ember.Map.create()` for symmetry with other Ember classes.
2437
+ */
2438
+ var get = Ember.get,
2439
+ set = Ember.set,
2440
+ guidFor = Ember.guidFor,
2441
+ indexOf = Ember.ArrayPolyfills.indexOf;
2442
+
2443
+ var copy = function(obj) {
2444
+ var output = {};
2445
+
2446
+ for (var prop in obj) {
2447
+ if (obj.hasOwnProperty(prop)) { output[prop] = obj[prop]; }
2448
+ }
2449
+
2450
+ return output;
2451
+ };
2452
+
2453
+ var copyMap = function(original, newObject) {
2454
+ var keys = original.keys.copy(),
2455
+ values = copy(original.values);
2456
+
2457
+ newObject.keys = keys;
2458
+ newObject.values = values;
2459
+ newObject.length = original.length;
2460
+
2461
+ return newObject;
2462
+ };
2463
+
2464
+ /**
2465
+ This class is used internally by Ember and Ember Data.
2466
+ Please do not use it at this time. We plan to clean it up
2467
+ and add many tests soon.
2468
+
2469
+ @class OrderedSet
2470
+ @namespace Ember
2471
+ @constructor
2472
+ @private
2473
+ */
2474
+ var OrderedSet = Ember.OrderedSet = function() {
2475
+ this.clear();
2476
+ };
2477
+
2478
+ /**
2479
+ @method create
2480
+ @static
2481
+ @return {Ember.OrderedSet}
2482
+ */
2483
+ OrderedSet.create = function() {
2484
+ return new OrderedSet();
2485
+ };
2486
+
2487
+
2488
+ OrderedSet.prototype = {
2489
+ /**
2490
+ @method clear
2491
+ */
2492
+ clear: function() {
2493
+ this.presenceSet = {};
2494
+ this.list = [];
2495
+ },
2496
+
2497
+ /**
2498
+ @method add
2499
+ @param obj
2500
+ */
2501
+ add: function(obj) {
2502
+ var guid = guidFor(obj),
2503
+ presenceSet = this.presenceSet,
2504
+ list = this.list;
2505
+
2506
+ if (guid in presenceSet) { return; }
2507
+
2508
+ presenceSet[guid] = true;
2509
+ list.push(obj);
2510
+ },
2511
+
2512
+ /**
2513
+ @method remove
2514
+ @param obj
2515
+ */
2516
+ remove: function(obj) {
2517
+ var guid = guidFor(obj),
2518
+ presenceSet = this.presenceSet,
2519
+ list = this.list;
2520
+
2521
+ delete presenceSet[guid];
2522
+
2523
+ var index = indexOf.call(list, obj);
2524
+ if (index > -1) {
2525
+ list.splice(index, 1);
2526
+ }
2527
+ },
2528
+
2529
+ /**
2530
+ @method isEmpty
2531
+ @return {Boolean}
2532
+ */
2533
+ isEmpty: function() {
2534
+ return this.list.length === 0;
2535
+ },
2536
+
2537
+ /**
2538
+ @method has
2539
+ @param obj
2540
+ @return {Boolean}
2541
+ */
2542
+ has: function(obj) {
2543
+ var guid = guidFor(obj),
2544
+ presenceSet = this.presenceSet;
2545
+
2546
+ return guid in presenceSet;
2547
+ },
2548
+
2549
+ /**
2550
+ @method forEach
2551
+ @param {Function} fn
2552
+ @param self
2553
+ */
2554
+ forEach: function(fn, self) {
2555
+ // allow mutation during iteration
2556
+ var list = this.toArray();
2557
+
2558
+ for (var i = 0, j = list.length; i < j; i++) {
2559
+ fn.call(self, list[i]);
2560
+ }
2561
+ },
2562
+
2563
+ /**
2564
+ @method toArray
2565
+ @return {Array}
2566
+ */
2567
+ toArray: function() {
2568
+ return this.list.slice();
2569
+ },
2570
+
2571
+ /**
2572
+ @method copy
2573
+ @return {Ember.OrderedSet}
2574
+ */
2575
+ copy: function() {
2576
+ var set = new OrderedSet();
2577
+
2578
+ set.presenceSet = copy(this.presenceSet);
2579
+ set.list = this.toArray();
2580
+
2581
+ return set;
2582
+ }
2583
+ };
2584
+
2585
+ /**
2586
+ A Map stores values indexed by keys. Unlike JavaScript's
2587
+ default Objects, the keys of a Map can be any JavaScript
2588
+ object.
2589
+
2590
+ Internally, a Map has two data structures:
2591
+
2592
+ 1. `keys`: an OrderedSet of all of the existing keys
2593
+ 2. `values`: a JavaScript Object indexed by the `Ember.guidFor(key)`
2594
+
2595
+ When a key/value pair is added for the first time, we
2596
+ add the key to the `keys` OrderedSet, and create or
2597
+ replace an entry in `values`. When an entry is deleted,
2598
+ we delete its entry in `keys` and `values`.
2599
+
2600
+ @class Map
2601
+ @namespace Ember
2602
+ @private
2603
+ @constructor
2604
+ */
2605
+ var Map = Ember.Map = function() {
2606
+ this.keys = Ember.OrderedSet.create();
2607
+ this.values = {};
2608
+ };
2609
+
2610
+ /**
2611
+ @method create
2612
+ @static
2613
+ */
2614
+ Map.create = function() {
2615
+ return new Map();
2616
+ };
2617
+
2618
+ Map.prototype = {
2619
+ /**
2620
+ This property will change as the number of objects in the map changes.
2621
+
2622
+ @property length
2623
+ @type number
2624
+ @default 0
2625
+ */
2626
+ length: 0,
2627
+
2628
+
2629
+ /**
2630
+ Retrieve the value associated with a given key.
2631
+
2632
+ @method get
2633
+ @param {*} key
2634
+ @return {*} the value associated with the key, or `undefined`
2635
+ */
2636
+ get: function(key) {
2637
+ var values = this.values,
2638
+ guid = guidFor(key);
2639
+
2640
+ return values[guid];
2641
+ },
2642
+
2643
+ /**
2644
+ Adds a value to the map. If a value for the given key has already been
2645
+ provided, the new value will replace the old value.
2646
+
2647
+ @method set
2648
+ @param {*} key
2649
+ @param {*} value
2650
+ */
2651
+ set: function(key, value) {
2652
+ var keys = this.keys,
2653
+ values = this.values,
2654
+ guid = guidFor(key);
2655
+
2656
+ keys.add(key);
2657
+ values[guid] = value;
2658
+ set(this, 'length', keys.list.length);
2659
+ },
2660
+
2661
+ /**
2662
+ Removes a value from the map for an associated key.
2663
+
2664
+ @method remove
2665
+ @param {*} key
2666
+ @return {Boolean} true if an item was removed, false otherwise
2667
+ */
2668
+ remove: function(key) {
2669
+ // don't use ES6 "delete" because it will be annoying
2670
+ // to use in browsers that are not ES6 friendly;
2671
+ var keys = this.keys,
2672
+ values = this.values,
2673
+ guid = guidFor(key);
2674
+
2675
+ if (values.hasOwnProperty(guid)) {
2676
+ keys.remove(key);
2677
+ delete values[guid];
2678
+ set(this, 'length', keys.list.length);
2679
+ return true;
2680
+ } else {
2681
+ return false;
2697
2682
  }
2698
- }
2699
- return value;
2700
- };
2683
+ },
2701
2684
 
2702
- // Currently used only by Ember Data tests
2703
- if (Ember.config.overrideAccessors) {
2704
- Ember.set = set;
2705
- Ember.config.overrideAccessors();
2706
- set = Ember.set;
2707
- }
2685
+ /**
2686
+ Check whether a key is present.
2708
2687
 
2709
- function setPath(root, path, value, tolerant) {
2710
- var keyName;
2688
+ @method has
2689
+ @param {*} key
2690
+ @return {Boolean} true if the item was present, false otherwise
2691
+ */
2692
+ has: function(key) {
2693
+ var values = this.values,
2694
+ guid = guidFor(key);
2711
2695
 
2712
- // get the last part of the path
2713
- keyName = path.slice(path.lastIndexOf('.') + 1);
2696
+ return values.hasOwnProperty(guid);
2697
+ },
2714
2698
 
2715
- // get the first part of the part
2716
- path = path.slice(0, path.length-(keyName.length+1));
2699
+ /**
2700
+ Iterate over all the keys and values. Calls the function once
2701
+ for each key, passing in the key and value, in that order.
2717
2702
 
2718
- // unless the path is this, look up the first part to
2719
- // get the root
2720
- if (path !== 'this') {
2721
- root = getPath(root, path);
2722
- }
2703
+ The keys are guaranteed to be iterated over in insertion order.
2723
2704
 
2724
- if (!keyName || keyName.length === 0) {
2725
- throw new Error('You passed an empty path');
2726
- }
2705
+ @method forEach
2706
+ @param {Function} callback
2707
+ @param {*} self if passed, the `this` value inside the
2708
+ callback. By default, `this` is the map.
2709
+ */
2710
+ forEach: function(callback, self) {
2711
+ var keys = this.keys,
2712
+ values = this.values;
2727
2713
 
2728
- if (!root) {
2729
- if (tolerant) { return; }
2730
- else { throw new Error('Object in path '+path+' could not be found or was destroyed.'); }
2714
+ keys.forEach(function(key) {
2715
+ var guid = guidFor(key);
2716
+ callback.call(self, key, values[guid]);
2717
+ });
2718
+ },
2719
+
2720
+ /**
2721
+ @method copy
2722
+ @return {Ember.Map}
2723
+ */
2724
+ copy: function() {
2725
+ return copyMap(this, new Map());
2731
2726
  }
2727
+ };
2732
2728
 
2733
- return set(root, keyName, value);
2734
- }
2729
+ /**
2730
+ @class MapWithDefault
2731
+ @namespace Ember
2732
+ @extends Ember.Map
2733
+ @private
2734
+ @constructor
2735
+ @param [options]
2736
+ @param {*} [options.defaultValue]
2737
+ */
2738
+ var MapWithDefault = Ember.MapWithDefault = function(options) {
2739
+ Map.call(this);
2740
+ this.defaultValue = options.defaultValue;
2741
+ };
2735
2742
 
2736
- Ember.set = set;
2737
- Ember.setPath = Ember.deprecateFunc('setPath is deprecated since set now supports paths', Ember.set);
2743
+ /**
2744
+ @method create
2745
+ @static
2746
+ @param [options]
2747
+ @param {*} [options.defaultValue]
2748
+ @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
2749
+ `Ember.MapWithDefault` otherwise returns `Ember.Map`
2750
+ */
2751
+ MapWithDefault.create = function(options) {
2752
+ if (options) {
2753
+ return new MapWithDefault(options);
2754
+ } else {
2755
+ return new Map();
2756
+ }
2757
+ };
2758
+
2759
+ MapWithDefault.prototype = Ember.create(Map.prototype);
2738
2760
 
2739
2761
  /**
2740
- Error-tolerant form of `Ember.set`. Will not blow up if any part of the
2741
- chain is `undefined`, `null`, or destroyed.
2762
+ Retrieve the value associated with a given key.
2742
2763
 
2743
- This is primarily used when syncing bindings, which may try to update after
2744
- an object has been destroyed.
2764
+ @method get
2765
+ @param {*} key
2766
+ @return {*} the value associated with the key, or the default value
2767
+ */
2768
+ MapWithDefault.prototype.get = function(key) {
2769
+ var hasValue = this.has(key);
2745
2770
 
2746
- @method trySet
2747
- @for Ember
2748
- @param {Object} obj The object to modify.
2749
- @param {String} path The property path to set
2750
- @param {Object} value The value to set
2771
+ if (hasValue) {
2772
+ return Map.prototype.get.call(this, key);
2773
+ } else {
2774
+ var defaultValue = this.defaultValue(key);
2775
+ this.set(key, defaultValue);
2776
+ return defaultValue;
2777
+ }
2778
+ };
2779
+
2780
+ /**
2781
+ @method copy
2782
+ @return {Ember.MapWithDefault}
2751
2783
  */
2752
- Ember.trySet = function(root, path, value) {
2753
- return set(root, path, value, true);
2784
+ MapWithDefault.prototype.copy = function() {
2785
+ return copyMap(this, new MapWithDefault({
2786
+ defaultValue: this.defaultValue
2787
+ }));
2754
2788
  };
2755
- Ember.trySetPath = Ember.deprecateFunc('trySetPath has been renamed to trySet', Ember.trySet);
2756
2789
 
2757
2790
  })();
2758
2791
 
@@ -2784,7 +2817,7 @@ var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
2784
2817
  @private
2785
2818
  @constructor
2786
2819
  */
2787
- var Descriptor = Ember.Descriptor = function() {};
2820
+ Ember.Descriptor = function() {};
2788
2821
 
2789
2822
  // ..........................................................
2790
2823
  // DEFINING PROPERTIES API
@@ -3345,7 +3378,7 @@ Ember.watchPath = function(obj, keyPath) {
3345
3378
  };
3346
3379
 
3347
3380
  Ember.unwatchPath = function(obj, keyPath) {
3348
- var m = metaFor(obj), watching = m.watching, desc;
3381
+ var m = metaFor(obj), watching = m.watching;
3349
3382
 
3350
3383
  if (watching[keyPath] === 1) {
3351
3384
  watching[keyPath] = 0;
@@ -3606,27 +3639,14 @@ ComputedProperty.prototype = new Ember.Descriptor();
3606
3639
  var ComputedPropertyPrototype = ComputedProperty.prototype;
3607
3640
 
3608
3641
  /*
3609
- Call on a computed property to explicitly change it's cacheable mode.
3610
-
3611
- Please use `.volatile` over this method.
3612
-
3613
- ```javascript
3614
- MyApp.president = Ember.Object.create({
3615
- fullName: function() {
3616
- return this.get('firstName') + ' ' + this.get('lastName');
3617
-
3618
- // By default, Ember will return the value of this property
3619
- // without re-executing this function.
3620
- }.property('firstName', 'lastName')
3642
+ Properties are cacheable by default. Computed property will automatically
3643
+ cache the return value of your function until one of the dependent keys changes.
3621
3644
 
3622
- initials: function() {
3623
- return this.get('firstName')[0] + this.get('lastName')[0];
3645
+ Call `volatile()` to set it into non-cached mode. When in this mode
3646
+ the computed property will not automatically cache the return value.
3624
3647
 
3625
- // This function will be executed every time this property
3626
- // is requested.
3627
- }.property('firstName', 'lastName').cacheable(false)
3628
- });
3629
- ```
3648
+ However, if a property is properly observable, there is no reason to disable
3649
+ caching.
3630
3650
 
3631
3651
  @method cacheable
3632
3652
  @param {Boolean} aFlag optional set to `false` to disable caching
@@ -3890,7 +3910,6 @@ ComputedPropertyPrototype.teardown = function(obj, keyName) {
3890
3910
  The function should accept two parameters, key and value. If value is not
3891
3911
  undefined you should set the value first. In either case return the
3892
3912
  current value of the property.
3893
-
3894
3913
  @method computed
3895
3914
  @for Ember
3896
3915
  @param {Function} func The computed property function.
@@ -4132,7 +4151,7 @@ registerComputedWithProperties('or', function(properties) {
4132
4151
  @for Ember
4133
4152
  @param {String} dependentKey, [dependentKey...]
4134
4153
  @return {Ember.ComputedProperty} computed property which returns
4135
- the first trouthy value of given list of properties.
4154
+ the first truthy value of given list of properties.
4136
4155
  */
4137
4156
  registerComputedWithProperties('any', function(properties) {
4138
4157
  for (var key in properties) {
@@ -4182,6 +4201,48 @@ Ember.computed.alias = function(dependentKey) {
4182
4201
  });
4183
4202
  };
4184
4203
 
4204
+ /**
4205
+ @method computed.oneWay
4206
+ @for Ember
4207
+ @param {String} dependentKey
4208
+ @return {Ember.ComputedProperty} computed property which creates an
4209
+ one way computed property to the original value for property.
4210
+
4211
+ Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
4212
+ data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
4213
+ not mutate the upstream property, rather causes the current property to
4214
+ become the value set. This causes the downstream property to permentantly
4215
+ diverge from the upstream property.
4216
+
4217
+ ```javascript
4218
+ User = Ember.Object.extend({
4219
+ firstName: null,
4220
+ lastName: null,
4221
+ nickName: Ember.computed.oneWay('firstName')
4222
+ });
4223
+
4224
+ user = User.create({
4225
+ firstName: 'Teddy',
4226
+ lastName: 'Zeenny'
4227
+ });
4228
+
4229
+ user.get('nickName');
4230
+ # 'Teddy'
4231
+
4232
+ user.set('nickName', 'TeddyBear');
4233
+ # 'TeddyBear'
4234
+
4235
+ user.get('firstName');
4236
+ # 'Teddy'
4237
+ ```
4238
+ */
4239
+ Ember.computed.oneWay = function(dependentKey) {
4240
+ return Ember.computed(dependentKey, function() {
4241
+ return get(this, dependentKey);
4242
+ });
4243
+ };
4244
+
4245
+
4185
4246
  /**
4186
4247
  @method computed.defaultTo
4187
4248
  @for Ember
@@ -4211,8 +4272,6 @@ Ember.computed.defaultTo = function(defaultPath) {
4211
4272
  var AFTER_OBSERVERS = ':change';
4212
4273
  var BEFORE_OBSERVERS = ':before';
4213
4274
 
4214
- var guidFor = Ember.guidFor;
4215
-
4216
4275
  function changeEvent(keyName) {
4217
4276
  return keyName+AFTER_OBSERVERS;
4218
4277
  }
@@ -4272,220 +4331,544 @@ Ember._suspendBeforeObserver = function(obj, path, target, method, callback) {
4272
4331
  return Ember._suspendListener(obj, beforeEvent(path), target, method, callback);
4273
4332
  };
4274
4333
 
4275
- Ember._suspendObserver = function(obj, path, target, method, callback) {
4276
- return Ember._suspendListener(obj, changeEvent(path), target, method, callback);
4277
- };
4334
+ Ember._suspendObserver = function(obj, path, target, method, callback) {
4335
+ return Ember._suspendListener(obj, changeEvent(path), target, method, callback);
4336
+ };
4337
+
4338
+ var map = Ember.ArrayPolyfills.map;
4339
+
4340
+ Ember._suspendBeforeObservers = function(obj, paths, target, method, callback) {
4341
+ var events = map.call(paths, beforeEvent);
4342
+ return Ember._suspendListeners(obj, events, target, method, callback);
4343
+ };
4344
+
4345
+ Ember._suspendObservers = function(obj, paths, target, method, callback) {
4346
+ var events = map.call(paths, changeEvent);
4347
+ return Ember._suspendListeners(obj, events, target, method, callback);
4348
+ };
4349
+
4350
+ Ember.beforeObserversFor = function(obj, path) {
4351
+ return Ember.listenersFor(obj, beforeEvent(path));
4352
+ };
4353
+
4354
+ /**
4355
+ @method removeBeforeObserver
4356
+ @param obj
4357
+ @param {String} path
4358
+ @param {Object|Function} targetOrMethod
4359
+ @param {Function|String} [method]
4360
+ */
4361
+ Ember.removeBeforeObserver = function(obj, path, target, method) {
4362
+ Ember.unwatch(obj, path);
4363
+ Ember.removeListener(obj, beforeEvent(path), target, method);
4364
+ return this;
4365
+ };
4366
+ })();
4367
+
4368
+
4369
+
4370
+ (function() {
4371
+ define("backburner",
4372
+ ["backburner/deferred_action_queues","exports"],
4373
+ function(__dependency1__, __exports__) {
4374
+ "use strict";
4375
+ var DeferredActionQueues = __dependency1__.DeferredActionQueues;
4376
+
4377
+ var slice = [].slice,
4378
+ pop = [].pop,
4379
+ debouncees = [],
4380
+ timers = [],
4381
+ autorun, laterTimer, laterTimerExpiresAt;
4382
+
4383
+ function Backburner(queueNames, options) {
4384
+ this.queueNames = queueNames;
4385
+ this.options = options || {};
4386
+ if (!this.options.defaultQueue) {
4387
+ this.options.defaultQueue = queueNames[0];
4388
+ }
4389
+ this.instanceStack = [];
4390
+ }
4391
+
4392
+ Backburner.prototype = {
4393
+ queueNames: null,
4394
+ options: null,
4395
+ currentInstance: null,
4396
+ instanceStack: null,
4397
+
4398
+ begin: function() {
4399
+ var onBegin = this.options && this.options.onBegin,
4400
+ previousInstance = this.currentInstance;
4401
+
4402
+ if (previousInstance) {
4403
+ this.instanceStack.push(previousInstance);
4404
+ }
4405
+
4406
+ this.currentInstance = new DeferredActionQueues(this.queueNames, this.options);
4407
+ if (onBegin) {
4408
+ onBegin(this.currentInstance, previousInstance);
4409
+ }
4410
+ },
4411
+
4412
+ end: function() {
4413
+ var onEnd = this.options && this.options.onEnd,
4414
+ currentInstance = this.currentInstance,
4415
+ nextInstance = null;
4416
+
4417
+ try {
4418
+ currentInstance.flush();
4419
+ } finally {
4420
+ this.currentInstance = null;
4421
+
4422
+ if (this.instanceStack.length) {
4423
+ nextInstance = this.instanceStack.pop();
4424
+ this.currentInstance = nextInstance;
4425
+ }
4426
+
4427
+ if (onEnd) {
4428
+ onEnd(currentInstance, nextInstance);
4429
+ }
4430
+ }
4431
+ },
4432
+
4433
+ run: function(target, method /*, args */) {
4434
+ var ret;
4435
+ this.begin();
4436
+
4437
+ if (!method) {
4438
+ method = target;
4439
+ target = null;
4440
+ }
4441
+
4442
+ if (typeof method === 'string') {
4443
+ method = target[method];
4444
+ }
4445
+
4446
+ // Prevent Safari double-finally.
4447
+ var finallyAlreadyCalled = false;
4448
+ try {
4449
+ if (arguments.length > 2) {
4450
+ ret = method.apply(target, slice.call(arguments, 2));
4451
+ } else {
4452
+ ret = method.call(target);
4453
+ }
4454
+ } finally {
4455
+ if (!finallyAlreadyCalled) {
4456
+ finallyAlreadyCalled = true;
4457
+ this.end();
4458
+ }
4459
+ }
4460
+ return ret;
4461
+ },
4278
4462
 
4279
- var map = Ember.ArrayPolyfills.map;
4463
+ defer: function(queueName, target, method /* , args */) {
4464
+ if (!method) {
4465
+ method = target;
4466
+ target = null;
4467
+ }
4280
4468
 
4281
- Ember._suspendBeforeObservers = function(obj, paths, target, method, callback) {
4282
- var events = map.call(paths, beforeEvent);
4283
- return Ember._suspendListeners(obj, events, target, method, callback);
4284
- };
4469
+ if (typeof method === 'string') {
4470
+ method = target[method];
4471
+ }
4285
4472
 
4286
- Ember._suspendObservers = function(obj, paths, target, method, callback) {
4287
- var events = map.call(paths, changeEvent);
4288
- return Ember._suspendListeners(obj, events, target, method, callback);
4289
- };
4473
+ var stack = new Error().stack,
4474
+ args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
4475
+ if (!this.currentInstance) { createAutorun(this); }
4476
+ return this.currentInstance.schedule(queueName, target, method, args, false, stack);
4477
+ },
4290
4478
 
4291
- Ember.beforeObserversFor = function(obj, path) {
4292
- return Ember.listenersFor(obj, beforeEvent(path));
4293
- };
4479
+ deferOnce: function(queueName, target, method /* , args */) {
4480
+ if (!method) {
4481
+ method = target;
4482
+ target = null;
4483
+ }
4294
4484
 
4295
- /**
4296
- @method removeBeforeObserver
4297
- @param obj
4298
- @param {String} path
4299
- @param {Object|Function} targetOrMethod
4300
- @param {Function|String} [method]
4301
- */
4302
- Ember.removeBeforeObserver = function(obj, path, target, method) {
4303
- Ember.unwatch(obj, path);
4304
- Ember.removeListener(obj, beforeEvent(path), target, method);
4305
- return this;
4306
- };
4307
- })();
4485
+ if (typeof method === 'string') {
4486
+ method = target[method];
4487
+ }
4308
4488
 
4489
+ var stack = new Error().stack,
4490
+ args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
4491
+ if (!this.currentInstance) { createAutorun(this); }
4492
+ return this.currentInstance.schedule(queueName, target, method, args, true, stack);
4493
+ },
4309
4494
 
4495
+ setTimeout: function() {
4496
+ var self = this,
4497
+ wait = pop.call(arguments),
4498
+ target = arguments[0],
4499
+ method = arguments[1],
4500
+ executeAt = (+new Date()) + wait;
4310
4501
 
4311
- (function() {
4312
- // Ember.Logger
4313
- // Ember.watch.flushPending
4314
- // Ember.beginPropertyChanges, Ember.endPropertyChanges
4315
- // Ember.guidFor, Ember.tryFinally
4502
+ if (!method) {
4503
+ method = target;
4504
+ target = null;
4505
+ }
4316
4506
 
4317
- /**
4318
- @module ember-metal
4319
- */
4507
+ if (typeof method === 'string') {
4508
+ method = target[method];
4509
+ }
4320
4510
 
4321
- // ..........................................................
4322
- // HELPERS
4323
- //
4511
+ var fn, args;
4512
+ if (arguments.length > 2) {
4513
+ args = slice.call(arguments, 2);
4324
4514
 
4325
- var slice = [].slice,
4326
- forEach = Ember.ArrayPolyfills.forEach;
4515
+ fn = function() {
4516
+ method.apply(target, args);
4517
+ };
4518
+ } else {
4519
+ fn = function() {
4520
+ method.call(target);
4521
+ };
4522
+ }
4327
4523
 
4328
- // invokes passed params - normalizing so you can pass target/func,
4329
- // target/string or just func
4330
- function invoke(target, method, args, ignore) {
4524
+ // find position to insert - TODO: binary search
4525
+ var i, l;
4526
+ for (i = 0, l = timers.length; i < l; i += 2) {
4527
+ if (executeAt < timers[i]) { break; }
4528
+ }
4331
4529
 
4332
- if (method === undefined) {
4333
- method = target;
4334
- target = undefined;
4335
- }
4530
+ timers.splice(i, 0, executeAt, fn);
4336
4531
 
4337
- if ('string' === typeof method) { method = target[method]; }
4338
- if (args && ignore > 0) {
4339
- args = args.length > ignore ? slice.call(args, ignore) : null;
4340
- }
4532
+ if (laterTimer && laterTimerExpiresAt < executeAt) { return fn; }
4341
4533
 
4342
- return Ember.handleErrors(function() {
4343
- // IE8's Function.prototype.apply doesn't accept undefined/null arguments.
4344
- return method.apply(target || this, args || []);
4345
- }, this);
4346
- }
4534
+ if (laterTimer) {
4535
+ clearTimeout(laterTimer);
4536
+ laterTimer = null;
4537
+ }
4538
+ laterTimer = setTimeout(function() {
4539
+ executeTimers(self);
4540
+ laterTimer = null;
4541
+ laterTimerExpiresAt = null;
4542
+ }, wait);
4543
+ laterTimerExpiresAt = executeAt;
4544
+
4545
+ return fn;
4546
+ },
4347
4547
 
4548
+ debounce: function(target, method /* , args, wait */) {
4549
+ var self = this,
4550
+ args = arguments,
4551
+ wait = pop.call(args),
4552
+ debouncee;
4348
4553
 
4349
- // ..........................................................
4350
- // RUNLOOP
4351
- //
4554
+ for (var i = 0, l = debouncees.length; i < l; i++) {
4555
+ debouncee = debouncees[i];
4556
+ if (debouncee[0] === target && debouncee[1] === method) { return; } // do nothing
4557
+ }
4352
4558
 
4353
- /**
4354
- Ember RunLoop (Private)
4559
+ var timer = setTimeout(function() {
4560
+ self.run.apply(self, args);
4355
4561
 
4356
- @class RunLoop
4357
- @namespace Ember
4358
- @private
4359
- @constructor
4360
- */
4361
- var RunLoop = function(prev) {
4362
- this._prev = prev || null;
4363
- this.onceTimers = {};
4364
- };
4562
+ // remove debouncee
4563
+ var index = -1;
4564
+ for (var i = 0, l = debouncees.length; i < l; i++) {
4565
+ debouncee = debouncees[i];
4566
+ if (debouncee[0] === target && debouncee[1] === method) {
4567
+ index = i;
4568
+ break;
4569
+ }
4570
+ }
4365
4571
 
4366
- RunLoop.prototype = {
4367
- /**
4368
- @method end
4369
- */
4370
- end: function() {
4371
- this.flush();
4372
- },
4572
+ if (index > -1) { debouncees.splice(index, 1); }
4573
+ }, wait);
4373
4574
 
4374
- /**
4375
- @method prev
4376
- */
4377
- prev: function() {
4378
- return this._prev;
4379
- },
4575
+ debouncees.push([target, method, timer]);
4576
+ },
4380
4577
 
4381
- // ..........................................................
4382
- // Delayed Actions
4383
- //
4578
+ cancelTimers: function() {
4579
+ for (var i = 0, l = debouncees.length; i < l; i++) {
4580
+ clearTimeout(debouncees[i][2]);
4581
+ }
4582
+ debouncees = [];
4384
4583
 
4385
- /**
4386
- @method schedule
4387
- @param {String} queueName
4388
- @param target
4389
- @param method
4390
- */
4391
- schedule: function(queueName, target, method) {
4392
- var queues = this._queues, queue;
4393
- if (!queues) { queues = this._queues = {}; }
4394
- queue = queues[queueName];
4395
- if (!queue) { queue = queues[queueName] = []; }
4584
+ if (laterTimer) {
4585
+ clearTimeout(laterTimer);
4586
+ laterTimer = null;
4587
+ }
4588
+ timers = [];
4396
4589
 
4397
- var args = arguments.length > 3 ? slice.call(arguments, 3) : null;
4398
- queue.push({ target: target, method: method, args: args });
4399
- return this;
4400
- },
4590
+ if (autorun) {
4591
+ clearTimeout(autorun);
4592
+ autorun = null;
4593
+ }
4594
+ },
4401
4595
 
4402
- /**
4403
- @method flush
4404
- @param {String} queueName
4405
- */
4406
- flush: function(queueName) {
4407
- var queueNames, idx, len, queue, log;
4596
+ hasTimers: function() {
4597
+ return !!timers.length || autorun;
4598
+ },
4408
4599
 
4409
- if (!this._queues) { return this; } // nothing to do
4600
+ cancel: function(timer) {
4601
+ if (typeof timer === 'object' && timer.queue && timer.method) { // we're cancelling a deferOnce
4602
+ return timer.queue.cancel(timer);
4603
+ } else if (typeof timer === 'function') { // we're cancelling a setTimeout
4604
+ for (var i = 0, l = timers.length; i < l; i += 2) {
4605
+ if (timers[i + 1] === timer) {
4606
+ timers.splice(i, 2); // remove the two elements
4607
+ return true;
4608
+ }
4609
+ }
4610
+ }
4611
+ }
4612
+ };
4613
+
4614
+ Backburner.prototype.schedule = Backburner.prototype.defer;
4615
+ Backburner.prototype.scheduleOnce = Backburner.prototype.deferOnce;
4616
+ Backburner.prototype.later = Backburner.prototype.setTimeout;
4410
4617
 
4411
- function iter(item) {
4412
- invoke(item.target, item.method, item.args);
4618
+ function createAutorun(backburner) {
4619
+ backburner.begin();
4620
+ autorun = setTimeout(function() {
4621
+ backburner.end();
4622
+ autorun = null;
4623
+ });
4413
4624
  }
4414
4625
 
4415
- function tryable() {
4416
- forEach.call(queue, iter);
4626
+ function executeTimers(self) {
4627
+ var now = +new Date(),
4628
+ time, fns, i, l;
4629
+
4630
+ self.run(function() {
4631
+ // TODO: binary search
4632
+ for (i = 0, l = timers.length; i < l; i += 2) {
4633
+ time = timers[i];
4634
+ if (time > now) { break; }
4635
+ }
4636
+
4637
+ fns = timers.splice(0, i);
4638
+
4639
+ for (i = 1, l = fns.length; i < l; i += 2) {
4640
+ self.schedule(self.options.defaultQueue, null, fns[i]);
4641
+ }
4642
+ });
4643
+
4644
+ if (timers.length) {
4645
+ laterTimer = setTimeout(function() {
4646
+ executeTimers(self);
4647
+ laterTimer = null;
4648
+ laterTimerExpiresAt = null;
4649
+ }, timers[0] - now);
4650
+ laterTimerExpiresAt = timers[0];
4651
+ }
4417
4652
  }
4418
4653
 
4419
- Ember.watch.flushPending(); // make sure all chained watchers are setup
4420
4654
 
4421
- if (queueName) {
4422
- while (this._queues && (queue = this._queues[queueName])) {
4423
- this._queues[queueName] = null;
4655
+ __exports__.Backburner = Backburner;
4656
+ });
4657
+
4658
+ define("backburner/deferred_action_queues",
4659
+ ["backburner/queue","exports"],
4660
+ function(__dependency1__, __exports__) {
4661
+ "use strict";
4662
+ var Queue = __dependency1__.Queue;
4663
+
4664
+ function DeferredActionQueues(queueNames, options) {
4665
+ var queues = this.queues = {};
4666
+ this.queueNames = queueNames = queueNames || [];
4424
4667
 
4425
- // the sync phase is to allow property changes to propagate. don't
4426
- // invoke observers until that is finished.
4427
- if (queueName === 'sync') {
4428
- log = Ember.LOG_BINDINGS;
4429
- if (log) { Ember.Logger.log('Begin: Flush Sync Queue'); }
4668
+ var queueName;
4669
+ for (var i = 0, l = queueNames.length; i < l; i++) {
4670
+ queueName = queueNames[i];
4671
+ queues[queueName] = new Queue(this, queueName, options[queueName]);
4672
+ }
4673
+ }
4430
4674
 
4431
- Ember.beginPropertyChanges();
4675
+ DeferredActionQueues.prototype = {
4676
+ queueNames: null,
4677
+ queues: null,
4432
4678
 
4433
- Ember.tryFinally(tryable, Ember.endPropertyChanges);
4679
+ schedule: function(queueName, target, method, args, onceFlag, stack) {
4680
+ var queues = this.queues,
4681
+ queue = queues[queueName];
4434
4682
 
4435
- if (log) { Ember.Logger.log('End: Flush Sync Queue'); }
4683
+ if (!queue) { throw new Error("You attempted to schedule an action in a queue (" + queueName + ") that doesn't exist"); }
4436
4684
 
4685
+ if (onceFlag) {
4686
+ return queue.pushUnique(target, method, args, stack);
4437
4687
  } else {
4438
- forEach.call(queue, iter);
4688
+ return queue.push(target, method, args, stack);
4689
+ }
4690
+ },
4691
+
4692
+ flush: function() {
4693
+ var queues = this.queues,
4694
+ queueNames = this.queueNames,
4695
+ queueName, queue, queueItems, priorQueueNameIndex,
4696
+ queueNameIndex = 0, numberOfQueues = queueNames.length;
4697
+
4698
+ outerloop:
4699
+ while (queueNameIndex < numberOfQueues) {
4700
+ queueName = queueNames[queueNameIndex];
4701
+ queue = queues[queueName];
4702
+ queueItems = queue._queue.slice();
4703
+ queue._queue = [];
4704
+
4705
+ var options = queue.options,
4706
+ before = options && options.before,
4707
+ after = options && options.after,
4708
+ target, method, args, stack,
4709
+ queueIndex = 0, numberOfQueueItems = queueItems.length;
4710
+
4711
+ if (numberOfQueueItems && before) { before(); }
4712
+ while (queueIndex < numberOfQueueItems) {
4713
+ target = queueItems[queueIndex];
4714
+ method = queueItems[queueIndex+1];
4715
+ args = queueItems[queueIndex+2];
4716
+ stack = queueItems[queueIndex+3]; // Debugging assistance
4717
+
4718
+ if (typeof method === 'string') { method = target[method]; }
4719
+
4720
+ // TODO: error handling
4721
+ if (args && args.length > 0) {
4722
+ method.apply(target, args);
4723
+ } else {
4724
+ method.call(target);
4725
+ }
4726
+
4727
+ queueIndex += 4;
4728
+ }
4729
+ if (numberOfQueueItems && after) { after(); }
4730
+
4731
+ if ((priorQueueNameIndex = indexOfPriorQueueWithActions(this, queueNameIndex)) !== -1) {
4732
+ queueNameIndex = priorQueueNameIndex;
4733
+ continue outerloop;
4734
+ }
4735
+
4736
+ queueNameIndex++;
4439
4737
  }
4440
4738
  }
4739
+ };
4441
4740
 
4442
- } else {
4443
- queueNames = Ember.run.queues;
4444
- len = queueNames.length;
4445
- idx = 0;
4741
+ function indexOfPriorQueueWithActions(daq, currentQueueIndex) {
4742
+ var queueName, queue;
4743
+
4744
+ for (var i = 0, l = currentQueueIndex; i <= l; i++) {
4745
+ queueName = daq.queueNames[i];
4746
+ queue = daq.queues[queueName];
4747
+ if (queue._queue.length) { return i; }
4748
+ }
4749
+
4750
+ return -1;
4751
+ }
4752
+
4753
+ __exports__.DeferredActionQueues = DeferredActionQueues;
4754
+ });
4755
+
4756
+ define("backburner/queue",
4757
+ ["exports"],
4758
+ function(__exports__) {
4759
+ "use strict";
4760
+ function Queue(daq, name, options) {
4761
+ this.daq = daq;
4762
+ this.name = name;
4763
+ this.options = options;
4764
+ this._queue = [];
4765
+ }
4766
+
4767
+ Queue.prototype = {
4768
+ daq: null,
4769
+ name: null,
4770
+ options: null,
4771
+ _queue: null,
4772
+
4773
+ push: function(target, method, args, stack) {
4774
+ var queue = this._queue;
4775
+ queue.push(target, method, args, stack);
4776
+ return {queue: this, target: target, method: method};
4777
+ },
4446
4778
 
4447
- outerloop:
4448
- while (idx < len) {
4449
- queueName = queueNames[idx];
4450
- queue = this._queues && this._queues[queueName];
4451
- delete this._queues[queueName];
4779
+ pushUnique: function(target, method, args, stack) {
4780
+ var queue = this._queue, currentTarget, currentMethod, i, l;
4452
4781
 
4453
- if (queue) {
4454
- // the sync phase is to allow property changes to propagate. don't
4455
- // invoke observers until that is finished.
4456
- if (queueName === 'sync') {
4457
- log = Ember.LOG_BINDINGS;
4458
- if (log) { Ember.Logger.log('Begin: Flush Sync Queue'); }
4782
+ for (i = 0, l = queue.length; i < l; i += 4) {
4783
+ currentTarget = queue[i];
4784
+ currentMethod = queue[i+1];
4459
4785
 
4460
- Ember.beginPropertyChanges();
4786
+ if (currentTarget === target && currentMethod === method) {
4787
+ queue[i+2] = args; // replace args
4788
+ queue[i+3] = stack; // replace stack
4789
+ return {queue: this, target: target, method: method}; // TODO: test this code path
4790
+ }
4791
+ }
4461
4792
 
4462
- Ember.tryFinally(tryable, Ember.endPropertyChanges);
4793
+ this._queue.push(target, method, args, stack);
4794
+ return {queue: this, target: target, method: method};
4795
+ },
4463
4796
 
4464
- if (log) { Ember.Logger.log('End: Flush Sync Queue'); }
4797
+ // TODO: remove me, only being used for Ember.run.sync
4798
+ flush: function() {
4799
+ var queue = this._queue,
4800
+ options = this.options,
4801
+ before = options && options.before,
4802
+ after = options && options.after,
4803
+ target, method, args, stack, i, l = queue.length;
4804
+
4805
+ if (l && before) { before(); }
4806
+ for (i = 0; i < l; i += 4) {
4807
+ target = queue[i];
4808
+ method = queue[i+1];
4809
+ args = queue[i+2];
4810
+ stack = queue[i+3]; // Debugging assistance
4811
+
4812
+ // TODO: error handling
4813
+ if (args && args.length > 0) {
4814
+ method.apply(target, args);
4465
4815
  } else {
4466
- forEach.call(queue, iter);
4816
+ method.call(target);
4467
4817
  }
4468
4818
  }
4819
+ if (l && after) { after(); }
4469
4820
 
4470
- // Loop through prior queues
4471
- for (var i = 0; i <= idx; i++) {
4472
- if (this._queues && this._queues[queueNames[i]]) {
4473
- // Start over at the first queue with contents
4474
- idx = i;
4475
- continue outerloop;
4476
- }
4821
+ // check if new items have been added
4822
+ if (queue.length > l) {
4823
+ this._queue = queue.slice(l);
4824
+ this.flush();
4825
+ } else {
4826
+ this._queue.length = 0;
4477
4827
  }
4828
+ },
4829
+
4830
+ cancel: function(actionToCancel) {
4831
+ var queue = this._queue, currentTarget, currentMethod, i, l;
4478
4832
 
4479
- idx++;
4833
+ for (i = 0, l = queue.length; i < l; i += 4) {
4834
+ currentTarget = queue[i];
4835
+ currentMethod = queue[i+1];
4836
+
4837
+ if (currentTarget === actionToCancel.target && currentMethod === actionToCancel.method) {
4838
+ queue.splice(i, 4);
4839
+ return true;
4840
+ }
4841
+ }
4480
4842
  }
4481
- }
4843
+ };
4844
+
4845
+ __exports__.Queue = Queue;
4846
+ });
4847
+
4848
+ })();
4849
+
4482
4850
 
4483
- return this;
4484
- }
4485
4851
 
4852
+ (function() {
4853
+ var onBegin = function(current) {
4854
+ Ember.run.currentRunLoop = current;
4855
+ };
4856
+
4857
+ var onEnd = function(current, next) {
4858
+ Ember.run.currentRunLoop = next;
4486
4859
  };
4487
4860
 
4488
- Ember.RunLoop = RunLoop;
4861
+ var Backburner = requireModule('backburner').Backburner,
4862
+ backburner = new Backburner(['sync', 'actions', 'destroy'], {
4863
+ sync: {
4864
+ before: Ember.beginPropertyChanges,
4865
+ after: Ember.endPropertyChanges
4866
+ },
4867
+ defaultQueue: 'actions',
4868
+ onBegin: onBegin,
4869
+ onEnd: onEnd
4870
+ }),
4871
+ slice = [].slice;
4489
4872
 
4490
4873
  // ..........................................................
4491
4874
  // Ember.run - this is ideally the only public API the dev sees
@@ -4519,20 +4902,76 @@ Ember.RunLoop = RunLoop;
4519
4902
  @return {Object} return value from invoking the passed function.
4520
4903
  */
4521
4904
  Ember.run = function(target, method) {
4522
- var args = arguments;
4523
- run.begin();
4905
+ var ret;
4524
4906
 
4525
- function tryable() {
4526
- if (target || method) {
4527
- return invoke(target, method, args, 2);
4907
+ if (Ember.onerror) {
4908
+ try {
4909
+ ret = backburner.run.apply(backburner, arguments);
4910
+ } catch (e) {
4911
+ Ember.onerror(e);
4528
4912
  }
4913
+ } else {
4914
+ ret = backburner.run.apply(backburner, arguments);
4529
4915
  }
4530
4916
 
4531
- return Ember.tryFinally(tryable, run.end);
4917
+ return ret;
4918
+ };
4919
+
4920
+ /**
4921
+
4922
+ If no run-loop is present, it creates a new one. If a run loop is
4923
+ present it will queue itself to run on the existing run-loops action
4924
+ queue.
4925
+
4926
+ Please note: This is not for normal usage, and should be used sparingly.
4927
+
4928
+ If invoked when not within a run loop:
4929
+
4930
+ ```javascript
4931
+ Ember.run.join(function(){
4932
+ // creates a new run-loop
4933
+ });
4934
+ ```
4935
+
4936
+ Alternatively, if called within an existing run loop:
4937
+
4938
+ ```javascript
4939
+ Ember.run(function(){
4940
+ // creates a new run-loop
4941
+ Ember.run.join(function(){
4942
+ // joins with the existing run-loop, and queues for invocation on
4943
+ // the existing run-loops action queue.
4944
+ });
4945
+ });
4946
+ ```
4947
+
4948
+ @method join
4949
+ @namespace Ember
4950
+ @param {Object} [target] target of method to call
4951
+ @param {Function|String} method Method to invoke.
4952
+ May be a function or a string. If you pass a string
4953
+ then it will be looked up on the passed target.
4954
+ @param {Object} [args*] Any additional arguments you wish to pass to the method.
4955
+ @return {Object} return value from invoking the passed function. Please note,
4956
+ when called within an existing loop, no return value is possible.
4957
+ */
4958
+ Ember.run.join = function(target, method) {
4959
+ if (!Ember.run.currentRunLoop) {
4960
+ return Ember.run.apply(Ember.run, arguments);
4961
+ }
4962
+
4963
+ var args = slice.call(arguments);
4964
+ args.unshift('actions');
4965
+ Ember.run.schedule.apply(Ember.run, args);
4532
4966
  };
4533
4967
 
4968
+ Ember.run.backburner = backburner;
4969
+
4534
4970
  var run = Ember.run;
4535
4971
 
4972
+ Ember.run.currentRunLoop = null;
4973
+
4974
+ Ember.run.queues = backburner.queueNames;
4536
4975
 
4537
4976
  /**
4538
4977
  Begins a new RunLoop. Any deferred actions invoked after the begin will
@@ -4549,7 +4988,7 @@ var run = Ember.run;
4549
4988
  @return {void}
4550
4989
  */
4551
4990
  Ember.run.begin = function() {
4552
- run.currentRunLoop = new RunLoop(run.currentRunLoop);
4991
+ backburner.begin();
4553
4992
  };
4554
4993
 
4555
4994
  /**
@@ -4567,12 +5006,7 @@ Ember.run.begin = function() {
4567
5006
  @return {void}
4568
5007
  */
4569
5008
  Ember.run.end = function() {
4570
-
4571
-
4572
- function tryable() { run.currentRunLoop.end(); }
4573
- function finalizer() { run.currentRunLoop = run.currentRunLoop.prev(); }
4574
-
4575
- Ember.tryFinally(tryable, finalizer);
5009
+ backburner.end();
4576
5010
  };
4577
5011
 
4578
5012
  /**
@@ -4585,7 +5019,6 @@ Ember.run.end = function() {
4585
5019
  @type Array
4586
5020
  @default ['sync', 'actions', 'destroy']
4587
5021
  */
4588
- Ember.run.queues = ['sync', 'actions', 'destroy'];
4589
5022
 
4590
5023
  /**
4591
5024
  Adds the passed target/method and any optional arguments to the named
@@ -4624,57 +5057,18 @@ Ember.run.queues = ['sync', 'actions', 'destroy'];
4624
5057
  @return {void}
4625
5058
  */
4626
5059
  Ember.run.schedule = function(queue, target, method) {
4627
- var loop = run.autorun();
4628
- loop.schedule.apply(loop, arguments);
5060
+ checkAutoRun();
5061
+ backburner.schedule.apply(backburner, arguments);
4629
5062
  };
4630
5063
 
4631
- var scheduledAutorun;
4632
- function autorun() {
4633
- scheduledAutorun = null;
4634
- if (run.currentRunLoop) { run.end(); }
4635
- }
4636
-
4637
5064
  // Used by global test teardown
4638
5065
  Ember.run.hasScheduledTimers = function() {
4639
- return !!(scheduledAutorun || scheduledLater);
5066
+ return backburner.hasTimers();
4640
5067
  };
4641
5068
 
4642
5069
  // Used by global test teardown
4643
5070
  Ember.run.cancelTimers = function () {
4644
- if (scheduledAutorun) {
4645
- clearTimeout(scheduledAutorun);
4646
- scheduledAutorun = null;
4647
- }
4648
- if (scheduledLater) {
4649
- clearTimeout(scheduledLater);
4650
- scheduledLater = null;
4651
- }
4652
- timers = {};
4653
- };
4654
-
4655
- /**
4656
- Begins a new RunLoop if necessary and schedules a timer to flush the
4657
- RunLoop at a later time. This method is used by parts of Ember to
4658
- ensure the RunLoop always finishes. You normally do not need to call this
4659
- method directly. Instead use `Ember.run()`
4660
-
4661
- @method autorun
4662
- @example
4663
- Ember.run.autorun();
4664
- @return {Ember.RunLoop} the new current RunLoop
4665
- */
4666
- Ember.run.autorun = function() {
4667
- if (!run.currentRunLoop) {
4668
-
4669
-
4670
- run.begin();
4671
-
4672
- if (!scheduledAutorun) {
4673
- scheduledAutorun = setTimeout(autorun, 1);
4674
- }
4675
- }
4676
-
4677
- return run.currentRunLoop;
5071
+ backburner.cancelTimers();
4678
5072
  };
4679
5073
 
4680
5074
  /**
@@ -4694,42 +5088,9 @@ Ember.run.autorun = function() {
4694
5088
  @return {void}
4695
5089
  */
4696
5090
  Ember.run.sync = function() {
4697
- run.autorun();
4698
- run.currentRunLoop.flush('sync');
5091
+ backburner.currentInstance.queues.sync.flush();
4699
5092
  };
4700
5093
 
4701
- // ..........................................................
4702
- // TIMERS
4703
- //
4704
-
4705
- var timers = {}; // active timers...
4706
-
4707
- var scheduledLater, scheduledLaterExpires;
4708
- function invokeLaterTimers() {
4709
- scheduledLater = null;
4710
- run(function() {
4711
- var now = (+ new Date()), earliest = -1;
4712
- for (var key in timers) {
4713
- if (!timers.hasOwnProperty(key)) { continue; }
4714
- var timer = timers[key];
4715
- if (timer && timer.expires) {
4716
- if (now >= timer.expires) {
4717
- delete timers[key];
4718
- invoke(timer.target, timer.method, timer.args, 2);
4719
- } else {
4720
- if (earliest < 0 || (timer.expires < earliest)) { earliest = timer.expires; }
4721
- }
4722
- }
4723
- }
4724
-
4725
- // schedule next timeout to fire when the earliest timer expires
4726
- if (earliest > 0) {
4727
- scheduledLater = setTimeout(invokeLaterTimers, earliest - now);
4728
- scheduledLaterExpires = earliest;
4729
- }
4730
- });
4731
- }
4732
-
4733
5094
  /**
4734
5095
  Invokes the passed target/method and optional arguments after a specified
4735
5096
  period if time. The last parameter of this method must always be a number
@@ -4741,89 +5102,24 @@ function invokeLaterTimers() {
4741
5102
  together, which is often more efficient than using a real setTimeout.
4742
5103
 
4743
5104
  ```javascript
4744
- Ember.run.later(myContext, function(){
4745
- // code here will execute within a RunLoop in about 500ms with this == myContext
4746
- }, 500);
4747
- ```
4748
-
4749
- @method later
4750
- @param {Object} [target] target of method to invoke
4751
- @param {Function|String} method The method to invoke.
4752
- If you pass a string it will be resolved on the
4753
- target at the time the method is invoked.
4754
- @param {Object} [args*] Optional arguments to pass to the timeout.
4755
- @param {Number} wait Number of milliseconds to wait.
4756
- @return {String} a string you can use to cancel the timer in
4757
- {{#crossLink "Ember/run.cancel"}}{{/crossLink}} later.
4758
- */
4759
- Ember.run.later = function(target, method) {
4760
- var args, expires, timer, guid, wait;
4761
-
4762
- // setTimeout compatibility...
4763
- if (arguments.length===2 && 'function' === typeof target) {
4764
- wait = method;
4765
- method = target;
4766
- target = undefined;
4767
- args = [target, method];
4768
- } else {
4769
- args = slice.call(arguments);
4770
- wait = args.pop();
4771
- }
4772
-
4773
- expires = (+ new Date()) + wait;
4774
- timer = { target: target, method: method, expires: expires, args: args };
4775
- guid = Ember.guidFor(timer);
4776
- timers[guid] = timer;
4777
-
4778
- if(scheduledLater && expires < scheduledLaterExpires) {
4779
- // Cancel later timer (then reschedule earlier timer below)
4780
- clearTimeout(scheduledLater);
4781
- scheduledLater = null;
4782
- }
4783
-
4784
- if (!scheduledLater) {
4785
- // Schedule later timers to be run.
4786
- scheduledLater = setTimeout(invokeLaterTimers, wait);
4787
- scheduledLaterExpires = expires;
4788
- }
4789
-
4790
- return guid;
4791
- };
4792
-
4793
- function invokeOnceTimer(guid, onceTimers) {
4794
- if (onceTimers[this.tguid]) { delete onceTimers[this.tguid][this.mguid]; }
4795
- if (timers[guid]) { invoke(this.target, this.method, this.args); }
4796
- delete timers[guid];
4797
- }
4798
-
4799
- function scheduleOnce(queue, target, method, args) {
4800
- var tguid = Ember.guidFor(target),
4801
- mguid = Ember.guidFor(method),
4802
- onceTimers = run.autorun().onceTimers,
4803
- guid = onceTimers[tguid] && onceTimers[tguid][mguid],
4804
- timer;
4805
-
4806
- if (guid && timers[guid]) {
4807
- timers[guid].args = args; // replace args
4808
- } else {
4809
- timer = {
4810
- target: target,
4811
- method: method,
4812
- args: args,
4813
- tguid: tguid,
4814
- mguid: mguid
4815
- };
4816
-
4817
- guid = Ember.guidFor(timer);
4818
- timers[guid] = timer;
4819
- if (!onceTimers[tguid]) { onceTimers[tguid] = {}; }
4820
- onceTimers[tguid][mguid] = guid; // so it isn't scheduled more than once
4821
-
4822
- run.schedule(queue, timer, invokeOnceTimer, guid, onceTimers);
4823
- }
5105
+ Ember.run.later(myContext, function(){
5106
+ // code here will execute within a RunLoop in about 500ms with this == myContext
5107
+ }, 500);
5108
+ ```
4824
5109
 
4825
- return guid;
4826
- }
5110
+ @method later
5111
+ @param {Object} [target] target of method to invoke
5112
+ @param {Function|String} method The method to invoke.
5113
+ If you pass a string it will be resolved on the
5114
+ target at the time the method is invoked.
5115
+ @param {Object} [args*] Optional arguments to pass to the timeout.
5116
+ @param {Number} wait Number of milliseconds to wait.
5117
+ @return {String} a string you can use to cancel the timer in
5118
+ `Ember.run.cancel` later.
5119
+ */
5120
+ Ember.run.later = function(target, method) {
5121
+ return backburner.later.apply(backburner, arguments);
5122
+ };
4827
5123
 
4828
5124
  /**
4829
5125
  Schedule a function to run one time during the current RunLoop. This is equivalent
@@ -4838,7 +5134,10 @@ function scheduleOnce(queue, target, method, args) {
4838
5134
  @return {Object} timer
4839
5135
  */
4840
5136
  Ember.run.once = function(target, method) {
4841
- return scheduleOnce('actions', target, method, slice.call(arguments, 2));
5137
+ checkAutoRun();
5138
+ var args = slice.call(arguments);
5139
+ args.unshift('actions');
5140
+ return backburner.scheduleOnce.apply(backburner, args);
4842
5141
  };
4843
5142
 
4844
5143
  /**
@@ -4886,12 +5185,13 @@ Ember.run.once = function(target, method) {
4886
5185
  @return {Object} timer
4887
5186
  */
4888
5187
  Ember.run.scheduleOnce = function(queue, target, method) {
4889
- return scheduleOnce(queue, target, method, slice.call(arguments, 3));
5188
+ checkAutoRun();
5189
+ return backburner.scheduleOnce.apply(backburner, arguments);
4890
5190
  };
4891
5191
 
4892
5192
  /**
4893
- Schedules an item to run from within a separate run loop, after
4894
- control has been returned to the system. This is equivalent to calling
5193
+ Schedules an item to run from within a separate run loop, after
5194
+ control has been returned to the system. This is equivalent to calling
4895
5195
  `Ember.run.later` with a wait time of 1ms.
4896
5196
 
4897
5197
  ```javascript
@@ -4903,7 +5203,7 @@ Ember.run.scheduleOnce = function(queue, target, method) {
4903
5203
  Multiple operations scheduled with `Ember.run.next` will coalesce
4904
5204
  into the same later run loop, along with any other operations
4905
5205
  scheduled by `Ember.run.later` that expire right around the same
4906
- time that `Ember.run.next` operations will fire.
5206
+ time that `Ember.run.next` operations will fire.
4907
5207
 
4908
5208
  Note that there are often alternatives to using `Ember.run.next`.
4909
5209
  For instance, if you'd like to schedule an operation to happen
@@ -4929,13 +5229,13 @@ Ember.run.scheduleOnce = function(queue, target, method) {
4929
5229
 
4930
5230
  One benefit of the above approach compared to using `Ember.run.next` is
4931
5231
  that you will be able to perform DOM/CSS operations before unprocessed
4932
- elements are rendered to the screen, which may prevent flickering or
5232
+ elements are rendered to the screen, which may prevent flickering or
4933
5233
  other artifacts caused by delaying processing until after rendering.
4934
5234
 
4935
- The other major benefit to the above approach is that `Ember.run.next`
4936
- introduces an element of non-determinism, which can make things much
4937
- harder to test, due to its reliance on `setTimeout`; it's much harder
4938
- to guarantee the order of scheduled operations when they are scheduled
5235
+ The other major benefit to the above approach is that `Ember.run.next`
5236
+ introduces an element of non-determinism, which can make things much
5237
+ harder to test, due to its reliance on `setTimeout`; it's much harder
5238
+ to guarantee the order of scheduled operations when they are scheduled
4939
5239
  outside of the current run loop, i.e. with `Ember.run.next`.
4940
5240
 
4941
5241
  @method next
@@ -4948,8 +5248,8 @@ Ember.run.scheduleOnce = function(queue, target, method) {
4948
5248
  */
4949
5249
  Ember.run.next = function() {
4950
5250
  var args = slice.call(arguments);
4951
- args.push(1); // 1 millisecond wait
4952
- return run.later.apply(this, args);
5251
+ args.push(1);
5252
+ return backburner.later.apply(backburner, args);
4953
5253
  };
4954
5254
 
4955
5255
  /**
@@ -4978,9 +5278,16 @@ Ember.run.next = function() {
4978
5278
  @return {void}
4979
5279
  */
4980
5280
  Ember.run.cancel = function(timer) {
4981
- delete timers[timer];
5281
+ return backburner.cancel(timer);
4982
5282
  };
4983
5283
 
5284
+ // Make sure it's not an autorun during testing
5285
+ function checkAutoRun() {
5286
+ if (!Ember.run.currentRunLoop) {
5287
+
5288
+ }
5289
+ }
5290
+
4984
5291
  })();
4985
5292
 
4986
5293
 
@@ -5265,7 +5572,7 @@ function mixinProperties(to, from) {
5265
5572
  mixinProperties(Binding, {
5266
5573
 
5267
5574
  /**
5268
- See {{#crossLink "Ember.Binding/from"}}{{/crossLink}}
5575
+ See `Ember.Binding.from`.
5269
5576
 
5270
5577
  @method from
5271
5578
  @static
@@ -5276,7 +5583,7 @@ mixinProperties(Binding, {
5276
5583
  },
5277
5584
 
5278
5585
  /**
5279
- See {{#crossLink "Ember.Binding/to"}}{{/crossLink}}
5586
+ See `Ember.Binding.to`.
5280
5587
 
5281
5588
  @method to
5282
5589
  @static
@@ -5293,7 +5600,7 @@ mixinProperties(Binding, {
5293
5600
  This means that if you change the "to" side directly, the "from" side may have
5294
5601
  a different value.
5295
5602
 
5296
- See {{#crossLink "Binding/oneWay"}}{{/crossLink}}
5603
+ See `Binding.oneWay`.
5297
5604
 
5298
5605
  @method oneWay
5299
5606
  @param {String} from from path.
@@ -5354,7 +5661,7 @@ mixinProperties(Binding, {
5354
5661
 
5355
5662
  You should consider using one way bindings anytime you have an object that
5356
5663
  may be created frequently and you do not intend to change a property; only
5357
- to monitor it for changes. (such as in the example above).
5664
+ to monitor it for changes (such as in the example above).
5358
5665
 
5359
5666
  ## Adding Bindings Manually
5360
5667
 
@@ -5655,14 +5962,6 @@ function mergeMixins(mixins, m, descs, values, base, keys) {
5655
5962
  }
5656
5963
  }
5657
5964
 
5658
- function writableReq(obj) {
5659
- var m = Ember.meta(obj), req = m.required;
5660
- if (!req || !m.hasOwnProperty('required')) {
5661
- req = m.required = req ? o_create(req) : {};
5662
- }
5663
- return req;
5664
- }
5665
-
5666
5965
  var IS_BINDING = Ember.IS_BINDING = /^.+Binding$/;
5667
5966
 
5668
5967
  function detectBinding(obj, key, value, m) {
@@ -6148,14 +6447,57 @@ Ember Metal
6148
6447
  })();
6149
6448
 
6150
6449
  (function() {
6151
- define("rsvp",
6152
- [],
6153
- function() {
6450
+ define("rsvp/all",
6451
+ ["rsvp/defer","exports"],
6452
+ function(__dependency1__, __exports__) {
6453
+ "use strict";
6454
+ var defer = __dependency1__.defer;
6455
+
6456
+ function all(promises) {
6457
+ var results = [], deferred = defer(), remaining = promises.length;
6458
+
6459
+ if (remaining === 0) {
6460
+ deferred.resolve([]);
6461
+ }
6462
+
6463
+ var resolver = function(index) {
6464
+ return function(value) {
6465
+ resolveAll(index, value);
6466
+ };
6467
+ };
6468
+
6469
+ var resolveAll = function(index, value) {
6470
+ results[index] = value;
6471
+ if (--remaining === 0) {
6472
+ deferred.resolve(results);
6473
+ }
6474
+ };
6475
+
6476
+ var rejectAll = function(error) {
6477
+ deferred.reject(error);
6478
+ };
6479
+
6480
+ for (var i = 0; i < promises.length; i++) {
6481
+ if (promises[i] && typeof promises[i].then === 'function') {
6482
+ promises[i].then(resolver(i), rejectAll);
6483
+ } else {
6484
+ resolveAll(i, promises[i]);
6485
+ }
6486
+ }
6487
+ return deferred.promise;
6488
+ }
6489
+
6490
+ __exports__.all = all;
6491
+ });
6492
+
6493
+ define("rsvp/async",
6494
+ ["exports"],
6495
+ function(__exports__) {
6154
6496
  "use strict";
6155
6497
  var browserGlobal = (typeof window !== 'undefined') ? window : {};
6156
6498
 
6157
- var MutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
6158
- var RSVP, async;
6499
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
6500
+ var async;
6159
6501
 
6160
6502
  if (typeof process !== 'undefined' &&
6161
6503
  {}.toString.call(process) === '[object process]') {
@@ -6164,10 +6506,10 @@ define("rsvp",
6164
6506
  callback.call(binding);
6165
6507
  });
6166
6508
  };
6167
- } else if (MutationObserver) {
6509
+ } else if (BrowserMutationObserver) {
6168
6510
  var queue = [];
6169
6511
 
6170
- var observer = new MutationObserver(function() {
6512
+ var observer = new BrowserMutationObserver(function() {
6171
6513
  var toProcess = queue.slice();
6172
6514
  queue = [];
6173
6515
 
@@ -6198,6 +6540,47 @@ define("rsvp",
6198
6540
  };
6199
6541
  }
6200
6542
 
6543
+
6544
+ __exports__.async = async;
6545
+ });
6546
+
6547
+ define("rsvp/config",
6548
+ ["rsvp/async","exports"],
6549
+ function(__dependency1__, __exports__) {
6550
+ "use strict";
6551
+ var async = __dependency1__.async;
6552
+
6553
+ var config = {};
6554
+ config.async = async;
6555
+
6556
+ __exports__.config = config;
6557
+ });
6558
+
6559
+ define("rsvp/defer",
6560
+ ["rsvp/promise","exports"],
6561
+ function(__dependency1__, __exports__) {
6562
+ "use strict";
6563
+ var Promise = __dependency1__.Promise;
6564
+
6565
+ function defer() {
6566
+ var deferred = {};
6567
+
6568
+ var promise = new Promise(function(resolve, reject) {
6569
+ deferred.resolve = resolve;
6570
+ deferred.reject = reject;
6571
+ });
6572
+
6573
+ deferred.promise = promise;
6574
+ return deferred;
6575
+ }
6576
+
6577
+ __exports__.defer = defer;
6578
+ });
6579
+
6580
+ define("rsvp/events",
6581
+ ["exports"],
6582
+ function(__exports__) {
6583
+ "use strict";
6201
6584
  var Event = function(type, options) {
6202
6585
  this.type = type;
6203
6586
 
@@ -6292,7 +6675,148 @@ define("rsvp",
6292
6675
  }
6293
6676
  };
6294
6677
 
6295
- var Promise = function() {
6678
+
6679
+ __exports__.EventTarget = EventTarget;
6680
+ });
6681
+
6682
+ define("rsvp/hash",
6683
+ ["rsvp/defer","exports"],
6684
+ function(__dependency1__, __exports__) {
6685
+ "use strict";
6686
+ var defer = __dependency1__.defer;
6687
+
6688
+ function size(object) {
6689
+ var size = 0;
6690
+
6691
+ for (var prop in object) {
6692
+ size++;
6693
+ }
6694
+
6695
+ return size;
6696
+ }
6697
+
6698
+ function hash(promises) {
6699
+ var results = {}, deferred = defer(), remaining = size(promises);
6700
+
6701
+ if (remaining === 0) {
6702
+ deferred.resolve({});
6703
+ }
6704
+
6705
+ var resolver = function(prop) {
6706
+ return function(value) {
6707
+ resolveAll(prop, value);
6708
+ };
6709
+ };
6710
+
6711
+ var resolveAll = function(prop, value) {
6712
+ results[prop] = value;
6713
+ if (--remaining === 0) {
6714
+ deferred.resolve(results);
6715
+ }
6716
+ };
6717
+
6718
+ var rejectAll = function(error) {
6719
+ deferred.reject(error);
6720
+ };
6721
+
6722
+ for (var prop in promises) {
6723
+ if (promises[prop] && typeof promises[prop].then === 'function') {
6724
+ promises[prop].then(resolver(prop), rejectAll);
6725
+ } else {
6726
+ resolveAll(prop, promises[prop]);
6727
+ }
6728
+ }
6729
+
6730
+ return deferred.promise;
6731
+ }
6732
+
6733
+ __exports__.hash = hash;
6734
+ });
6735
+
6736
+ define("rsvp/node",
6737
+ ["rsvp/promise","rsvp/all","exports"],
6738
+ function(__dependency1__, __dependency2__, __exports__) {
6739
+ "use strict";
6740
+ var Promise = __dependency1__.Promise;
6741
+ var all = __dependency2__.all;
6742
+
6743
+ function makeNodeCallbackFor(resolve, reject) {
6744
+ return function (error, value) {
6745
+ if (error) {
6746
+ reject(error);
6747
+ } else if (arguments.length > 2) {
6748
+ resolve(Array.prototype.slice.call(arguments, 1));
6749
+ } else {
6750
+ resolve(value);
6751
+ }
6752
+ };
6753
+ }
6754
+
6755
+ function denodeify(nodeFunc) {
6756
+ return function() {
6757
+ var nodeArgs = Array.prototype.slice.call(arguments), resolve, reject;
6758
+
6759
+ var promise = new Promise(function(nodeResolve, nodeReject) {
6760
+ resolve = nodeResolve;
6761
+ reject = nodeReject;
6762
+ });
6763
+
6764
+ all(nodeArgs).then(function(nodeArgs) {
6765
+ nodeArgs.push(makeNodeCallbackFor(resolve, reject));
6766
+
6767
+ try {
6768
+ nodeFunc.apply(this, nodeArgs);
6769
+ } catch(e) {
6770
+ reject(e);
6771
+ }
6772
+ });
6773
+
6774
+ return promise;
6775
+ };
6776
+ }
6777
+
6778
+ __exports__.denodeify = denodeify;
6779
+ });
6780
+
6781
+ define("rsvp/promise",
6782
+ ["rsvp/config","rsvp/events","exports"],
6783
+ function(__dependency1__, __dependency2__, __exports__) {
6784
+ "use strict";
6785
+ var config = __dependency1__.config;
6786
+ var EventTarget = __dependency2__.EventTarget;
6787
+
6788
+ function objectOrFunction(x) {
6789
+ return isFunction(x) || (typeof x === "object" && x !== null);
6790
+ }
6791
+
6792
+ function isFunction(x){
6793
+ return typeof x === "function";
6794
+ }
6795
+
6796
+ var Promise = function(resolver) {
6797
+ var promise = this,
6798
+ resolved = false;
6799
+
6800
+ if (typeof resolver !== 'function') {
6801
+ throw new TypeError('You must pass a resolver function as the sole argument to the promise constructor');
6802
+ }
6803
+
6804
+ if (!(promise instanceof Promise)) {
6805
+ return new Promise(resolver);
6806
+ }
6807
+
6808
+ var resolvePromise = function(value) {
6809
+ if (resolved) { return; }
6810
+ resolved = true;
6811
+ resolve(promise, value);
6812
+ };
6813
+
6814
+ var rejectPromise = function(value) {
6815
+ if (resolved) { return; }
6816
+ resolved = true;
6817
+ reject(promise, value);
6818
+ };
6819
+
6296
6820
  this.on('promise:resolved', function(event) {
6297
6821
  this.trigger('success', { detail: event.detail });
6298
6822
  }, this);
@@ -6300,12 +6824,16 @@ define("rsvp",
6300
6824
  this.on('promise:failed', function(event) {
6301
6825
  this.trigger('error', { detail: event.detail });
6302
6826
  }, this);
6303
- };
6304
6827
 
6305
- var noop = function() {};
6828
+ try {
6829
+ resolver(resolvePromise, rejectPromise);
6830
+ } catch(e) {
6831
+ rejectPromise(e);
6832
+ }
6833
+ };
6306
6834
 
6307
6835
  var invokeCallback = function(type, promise, callback, event) {
6308
- var hasCallback = typeof callback === 'function',
6836
+ var hasCallback = isFunction(callback),
6309
6837
  value, error, succeeded, failed;
6310
6838
 
6311
6839
  if (hasCallback) {
@@ -6321,34 +6849,34 @@ define("rsvp",
6321
6849
  succeeded = true;
6322
6850
  }
6323
6851
 
6324
- if (value && typeof value.then === 'function') {
6325
- value.then(function(value) {
6326
- promise.resolve(value);
6327
- }, function(error) {
6328
- promise.reject(error);
6329
- });
6852
+ if (handleThenable(promise, value)) {
6853
+ return;
6330
6854
  } else if (hasCallback && succeeded) {
6331
- promise.resolve(value);
6855
+ resolve(promise, value);
6332
6856
  } else if (failed) {
6333
- promise.reject(error);
6334
- } else {
6335
- promise[type](value);
6857
+ reject(promise, error);
6858
+ } else if (type === 'resolve') {
6859
+ resolve(promise, value);
6860
+ } else if (type === 'reject') {
6861
+ reject(promise, value);
6336
6862
  }
6337
6863
  };
6338
6864
 
6339
6865
  Promise.prototype = {
6866
+ constructor: Promise,
6867
+
6340
6868
  then: function(done, fail) {
6341
- var thenPromise = new Promise();
6869
+ var thenPromise = new Promise(function() {});
6342
6870
 
6343
- if (this.isResolved) {
6344
- RSVP.async(function() {
6345
- invokeCallback('resolve', thenPromise, done, { detail: this.resolvedValue });
6871
+ if (this.isFulfilled) {
6872
+ config.async(function() {
6873
+ invokeCallback('resolve', thenPromise, done, { detail: this.fulfillmentValue });
6346
6874
  }, this);
6347
6875
  }
6348
6876
 
6349
6877
  if (this.isRejected) {
6350
- RSVP.async(function() {
6351
- invokeCallback('reject', thenPromise, fail, { detail: this.rejectedValue });
6878
+ config.async(function() {
6879
+ invokeCallback('reject', thenPromise, fail, { detail: this.rejectedReason });
6352
6880
  }, this);
6353
6881
  }
6354
6882
 
@@ -6361,75 +6889,162 @@ define("rsvp",
6361
6889
  });
6362
6890
 
6363
6891
  return thenPromise;
6364
- },
6892
+ }
6893
+ };
6365
6894
 
6366
- resolve: function(value) {
6367
- resolve(this, value);
6895
+ EventTarget.mixin(Promise.prototype);
6368
6896
 
6369
- this.resolve = noop;
6370
- this.reject = noop;
6371
- },
6897
+ function resolve(promise, value) {
6898
+ if (promise === value) {
6899
+ fulfill(promise, value);
6900
+ } else if (!handleThenable(promise, value)) {
6901
+ fulfill(promise, value);
6902
+ }
6903
+ }
6904
+
6905
+ function handleThenable(promise, value) {
6906
+ var then = null;
6372
6907
 
6373
- reject: function(value) {
6374
- reject(this, value);
6908
+ if (objectOrFunction(value)) {
6909
+ try {
6910
+ then = value.then;
6911
+ } catch(e) {
6912
+ reject(promise, e);
6913
+ return true;
6914
+ }
6375
6915
 
6376
- this.resolve = noop;
6377
- this.reject = noop;
6916
+ if (isFunction(then)) {
6917
+ try {
6918
+ then.call(value, function(val) {
6919
+ if (value !== val) {
6920
+ resolve(promise, val);
6921
+ } else {
6922
+ fulfill(promise, val);
6923
+ }
6924
+ }, function(val) {
6925
+ reject(promise, val);
6926
+ });
6927
+ } catch (e) {
6928
+ reject(promise, e);
6929
+ }
6930
+ return true;
6931
+ }
6378
6932
  }
6379
- };
6380
6933
 
6381
- function resolve(promise, value) {
6382
- RSVP.async(function() {
6934
+ return false;
6935
+ }
6936
+
6937
+ function fulfill(promise, value) {
6938
+ config.async(function() {
6383
6939
  promise.trigger('promise:resolved', { detail: value });
6384
- promise.isResolved = true;
6385
- promise.resolvedValue = value;
6940
+ promise.isFulfilled = true;
6941
+ promise.fulfillmentValue = value;
6386
6942
  });
6387
6943
  }
6388
6944
 
6389
6945
  function reject(promise, value) {
6390
- RSVP.async(function() {
6946
+ config.async(function() {
6391
6947
  promise.trigger('promise:failed', { detail: value });
6392
6948
  promise.isRejected = true;
6393
- promise.rejectedValue = value;
6949
+ promise.rejectedReason = value;
6394
6950
  });
6395
6951
  }
6396
6952
 
6397
- function all(promises) {
6398
- var i, results = [];
6399
- var allPromise = new Promise();
6400
- var remaining = promises.length;
6401
6953
 
6402
- if (remaining === 0) {
6403
- allPromise.resolve([]);
6404
- }
6954
+ __exports__.Promise = Promise;
6955
+ });
6405
6956
 
6406
- var resolver = function(index) {
6407
- return function(value) {
6408
- resolve(index, value);
6409
- };
6410
- };
6957
+ define("rsvp/reject",
6958
+ ["rsvp/promise","exports"],
6959
+ function(__dependency1__, __exports__) {
6960
+ "use strict";
6961
+ var Promise = __dependency1__.Promise;
6411
6962
 
6412
- var resolve = function(index, value) {
6413
- results[index] = value;
6414
- if (--remaining === 0) {
6415
- allPromise.resolve(results);
6416
- }
6417
- };
6418
6963
 
6419
- var reject = function(error) {
6420
- allPromise.reject(error);
6421
- };
6964
+ function objectOrFunction(x) {
6965
+ return typeof x === "function" || (typeof x === "object" && x !== null);
6966
+ }
6422
6967
 
6423
- for (i = 0; i < remaining; i++) {
6424
- promises[i].then(resolver(i), reject);
6425
- }
6426
- return allPromise;
6968
+
6969
+ function reject(reason) {
6970
+ return new Promise(function (resolve, reject) {
6971
+ reject(reason);
6972
+ });
6427
6973
  }
6428
6974
 
6429
- EventTarget.mixin(Promise.prototype);
6430
6975
 
6431
- RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget, all: all, raiseOnUncaughtExceptions: true };
6432
- return RSVP;
6976
+ __exports__.reject = reject;
6977
+ });
6978
+
6979
+ define("rsvp/resolve",
6980
+ ["rsvp/promise","exports"],
6981
+ function(__dependency1__, __exports__) {
6982
+ "use strict";
6983
+ var Promise = __dependency1__.Promise;
6984
+
6985
+
6986
+ function objectOrFunction(x) {
6987
+ return typeof x === "function" || (typeof x === "object" && x !== null);
6988
+ }
6989
+
6990
+ function resolve(thenable){
6991
+ var promise = new Promise(function(resolve, reject){
6992
+ var then;
6993
+
6994
+ try {
6995
+ if ( objectOrFunction(thenable) ) {
6996
+ then = thenable.then;
6997
+
6998
+ if (typeof then === "function") {
6999
+ then.call(thenable, resolve, reject);
7000
+ } else {
7001
+ resolve(thenable);
7002
+ }
7003
+
7004
+ } else {
7005
+ resolve(thenable);
7006
+ }
7007
+
7008
+ } catch(error) {
7009
+ reject(error);
7010
+ }
7011
+ });
7012
+
7013
+ return promise;
7014
+ }
7015
+
7016
+
7017
+ __exports__.resolve = resolve;
7018
+ });
7019
+
7020
+ define("rsvp",
7021
+ ["rsvp/events","rsvp/promise","rsvp/node","rsvp/all","rsvp/hash","rsvp/defer","rsvp/config","rsvp/resolve","rsvp/reject","exports"],
7022
+ function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
7023
+ "use strict";
7024
+ var EventTarget = __dependency1__.EventTarget;
7025
+ var Promise = __dependency2__.Promise;
7026
+ var denodeify = __dependency3__.denodeify;
7027
+ var all = __dependency4__.all;
7028
+ var hash = __dependency5__.hash;
7029
+ var defer = __dependency6__.defer;
7030
+ var config = __dependency7__.config;
7031
+ var resolve = __dependency8__.resolve;
7032
+ var reject = __dependency9__.reject;
7033
+
7034
+ function configure(name, value) {
7035
+ config[name] = value;
7036
+ }
7037
+
7038
+
7039
+ __exports__.Promise = Promise;
7040
+ __exports__.EventTarget = EventTarget;
7041
+ __exports__.all = all;
7042
+ __exports__.hash = hash;
7043
+ __exports__.defer = defer;
7044
+ __exports__.denodeify = denodeify;
7045
+ __exports__.configure = configure;
7046
+ __exports__.resolve = resolve;
7047
+ __exports__.reject = reject;
6433
7048
  });
6434
7049
 
6435
7050
  })();
@@ -6605,10 +7220,6 @@ define("container",
6605
7220
 
6606
7221
  this.children = [];
6607
7222
 
6608
- eachDestroyable(this, function(item) {
6609
- item.isDestroying = true;
6610
- });
6611
-
6612
7223
  eachDestroyable(this, function(item) {
6613
7224
  item.destroy();
6614
7225
  });
@@ -6979,10 +7590,15 @@ Ember.ORDER_DEFINITION = Ember.ENV.ORDER_DEFINITION || [
6979
7590
  */
6980
7591
  Ember.keys = Object.keys;
6981
7592
 
6982
- if (!Ember.keys) {
7593
+ if (!Ember.keys || Ember.create.isSimulated) {
6983
7594
  Ember.keys = function(obj) {
6984
7595
  var ret = [];
6985
7596
  for(var key in obj) {
7597
+ // Prevents browsers that don't respect non-enumerability from
7598
+ // copying internal Ember properties
7599
+ if (key.substring(0,2) === '__') continue;
7600
+ if (key === '_super') continue;
7601
+
6986
7602
  if (obj.hasOwnProperty(key)) { ret.push(key); }
6987
7603
  }
6988
7604
  return ret;
@@ -7004,7 +7620,7 @@ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'n
7004
7620
  @constructor
7005
7621
  */
7006
7622
  Ember.Error = function() {
7007
- var tmp = Error.prototype.constructor.apply(this, arguments);
7623
+ var tmp = Error.apply(this, arguments);
7008
7624
 
7009
7625
  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
7010
7626
  for (var idx = 0; idx < errorProps.length; idx++) {
@@ -7266,10 +7882,12 @@ Ember.String = {
7266
7882
  /**
7267
7883
  Returns the Capitalized form of a string
7268
7884
 
7269
- 'innerHTML'.capitalize() // 'InnerHTML'
7270
- 'action_name'.capitalize() // 'Action_name'
7271
- 'css-class-name'.capitalize() // 'Css-class-name'
7272
- 'my favorite items'.capitalize() // 'My favorite items'
7885
+ ```javascript
7886
+ 'innerHTML'.capitalize() // 'InnerHTML'
7887
+ 'action_name'.capitalize() // 'Action_name'
7888
+ 'css-class-name'.capitalize() // 'Css-class-name'
7889
+ 'my favorite items'.capitalize() // 'My favorite items'
7890
+ ```
7273
7891
 
7274
7892
  @method capitalize
7275
7893
  @param {String} str
@@ -7306,7 +7924,7 @@ var fmt = Ember.String.fmt,
7306
7924
  if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7307
7925
 
7308
7926
  /**
7309
- See {{#crossLink "Ember.String/fmt"}}{{/crossLink}}
7927
+ See `Ember.String.fmt`.
7310
7928
 
7311
7929
  @method fmt
7312
7930
  @for String
@@ -7316,7 +7934,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7316
7934
  };
7317
7935
 
7318
7936
  /**
7319
- See {{#crossLink "Ember.String/w"}}{{/crossLink}}
7937
+ See `Ember.String.w`.
7320
7938
 
7321
7939
  @method w
7322
7940
  @for String
@@ -7326,7 +7944,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7326
7944
  };
7327
7945
 
7328
7946
  /**
7329
- See {{#crossLink "Ember.String/loc"}}{{/crossLink}}
7947
+ See `Ember.String.loc`.
7330
7948
 
7331
7949
  @method loc
7332
7950
  @for String
@@ -7336,7 +7954,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7336
7954
  };
7337
7955
 
7338
7956
  /**
7339
- See {{#crossLink "Ember.String/camelize"}}{{/crossLink}}
7957
+ See `Ember.String.camelize`.
7340
7958
 
7341
7959
  @method camelize
7342
7960
  @for String
@@ -7346,7 +7964,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7346
7964
  };
7347
7965
 
7348
7966
  /**
7349
- See {{#crossLink "Ember.String/decamelize"}}{{/crossLink}}
7967
+ See `Ember.String.decamelize`.
7350
7968
 
7351
7969
  @method decamelize
7352
7970
  @for String
@@ -7356,7 +7974,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7356
7974
  };
7357
7975
 
7358
7976
  /**
7359
- See {{#crossLink "Ember.String/dasherize"}}{{/crossLink}}
7977
+ See `Ember.String.dasherize`.
7360
7978
 
7361
7979
  @method dasherize
7362
7980
  @for String
@@ -7366,7 +7984,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7366
7984
  };
7367
7985
 
7368
7986
  /**
7369
- See {{#crossLink "Ember.String/underscore"}}{{/crossLink}}
7987
+ See `Ember.String.underscore`.
7370
7988
 
7371
7989
  @method underscore
7372
7990
  @for String
@@ -7376,7 +7994,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7376
7994
  };
7377
7995
 
7378
7996
  /**
7379
- See {{#crossLink "Ember.String/classify"}}{{/crossLink}}
7997
+ See `Ember.String.classify`.
7380
7998
 
7381
7999
  @method classify
7382
8000
  @for String
@@ -7386,7 +8004,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
7386
8004
  };
7387
8005
 
7388
8006
  /**
7389
- See {{#crossLink "Ember.String/capitalize"}}{{/crossLink}}
8007
+ See `Ember.String.capitalize`.
7390
8008
 
7391
8009
  @method capitalize
7392
8010
  @for String
@@ -7462,8 +8080,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
7462
8080
  will instead clear the cache so that it is updated when the next `get`
7463
8081
  is called on the property.
7464
8082
 
7465
- See {{#crossLink "Ember.ComputedProperty"}}{{/crossLink}},
7466
- {{#crossLink "Ember/computed"}}{{/crossLink}}
8083
+ See `Ember.ComputedProperty`, `Ember.computed`.
7467
8084
 
7468
8085
  @method property
7469
8086
  @for Function
@@ -7490,7 +8107,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
7490
8107
  });
7491
8108
  ```
7492
8109
 
7493
- See {{#crossLink "Ember.Observable/observes"}}{{/crossLink}}
8110
+ See `Ember.Observable.observes`.
7494
8111
 
7495
8112
  @method observes
7496
8113
  @for Function
@@ -7517,7 +8134,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
7517
8134
  });
7518
8135
  ```
7519
8136
 
7520
- See {{#crossLink "Ember.Observable/observesBefore"}}{{/crossLink}}
8137
+ See `Ember.Observable.observesBefore`.
7521
8138
 
7522
8139
  @method observesBefore
7523
8140
  @for Function
@@ -8414,9 +9031,7 @@ Ember.Enumerable = Ember.Mixin.create({
8414
9031
  // HELPERS
8415
9032
  //
8416
9033
 
8417
- var get = Ember.get, set = Ember.set, map = Ember.EnumerableUtils.map, cacheFor = Ember.cacheFor;
8418
-
8419
- function none(obj) { return obj===null || obj===undefined; }
9034
+ var get = Ember.get, set = Ember.set, isNone = Ember.isNone, map = Ember.EnumerableUtils.map, cacheFor = Ember.cacheFor;
8420
9035
 
8421
9036
  // ..........................................................
8422
9037
  // ARRAY
@@ -8439,7 +9054,7 @@ function none(obj) { return obj===null || obj===undefined; }
8439
9054
 
8440
9055
  You can use the methods defined in this module to access and modify array
8441
9056
  contents in a KVO-friendly way. You can also be notified whenever the
8442
- membership if an array changes by changing the syntax of the property to
9057
+ membership of an array changes by changing the syntax of the property to
8443
9058
  `.observes('*myProperty.[]')`.
8444
9059
 
8445
9060
  To support `Ember.Array` in your own class, you must override two
@@ -8456,9 +9071,6 @@ function none(obj) { return obj===null || obj===undefined; }
8456
9071
  */
8457
9072
  Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.prototype */ {
8458
9073
 
8459
- // compatibility
8460
- isSCArray: true,
8461
-
8462
9074
  /**
8463
9075
  Your array must support the `length` property. Your replace methods should
8464
9076
  set this property whenever it changes.
@@ -8566,8 +9178,8 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8566
9178
  slice: function(beginIndex, endIndex) {
8567
9179
  var ret = Ember.A([]);
8568
9180
  var length = get(this, 'length') ;
8569
- if (none(beginIndex)) beginIndex = 0 ;
8570
- if (none(endIndex) || (endIndex > length)) endIndex = length ;
9181
+ if (isNone(beginIndex)) beginIndex = 0 ;
9182
+ if (isNone(endIndex) || (endIndex > length)) endIndex = length ;
8571
9183
 
8572
9184
  if (beginIndex < 0) beginIndex = length + beginIndex;
8573
9185
  if (endIndex < 0) endIndex = length + endIndex;
@@ -8727,7 +9339,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8727
9339
  @param {Number} startIdx The starting index in the array that will change.
8728
9340
  @param {Number} removeAmt The number of items that will be removed. If you
8729
9341
  pass `null` assumes 0
8730
- @param {Number} addAmt The number of items that will be added If you
9342
+ @param {Number} addAmt The number of items that will be added. If you
8731
9343
  pass `null` assumes 0.
8732
9344
  @return {Ember.Array} receiver
8733
9345
  */
@@ -8761,6 +9373,20 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8761
9373
  return this;
8762
9374
  },
8763
9375
 
9376
+ /**
9377
+ If you are implementing an object that supports `Ember.Array`, call this
9378
+ method just after the array content changes to notify any observers and
9379
+ invalidate any related properties. Pass the starting index of the change
9380
+ as well as a delta of the amounts to change.
9381
+
9382
+ @method arrayContentDidChange
9383
+ @param {Number} startIdx The starting index in the array that did change.
9384
+ @param {Number} removeAmt The number of items that were removed. If you
9385
+ pass `null` assumes 0
9386
+ @param {Number} addAmt The number of items that were added. If you
9387
+ pass `null` assumes 0.
9388
+ @return {Ember.Array} receiver
9389
+ */
8764
9390
  arrayContentDidChange: function(startIdx, removeAmt, addAmt) {
8765
9391
 
8766
9392
  // if no args are passed assume everything changes
@@ -8901,8 +9527,7 @@ var get = Ember.get, set = Ember.set;
8901
9527
  @extends Ember.Mixin
8902
9528
  @since Ember 0.9
8903
9529
  */
8904
- Ember.Copyable = Ember.Mixin.create(
8905
- /** @scope Ember.Copyable.prototype */ {
9530
+ Ember.Copyable = Ember.Mixin.create(/** @scope Ember.Copyable.prototype */ {
8906
9531
 
8907
9532
  /**
8908
9533
  Override to return a copy of the receiver. Default implementation raises
@@ -9007,8 +9632,7 @@ var get = Ember.get, set = Ember.set;
9007
9632
  @extends Ember.Mixin
9008
9633
  @since Ember 0.9
9009
9634
  */
9010
- Ember.Freezable = Ember.Mixin.create(
9011
- /** @scope Ember.Freezable.prototype */ {
9635
+ Ember.Freezable = Ember.Mixin.create(/** @scope Ember.Freezable.prototype */ {
9012
9636
 
9013
9637
  /**
9014
9638
  Set to `true` when the object is frozen. Use this property to detect
@@ -9189,8 +9813,7 @@ var get = Ember.get, set = Ember.set;
9189
9813
  @uses Ember.Array
9190
9814
  @uses Ember.MutableEnumerable
9191
9815
  */
9192
- Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
9193
- /** @scope Ember.MutableArray.prototype */ {
9816
+ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,/** @scope Ember.MutableArray.prototype */ {
9194
9817
 
9195
9818
  /**
9196
9819
  __Required.__ You must implement this method to apply this mixin.
@@ -9461,7 +10084,6 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
9461
10084
 
9462
10085
  });
9463
10086
 
9464
-
9465
10087
  })();
9466
10088
 
9467
10089
 
@@ -9509,7 +10131,7 @@ var get = Ember.get, set = Ember.set;
9509
10131
  For example:
9510
10132
 
9511
10133
  ```javascript
9512
- Ember.Object.create({
10134
+ Ember.Object.extend({
9513
10135
  valueObserver: function() {
9514
10136
  // Executes whenever the "value" property changes
9515
10137
  }.observes('value')
@@ -9528,8 +10150,8 @@ var get = Ember.get, set = Ember.set;
9528
10150
  object.addObserver('propertyKey', targetObject, targetAction)
9529
10151
  ```
9530
10152
 
9531
- This will call the `targetAction` method on the `targetObject` to be called
9532
- whenever the value of the `propertyKey` changes.
10153
+ This will call the `targetAction` method on the `targetObject` whenever
10154
+ the value of the `propertyKey` changes.
9533
10155
 
9534
10156
  Note that if `propertyKey` is a computed property, the observer will be
9535
10157
  called when any of the property dependencies are changed, even if the
@@ -9789,8 +10411,8 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
9789
10411
 
9790
10412
  This is the core method used to register an observer for a property.
9791
10413
 
9792
- Once you call this method, anytime the key's value is set, your observer
9793
- will be notified. Note that the observers are triggered anytime the
10414
+ Once you call this method, any time the key's value is set, your observer
10415
+ will be notified. Note that the observers are triggered any time the
9794
10416
  value is set, regardless of whether it has actually changed. Your
9795
10417
  observer should be prepared to handle that.
9796
10418
 
@@ -9915,11 +10537,11 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
9915
10537
 
9916
10538
  @method incrementProperty
9917
10539
  @param {String} keyName The name of the property to increment
9918
- @param {Object} increment The amount to increment by. Defaults to 1
9919
- @return {Object} The new property value
10540
+ @param {Number} increment The amount to increment by. Defaults to 1
10541
+ @return {Number} The new property value
9920
10542
  */
9921
10543
  incrementProperty: function(keyName, increment) {
9922
- if (!increment) { increment = 1; }
10544
+ if (Ember.isNone(increment)) { increment = 1; }
9923
10545
  set(this, keyName, (get(this, keyName) || 0)+increment);
9924
10546
  return get(this, keyName);
9925
10547
  },
@@ -9934,12 +10556,12 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
9934
10556
 
9935
10557
  @method decrementProperty
9936
10558
  @param {String} keyName The name of the property to decrement
9937
- @param {Object} increment The amount to decrement by. Defaults to 1
9938
- @return {Object} The new property value
10559
+ @param {Number} decrement The amount to decrement by. Defaults to 1
10560
+ @return {Number} The new property value
9939
10561
  */
9940
- decrementProperty: function(keyName, increment) {
9941
- if (!increment) { increment = 1; }
9942
- set(this, keyName, (get(this, keyName) || 0)-increment);
10562
+ decrementProperty: function(keyName, decrement) {
10563
+ if (Ember.isNone(decrement)) { decrement = 1; }
10564
+ set(this, keyName, (get(this, keyName) || 0)-decrement);
9943
10565
  return get(this, keyName);
9944
10566
  },
9945
10567
 
@@ -9948,7 +10570,7 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
9948
10570
  current value.
9949
10571
 
9950
10572
  ```javascript
9951
- starship.toggleProperty('warpDriveEnaged');
10573
+ starship.toggleProperty('warpDriveEngaged');
9952
10574
  ```
9953
10575
 
9954
10576
  @method toggleProperty
@@ -9980,7 +10602,6 @@ Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
9980
10602
  }
9981
10603
  });
9982
10604
 
9983
-
9984
10605
  })();
9985
10606
 
9986
10607
 
@@ -10275,9 +10896,9 @@ Ember.Evented = Ember.Mixin.create({
10275
10896
  (function() {
10276
10897
  var RSVP = requireModule("rsvp");
10277
10898
 
10278
- RSVP.async = function(callback, binding) {
10899
+ RSVP.configure('async', function(callback, binding) {
10279
10900
  Ember.run.schedule('actions', binding, callback);
10280
- };
10901
+ });
10281
10902
 
10282
10903
  /**
10283
10904
  @module ember
@@ -10299,9 +10920,22 @@ Ember.DeferredMixin = Ember.Mixin.create({
10299
10920
  @param {Function} doneCallback a callback function to be called when done
10300
10921
  @param {Function} failCallback a callback function to be called when failed
10301
10922
  */
10302
- then: function(doneCallback, failCallback) {
10303
- var promise = get(this, 'promise');
10304
- return promise.then.apply(promise, arguments);
10923
+ then: function(resolve, reject) {
10924
+ var deferred, promise, entity;
10925
+
10926
+ entity = this;
10927
+ deferred = get(this, '_deferred');
10928
+ promise = deferred.promise;
10929
+
10930
+ function fulfillmentHandler(fulfillment) {
10931
+ if (fulfillment === promise) {
10932
+ return resolve(entity);
10933
+ } else {
10934
+ return resolve(fulfillment);
10935
+ }
10936
+ }
10937
+
10938
+ return promise.then(resolve && fulfillmentHandler, reject);
10305
10939
  },
10306
10940
 
10307
10941
  /**
@@ -10310,7 +10944,16 @@ Ember.DeferredMixin = Ember.Mixin.create({
10310
10944
  @method resolve
10311
10945
  */
10312
10946
  resolve: function(value) {
10313
- get(this, 'promise').resolve(value);
10947
+ var deferred, promise;
10948
+
10949
+ deferred = get(this, '_deferred');
10950
+ promise = deferred.promise;
10951
+
10952
+ if (value === this){
10953
+ deferred.resolve(promise);
10954
+ } else {
10955
+ deferred.resolve(value);
10956
+ }
10314
10957
  },
10315
10958
 
10316
10959
  /**
@@ -10319,11 +10962,11 @@ Ember.DeferredMixin = Ember.Mixin.create({
10319
10962
  @method reject
10320
10963
  */
10321
10964
  reject: function(value) {
10322
- get(this, 'promise').reject(value);
10965
+ get(this, '_deferred').reject(value);
10323
10966
  },
10324
10967
 
10325
- promise: Ember.computed(function() {
10326
- return new RSVP.Promise();
10968
+ _deferred: Ember.computed(function() {
10969
+ return RSVP.defer();
10327
10970
  })
10328
10971
  });
10329
10972
 
@@ -10634,21 +11277,23 @@ CoreObject.PrototypeMixin = Mixin.create({
10634
11277
  raised.
10635
11278
 
10636
11279
  Note that destruction is scheduled for the end of the run loop and does not
10637
- happen immediately.
11280
+ happen immediately. It will set an isDestroying flag immediately.
10638
11281
 
10639
11282
  @method destroy
10640
11283
  @return {Ember.Object} receiver
10641
11284
  */
10642
11285
  destroy: function() {
10643
- if (this._didCallDestroy) { return; }
10644
-
11286
+ if (this.isDestroying) { return; }
10645
11287
  this.isDestroying = true;
10646
- this._didCallDestroy = true;
10647
11288
 
11289
+ schedule('actions', this, this.willDestroy);
10648
11290
  schedule('destroy', this, this._scheduledDestroy);
10649
11291
  return this;
10650
11292
  },
10651
11293
 
11294
+ /**
11295
+ Override to implement teardown.
11296
+ */
10652
11297
  willDestroy: Ember.K,
10653
11298
 
10654
11299
  /**
@@ -10660,10 +11305,9 @@ CoreObject.PrototypeMixin = Mixin.create({
10660
11305
  @method _scheduledDestroy
10661
11306
  */
10662
11307
  _scheduledDestroy: function() {
10663
- if (this.willDestroy) { this.willDestroy(); }
11308
+ if (this.isDestroyed) { return; }
10664
11309
  destroy(this);
10665
11310
  this.isDestroyed = true;
10666
- if (this.didDestroy) { this.didDestroy(); }
10667
11311
  },
10668
11312
 
10669
11313
  bind: function(to, from) {
@@ -11153,8 +11797,7 @@ var get = Ember.get, set = Ember.set;
11153
11797
  @extends Ember.Object
11154
11798
  @uses Ember.MutableArray
11155
11799
  */
11156
- Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
11157
- /** @scope Ember.ArrayProxy.prototype */ {
11800
+ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,/** @scope Ember.ArrayProxy.prototype */ {
11158
11801
 
11159
11802
  /**
11160
11803
  The content array. Must be an object that implements `Ember.Array` and/or
@@ -11428,7 +12071,6 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
11428
12071
  }
11429
12072
  });
11430
12073
 
11431
-
11432
12074
  })();
11433
12075
 
11434
12076
 
@@ -11528,8 +12170,7 @@ function contentPropertyDidChange(content, contentKey) {
11528
12170
  @namespace Ember
11529
12171
  @extends Ember.Object
11530
12172
  */
11531
- Ember.ObjectProxy = Ember.Object.extend(
11532
- /** @scope Ember.ObjectProxy.prototype */ {
12173
+ Ember.ObjectProxy = Ember.Object.extend(/** @scope Ember.ObjectProxy.prototype */ {
11533
12174
  /**
11534
12175
  The object whose properties will be forwarded.
11535
12176
 
@@ -11967,7 +12608,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
11967
12608
  @submodule ember-runtime
11968
12609
  */
11969
12610
 
11970
- var get = Ember.get, set = Ember.set, guidFor = Ember.guidFor, none = Ember.isNone, fmt = Ember.String.fmt;
12611
+ var get = Ember.get, set = Ember.set, guidFor = Ember.guidFor, isNone = Ember.isNone, fmt = Ember.String.fmt;
11971
12612
 
11972
12613
  /**
11973
12614
  An unordered collection of objects.
@@ -12325,7 +12966,7 @@ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Emb
12325
12966
  // implements Ember.MutableEnumerable
12326
12967
  addObject: function(obj) {
12327
12968
  if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
12328
- if (none(obj)) return this; // nothing to do
12969
+ if (isNone(obj)) return this; // nothing to do
12329
12970
 
12330
12971
  var guid = guidFor(obj),
12331
12972
  idx = this[guid],
@@ -12353,7 +12994,7 @@ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Emb
12353
12994
  // implements Ember.MutableEnumerable
12354
12995
  removeObject: function(obj) {
12355
12996
  if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
12356
- if (none(obj)) return this; // nothing to do
12997
+ if (isNone(obj)) return this; // nothing to do
12357
12998
 
12358
12999
  var guid = guidFor(obj),
12359
13000
  idx = this[guid],
@@ -12428,7 +13069,7 @@ Deferred.reopenClass({
12428
13069
  promise: function(callback, binding) {
12429
13070
  var deferred = Deferred.create();
12430
13071
  callback.call(binding, deferred);
12431
- return get(deferred, 'promise');
13072
+ return deferred;
12432
13073
  }
12433
13074
  });
12434
13075
 
@@ -12439,6 +13080,8 @@ Ember.Deferred = Deferred;
12439
13080
 
12440
13081
 
12441
13082
  (function() {
13083
+ var forEach = Ember.ArrayPolyfills.forEach;
13084
+
12442
13085
  /**
12443
13086
  @module ember
12444
13087
  @submodule ember-runtime
@@ -12471,12 +13114,10 @@ Ember.onLoad = function(name, callback) {
12471
13114
  @param object {Object} object to pass to callbacks
12472
13115
  */
12473
13116
  Ember.runLoadHooks = function(name, object) {
12474
- var hooks;
12475
-
12476
13117
  loaded[name] = object;
12477
13118
 
12478
- if (hooks = loadHooks[name]) {
12479
- loadHooks[name].forEach(function(callback) {
13119
+ if (loadHooks[name]) {
13120
+ forEach.call(loadHooks[name], function(callback) {
12480
13121
  callback(object);
12481
13122
  });
12482
13123
  }
@@ -12550,6 +13191,8 @@ Ember.ControllerMixin = Ember.Mixin.create({
12550
13191
 
12551
13192
  container: null,
12552
13193
 
13194
+ parentController: null,
13195
+
12553
13196
  store: null,
12554
13197
 
12555
13198
  model: Ember.computed.alias('content'),
@@ -12891,6 +13534,10 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach,
12891
13534
  });
12892
13535
  ```
12893
13536
 
13537
+ The itemController instances will have a `parentController` property set to
13538
+ either the the `parentController` property of the `ArrayController`
13539
+ or to the `ArrayController` instance itself.
13540
+
12894
13541
  @class ArrayController
12895
13542
  @namespace Ember
12896
13543
  @extends Ember.ArrayProxy
@@ -13001,6 +13648,7 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
13001
13648
  }
13002
13649
 
13003
13650
  subController.set('target', this);
13651
+ subController.set('parentController', get(this, 'parentController') || this);
13004
13652
  subController.set('content', object);
13005
13653
 
13006
13654
  return subController;
@@ -13072,6 +13720,6 @@ Ember Runtime
13072
13720
 
13073
13721
 
13074
13722
  if (typeof location !== 'undefined' && (location.hostname === 'localhost' || location.hostname === '127.0.0.1')) {
13075
- console.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. "+
13723
+ Ember.Logger.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. "+
13076
13724
  "If you want full error messages please use the non-minified build provided on the Ember website.");
13077
13725
  }