// { "framework": "Vue" }
"use weex:vue";

!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=37)}([function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(3),o=n(11);t.exports=n(4)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(9),o=n(29),i=n(17),a=Object.defineProperty;e.f=n(4)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){t.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(52),o=n(15);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(21)("wks"),o=n(12),i=n(0).Symbol,a="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))}).store=r},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(7);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fetchNews=e.fetchDoodle=e.readAbout=e.saveAbout=e.fetchAbout=e.readGuide=e.saveGuide=e.fetchGuide=e.readExamples=e.saveExamples=e.fetchExamples=void 0;var r=i(n(41)),o=i(n(43));function i(t){return t&&t.__esModule?t:{default:t}}e.createLink=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];for(var r in e)"string"==typeof e[r]&&n.push(s(r)+"="+s(e[r]));if("Web"===WXEnvironment.platform)return n.unshift("page="+t+".web.js"),"/?"+n.join("&");return""+function(){var t=weex.config.bundleUrl,e=t.indexOf("your_current_IP")>=0||t.indexOf("file://assets/")>=0,n=t.indexOf("file:///")>=0&&t.indexOf("WeexDemo.app")>0;if(e)return"file://assets/";if(n)return t.substring(0,t.lastIndexOf("/")+1);return""}()+t+".weex.js"+(n.length?"?"+n.join("&"):"")},e.createURL=f,e.i18n=l,e.parseLanguage=d,e.setLanguage=function(t){var e=d(t);e&&u.setItem("WEEX_PLAYGROUND_LANGUAGE",e)},e.clearStorageLanguage=function(){u.removeItem("WEEX_PLAYGROUND_LANGUAGE")},e.getStorageLanguage=v,e.getSystemLanguage=g,e.getLanguage=h,e.jumpTo=function(t,e,n){h(function(r){u.setItem("CURRENT_DOCUMENT_URL",l(t,n||r)),c.push({url:f("bf0305c14b511b24a4e616f53926432b",{language:r,title:l(e,n||r)})})})},e.viewSource=function(t){h(function(e){c.push({url:f("f6ce29faf686eabc38b410bf4828fa5a",{hash:t,language:e})})})},e.setTitleBar=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"en";if("[object Object]"!==Object.prototype.toString.apply(t))return;var n=weex.requireModule("titleBar");if(t.color||t.backgroundColor)try{n.setStyle({foregroundColor:t.color||"#FFFFFF",backgroundColor:t.backgroundColor||"#00B4FF"})}catch(t){}var r=l(t.title,e);if(r)try{n.setTitle(r)}catch(t){}},e.fetchData=b,e.saveData=x,e.readData=_;var a=weex.requireModule("stream"),u=weex.requireModule("storage"),c=weex.requireModule("navigator"),s="function"==typeof encodeURIComponent?encodeURIComponent:"function"==typeof encodeURI?encodeURI:function(t){return t};function f(t,e){if("Web"===WXEnvironment.platform)return"http://dotwe.org/raw/htmlVue/"+t;var n="http://dotwe.org/raw/dist/"+t+".bundle.wx",r=function(t){if(!t||"object"!==(void 0===t?"undefined":(0,o.default)(t)))return"";var e=[];for(var n in t)"string"==typeof t[n]&&e.push(s(n)+"="+s(t[n]));return e.join("&")}(e);return"TB"===WXEnvironment.appName?n+"?_wx_tpl="+n+"&"+r:"WXSample"===WXEnvironment.appName?n+"?"+r:n+"?wx_weex=true&"+r}function l(t,e){return"string"==typeof t?t:"[object Object]"===Object.prototype.toString.call(t)?t[this&&this.language||e||"en"]:void 0}var p=/(en|zh)\_?\w*/i;function d(t){var e=p.exec(t+"");return e&&e[1]?e[1]:""}function v(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};if("function"!==!(void 0===t||(0,o.default)(t)))try{u.getItem("WEEX_PLAYGROUND_LANGUAGE",function(n){if("success"===n.result){var r=d(n.data);r?t(r):e()}else e(n)})}catch(t){e(t)}}function g(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};if("function"!==!(void 0===t||(0,o.default)(t)))if("web"===WXEnvironment.platform.toLowerCase()){var n=d(window.navigator.language);n?t(n):e()}else try{var r=weex.requireModule("locale")||weex.requireModule("local"),i=!1,a=d(r.getLanguage(function(n){var r=d(n);r?i||t(r):e()}));a?(i=!0,t(a)):e()}catch(t){e(t)}}var y=/.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;function h(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},e=y.exec(weex.config.bundleUrl||""),n=d(e&&e[1]);n?t(n):v(t,function(){g(t,function(){t("en")})})}var m={doodle:"WEEX_PLAYGROUND_APP_DOODLE",guide:"WEEX_PLAYGROUND_APP_GUIDE",examples:"WEEX_PLAYGROUND_APP_EXAMPLES",news:"WEEX_PLAYGROUND_APP_NEWS",about:"WEEX_PLAYGROUND_APP_ABOUT"};function b(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){};try{a.fetch({url:"http://dotwe.org/query/weex-playground-app",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},type:"json",body:"name="+t},function(t){t.ok&&t.data&&t.data.success?e(t.data):n(t)})}catch(t){n(t)}}function x(t,e){var n=m[t];n&&e&&"object"===(void 0===e?"undefined":(0,o.default)(e))&&(e.timestamp=Date.now(),u.setItem(n,(0,r.default)(e)))}function _(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=m[t];if(!r)return n();try{u.getItem(r,function(r){if("success"===r.result){var o=JSON.parse(r.data);if(o&&Array.isArray(o[t]))return e(o[t])}n(r)})}catch(t){n(t)}}e.fetchExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["examples"].concat(e))},e.saveExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["examples"].concat(e))},e.readExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["examples"].concat(e))},e.fetchGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["guide"].concat(e))},e.saveGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["guide"].concat(e))},e.readGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["guide"].concat(e))},e.fetchAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["about"].concat(e))},e.saveAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["about"].concat(e))},e.readAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["about"].concat(e))},e.fetchDoodle=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["doodle"].concat(e))},e.fetchNews=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["news"].concat(e))}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},function(t,e){t.exports=!0},function(t,e,n){var r=n(7);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports={}},function(t,e,n){var r=n(33),o=n(22);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(21)("keys"),o=n(12);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(0),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});t.exports=function(t){return o[t]||(o[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(3).f,o=n(1),i=n(6)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){e.f=n(6)},function(t,e,n){var r=n(0),o=n(8),i=n(16),a=n(24),u=n(3).f;t.exports=function(t){var e=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||u(e,t,{value:a.f(t)})}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){"use strict";var r=n(16),o=n(28),i=n(31),a=n(2),u=n(1),c=n(18),s=n(50),f=n(23),l=n(57),p=n(6)("iterator"),d=!([].keys&&"next"in[].keys()),v=function(){return this};t.exports=function(t,e,n,g,y,h,m){s(n,e,g);var b,x,_,w=function(t){if(!d&&t in A)return A[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O="values"==y,E=!1,A=t.prototype,C=A[p]||A["@@iterator"]||y&&A[y],L=!d&&C||w(y),j=y?O?w("entries"):L:void 0,T="Array"==e&&A.entries||C;if(T&&(_=l(T.call(new t)))!==Object.prototype&&_.next&&(f(_,S,!0),r||u(_,p)||a(_,p,v)),O&&C&&"values"!==C.name&&(E=!0,L=function(){return C.call(this)}),r&&!m||!d&&!E&&A[p]||a(A,p,L),c[e]=L,c[S]=v,y)if(b={values:O?L:w("values"),keys:h?L:w("keys"),entries:j},m)for(x in b)x in A||i(A,x,b[x]);else o(o.P+o.F*(d||E),e,b);return b}},function(t,e,n){var r=n(0),o=n(8),i=n(48),a=n(2),u=function(t,e,n){var c,s,f,l=t&u.F,p=t&u.G,d=t&u.S,v=t&u.P,g=t&u.B,y=t&u.W,h=p?o:o[e]||(o[e]={}),m=h.prototype,b=p?r:d?r[e]:(r[e]||{}).prototype;for(c in p&&(n=e),n)(s=!l&&b&&void 0!==b[c])&&c in h||(f=s?b[c]:n[c],h[c]=p&&"function"!=typeof b[c]?n[c]:g&&s?i(f,r):y&&b[c]==f?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(f):v&&"function"==typeof f?i(Function.call,f):f,v&&((h.virtual||(h.virtual={}))[c]=f,t&u.R&&m&&!m[c]&&a(m,c,f)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},function(t,e,n){t.exports=!n(4)&&!n(10)(function(){return 7!=Object.defineProperty(n(30)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(7),o=n(0).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){t.exports=n(2)},function(t,e,n){var r=n(9),o=n(51),i=n(22),a=n(20)("IE_PROTO"),u=function(){},c=function(){var t,e=n(30)("iframe"),r=i.length;for(e.style.display="none",n(56).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),c=t.F;r--;)delete c.prototype[i[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(u.prototype=r(t),n=new u,u.prototype=null,n[a]=t):n=c(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(1),o=n(5),i=n(53)(!1),a=n(20)("IE_PROTO");t.exports=function(t,e){var n,u=o(t),c=0,s=[];for(n in u)n!=a&&r(u,n)&&s.push(n);for(;e.length>c;)r(u,n=e[c++])&&(~i(s,n)||s.push(n));return s}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(33),o=n(22).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=i(n(38)),o=i(n(79));function i(t){return t&&t.__esModule?t:{default:t}}Vue.mixin(o.default),r.default.el="#root",new Vue(r.default)},function(t,e,n){var r,o,i=[];i.push(n(39)),r=n(40);var a=n(78);o=r=r||{},"object"!=typeof r.default&&"function"!=typeof r.default||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t})&&console.error("named exports are not supported in *.vue files."),o=r=r.default),"function"==typeof o&&(o=o.options),o.__file="/Users/Hanks/Codes/work/weex-vue-examples/src/pages/Examples.vue",o.render=a.render,o.staticRenderFns=a.staticRenderFns,o._scopeId="data-v-25a5be6d",o.style=o.style||{},i.forEach(function(t){for(var e in t)o.style[e]=t[e]}),"function"==typeof __register_static_styles__&&__register_static_styles__(o._scopeId,i),t.exports=r},function(t,e){t.exports={"example-list":{width:"750",position:"absolute",top:0,bottom:"100",backgroundColor:"#F5F5F5"},"group-info":{backgroundColor:"#FFFFFF"},loading:{flex:1,justifyContent:"center",alignItems:"center"},"loading-text":{fontSize:"60",color:"#BBBBBB"},"group-title":{width:"750",paddingTop:"20",paddingBottom:"35",fontSize:"40",textAlign:"center",color:"#00B4FF",backgroundImage:"linear-gradient(to bottom, #E3F5FB, #F9FEFF)"},"group-desc":{fontSize:"28",color:"#999999",marginTop:"10",marginLeft:"30",marginRight:"40"},"doc-link":{fontSize:"26",color:"rgba(0,189,255,0.6)",textAlign:"right",marginTop:"10",marginRight:"60",marginBottom:"20"},section:{paddingBottom:"30"},tabbar:{width:"750",position:"fixed",bottom:0,height:"100",flexDirection:"row",justifyContent:"space-around",alignItems:"flex-end",backgroundColor:"#E6E6E6"},"tab-cell":{width:"186",height:"100",borderTopWidth:"2",borderTopStyle:"solid",borderTopColor:"#DDDDDD",justifyContent:"center",backgroundColor:"#FCFCFC",transitionProperty:"backgroundColor",transitionDuration:200},"@TRANSITION":{"tab-cell":{property:"backgroundColor",duration:200},"tab-name":{property:"color,fontSize",duration:100}},"active-tab-cell":{borderTopColor:"rgba(0,189,255,0.8)",backgroundColor:"#BDECFF"},"tab-name":{textAlign:"center",color:"#666666",transitionProperty:"color,fontSize",transitionDuration:100},"tab-name-zh":{fontSize:"36"},"tab-name-en":{fontSize:"30"},"active-tab-name-zh":{color:"#00B4FF",fontSize:"42",fontWeight:"bold"},"active-tab-name-en":{color:"#00B4FF",fontSize:"30",fontWeight:"bold"}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=n(13),i=n(74),a=(r=i)&&r.__esModule?r:{default:r};var u=[],c=!1;e.default={components:{ExampleScroller:a.default},data:function(){return{navigationBarOptions:{title:{zh:"使用 Weex 的例子",en:"Weex Examples"}},examples:u,showLoading:!1,language:"en",activeTab:"component",activeGroup:"div",tips:{VIEW_SOURCE:{en:"view source",zh:"查看源码"},READ_MORE:{en:"read more",zh:"查看更多"}}}},beforeCreate:function(){var t=this;(0,o.readExamples)(function(e){t.examples=e,"web"!==WXEnvironment.platform.toLowerCase()&&(c=!0)}),(0,o.fetchExamples)(function(e){(0,o.saveExamples)(e),c||(t.examples=e.examples)}),setTimeout(function(){t.showLoading=!0},400)},computed:{tabs:function(){return this.examples.map(function(t){return{type:t.type,name:t.name}})},currentTab:function(){var t=this;return this.examples.filter(function(e){return e.type===t.activeTab})[0]}},methods:{toggleTab:function(t){this.activeTab=t,this.activeGroup=this.currentTab.group[0].type}}}},function(t,e,n){t.exports={default:n(42),__esModule:!0}},function(t,e,n){var r=n(8),o=r.JSON||(r.JSON={stringify:JSON.stringify});t.exports=function(t){return o.stringify.apply(o,arguments)}},function(t,e,n){"use strict";e.__esModule=!0;var r=a(n(44)),o=a(n(63)),i="function"==typeof o.default&&"symbol"==typeof r.default?function(t){return typeof t}:function(t){return t&&"function"==typeof o.default&&t.constructor===o.default&&t!==o.default.prototype?"symbol":typeof t};function a(t){return t&&t.__esModule?t:{default:t}}e.default="function"==typeof o.default&&"symbol"===i(r.default)?function(t){return void 0===t?"undefined":i(t)}:function(t){return t&&"function"==typeof o.default&&t.constructor===o.default&&t!==o.default.prototype?"symbol":void 0===t?"undefined":i(t)}},function(t,e,n){t.exports={default:n(45),__esModule:!0}},function(t,e,n){n(46),n(59),t.exports=n(24).f("iterator")},function(t,e,n){"use strict";var r=n(47)(!0);n(27)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(14),o=n(15);t.exports=function(t){return function(e,n){var i,a,u=String(o(e)),c=r(n),s=u.length;return c<0||c>=s?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}}},function(t,e,n){var r=n(49);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){"use strict";var r=n(32),o=n(11),i=n(23),a={};n(2)(a,n(6)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(a,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){var r=n(3),o=n(9),i=n(19);t.exports=n(4)?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),u=a.length,c=0;u>c;)r.f(t,n=a[c++],e[n]);return t}},function(t,e,n){var r=n(34);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(5),o=n(54),i=n(55);t.exports=function(t){return function(e,n,a){var u,c=r(e),s=o(c.length),f=i(a,s);if(t&&n!=n){for(;s>f;)if((u=c[f++])!=u)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===n)return t||f||0;return!t&&-1}}},function(t,e,n){var r=n(14),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(14),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1),o=n(58),i=n(20)("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,n){var r=n(15);t.exports=function(t){return Object(r(t))}},function(t,e,n){n(60);for(var r=n(0),o=n(2),i=n(18),a=n(6)("toStringTag"),u="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),c=0;c<u.length;c++){var s=u[c],f=r[s],l=f&&f.prototype;l&&!l[a]&&o(l,a,s),i[s]=i.Array}},function(t,e,n){"use strict";var r=n(61),o=n(62),i=n(18),a=n(5);t.exports=n(27)(Array,"Array",function(t,e){this._t=a(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){t.exports={default:n(64),__esModule:!0}},function(t,e,n){n(65),n(71),n(72),n(73),t.exports=n(8).Symbol},function(t,e,n){"use strict";var r=n(0),o=n(1),i=n(4),a=n(28),u=n(31),c=n(66).KEY,s=n(10),f=n(21),l=n(23),p=n(12),d=n(6),v=n(24),g=n(25),y=n(67),h=n(68),m=n(9),b=n(7),x=n(5),_=n(17),w=n(11),S=n(32),O=n(69),E=n(70),A=n(3),C=n(19),L=E.f,j=A.f,T=O.f,P=r.Symbol,F=r.JSON,D=F&&F.stringify,k=d("_hidden"),R=d("toPrimitive"),M={}.propertyIsEnumerable,I=f("symbol-registry"),N=f("symbols"),U=f("op-symbols"),W=Object.prototype,G="function"==typeof P,B=r.QObject,z=!B||!B.prototype||!B.prototype.findChild,X=i&&s(function(){return 7!=S(j({},"a",{get:function(){return j(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=L(W,e);r&&delete W[e],j(t,e,n),r&&t!==W&&j(W,e,r)}:j,V=function(t){var e=N[t]=S(P.prototype);return e._k=t,e},q=G&&"symbol"==typeof P.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof P},Y=function(t,e,n){return t===W&&Y(U,e,n),m(t),e=_(e,!0),m(n),o(N,e)?(n.enumerable?(o(t,k)&&t[k][e]&&(t[k][e]=!1),n=S(n,{enumerable:w(0,!1)})):(o(t,k)||j(t,k,w(1,{})),t[k][e]=!0),X(t,e,n)):j(t,e,n)},H=function(t,e){m(t);for(var n,r=y(e=x(e)),o=0,i=r.length;i>o;)Y(t,n=r[o++],e[n]);return t},J=function(t){var e=M.call(this,t=_(t,!0));return!(this===W&&o(N,t)&&!o(U,t))&&(!(e||!o(this,t)||!o(N,t)||o(this,k)&&this[k][t])||e)},K=function(t,e){if(t=x(t),e=_(e,!0),t!==W||!o(N,e)||o(U,e)){var n=L(t,e);return!n||!o(N,e)||o(t,k)&&t[k][e]||(n.enumerable=!0),n}},$=function(t){for(var e,n=T(x(t)),r=[],i=0;n.length>i;)o(N,e=n[i++])||e==k||e==c||r.push(e);return r},Q=function(t){for(var e,n=t===W,r=T(n?U:x(t)),i=[],a=0;r.length>a;)!o(N,e=r[a++])||n&&!o(W,e)||i.push(N[e]);return i};G||(u((P=function(){if(this instanceof P)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),e=function(n){this===W&&e.call(U,n),o(this,k)&&o(this[k],t)&&(this[k][t]=!1),X(this,t,w(1,n))};return i&&z&&X(W,t,{configurable:!0,set:e}),V(t)}).prototype,"toString",function(){return this._k}),E.f=K,A.f=Y,n(36).f=O.f=$,n(26).f=J,n(35).f=Q,i&&!n(16)&&u(W,"propertyIsEnumerable",J,!0),v.f=function(t){return V(d(t))}),a(a.G+a.W+a.F*!G,{Symbol:P});for(var Z="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Z.length>tt;)d(Z[tt++]);for(var et=C(d.store),nt=0;et.length>nt;)g(et[nt++]);a(a.S+a.F*!G,"Symbol",{for:function(t){return o(I,t+="")?I[t]:I[t]=P(t)},keyFor:function(t){if(!q(t))throw TypeError(t+" is not a symbol!");for(var e in I)if(I[e]===t)return e},useSetter:function(){z=!0},useSimple:function(){z=!1}}),a(a.S+a.F*!G,"Object",{create:function(t,e){return void 0===e?S(t):H(S(t),e)},defineProperty:Y,defineProperties:H,getOwnPropertyDescriptor:K,getOwnPropertyNames:$,getOwnPropertySymbols:Q}),F&&a(a.S+a.F*(!G||s(function(){var t=P();return"[null]"!=D([t])||"{}"!=D({a:t})||"{}"!=D(Object(t))})),"JSON",{stringify:function(t){for(var e,n,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=e=r[1],(b(e)||void 0!==t)&&!q(t))return h(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!q(e))return e}),r[1]=e,D.apply(F,r)}}),P.prototype[R]||n(2)(P.prototype,R,P.prototype.valueOf),l(P,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,e,n){var r=n(12)("meta"),o=n(7),i=n(1),a=n(3).f,u=0,c=Object.isExtensible||function(){return!0},s=!n(10)(function(){return c(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++u,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&c(t)&&!i(t,r)&&f(t),t}}},function(t,e,n){var r=n(19),o=n(35),i=n(26);t.exports=function(t){var e=r(t),n=o.f;if(n)for(var a,u=n(t),c=i.f,s=0;u.length>s;)c.call(t,a=u[s++])&&e.push(a);return e}},function(t,e,n){var r=n(34);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(5),o=n(36).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(t){return a.slice()}}(t):o(r(t))}},function(t,e,n){var r=n(26),o=n(11),i=n(5),a=n(17),u=n(1),c=n(29),s=Object.getOwnPropertyDescriptor;e.f=n(4)?s:function(t,e){if(t=i(t),e=a(e,!0),c)try{return s(t,e)}catch(t){}if(u(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e){},function(t,e,n){n(25)("asyncIterator")},function(t,e,n){n(25)("observable")},function(t,e,n){var r,o,i=[];i.push(n(75)),r=n(76);var a=n(77);o=r=r||{},"object"!=typeof r.default&&"function"!=typeof r.default||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t})&&console.error("named exports are not supported in *.vue files."),o=r=r.default),"function"==typeof o&&(o=o.options),o.__file="/Users/Hanks/Codes/work/weex-vue-examples/src/components/ExampleScroller.vue",o.render=a.render,o.staticRenderFns=a.staticRenderFns,o._scopeId="data-v-d9e80478",o.style=o.style||{},i.forEach(function(t){for(var e in t)o.style[e]=t[e]}),"function"==typeof __register_static_styles__&&__register_static_styles__(o._scopeId,i),t.exports=r},function(t,e){t.exports={scroller:{flexDirection:"row",backgroundColor:"#FDFDFD",paddingTop:"20",paddingRight:"20",paddingBottom:"20",paddingLeft:"20",height:"600"},"example-box":{justifyContent:"space-between",alignItems:"center",paddingLeft:"6",paddingRight:"6",width:"310"},screenshot:{width:"270",height:"422",borderWidth:"1",borderColor:"#DDDDDD"},title:{height:"75",justifyContent:"center"},"title-text":{fontSize:"32",textAlign:"center",color:"#606060",paddingTop:"10",paddingBottom:"10"},"example-tips":{fontSize:"28",textAlign:"center",color:"#A5A5A5",paddingTop:"10",paddingBottom:"10"}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(13);e.default={methods:{viewSource:r.viewSource},props:{language:{type:String,default:"en"},examples:{type:Array,required:!0}},data:function(){return{VIEW_SOURCE:{en:"view source",zh:"查看源码"}}}}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("scroller",{staticClass:["scroller"],attrs:{scrollDirection:"horizontal"}},t._l(t.examples,function(e,r){return n("div",{key:r,staticClass:["example-box"]},[n("div",{staticClass:["title"]},[n("text",{staticClass:["title-text"]},[t._v(t._s(t.i18n(e.title)))])]),n("div",{staticStyle:{alignItems:"center"}},[n("a",{attrs:{href:t._f("url")(t.i18n(e.hash))}},[n("image",{staticClass:["screenshot"],attrs:{src:t.i18n(e.screenshot)}})]),n("text",{staticClass:["example-tips"],on:{click:function(n){t.viewSource(t.i18n(e.hash))}}},[t._v(t._s(t.i18n(t.VIEW_SOURCE)))])])])}))},staticRenderFns:[]},t.exports.render._withStripped=!0},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:["wrapper"]},[t.examples&&t.examples.length?n("list",{staticClass:["example-list"]},[t._l(t.currentTab.group,function(e){return[e&&e.title||e.name?n("cell",{key:e.type,ref:e.type,refInFor:!0,staticClass:["group-info"],appendAsTree:!0,attrs:{append:"tree"}},[n("text",{staticClass:["group-title"]},[t._v(t._s(t.i18n(e.title||e.name)))]),e.desc?n("text",{staticClass:["group-desc"]},[t._v(t._s(t.i18n(e.desc)))]):t._e(),e.desc&&e.docLink?n("text",{staticClass:["doc-link"],on:{click:function(n){t.jumpTo(t.i18n(e.docLink))}}},[t._v(t._s(t.i18n(t.tips.READ_MORE))+" >>")]):t._e()]):t._e(),n("cell",{key:e.type+"-examples",staticClass:["section"],appendAsTree:!0,attrs:{append:"tree"}},[n("example-scroller",{attrs:{language:t.language,examples:e.examples}})],1)]})],2):t.showLoading?n("div",{staticClass:["loading"]},[n("text",{staticClass:["loading-text"]},[t._v("loading ...")])]):t._e(),t.tabs&&t.tabs.length?n("div",{staticClass:["tabbar"]},t._l(t.tabs,function(e){return n("div",{key:e.type,class:["tab-cell",e.type===t.activeTab?"active-tab-cell":""],on:{click:function(n){t.toggleTab(e.type)}}},[n("text",{class:["tab-name","tab-name-"+t.language,e.type===t.activeTab?"active-tab-name-"+t.language:""]},[t._v(t._s(t.i18n(e.name)))])])})):t._e()])},staticRenderFns:[]},t.exports.render._withStripped=!0},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(13));var o=weex.requireModule("storage");e.default={filters:{i18n:r.i18n,url:r.createURL,link:r.createLink},methods:{createLink:r.createLink,createURL:r.createURL,i18n:r.i18n,getLanguage:r.getLanguage,fetchData:r.fetchData,saveData:r.saveData,readData:r.readData,jumpTo:r.jumpTo},created:function(){var t=this;r.getLanguage(function(e){t.language=e,r.setTitleBar(t.navigationBarOptions,e)}),new BroadcastChannel("language").onmessage=function(e){e.data&&e.data.language&&(t.language=e.data.language)}},beforeDestroy:function(){o.removeItem("CURRENT_DOCUMENT_URL"),o.removeItem("CURRENT_SOURCE_HASH")}}}]);