!function(name,context,definition){context[name]=definition(),"undefined"!=typeof module&&module.exports?module.exports=context[name]:"function"==typeof define&&define.amd&&define(function(){return context[name]})}("Promise","undefined"!=typeof global?global:this,function(){"use strict";var builtInProp,cycle,first,last,item,ToString=Object.prototype.toString,timer="undefined"!=typeof setImmediate?function(fn){return setImmediate(fn)}:setTimeout;try{Object.defineProperty({},"x",{}),builtInProp=function(obj,name,val,config){return Object.defineProperty(obj,name,{value:val,writable:!0,configurable:!1!==config})}}catch(err){builtInProp=function(obj,name,val){return obj[name]=val,obj}}function Item(fn,self){this.fn=fn,this.self=self,this.next=void 0}function schedule(fn,self){scheduling_queue.add(fn,self),cycle=cycle||timer(scheduling_queue.drain)}function isThenable(o){var _then,o_type=typeof o;return"function"==typeof(_then=null==o||"object"!=o_type&&"function"!=o_type?_then:o.then)&&_then}function notify(){for(var i=0;i<this.chain.length;i++){_then=ret=chain=cb=self=void 0;var ret,_then,self=this,cb=1===this.state?this.chain[i].success:this.chain[i].failure,chain=this.chain[i];try{!1===cb?chain.reject(self.msg):(ret=!0===cb?self.msg:cb.call(void 0,self.msg))===chain.promise?chain.reject(TypeError("Promise-chain cycle")):(_then=isThenable(ret))?_then.call(ret,chain.resolve,chain.reject):chain.resolve(ret)}catch(err){chain.reject(err)}}this.chain.length=0}function resolve(msg){var _then,self=this;if(!self.triggered){self.triggered=!0,self.def&&(self=self.def);try{(_then=isThenable(msg))?schedule(function(){var def_wrapper=new MakeDefWrapper(self);try{_then.call(msg,function(){resolve.apply(def_wrapper,arguments)},function(){reject.apply(def_wrapper,arguments)})}catch(err){reject.call(def_wrapper,err)}}):(self.msg=msg,self.state=1,0<self.chain.length&&schedule(notify,self))}catch(err){reject.call(new MakeDefWrapper(self),err)}}}function reject(msg){var self=this;self.triggered||(self.triggered=!0,(self=self.def?self.def:self).msg=msg,self.state=2,0<self.chain.length&&schedule(notify,self))}function iteratePromises(Constructor,arr,resolver,rejecter){for(var idx=0;idx<arr.length;idx++)!function(idx){Constructor.resolve(arr[idx]).then(function(msg){resolver(idx,msg)},rejecter)}(idx)}function MakeDefWrapper(self){this.def=self,this.triggered=!1}function MakeDef(self){this.promise=self,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function Promise(executor){if("function"!=typeof executor)throw TypeError("Not a function");if(0!==this.__NPO__)throw TypeError("Not a promise");this.__NPO__=1;var def=new MakeDef(this);this.then=function(success,failure){var o={success:"function"!=typeof success||success,failure:"function"==typeof failure&&failure};return o.promise=new this.constructor(function(resolve,reject){if("function"!=typeof resolve||"function"!=typeof reject)throw TypeError("Not a function");o.resolve=resolve,o.reject=reject}),def.chain.push(o),0!==def.state&&schedule(notify,def),o.promise},this.catch=function(failure){return this.then(void 0,failure)};try{executor.call(void 0,function(msg){resolve.call(def,msg)},function(msg){reject.call(def,msg)})}catch(err){reject.call(def,err)}}var scheduling_queue={add:function(fn,self){item=new Item(fn,self),last?last.next=item:first=item,last=item},drain:function(){var f=first;for(first=last=cycle=void 0;f;)f.fn.call(f.self),f=f.next}},PromisePrototype=builtInProp({},"constructor",Promise,!1);return builtInProp(Promise.prototype=PromisePrototype,"__NPO__",0,!1),builtInProp(Promise,"resolve",function(msg){return msg&&"object"==typeof msg&&1===msg.__NPO__?msg:new this(function(resolve,reject){if("function"!=typeof resolve||"function"!=typeof reject)throw TypeError("Not a function");resolve(msg)})}),builtInProp(Promise,"reject",function(msg){return new this(function(resolve,reject){if("function"!=typeof resolve||"function"!=typeof reject)throw TypeError("Not a function");reject(msg)})}),builtInProp(Promise,"all",function(arr){var Constructor=this;return"[object Array]"!=ToString.call(arr)?Constructor.reject(TypeError("Not an array")):0===arr.length?Constructor.resolve([]):new Constructor(function(resolve,reject){if("function"!=typeof resolve||"function"!=typeof reject)throw TypeError("Not a function");var len=arr.length,msgs=Array(len),count=0;iteratePromises(Constructor,arr,function(idx,msg){msgs[idx]=msg,++count===len&&resolve(msgs)},reject)})}),builtInProp(Promise,"race",function(arr){var Constructor=this;return"[object Array]"!=ToString.call(arr)?Constructor.reject(TypeError("Not an array")):new Constructor(function(resolve,reject){if("function"!=typeof resolve||"function"!=typeof reject)throw TypeError("Not a function");iteratePromises(Constructor,arr,function(idx,msg){resolve(msg)},reject)})}),Promise});