/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */

/*

 JS Signals <http://millermedeiros.github.com/js-signals/>
 Released under the MIT license
 Author: Miller Medeiros
 Version: 1.0.0 - Build: 268 (2012/11/29 05:48 PM)
*/

/*!
 * Hasher <http://github.com/millermedeiros/hasher>
 * @author Miller Medeiros
 * @version 1.2.0 (2013/11/11 03:18 PM)
 * Released under the MIT License
 */

/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */

!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t="length"in e&&e.length,n=ie.type(e);return"function"!==n&&!ie.isWindow(e)&&(!(1!==e.nodeType||!t)||("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e))}function r(e,t,n){if(ie.isFunction(t))return ie.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ie.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pe.test(t))return ie.filter(t,e,n);t=ie.filter(t,e)}return ie.grep(e,function(e){return ie.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=we[e]={};return ie.each(e.match(be)||[],function(e,n){t[n]=!0}),t}function a(){he.addEventListener?(he.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(he.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(he.addEventListener||"load"===event.type||"complete"===he.readyState)&&(a(),ie.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(Ee,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Ce.test(n)?ie.parseJSON(n):n)}catch(e){}ie.data(e,t,n)}else n=void 0}return n}function u(e){var t;for(t in e)if(("data"!==t||!ie.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(ie.acceptData(e)){var i,o,a=ie.expando,s=e.nodeType,l=s?ie.cache:e,u=s?e[a]:e[a]&&a;if(u&&l[u]&&(r||l[u].data)||void 0!==n||"string"!=typeof t)return u||(u=s?e[a]=U.pop()||ie.guid++:a),l[u]||(l[u]=s?{}:{toJSON:ie.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[u]=ie.extend(l[u],t):l[u].data=ie.extend(l[u].data,t)),o=l[u],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ie.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ie.camelCase(t)])):i=o,i}}function d(e,t,n){if(ie.acceptData(e)){var r,i,o=e.nodeType,a=o?ie.cache:e,s=o?e[ie.expando]:ie.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ie.isArray(t)?t=t.concat(ie.map(t,ie.camelCase)):t in r?t=[t]:(t=ie.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!u(r):!ie.isEmptyObject(r))return}(n||(delete a[s].data,u(a[s])))&&(o?ie.cleanData([e],!0):ne.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function p(){return!0}function f(){return!1}function h(){try{return he.activeElement}catch(e){}}function v(e){var t=Ne.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==Te?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==Te?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ie.nodeName(r,t)?o.push(r):ie.merge(o,g(r,t));return void 0===t||t&&ie.nodeName(e,t)?ie.merge([e],o):o}function m(e){Le.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ie.nodeName(e,"table")&&ie.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ie.find.attr(e,"type"))+"/"+e.type,e}function w(e){var t=Ve.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function x(e,t){for(var n,r=0;null!=(n=e[r]);r++)ie._data(n,"globalEval",!t||ie._data(t[r],"globalEval"))}function _(e,t){if(1===t.nodeType&&ie.hasData(e)){var n,r,i,o=ie._data(e),a=ie._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ie.event.add(t,n,s[n][r])}a.data&&(a.data=ie.extend({},a.data))}}function T(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!ne.noCloneEvent&&t[ie.expando]){i=ie._data(t);for(r in i.events)ie.removeEvent(t,r,i.handle);t.removeAttribute(ie.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,w(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),ne.html5Clone&&e.innerHTML&&!ie.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Le.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function C(t,n){var r,i=ie(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ie.css(i[0],"display");return i.detach(),o}function E(e){var t=he,n=Ze[e];return n||(n=C(e,t),"none"!==n&&n||(Je=(Je||ie("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Je[0].contentWindow||Je[0].contentDocument).document,t.write(),t.close(),n=C(e,t),Je.detach()),Ze[e]=n),n}function A(e,t){return{get:function(){var n=e();if(null!=n)return n?void delete this.get:(this.get=t).apply(this,arguments)}}}function D(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=pt.length;i--;)if(t=pt[i]+n,t in e)return t;return r}function S(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=ie._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Se(r)&&(o[a]=ie._data(r,"olddisplay",E(r.nodeName)))):(i=Se(r),(n&&"none"!==n||!i)&&ie._data(r,"olddisplay",i?n:ie.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function k(e,t,n){var r=lt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function L(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=ie.css(e,n+De[o],!0,i)),r?("content"===n&&(a-=ie.css(e,"padding"+De[o],!0,i)),"margin"!==n&&(a-=ie.css(e,"border"+De[o]+"Width",!0,i))):(a+=ie.css(e,"padding"+De[o],!0,i),"padding"!==n&&(a+=ie.css(e,"border"+De[o]+"Width",!0,i)));return a}function M(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=et(e),a=ne.boxSizing&&"border-box"===ie.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=tt(e,t,o),(0>i||null==i)&&(i=e.style[t]),rt.test(i))return i;r=a&&(ne.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+L(e,t,n||(a?"border":"content"),r,o)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function P(){return setTimeout(function(){ft=void 0}),ft=ie.now()}function I(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=De[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function H(e,t,n){for(var r,i=(bt[t]||[]).concat(bt["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,t,e))return r}function N(e,t,n){var r,i,o,a,s,l,u,c,d=this,p={},f=e.style,h=e.nodeType&&Se(e),v=ie._data(e,"fxshow");n.queue||(s=ie._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,d.always(function(){d.always(function(){s.unqueued--,ie.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[f.overflow,f.overflowX,f.overflowY],u=ie.css(e,"display"),c="none"===u?ie._data(e,"olddisplay")||E(e.nodeName):u,"inline"===c&&"none"===ie.css(e,"float")&&(ne.inlineBlockNeedsLayout&&"inline"!==E(e.nodeName)?f.zoom=1:f.display="inline-block")),n.overflow&&(f.overflow="hidden",ne.shrinkWrapBlocks()||d.always(function(){f.overflow=n.overflow[0],f.overflowX=n.overflow[1],f.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],vt.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;h=!0}p[r]=v&&v[r]||ie.style(e,r)}else u=void 0;if(ie.isEmptyObject(p))"inline"===("none"===u?E(e.nodeName):u)&&(f.display=u);else{v?"hidden"in v&&(h=v.hidden):v=ie._data(e,"fxshow",{}),o&&(v.hidden=!h),h?ie(e).show():d.done(function(){ie(e).hide()}),d.done(function(){var t;ie._removeData(e,"fxshow");for(t in p)ie.style(e,t,p[t])});for(r in p)a=H(h?v[r]:0,r,d),r in v||(v[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function R(e,t){var n,r,i,o,a;for(n in e)if(r=ie.camelCase(n),i=t[r],o=e[n],ie.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=ie.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function j(e,t,n){var r,i,o=0,a=yt.length,s=ie.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=ft||P(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:ie.extend({},t),opts:ie.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:ft||P(),duration:n.duration,tweens:[],createTween:function(t,n){var r=ie.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(R(c,u.opts.specialEasing);a>o;o++)if(r=yt[o].call(u,e,c,u.opts))return r;return ie.map(c,H,u),ie.isFunction(u.opts.start)&&u.opts.start.call(e,u),ie.fx.timer(ie.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function q(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(be)||[];if(ie.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function B(e,t,n,r){function i(s){var l;return o[s]=!0,ie.each(e[s]||[],function(e,s){var u=s(t,n,r);return"string"!=typeof u||a||o[u]?a?!(l=u):void 0:(t.dataTypes.unshift(u),i(u),!1)}),l}var o={},a=e===Ft;return i(t.dataTypes[0])||!o["*"]&&i("*")}function W(e,t){var n,r,i=ie.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&ie.extend(!0,e,n),e}function $(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function F(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}function X(e,t,n,r){var i;if(ie.isArray(t))ie.each(t,function(t,i){n||zt.test(e)?r(e,i):X(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==ie.type(t))r(e,t);else for(i in t)X(e+"["+i+"]",t[i],n,r)}function Y(){try{return new e.XMLHttpRequest}catch(e){}}function z(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}function V(e){return ie.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var U=[],G=U.slice,K=U.concat,Q=U.push,J=U.indexOf,Z={},ee=Z.toString,te=Z.hasOwnProperty,ne={},re="1.11.3",ie=function(e,t){return new ie.fn.init(e,t)},oe=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ae=/^-ms-/,se=/-([\da-z])/gi,le=function(e,t){return t.toUpperCase()};ie.fn=ie.prototype={jquery:re,constructor:ie,selector:"",length:0,toArray:function(){return G.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:G.call(this)},pushStack:function(e){var t=ie.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ie.each(this,e,t)},map:function(e){return this.pushStack(ie.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(G.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:Q,sort:U.sort,splice:U.splice},ie.extend=ie.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,u=!1;for("boolean"==typeof a&&(u=a,a=arguments[s]||{},s++),"object"==typeof a||ie.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(u&&n&&(ie.isPlainObject(n)||(t=ie.isArray(n)))?(t?(t=!1,o=e&&ie.isArray(e)?e:[]):o=e&&ie.isPlainObject(e)?e:{},a[r]=ie.extend(u,o,n)):void 0!==n&&(a[r]=n));return a},ie.extend({expando:"jQuery"+(re+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ie.type(e)},isArray:Array.isArray||function(e){return"array"===ie.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ie.isArray(e)&&e-parseFloat(e)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ie.type(e)||e.nodeType||ie.isWindow(e))return!1;try{if(e.constructor&&!te.call(e,"constructor")&&!te.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}if(ne.ownLast)for(t in e)return te.call(e,t);for(t in e);return void 0===t||te.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?Z[ee.call(e)]||"object":typeof e},globalEval:function(t){t&&ie.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ae,"ms-").replace(se,le)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(oe,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?ie.merge(r,"string"==typeof e?[e]:e):Q.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(J)return J.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;a>o;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),l=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&l.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&l.push(i);return K.apply([],l)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ie.isFunction(e)?(n=G.call(arguments,2),r=function(){return e.apply(t||this,n.concat(G.call(arguments)))},r.guid=e.guid=e.guid||ie.guid++,r):void 0},now:function(){return+new Date},support:ne}),ie.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){Z["[object "+t+"]"]=t.toLowerCase()});var ue=function(e){function t(e,t,n,r){var i,o,a,s,l,u,d,f,h,v;if((t?t.ownerDocument||t:B)!==O&&M(t),t=t||O,n=n||[],s=t.nodeType,"string"!=typeof e||!e||1!==s&&9!==s&&11!==s)return n;if(!r&&I){if(11!==s&&(i=ye.exec(e)))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&j(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return J.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&x.getElementsByClassName)return J.apply(n,t.getElementsByClassName(a)),n}if(x.qsa&&(!H||!H.test(e))){if(f=d=q,h=t,v=1!==s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(u=E(e),(d=t.getAttribute("id"))?f=d.replace(we,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",l=u.length;l--;)u[l]=f+p(u[l]);h=be.test(e)&&c(t.parentNode)||t,v=u.join(",")}if(v)try{return J.apply(n,h.querySelectorAll(v)),n}catch(e){}finally{d||t.removeAttribute("id")}}}return D(e.replace(le,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>_.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[q]=!0,e}function i(e){var t=O.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)_.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function u(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function d(){}function p(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function f(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=$++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,u=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[q]||(t[q]={}),(s=l[r])&&s[0]===W&&s[1]===o)return u[2]=s[2];if(l[r]=u,u[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function v(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,u=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function m(e,t,n,i,o,a){return i&&!i[q]&&(i=m(i)),o&&!o[q]&&(o=m(o,a)),r(function(r,a,s,l){var u,c,d,p=[],f=[],h=a.length,m=r||v(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?m:g(m,p,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(u=g(b,f),i(u,[],s,l),c=u.length;c--;)(d=u[c])&&(b[f[c]]=!(y[f[c]]=d));if(r){if(o||e){if(o){for(u=[],c=b.length;c--;)(d=b[c])&&u.push(y[c]=d);o(null,b=[],u,l)}for(c=b.length;c--;)(d=b[c])&&(u=o?ee(r,d):p[c])>-1&&(r[u]=!(a[u]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):J.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=_.relative[e[0].type],a=o||_.relative[" "],s=o?1:0,l=f(function(e){return e===t},a,!0),u=f(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==S)||((t=n).nodeType?l(e,n,r):u(e,n,r));return t=null,i}];i>s;s++)if(n=_.relative[e[s].type])c=[f(h(c),n)];else{if(n=_.filter[e[s].type].apply(null,e[s].matches),n[q]){for(r=++s;i>r&&!_.relative[e[r].type];r++);return m(s>1&&h(c),s>1&&p(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(le,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&p(e))}c.push(n)}return h(c)}function b(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,l,u){var c,d,p,f=0,h="0",v=r&&[],m=[],y=S,b=r||o&&_.find.TAG("*",u),w=W+=null==y?1:Math.random()||.1,x=b.length;for(u&&(S=a!==O&&a);h!==x&&null!=(c=b[h]);h++){if(o&&c){for(d=0;p=e[d++];)if(p(c,a,s)){l.push(c);break}u&&(W=w)}i&&((c=!p&&c)&&f--,r&&v.push(c))}if(f+=h,i&&h!==f){for(d=0;p=n[d++];)p(v,m,a,s);if(r){if(f>0)for(;h--;)v[h]||m[h]||(m[h]=K.call(l));m=g(m)}J.apply(l,m),u&&!r&&m.length>0&&f+n.length>1&&t.uniqueSort(l)}return u&&(W=w,S=y),v};return i?r(a):a}var w,x,_,T,C,E,A,D,S,k,L,M,O,P,I,H,N,R,j,q="sizzle"+1*new Date,B=e.document,W=0,$=0,F=n(),X=n(),Y=n(),z=function(e,t){return e===t&&(L=!0),0},V=1<<31,U={}.hasOwnProperty,G=[],K=G.pop,Q=G.push,J=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;r>n;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie=re.replace("w","w#"),oe="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ie+"))|)"+ne+"*\\]",ae=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+oe+")*)|.*)\\)|)",se=new RegExp(ne+"+","g"),le=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),ce=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),de=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),pe=new RegExp(ae),fe=new RegExp("^"+ie+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re.replace("w","w*")+")"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ae),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},ve=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,be=/[+~]/,we=/'|\\/g,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),_e=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){M()};try{J.apply(G=Z.call(B.childNodes),B.childNodes),G[B.childNodes.length].nodeType}catch(e){J={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=t.support={},C=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},M=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==O&&9===r.nodeType&&r.documentElement?(O=r,P=r.documentElement,n=r.defaultView,n&&n!==n.top&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),I=!C(r),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(r.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=me.test(r.getElementsByClassName),x.getById=i(function(e){return P.appendChild(e).id=q,!r.getElementsByName||!r.getElementsByName(q).length}),x.getById?(_.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&I){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},_.filter.ID=function(e){var t=e.replace(xe,_e);return function(e){return e.getAttribute("id")===t}}):(delete _.find.ID,_.filter.ID=function(e){var t=e.replace(xe,_e);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),_.find.TAG=x.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):x.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},_.find.CLASS=x.getElementsByClassName&&function(e,t){return I?t.getElementsByClassName(e):void 0},N=[],H=[],(x.qsa=me.test(r.querySelectorAll))&&(i(function(e){P.appendChild(e).innerHTML="<a id='"+q+"'></a><select id='"+q+"-\f]' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&H.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||H.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+q+"-]").length||H.push("~="),e.querySelectorAll(":checked").length||H.push(":checked"),e.querySelectorAll("a#"+q+"+*").length||H.push(".#.+[+~]")}),i(function(e){var t=r.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&H.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),H.push(",.*:")})),(x.matchesSelector=me.test(R=P.matches||P.webkitMatchesSelector||P.mozMatchesSelector||P.oMatchesSelector||P.msMatchesSelector))&&i(function(e){x.disconnectedMatch=R.call(e,"div"),R.call(e,"[s!='']:x"),N.push("!=",ae)}),H=H.length&&new RegExp(H.join("|")),N=N.length&&new RegExp(N.join("|")),t=me.test(P.compareDocumentPosition),j=t||me.test(P.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},z=t?function(e,t){if(e===t)return L=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===r||e.ownerDocument===B&&j(B,e)?-1:t===r||t.ownerDocument===B&&j(B,t)?1:k?ee(k,e)-ee(k,t):0:4&n?-1:1)}:function(e,t){if(e===t)return L=!0,0;var n,i=0,o=e.parentNode,s=t.parentNode,l=[e],u=[t];if(!o||!s)return e===r?-1:t===r?1:o?-1:s?1:k?ee(k,e)-ee(k,t):0;if(o===s)return a(e,t);for(n=e;n=n.parentNode;)l.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;l[i]===u[i];)i++;return i?a(l[i],u[i]):l[i]===B?-1:u[i]===B?1:0},r):O},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==O&&M(e),n=n.replace(de,"='$1']"),!(!x.matchesSelector||!I||N&&N.test(n)||H&&H.test(n)))try{var r=R.call(e,n);if(r||x.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,O,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==O&&M(e),j(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==O&&M(e);var n=_.attrHandle[t.toLowerCase()],r=n&&U.call(_.attrHandle,t.toLowerCase())?n(e,t,!I):void 0;return void 0!==r?r:x.attributes||!I?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(L=!x.detectDuplicates,k=!x.sortStable&&e.slice(0),e.sort(z),L){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return k=null,e},T=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=T(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=T(t);return n},_=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,_e),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,_e),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&pe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,_e).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=F[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&F(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,d,p,f,h,v=o!==a?"nextSibling":"previousSibling",g=t.parentNode,m=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;v;){for(d=t;d=d[v];)if(s?d.nodeName.toLowerCase()===m:1===d.nodeType)return!1;h=v="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(c=g[q]||(g[q]={}),u=c[e]||[],f=u[0]===W&&u[1],p=u[0]===W&&u[2],d=f&&g.childNodes[f];d=++f&&d&&d[v]||(p=f=0)||h.pop();)if(1===d.nodeType&&++p&&d===t){c[e]=[W,f,p];break}}else if(y&&(u=(t[q]||(t[q]={}))[e])&&u[0]===W)p=u[1];else for(;(d=++f&&d&&d[v]||(p=f=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==m:1!==d.nodeType)||!++p||(y&&((d[q]||(d[q]={}))[e]=[W,p]),d!==t)););return p-=i,p===r||p%r===0&&p/r>=0}}},PSEUDO:function(e,n){var i,o=_.pseudos[e]||_.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[q]?o(n):o.length>1?(i=[e,e,"",n],_.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=A(e.replace(le,"$1"));return i[q]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,_e),function(t){return(t.textContent||t.innerText||T(t)).indexOf(e)>-1}}),lang:r(function(e){return fe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,_e).toLowerCase(),function(t){var n;do if(n=I?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===P},focus:function(e){return e===O.activeElement&&(!O.hasFocus||O.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!_.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return ve.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:u(function(){return[0]}),last:u(function(e,t){return[t-1]}),eq:u(function(e,t,n){return[0>n?n+t:n]}),even:u(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:u(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:u(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:u(function(e,t,n){for(var r=0>n?n+t:n;++r<t;)e.push(r);return e})}},_.pseudos.nth=_.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})_.pseudos[w]=s(w);for(w in{submit:!0,reset:!0})_.pseudos[w]=l(w);return d.prototype=_.filters=_.pseudos,_.setFilters=new d,E=t.tokenize=function(e,n){var r,i,o,a,s,l,u,c=X[e+" "];if(c)return n?0:c.slice(0);for(s=e,l=[],u=_.preFilter;s;){(!r||(i=ue.exec(s)))&&(i&&(s=s.slice(i[0].length)||s),l.push(o=[])),r=!1,(i=ce.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(le," ")}),s=s.slice(r.length));for(a in _.filter)!(i=he[a].exec(s))||u[a]&&!(i=u[a](i))||(r=i.shift(),
o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):X(e,l).slice(0)},A=t.compile=function(e,t){var n,r=[],i=[],o=Y[e+" "];if(!o){for(t||(t=E(e)),n=t.length;n--;)o=y(t[n]),o[q]?r.push(o):i.push(o);o=Y(e,b(i,r)),o.selector=e}return o},D=t.select=function(e,t,n,r){var i,o,a,s,l,u="function"==typeof e&&e,d=!r&&E(e=u.selector||e);if(n=n||[],1===d.length){if(o=d[0]=d[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&x.getById&&9===t.nodeType&&I&&_.relative[o[1].type]){if(t=(_.find.ID(a.matches[0].replace(xe,_e),t)||[])[0],!t)return n;u&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=he.needsContext.test(e)?0:o.length;i--&&(a=o[i],!_.relative[s=a.type]);)if((l=_.find[s])&&(r=l(a.matches[0].replace(xe,_e),be.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return J.apply(n,r),n;break}}return(u||A(e,d))(r,t,!I,n,be.test(e)&&c(t.parentNode)||t),n},x.sortStable=q.split("").sort(z).join("")===q,x.detectDuplicates=!!L,M(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(O.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);ie.find=ue,ie.expr=ue.selectors,ie.expr[":"]=ie.expr.pseudos,ie.unique=ue.uniqueSort,ie.text=ue.getText,ie.isXMLDoc=ue.isXML,ie.contains=ue.contains;var ce=ie.expr.match.needsContext,de=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,pe=/^.[^:#\[\.,]*$/;ie.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ie.find.matchesSelector(r,e)?[r]:[]:ie.find.matches(e,ie.grep(t,function(e){return 1===e.nodeType}))},ie.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(ie(e).filter(function(){for(t=0;i>t;t++)if(ie.contains(r[t],this))return!0}));for(t=0;i>t;t++)ie.find(e,r[t],n);return n=this.pushStack(i>1?ie.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&ce.test(e)?ie(e):e||[],!1).length}});var fe,he=e.document,ve=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ge=ie.fn.init=function(e,t){var n,r;if(!e)return this;if("string"==typeof e){if(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:ve.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||fe).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof ie?t[0]:t,ie.merge(this,ie.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:he,!0)),de.test(n[1])&&ie.isPlainObject(t))for(n in t)ie.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if(r=he.getElementById(n[2]),r&&r.parentNode){if(r.id!==n[2])return fe.find(e);this.length=1,this[0]=r}return this.context=he,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ie.isFunction(e)?"undefined"!=typeof fe.ready?fe.ready(e):e(ie):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ie.makeArray(e,this))};ge.prototype=ie.fn,fe=ie(he);var me=/^(?:parents|prev(?:Until|All))/,ye={children:!0,contents:!0,next:!0,prev:!0};ie.extend({dir:function(e,t,n){for(var r=[],i=e[t];i&&9!==i.nodeType&&(void 0===n||1!==i.nodeType||!ie(i).is(n));)1===i.nodeType&&r.push(i),i=i[t];return r},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),ie.fn.extend({has:function(e){var t,n=ie(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(ie.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=ce.test(e)||"string"!=typeof e?ie(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&ie.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ie.unique(o):o)},index:function(e){return e?"string"==typeof e?ie.inArray(this[0],ie(e)):ie.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ie.unique(ie.merge(this.get(),ie(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ie.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ie.dir(e,"parentNode")},parentsUntil:function(e,t,n){return ie.dir(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return ie.dir(e,"nextSibling")},prevAll:function(e){return ie.dir(e,"previousSibling")},nextUntil:function(e,t,n){return ie.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return ie.dir(e,"previousSibling",n)},siblings:function(e){return ie.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return ie.sibling(e.firstChild)},contents:function(e){return ie.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:ie.merge([],e.childNodes)}},function(e,t){ie.fn[e]=function(n,r){var i=ie.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ie.filter(r,i)),this.length>1&&(ye[e]||(i=ie.unique(i)),me.test(e)&&(i=i.reverse())),this.pushStack(i)}});var be=/\S+/g,we={};ie.Callbacks=function(e){e="string"==typeof e?we[e]||o(e):ie.extend({},e);var t,n,r,i,a,s,l=[],u=!e.once&&[],c=function(o){for(n=e.memory&&o,r=!0,a=s||0,s=0,i=l.length,t=!0;l&&i>a;a++)if(l[a].apply(o[0],o[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,l&&(u?u.length&&c(u.shift()):n?l=[]:d.disable())},d={add:function(){if(l){var r=l.length;!function t(n){ie.each(n,function(n,r){var i=ie.type(r);"function"===i?e.unique&&d.has(r)||l.push(r):r&&r.length&&"string"!==i&&t(r)})}(arguments),t?i=l.length:n&&(s=r,c(n))}return this},remove:function(){return l&&ie.each(arguments,function(e,n){for(var r;(r=ie.inArray(n,l,r))>-1;)l.splice(r,1),t&&(i>=r&&i--,a>=r&&a--)}),this},has:function(e){return e?ie.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],i=0,this},disable:function(){return l=u=n=void 0,this},disabled:function(){return!l},lock:function(){return u=void 0,n||d.disable(),this},locked:function(){return!u},fireWith:function(e,n){return!l||r&&!u||(n=n||[],n=[e,n.slice?n.slice():n],t?u.push(n):c(n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!r}};return d},ie.extend({Deferred:function(e){var t=[["resolve","done",ie.Callbacks("once memory"),"resolved"],["reject","fail",ie.Callbacks("once memory"),"rejected"],["notify","progress",ie.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ie.Deferred(function(n){ie.each(t,function(t,o){var a=ie.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&ie.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ie.extend(e,r):r}},i={};return r.pipe=r.then,ie.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=G.call(arguments),a=o.length,s=1!==a||e&&ie.isFunction(e.promise)?a:0,l=1===s?e:ie.Deferred(),u=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?G.call(arguments):i,r===t?l.notifyWith(n,r):--s||l.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);a>i;i++)o[i]&&ie.isFunction(o[i].promise)?o[i].promise().done(u(i,r,o)).fail(l.reject).progress(u(i,n,t)):--s;return s||l.resolveWith(r,o),l.promise()}});var xe;ie.fn.ready=function(e){return ie.ready.promise().done(e),this},ie.extend({isReady:!1,readyWait:1,holdReady:function(e){e?ie.readyWait++:ie.ready(!0)},ready:function(e){if(e===!0?!--ie.readyWait:!ie.isReady){if(!he.body)return setTimeout(ie.ready);ie.isReady=!0,e!==!0&&--ie.readyWait>0||(xe.resolveWith(he,[ie]),ie.fn.triggerHandler&&(ie(he).triggerHandler("ready"),ie(he).off("ready")))}}}),ie.ready.promise=function(t){if(!xe)if(xe=ie.Deferred(),"complete"===he.readyState)setTimeout(ie.ready);else if(he.addEventListener)he.addEventListener("DOMContentLoaded",s,!1),e.addEventListener("load",s,!1);else{he.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&he.documentElement}catch(e){}n&&n.doScroll&&!function e(){if(!ie.isReady){try{n.doScroll("left")}catch(t){return setTimeout(e,50)}a(),ie.ready()}}()}return xe.promise(t)};var _e,Te="undefined";for(_e in ie(ne))break;ne.ownLast="0"!==_e,ne.inlineBlockNeedsLayout=!1,ie(function(){var e,t,n,r;n=he.getElementsByTagName("body")[0],n&&n.style&&(t=he.createElement("div"),r=he.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==Te&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",ne.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=he.createElement("div");if(null==ne.deleteExpando){ne.deleteExpando=!0;try{delete e.test}catch(e){ne.deleteExpando=!1}}e=null}(),ie.acceptData=function(e){var t=ie.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)};var Ce=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Ee=/([A-Z])/g;ie.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?ie.cache[e[ie.expando]]:e[ie.expando],!!e&&!u(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return d(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return d(e,t,!0)}}),ie.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=ie.data(o),1===o.nodeType&&!ie._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=ie.camelCase(r.slice(5)),l(o,r,i[r])));ie._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){ie.data(this,e)}):arguments.length>1?this.each(function(){ie.data(this,e,t)}):o?l(o,e,ie.data(o,e)):void 0},removeData:function(e){return this.each(function(){ie.removeData(this,e)})}}),ie.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=ie._data(e,t),n&&(!r||ie.isArray(n)?r=ie._data(e,t,ie.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=ie.queue(e,t),r=n.length,i=n.shift(),o=ie._queueHooks(e,t),a=function(){ie.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ie._data(e,n)||ie._data(e,n,{empty:ie.Callbacks("once memory").add(function(){ie._removeData(e,t+"queue"),ie._removeData(e,n)})})}}),ie.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?ie.queue(this[0],e):void 0===t?this:this.each(function(){var n=ie.queue(this,e,t);ie._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&ie.dequeue(this,e)})},dequeue:function(e){return this.each(function(){ie.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ie.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=ie._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var Ae=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,De=["Top","Right","Bottom","Left"],Se=function(e,t){return e=t||e,"none"===ie.css(e,"display")||!ie.contains(e.ownerDocument,e)},ke=ie.access=function(e,t,n,r,i,o,a){var s=0,l=e.length,u=null==n;if("object"===ie.type(n)){i=!0;for(s in n)ie.access(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,ie.isFunction(r)||(a=!0),u&&(a?(t.call(e,r),t=null):(u=t,t=function(e,t,n){return u.call(ie(e),n)})),t))for(;l>s;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:u?t.call(e):l?t(e[0],n):o},Le=/^(?:checkbox|radio)$/i;!function(){var e=he.createElement("input"),t=he.createElement("div"),n=he.createDocumentFragment();if(t.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",ne.leadingWhitespace=3===t.firstChild.nodeType,ne.tbody=!t.getElementsByTagName("tbody").length,ne.htmlSerialize=!!t.getElementsByTagName("link").length,ne.html5Clone="<:nav></:nav>"!==he.createElement("nav").cloneNode(!0).outerHTML,e.type="checkbox",e.checked=!0,n.appendChild(e),ne.appendChecked=e.checked,t.innerHTML="<textarea>x</textarea>",ne.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,n.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",ne.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,ne.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){ne.noCloneEvent=!1}),t.cloneNode(!0).click()),null==ne.deleteExpando){ne.deleteExpando=!0;try{delete t.test}catch(e){ne.deleteExpando=!1}}}(),function(){var t,n,r=he.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(ne[t+"Bubbles"]=n in e)||(r.setAttribute(n,"t"),ne[t+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var Me=/^(?:input|select|textarea)$/i,Oe=/^key/,Pe=/^(?:mouse|pointer|contextmenu)|click/,Ie=/^(?:focusinfocus|focusoutblur)$/,He=/^([^.]*)(?:\.(.+)|)$/;ie.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,u,c,d,p,f,h,v,g=ie._data(e);if(g){for(n.handler&&(l=n,n=l.handler,i=l.selector),n.guid||(n.guid=ie.guid++),(a=g.events)||(a=g.events={}),(c=g.handle)||(c=g.handle=function(e){return typeof ie===Te||e&&ie.event.triggered===e.type?void 0:ie.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(be)||[""],s=t.length;s--;)o=He.exec(t[s])||[],f=v=o[1],h=(o[2]||"").split(".").sort(),f&&(u=ie.event.special[f]||{},f=(i?u.delegateType:u.bindType)||f,u=ie.event.special[f]||{},d=ie.extend({type:f,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ie.expr.match.needsContext.test(i),namespace:h.join(".")},l),(p=a[f])||(p=a[f]=[],p.delegateCount=0,u.setup&&u.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(f,c,!1):e.attachEvent&&e.attachEvent("on"+f,c))),u.add&&(u.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,d):p.push(d),ie.event.global[f]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,d,p,f,h,v,g=ie.hasData(e)&&ie._data(e);if(g&&(c=g.events)){for(t=(t||"").match(be)||[""],u=t.length;u--;)if(s=He.exec(t[u])||[],f=v=s[1],h=(s[2]||"").split(".").sort(),f){for(d=ie.event.special[f]||{},f=(r?d.delegateType:d.bindType)||f,p=c[f]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=p.length;o--;)a=p[o],!i&&v!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(p.splice(o,1),a.selector&&p.delegateCount--,d.remove&&d.remove.call(e,a));l&&!p.length&&(d.teardown&&d.teardown.call(e,h,g.handle)!==!1||ie.removeEvent(e,f,g.handle),delete c[f])}else for(f in c)ie.event.remove(e,f+t[u],n,r,!0);ie.isEmptyObject(c)&&(delete g.handle,ie._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,l,u,c,d,p=[r||he],f=te.call(t,"type")?t.type:t,h=te.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||he,3!==r.nodeType&&8!==r.nodeType&&!Ie.test(f+ie.event.triggered)&&(f.indexOf(".")>=0&&(h=f.split("."),f=h.shift(),h.sort()),a=f.indexOf(":")<0&&"on"+f,t=t[ie.expando]?t:new ie.Event(f,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:ie.makeArray(n,[t]),u=ie.event.special[f]||{},i||!u.trigger||u.trigger.apply(r,n)!==!1)){if(!i&&!u.noBubble&&!ie.isWindow(r)){for(l=u.delegateType||f,Ie.test(l+f)||(s=s.parentNode);s;s=s.parentNode)p.push(s),c=s;c===(r.ownerDocument||he)&&p.push(c.defaultView||c.parentWindow||e)}for(d=0;(s=p[d++])&&!t.isPropagationStopped();)t.type=d>1?l:u.bindType||f,o=(ie._data(s,"events")||{})[t.type]&&ie._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&ie.acceptData(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=f,!i&&!t.isDefaultPrevented()&&(!u._default||u._default.apply(p.pop(),n)===!1)&&ie.acceptData(r)&&a&&r[f]&&!ie.isWindow(r)){c=r[a],c&&(r[a]=null),ie.event.triggered=f;try{r[f]()}catch(e){}ie.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=ie.event.fix(e);var t,n,r,i,o,a=[],s=G.call(arguments),l=(ie._data(this,"events")||{})[e.type]||[],u=ie.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!u.preDispatch||u.preDispatch.call(this,e)!==!1){for(a=ie.event.handlers.call(this,e,l),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,o=0;(r=i.handlers[o++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(r.namespace))&&(e.handleObj=r,e.data=r.data,n=((ie.event.special[r.origType]||{}).handle||r.handler).apply(i.elem,s),void 0!==n&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(i=[],o=0;s>o;o++)r=t[o],n=r.selector+" ",void 0===i[n]&&(i[n]=r.needsContext?ie(n,this).index(l)>=0:ie.find(n,this,null,[l]).length),i[n]&&i.push(r);i.length&&a.push({elem:l,handlers:i})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[ie.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Pe.test(i)?this.mouseHooks:Oe.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new ie.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||he),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||he,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==h()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===h()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return ie.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(e){return ie.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=ie.extend(new ie.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?ie.event.trigger(i,null,t):ie.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},ie.removeEvent=he.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===Te&&(e[r]=null),e.detachEvent(r,n))},ie.Event=function(e,t){return this instanceof ie.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?p:f):this.type=e,t&&ie.extend(this,t),this.timeStamp=e&&e.timeStamp||ie.now(),void(this[ie.expando]=!0)):new ie.Event(e,t)},ie.Event.prototype={isDefaultPrevented:f,isPropagationStopped:f,isImmediatePropagationStopped:f,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=p,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=p,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=p,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},ie.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){ie.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!ie.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),ne.submitBubbles||(ie.event.special.submit={setup:function(){return!ie.nodeName(this,"form")&&void ie.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=ie.nodeName(t,"input")||ie.nodeName(t,"button")?t.form:void 0;n&&!ie._data(n,"submitBubbles")&&(ie.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),ie._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&ie.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return!ie.nodeName(this,"form")&&void ie.event.remove(this,"._submit")}}),ne.changeBubbles||(ie.event.special.change={setup:function(){return Me.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ie.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),ie.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),ie.event.simulate("change",this,e,!0)})),!1):void ie.event.add(this,"beforeactivate._change",function(e){var t=e.target;Me.test(t.nodeName)&&!ie._data(t,"changeBubbles")&&(ie.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||ie.event.simulate("change",this.parentNode,e,!0)}),ie._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ie.event.remove(this,"._change"),!Me.test(this.nodeName)}}),ne.focusinBubbles||ie.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ie.event.simulate(t,e.target,ie.event.fix(e),!0)};ie.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=ie._data(r,t);i||r.addEventListener(e,n,!0),ie._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=ie._data(r,t)-1;i?ie._data(r,t,i):(r.removeEventListener(e,n,!0),ie._removeData(r,t))}}}),ie.fn.extend({on:function(e,t,n,r,i){var o,a;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=void 0);for(o in e)this.on(o,t,n,e[o],i);return this}if(null==n&&null==r?(r=t,n=t=void 0):null==r&&("string"==typeof t?(r=n,n=void 0):(r=n,n=t,t=void 0)),r===!1)r=f;else if(!r)return this;return 1===i&&(a=r,r=function(e){return ie().off(e),a.apply(this,arguments)},r.guid=a.guid||(a.guid=ie.guid++)),this.each(function(){ie.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ie(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=void 0),n===!1&&(n=f),this.each(function(){ie.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){ie.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?ie.event.trigger(e,t,n,!0):void 0}});var Ne="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Re=/ jQuery\d+="(?:null|\d+)"/g,je=new RegExp("<(?:"+Ne+")[\\s/>]","i"),qe=/^\s+/,Be=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,We=/<([\w:]+)/,$e=/<tbody/i,Fe=/<|&#?\w+;/,Xe=/<(?:script|style|link)/i,Ye=/checked\s*(?:[^=]|=\s*.checked.)/i,ze=/^$|\/(?:java|ecma)script/i,Ve=/^true\/(.*)/,Ue=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Ge={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:ne.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Ke=v(he),Qe=Ke.appendChild(he.createElement("div"));Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td,ie.extend({clone:function(e,t,n){var r,i,o,a,s,l=ie.contains(e.ownerDocument,e);if(ne.html5Clone||ie.isXMLDoc(e)||!je.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Qe.innerHTML=e.outerHTML,Qe.removeChild(o=Qe.firstChild)),!(ne.noCloneEvent&&ne.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ie.isXMLDoc(e)))for(r=g(o),s=g(e),a=0;null!=(i=s[a]);++a)r[a]&&T(i,r[a]);if(t)if(n)for(s=s||g(e),r=r||g(o),a=0;null!=(i=s[a]);a++)_(i,r[a]);else _(e,o);return r=g(o,"script"),r.length>0&&x(r,!l&&g(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,l,u,c,d=e.length,p=v(t),f=[],h=0;d>h;h++)if(o=e[h],o||0===o)if("object"===ie.type(o))ie.merge(f,o.nodeType?[o]:o);else if(Fe.test(o)){for(s=s||p.appendChild(t.createElement("div")),l=(We.exec(o)||["",""])[1].toLowerCase(),c=Ge[l]||Ge._default,s.innerHTML=c[1]+o.replace(Be,"<$1></$2>")+c[2],i=c[0];i--;)s=s.lastChild;if(!ne.leadingWhitespace&&qe.test(o)&&f.push(t.createTextNode(qe.exec(o)[0])),!ne.tbody)for(o="table"!==l||$e.test(o)?"<table>"!==c[1]||$e.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)ie.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u);for(ie.merge(f,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=p.lastChild}else f.push(t.createTextNode(o));for(s&&p.removeChild(s),ne.appendChecked||ie.grep(g(f,"input"),m),h=0;o=f[h++];)if((!r||-1===ie.inArray(o,r))&&(a=ie.contains(o.ownerDocument,o),s=g(p.appendChild(o),"script"),a&&x(s),n))for(i=0;o=s[i++];)ze.test(o.type||"")&&n.push(o);return s=null,p},cleanData:function(e,t){for(var n,r,i,o,a=0,s=ie.expando,l=ie.cache,u=ne.deleteExpando,c=ie.event.special;null!=(n=e[a]);a++)if((t||ie.acceptData(n))&&(i=n[s],o=i&&l[i])){if(o.events)for(r in o.events)c[r]?ie.event.remove(n,r):ie.removeEvent(n,r,o.handle);l[i]&&(delete l[i],u?delete n[s]:typeof n.removeAttribute!==Te?n.removeAttribute(s):n[s]=null,U.push(i))}}}),ie.fn.extend({text:function(e){return ke(this,function(e){return void 0===e?ie.text(this):this.empty().append((this[0]&&this[0].ownerDocument||he).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=e?ie.filter(e,this):this,i=0;null!=(n=r[i]);i++)t||1!==n.nodeType||ie.cleanData(g(n)),n.parentNode&&(t&&ie.contains(n.ownerDocument,n)&&x(g(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&ie.cleanData(g(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&ie.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ie.clone(this,e,t)})},html:function(e){return ke(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Re,""):void 0;if(!("string"!=typeof e||Xe.test(e)||!ne.htmlSerialize&&je.test(e)||!ne.leadingWhitespace&&qe.test(e)||Ge[(We.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(Be,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(ie.cleanData(g(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,ie.cleanData(g(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=K.apply([],e);var n,r,i,o,a,s,l=0,u=this.length,c=this,d=u-1,p=e[0],f=ie.isFunction(p);if(f||u>1&&"string"==typeof p&&!ne.checkClone&&Ye.test(p))return this.each(function(n){var r=c.eq(n);f&&(e[0]=p.call(this,n,r.html())),r.domManip(e,t)});if(u&&(s=ie.buildFragment(e,this[0].ownerDocument,!1,this),n=s.firstChild,1===s.childNodes.length&&(s=n),n)){for(o=ie.map(g(s,"script"),b),i=o.length;u>l;l++)r=s,l!==d&&(r=ie.clone(r,!0,!0),i&&ie.merge(o,g(r,"script"))),t.call(this[l],r,l);if(i)for(a=o[o.length-1].ownerDocument,ie.map(o,w),l=0;i>l;l++)r=o[l],ze.test(r.type||"")&&!ie._data(r,"globalEval")&&ie.contains(a,r)&&(r.src?ie._evalUrl&&ie._evalUrl(r.src):ie.globalEval((r.text||r.textContent||r.innerHTML||"").replace(Ue,"")));s=n=null}return this}}),ie.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){ie.fn[e]=function(e){for(var n,r=0,i=[],o=ie(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),ie(o[r])[t](n),Q.apply(i,n.get());return this.pushStack(i)}});var Je,Ze={};!function(){var e;ne.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=he.getElementsByTagName("body")[0],n&&n.style?(t=he.createElement("div"),r=he.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==Te&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(he.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var et,tt,nt=/^margin/,rt=new RegExp("^("+Ae+")(?!px)[a-z%]+$","i"),it=/^(top|right|bottom|left)$/;e.getComputedStyle?(et=function(t){return t.ownerDocument.defaultView.opener?t.ownerDocument.defaultView.getComputedStyle(t,null):e.getComputedStyle(t,null)},tt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||et(e),a=n?n.getPropertyValue(t)||n[t]:void 0,n&&(""!==a||ie.contains(e.ownerDocument,e)||(a=ie.style(e,t)),rt.test(a)&&nt.test(t)&&(r=s.width,i=s.minWidth,
o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0===a?a:a+""}):he.documentElement.currentStyle&&(et=function(e){return e.currentStyle},tt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||et(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),rt.test(a)&&!it.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"}),!function(){function t(){var t,n,r,i;n=he.getElementsByTagName("body")[0],n&&n.style&&(t=he.createElement("div"),r=he.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),t.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",o=a=!1,l=!0,e.getComputedStyle&&(o="1%"!==(e.getComputedStyle(t,null)||{}).top,a="4px"===(e.getComputedStyle(t,null)||{width:"4px"}).width,i=t.appendChild(he.createElement("div")),i.style.cssText=t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",t.style.width="1px",l=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight),t.removeChild(i)),t.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=t.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",s=0===i[0].offsetHeight,s&&(i[0].style.display="",i[1].style.display="none",s=0===i[0].offsetHeight),n.removeChild(r))}var n,r,i,o,a,s,l;n=he.createElement("div"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",i=n.getElementsByTagName("a")[0],(r=i&&i.style)&&(r.cssText="float:left;opacity:.5",ne.opacity="0.5"===r.opacity,ne.cssFloat=!!r.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",ne.clearCloneStyle="content-box"===n.style.backgroundClip,ne.boxSizing=""===r.boxSizing||""===r.MozBoxSizing||""===r.WebkitBoxSizing,ie.extend(ne,{reliableHiddenOffsets:function(){return null==s&&t(),s},boxSizingReliable:function(){return null==a&&t(),a},pixelPosition:function(){return null==o&&t(),o},reliableMarginRight:function(){return null==l&&t(),l}}))}(),ie.swap=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};var ot=/alpha\([^)]*\)/i,at=/opacity\s*=\s*([^)]*)/,st=/^(none|table(?!-c[ea]).+)/,lt=new RegExp("^("+Ae+")(.*)$","i"),ut=new RegExp("^([+-])=("+Ae+")","i"),ct={position:"absolute",visibility:"hidden",display:"block"},dt={letterSpacing:"0",fontWeight:"400"},pt=["Webkit","O","Moz","ms"];ie.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=tt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:ne.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ie.camelCase(t),l=e.style;if(t=ie.cssProps[s]||(ie.cssProps[s]=D(l,s)),a=ie.cssHooks[t]||ie.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];if(o=typeof n,"string"===o&&(i=ut.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(ie.css(e,t)),o="number"),null!=n&&n===n&&("number"!==o||ie.cssNumber[s]||(n+="px"),ne.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{l[t]=n}catch(e){}}},css:function(e,t,n,r){var i,o,a,s=ie.camelCase(t);return t=ie.cssProps[s]||(ie.cssProps[s]=D(e.style,s)),a=ie.cssHooks[t]||ie.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=tt(e,t,r)),"normal"===o&&t in dt&&(o=dt[t]),""===n||n?(i=parseFloat(o),n===!0||ie.isNumeric(i)?i||0:o):o}}),ie.each(["height","width"],function(e,t){ie.cssHooks[t]={get:function(e,n,r){return n?st.test(ie.css(e,"display"))&&0===e.offsetWidth?ie.swap(e,ct,function(){return M(e,t,r)}):M(e,t,r):void 0},set:function(e,n,r){var i=r&&et(e);return k(e,n,r?L(e,t,r,ne.boxSizing&&"border-box"===ie.css(e,"boxSizing",!1,i),i):0)}}}),ne.opacity||(ie.cssHooks.opacity={get:function(e,t){return at.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=ie.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===ie.trim(o.replace(ot,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=ot.test(o)?o.replace(ot,i):o+" "+i)}}),ie.cssHooks.marginRight=A(ne.reliableMarginRight,function(e,t){return t?ie.swap(e,{display:"inline-block"},tt,[e,"marginRight"]):void 0}),ie.each({margin:"",padding:"",border:"Width"},function(e,t){ie.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+De[r]+t]=o[r]||o[r-2]||o[0];return i}},nt.test(e)||(ie.cssHooks[e+t].set=k)}),ie.fn.extend({css:function(e,t){return ke(this,function(e,t,n){var r,i,o={},a=0;if(ie.isArray(t)){for(r=et(e),i=t.length;i>a;a++)o[t[a]]=ie.css(e,t[a],!1,r);return o}return void 0!==n?ie.style(e,t,n):ie.css(e,t)},e,t,arguments.length>1)},show:function(){return S(this,!0)},hide:function(){return S(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Se(this)?ie(this).show():ie(this).hide()})}}),ie.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ie.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=ie.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=ie.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){ie.fx.step[e.prop]?ie.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[ie.cssProps[e.prop]]||ie.cssHooks[e.prop])?ie.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ie.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},ie.fx=O.prototype.init,ie.fx.step={};var ft,ht,vt=/^(?:toggle|show|hide)$/,gt=new RegExp("^(?:([+-])=|)("+Ae+")([a-z%]*)$","i"),mt=/queueHooks$/,yt=[N],bt={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=gt.exec(t),o=i&&i[3]||(ie.cssNumber[e]?"":"px"),a=(ie.cssNumber[e]||"px"!==o&&+r)&&gt.exec(ie.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,ie.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};ie.Animation=ie.extend(j,{tweener:function(e,t){ie.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],bt[n]=bt[n]||[],bt[n].unshift(t)},prefilter:function(e,t){t?yt.unshift(e):yt.push(e)}}),ie.speed=function(e,t,n){var r=e&&"object"==typeof e?ie.extend({},e):{complete:n||!n&&t||ie.isFunction(e)&&e,duration:e,easing:n&&t||t&&!ie.isFunction(t)&&t};return r.duration=ie.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in ie.fx.speeds?ie.fx.speeds[r.duration]:ie.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){ie.isFunction(r.old)&&r.old.call(this),r.queue&&ie.dequeue(this,r.queue)},r},ie.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=ie.isEmptyObject(e),o=ie.speed(t,n,r),a=function(){var t=j(this,ie.extend({},e),o);(i||ie._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=ie.timers,a=ie._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&mt.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&ie.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=ie._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=ie.timers,a=r?r.length:0;for(n.finish=!0,ie.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),ie.each(["toggle","show","hide"],function(e,t){var n=ie.fn[t];ie.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(I(t,!0),e,r,i)}}),ie.each({slideDown:I("show"),slideUp:I("hide"),slideToggle:I("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){ie.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),ie.timers=[],ie.fx.tick=function(){var e,t=ie.timers,n=0;for(ft=ie.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||ie.fx.stop(),ft=void 0},ie.fx.timer=function(e){ie.timers.push(e),e()?ie.fx.start():ie.timers.pop()},ie.fx.interval=13,ie.fx.start=function(){ht||(ht=setInterval(ie.fx.tick,ie.fx.interval))},ie.fx.stop=function(){clearInterval(ht),ht=null},ie.fx.speeds={slow:600,fast:200,_default:400},ie.fn.delay=function(e,t){return e=ie.fx?ie.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e,t,n,r,i;t=he.createElement("div"),t.setAttribute("className","t"),t.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=t.getElementsByTagName("a")[0],n=he.createElement("select"),i=n.appendChild(he.createElement("option")),e=t.getElementsByTagName("input")[0],r.style.cssText="top:1px",ne.getSetAttribute="t"!==t.className,ne.style=/top/.test(r.getAttribute("style")),ne.hrefNormalized="/a"===r.getAttribute("href"),ne.checkOn=!!e.value,ne.optSelected=i.selected,ne.enctype=!!he.createElement("form").enctype,n.disabled=!0,ne.optDisabled=!i.disabled,e=he.createElement("input"),e.setAttribute("value",""),ne.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),ne.radioValue="t"===e.value}();var wt=/\r/g;ie.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=ie.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ie(this).val()):e,null==i?i="":"number"==typeof i?i+="":ie.isArray(i)&&(i=ie.map(i,function(e){return null==e?"":e+""})),t=ie.valHooks[this.type]||ie.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=ie.valHooks[i.type]||ie.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)):void 0}}),ie.extend({valHooks:{option:{get:function(e){var t=ie.find.attr(e,"value");return null!=t?t:ie.trim(ie.text(e))}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(ne.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&ie.nodeName(n.parentNode,"optgroup"))){if(t=ie(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=ie.makeArray(t),a=i.length;a--;)if(r=i[a],ie.inArray(ie.valHooks.option.get(r),o)>=0)try{r.selected=n=!0}catch(e){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),ie.each(["radio","checkbox"],function(){ie.valHooks[this]={set:function(e,t){return ie.isArray(t)?e.checked=ie.inArray(ie(e).val(),t)>=0:void 0}},ne.checkOn||(ie.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var xt,_t,Tt=ie.expr.attrHandle,Ct=/^(?:checked|selected)$/i,Et=ne.getSetAttribute,At=ne.input;ie.fn.extend({attr:function(e,t){return ke(this,ie.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){ie.removeAttr(this,e)})}}),ie.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(e&&3!==o&&8!==o&&2!==o)return typeof e.getAttribute===Te?ie.prop(e,t,n):(1===o&&ie.isXMLDoc(e)||(t=t.toLowerCase(),r=ie.attrHooks[t]||(ie.expr.match.bool.test(t)?_t:xt)),void 0===n?r&&"get"in r&&null!==(i=r.get(e,t))?i:(i=ie.find.attr(e,t),null==i?void 0:i):null!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):void ie.removeAttr(e,t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(be);if(o&&1===e.nodeType)for(;n=o[i++];)r=ie.propFix[n]||n,ie.expr.match.bool.test(n)?At&&Et||!Ct.test(n)?e[r]=!1:e[ie.camelCase("default-"+n)]=e[r]=!1:ie.attr(e,n,""),e.removeAttribute(Et?n:r)},attrHooks:{type:{set:function(e,t){if(!ne.radioValue&&"radio"===t&&ie.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),_t={set:function(e,t,n){return t===!1?ie.removeAttr(e,n):At&&Et||!Ct.test(n)?e.setAttribute(!Et&&ie.propFix[n]||n,n):e[ie.camelCase("default-"+n)]=e[n]=!0,n}},ie.each(ie.expr.match.bool.source.match(/\w+/g),function(e,t){var n=Tt[t]||ie.find.attr;Tt[t]=At&&Et||!Ct.test(t)?function(e,t,r){var i,o;return r||(o=Tt[t],Tt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,Tt[t]=o),i}:function(e,t,n){return n?void 0:e[ie.camelCase("default-"+t)]?t.toLowerCase():null}}),At&&Et||(ie.attrHooks.value={set:function(e,t,n){return ie.nodeName(e,"input")?void(e.defaultValue=t):xt&&xt.set(e,t,n)}}),Et||(xt={set:function(e,t,n){var r=e.getAttributeNode(n);return r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n)?t:void 0}},Tt.id=Tt.name=Tt.coords=function(e,t,n){var r;return n?void 0:(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},ie.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:void 0},set:xt.set},ie.attrHooks.contenteditable={set:function(e,t,n){xt.set(e,""!==t&&t,n)}},ie.each(["width","height"],function(e,t){ie.attrHooks[t]={set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}}})),ne.style||(ie.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Dt=/^(?:input|select|textarea|button|object)$/i,St=/^(?:a|area)$/i;ie.fn.extend({prop:function(e,t){return ke(this,ie.prop,e,t,arguments.length>1)},removeProp:function(e){return e=ie.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(e){}})}}),ie.extend({propFix:{for:"htmlFor",class:"className"},prop:function(e,t,n){var r,i,o,a=e.nodeType;if(e&&3!==a&&8!==a&&2!==a)return o=1!==a||!ie.isXMLDoc(e),o&&(t=ie.propFix[t]||t,i=ie.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ie.find.attr(e,"tabindex");return t?parseInt(t,10):Dt.test(e.nodeName)||St.test(e.nodeName)&&e.href?0:-1}}}}),ne.hrefNormalized||ie.each(["href","src"],function(e,t){ie.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),ne.optSelected||(ie.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),ie.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ie.propFix[this.toLowerCase()]=this}),ne.enctype||(ie.propFix.enctype="encoding");var kt=/[\t\r\n\f]/g;ie.fn.extend({addClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,u="string"==typeof e&&e;if(ie.isFunction(e))return this.each(function(t){ie(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(be)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(kt," "):" ")){for(o=0;i=t[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=ie.trim(r),n.className!==a&&(n.className=a)}return this},removeClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,u=0===arguments.length||"string"==typeof e&&e;if(ie.isFunction(e))return this.each(function(t){ie(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(be)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(kt," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");a=e?ie.trim(r):"",n.className!==a&&(n.className=a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):this.each(ie.isFunction(e)?function(n){ie(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var t,r=0,i=ie(this),o=e.match(be)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else(n===Te||"boolean"===n)&&(this.className&&ie._data(this,"__className__",this.className),this.className=this.className||e===!1?"":ie._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(kt," ").indexOf(t)>=0)return!0;return!1}}),ie.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ie.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ie.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Lt=ie.now(),Mt=/\?/,Ot=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;ie.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=ie.trim(t+"");return i&&!ie.trim(i.replace(Ot,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():ie.error("Invalid JSON: "+t)},ie.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new DOMParser,n=r.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(e){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||ie.error("Invalid XML: "+t),n};var Pt,It,Ht=/#.*$/,Nt=/([?&])_=[^&]*/,Rt=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,jt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,qt=/^(?:GET|HEAD)$/,Bt=/^\/\//,Wt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,$t={},Ft={},Xt="*/".concat("*");try{It=location.href}catch(e){It=he.createElement("a"),It.href="",It=It.href}Pt=Wt.exec(It.toLowerCase())||[],ie.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:It,type:"GET",isLocal:jt.test(Pt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Xt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ie.parseJSON,"text xml":ie.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?W(W(e,ie.ajaxSettings),t):W(ie.ajaxSettings,e)},ajaxPrefilter:q($t),ajaxTransport:q(Ft),ajax:function(e,t){function n(e,t,n,r){var i,c,m,y,w,_=t;2!==b&&(b=2,s&&clearTimeout(s),u=void 0,a=r||"",x.readyState=e>0?4:0,i=e>=200&&300>e||304===e,n&&(y=$(d,x,n)),y=F(d,y,x,i),i?(d.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(ie.lastModified[o]=w),w=x.getResponseHeader("etag"),w&&(ie.etag[o]=w)),204===e||"HEAD"===d.type?_="nocontent":304===e?_="notmodified":(_=y.state,c=y.data,m=y.error,i=!m)):(m=_,(e||!_)&&(_="error",0>e&&(e=0))),x.status=e,x.statusText=(t||_)+"",i?h.resolveWith(p,[c,_,x]):h.rejectWith(p,[x,_,m]),x.statusCode(g),g=void 0,l&&f.trigger(i?"ajaxSuccess":"ajaxError",[x,d,i?c:m]),v.fireWith(p,[x,_]),l&&(f.trigger("ajaxComplete",[x,d]),--ie.active||ie.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,a,s,l,u,c,d=ie.ajaxSetup({},t),p=d.context||d,f=d.context&&(p.nodeType||p.jquery)?ie(p):ie.event,h=ie.Deferred(),v=ie.Callbacks("once memory"),g=d.statusCode||{},m={},y={},b=0,w="canceled",x={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c)for(c={};t=Rt.exec(a);)c[t[1].toLowerCase()]=t[2];t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)g[t]=[g[t],e[t]];else x.always(e[x.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),n(0,t),this}};if(h.promise(x).complete=v.add,x.success=x.done,x.error=x.fail,d.url=((e||d.url||It)+"").replace(Ht,"").replace(Bt,Pt[1]+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=ie.trim(d.dataType||"*").toLowerCase().match(be)||[""],null==d.crossDomain&&(r=Wt.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]===Pt[1]&&r[2]===Pt[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(Pt[3]||("http:"===Pt[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=ie.param(d.data,d.traditional)),B($t,d,t,x),2===b)return x;l=ie.event&&d.global,l&&0===ie.active++&&ie.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!qt.test(d.type),o=d.url,d.hasContent||(d.data&&(o=d.url+=(Mt.test(o)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Nt.test(o)?o.replace(Nt,"$1_="+Lt++):o+(Mt.test(o)?"&":"?")+"_="+Lt++)),d.ifModified&&(ie.lastModified[o]&&x.setRequestHeader("If-Modified-Since",ie.lastModified[o]),ie.etag[o]&&x.setRequestHeader("If-None-Match",ie.etag[o])),(d.data&&d.hasContent&&d.contentType!==!1||t.contentType)&&x.setRequestHeader("Content-Type",d.contentType),x.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Xt+"; q=0.01":""):d.accepts["*"]);for(i in d.headers)x.setRequestHeader(i,d.headers[i]);if(d.beforeSend&&(d.beforeSend.call(p,x,d)===!1||2===b))return x.abort();w="abort";for(i in{success:1,error:1,complete:1})x[i](d[i]);if(u=B(Ft,d,t,x)){x.readyState=1,l&&f.trigger("ajaxSend",[x,d]),d.async&&d.timeout>0&&(s=setTimeout(function(){x.abort("timeout")},d.timeout));try{b=1,u.send(m,n)}catch(e){if(!(2>b))throw e;n(-1,e)}}else n(-1,"No Transport");return x},getJSON:function(e,t,n){return ie.get(e,t,n,"json")},getScript:function(e,t){return ie.get(e,void 0,t,"script")}}),ie.each(["get","post"],function(e,t){ie[t]=function(e,n,r,i){return ie.isFunction(n)&&(i=i||r,r=n,n=void 0),ie.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),ie._evalUrl=function(e){return ie.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},ie.fn.extend({wrapAll:function(e){if(ie.isFunction(e))return this.each(function(t){ie(this).wrapAll(e.call(this,t))});if(this[0]){var t=ie(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(ie.isFunction(e)?function(t){ie(this).wrapInner(e.call(this,t))}:function(){var t=ie(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ie.isFunction(e);return this.each(function(n){ie(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ie.nodeName(this,"body")||ie(this).replaceWith(this.childNodes)}).end()}}),ie.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!ne.reliableHiddenOffsets()&&"none"===(e.style&&e.style.display||ie.css(e,"display"))},ie.expr.filters.visible=function(e){return!ie.expr.filters.hidden(e)};var Yt=/%20/g,zt=/\[\]$/,Vt=/\r?\n/g,Ut=/^(?:submit|button|image|reset|file)$/i,Gt=/^(?:input|select|textarea|keygen)/i;ie.param=function(e,t){var n,r=[],i=function(e,t){t=ie.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ie.ajaxSettings&&ie.ajaxSettings.traditional),ie.isArray(e)||e.jquery&&!ie.isPlainObject(e))ie.each(e,function(){i(this.name,this.value)});else for(n in e)X(n,e[n],t,i);return r.join("&").replace(Yt,"+")},ie.fn.extend({serialize:function(){return ie.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ie.prop(this,"elements");return e?ie.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ie(this).is(":disabled")&&Gt.test(this.nodeName)&&!Ut.test(e)&&(this.checked||!Le.test(e))}).map(function(e,t){var n=ie(this).val();return null==n?null:ie.isArray(n)?ie.map(n,function(e){return{name:t.name,value:e.replace(Vt,"\r\n")}}):{name:t.name,value:n.replace(Vt,"\r\n")}}).get()}}),ie.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Y()||z()}:Y;var Kt=0,Qt={},Jt=ie.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in Qt)Qt[e](void 0,!0)}),ne.cors=!!Jt&&"withCredentials"in Jt,Jt=ne.ajax=!!Jt,Jt&&ie.ajaxTransport(function(e){if(!e.crossDomain||ne.cors){var t;return{send:function(n,r){var i,o=e.xhr(),a=++Kt;if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)void 0!==n[i]&&o.setRequestHeader(i,n[i]+"");o.send(e.hasContent&&e.data||null),t=function(n,i){var s,l,u;if(t&&(i||4===o.readyState))if(delete Qt[a],t=void 0,o.onreadystatechange=ie.noop,i)4!==o.readyState&&o.abort();else{u={},s=o.status,"string"==typeof o.responseText&&(u.text=o.responseText);try{l=o.statusText}catch(e){l=""}s||!e.isLocal||e.crossDomain?1223===s&&(s=204):s=u.text?200:404}u&&r(s,l,u,o.getAllResponseHeaders())},e.async?4===o.readyState?setTimeout(t):o.onreadystatechange=Qt[a]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),ie.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return ie.globalEval(e),e}}}),ie.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),ie.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=he.head||ie("head")[0]||he.documentElement;return{send:function(r,i){t=he.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var Zt=[],en=/(=)\?(?=&|$)|\?\?/;ie.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Zt.pop()||ie.expando+"_"+Lt++;return this[e]=!0,e}}),ie.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(en.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&en.test(t.data)&&"data");return s||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=ie.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(en,"$1"+i):t.jsonp!==!1&&(t.url+=(Mt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||ie.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Zt.push(i)),a&&ie.isFunction(o)&&o(a[0]),a=o=void 0}),"script"):void 0}),ie.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||he;var r=de.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=ie.buildFragment([e],t,i),i&&i.length&&ie(i).remove(),ie.merge([],r.childNodes))};var tn=ie.fn.load;ie.fn.load=function(e,t,n){if("string"!=typeof e&&tn)return tn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>=0&&(r=ie.trim(e.slice(s,e.length)),e=e.slice(0,s)),ie.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(o="POST"),a.length>0&&ie.ajax({url:e,type:o,dataType:"html",data:t}).done(function(e){i=arguments,a.html(r?ie("<div>").append(ie.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){a.each(n,i||[e.responseText,t,e])}),this},ie.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ie.fn[t]=function(e){return this.on(t,e)}}),ie.expr.filters.animated=function(e){return ie.grep(ie.timers,function(t){return e===t.elem}).length};var nn=e.document.documentElement;ie.offset={setOffset:function(e,t,n){var r,i,o,a,s,l,u,c=ie.css(e,"position"),d=ie(e),p={};"static"===c&&(e.style.position="relative"),s=d.offset(),o=ie.css(e,"top"),l=ie.css(e,"left"),u=("absolute"===c||"fixed"===c)&&ie.inArray("auto",[o,l])>-1,u?(r=d.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(l)||0),ie.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):d.css(p)}},ie.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){ie.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;return o?(t=o.documentElement,ie.contains(t,i)?(typeof i.getBoundingClientRect!==Te&&(r=i.getBoundingClientRect()),n=V(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r):void 0},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===ie.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),ie.nodeName(e[0],"html")||(n=e.offset()),n.top+=ie.css(e[0],"borderTopWidth",!0),n.left+=ie.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-ie.css(r,"marginTop",!0),left:t.left-n.left-ie.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||nn;e&&!ie.nodeName(e,"html")&&"static"===ie.css(e,"position");)e=e.offsetParent;return e||nn})}}),ie.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);ie.fn[e]=function(r){return ke(this,function(e,r,i){var o=V(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?ie(o).scrollLeft():i,n?i:ie(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),ie.each(["top","left"],function(e,t){ie.cssHooks[t]=A(ne.pixelPosition,function(e,n){return n?(n=tt(e,t),rt.test(n)?ie(e).position()[t]+"px":n):void 0})}),ie.each({Height:"height",Width:"width"},function(e,t){ie.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){ie.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return ke(this,function(t,n,r){
var i;return ie.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?ie.css(t,n,a):ie.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),ie.fn.size=function(){return this.length},ie.fn.andSelf=ie.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return ie});var rn=e.jQuery,on=e.$;return ie.noConflict=function(t){return e.$===ie&&(e.$=on),t&&e.jQuery===ie&&(e.jQuery=rn),ie},typeof t===Te&&(e.jQuery=e.$=ie),ie}),define("dt/lib/Set",["require","jquery"],function(e){function t(e){return Object(e)===e}var n=e("jquery"),r="__isDTLibSet",i=function(e){this._valueSet={},this[r]=!0,this.reset(e)};return i.getSet=function(e){return i.isSet(e)?e:new i(e)},i.isSet=function(e){return t(e)&&!!e[r]},i.prototype={constructor:i,add:function(e){return n.extend(this._valueSet,this._normalize(e)),this},union:function(e){return this.add(e)},reset:function(e){return this._valueSet=this._normalize(e),this},contains:function(e){var t=this._normalize(e);for(var n in t)if(t.hasOwnProperty(n)&&!this._valueSet.hasOwnProperty(n))return!1;return!0},intersects:function(e){var t=this._normalize(e),n=[];for(var r in t)t.hasOwnProperty(r)&&this._valueSet.hasOwnProperty(r)&&n.push(r);return new i(n)},subtracts:function(e){var t=this._normalize(e),n=[];for(var r in this._valueSet)this._valueSet.hasOwnProperty(r)&&!t.hasOwnProperty(r)&&n.push(r);return new i(n)},isEmpty:function(){return 0===this.count()},count:function(){var e=0;for(var t in this._valueSet)this._valueSet.hasOwnProperty(t)&&e++;return e},list:function(){var e=this._valueSet,t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},clone:function(){return new i(this)},filter:function(e){var t=this._valueSet,n=[];for(var r in t)t.hasOwnProperty(r)&&e(r)&&n.push(r);return new i(n)},map:function(e){var t=this._valueSet,n=[];for(var r in t)t.hasOwnProperty(r)&&n.push(e(r));return new i(n)},classify:function(e,n){var r=this._valueSet,o={};for(var a in r)if(r.hasOwnProperty(a)){var s=e(a);if(!t(s)){var l={};l[s]=a,s=l}for(var u in s)if(s.hasOwnProperty(u)){var c=o[u]||(o[u]=new i);c.add(s[u])}}for(var d=0,p=(n||[]).length;d<p;d++)o[n[d]]||(o[n[d]]=new i);return o},_normalize:function(e){var t={},r=n.type(e);if(!e)return t;if(i.isSet(e))e=e.list();else if("string"===r){e=e.split(",");for(var o=0,a=e.length;o<a;o++)e[o]=n.trim(e[o])}else if("array"!==r)throw new Error;for(var o=0,a=e.length;o<a;o++)t[e[o]]=1;return t}},i}),define("dt/lib/base",["require","jquery"],function(e){function t(e){var t={},r=n.type(e);if("array"===r)for(var i=0,o=e.length;i<o;i++)t[e[i]]=e[i];else if("object"===r)for(var i in e)e.hasOwnProperty(i)&&(t[e[i]]=i);return t}var n=e("jquery"),r=Array.prototype.slice,i=Array.prototype.indexOf,o=/^[\s\t\xa0\u3000]*$/,a="-",s="-",l="__is__component__",u="__component__",c={},d=0,p=c.uncurry=function(e){return function(){return Function.call.apply(e,arguments)}};c.arraySlice=p(r),c.curry=function(e){var t=r.call(arguments,1);return function(){return e.apply(this,t.concat(r.call(arguments)))}},c.ieVersion=/msie (\d+\.\d+)/i.test(navigator.userAgent)?document.documentMode||+RegExp.$1:void 0;var f=/([&<>"'])/g,h={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};c.encodeHTML=function(e){return null==e?"":(e+"").replace(f,function(e,t){return h[t]})},c.decodeHTML=function(e){if(null==e)return"";var t=String(e).replace(/&quot;/g,'"').replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");return t.replace(/&#([\d]+);/g,function(e,t){return String.fromCharCode(parseInt(t,10))})},c.assert=function(e,t){if(!e)throw new Error(t||"assert fail!")},c.objForEach=function(e,t){var n;for(n in e)e.hasOwnProperty(n)&&t(n,e[n]);if(v)for(var r=0;n=g[r++];)e[n]!==Object.prototype[n]&&t(n,e[n])};var v=!{toString:1}.propertyIsEnumerable("toString"),g=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];c.localUID=function(){return d++},c.makeInner=function(){var e="__private_d_"+c.localUID(),t=function(t){return t[e]||(t[e]={})};return t.attach=function(t){var n="__private_s_",r="__private_attach_",i=t.prototype;return e=i.hasOwnProperty(r)?i[r]:i[r]?i[r]=n+(Number(i[r].split("_s_")[1])+1):i[r]=n+"0",t},t},c.isComponent=function(e,t){return Object(e)===e&&(t&&(e[l]=1),!!e[l])},c.getComponent=function(e){return c.isJQuery(e)&&(e=e[0]),!!e&&e[u]},c.bindComponent=function(e,t){return c.isJQuery(e)&&(e=e[0]),!!e&&(c.isComponent(t)?e[u]=t:t===!1&&(e[u]=null),e[u])},c.isJQuery=function(e){return e instanceof n},c.toInt=function(e){return parseInt(e,10)},c.assign=function(e,n,r,i,o){var a=t(r),s=t(i);for(var l in n)if(n.hasOwnProperty(l)&&!s.hasOwnProperty(l)){var u=null;if(r?a.hasOwnProperty(l)&&(u=a[l]):u=l,null!=u){if(o&&e.hasOwnProperty(u))throw new Error('Target attr "'+u+'" exists!');e[u]=n[l]}}return e};var m=c.isObject=function(e){var t=typeof e;return"function"===t||!!e&&"object"==t};return c.isEmptyObj=function(e){if(!m(e))return!1;for(var t in e)if(e.hasOwnProperty(t))return!1;return!0},c.isNaN=function(e){return e!==e},c.arrayIndexOf=function(e,t,n){if(!e)return-1;if(arguments.length<3&&"function"==typeof i)return i.call(e,t);for(var r=0,o=e.length;r<o;r++)if(arguments.length<3&&e[r]===t||m(e[r])&&e[r][n]===t)return r;return-1},c.arrayRemoveItem=function(e,t){var n=c.arrayIndexOf(e,t);n>0?e.splice(n,1):0===n&&e.shift()},c.arrayMap=function(e,t){for(var n=[],r=0,i=(e||[]).length;r<i;r++)n.push(t(e[r]));return n},c.arrayEquals=function(e,t){if(!n.isArray(e)||!n.isArray(t)||e.length!==t.length)return!1;for(var r=0,i=e.length;r<i;r++)if(e[r]!==t[r])return!1;return!0},c.objectKeys=function(e){var t=[];if(!c.isObject(e))return t;for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},c.objHasAttr=function(e,t){"string"===n.type(t)&&(t=[t]);for(var r=0,i=t.length;r<i;r++)if(e.hasOwnProperty[t[r]])return!0;return!1},c.diffObjects=function(e,t){function r(){return i.push({path:o.join("."),obj1:e,obj2:t}),i}var i=arguments[2]||[],o=arguments[3]||[],a=n.type(e),s=n.type(t);if(a!==s)return r();if("array"===a){if(e.length!==t.length)return r();for(var l=0,u=e.length;l<u;l++)o.push(l),c.diffObjects(e[l],t[l],i,o),o.pop()}else if("object"===a&&"object"===s){var d=c.objectKeys(e),p=c.objectKeys(t);if(!c.arrayEquals(d,p))return r();for(var l=0,u=d.length;l<u;l++){var f=d[l];o.push(f),c.diffObjects(e[f],t[f],i,o),o.pop()}}else if("date"===a){if(e.getTime()!==t.getTime())return r()}else if("regexp"===a){if(e.toString()!==t.toString())return r()}else if(e!==t)return r();return i},c.isBlank=function(e){return null==e||o.test(e)},c.toEcValue=function(e){return null==e?a:e},c.fromEcValue=function(e){return e===a?null:e},c.toNotEmptyEcName=function(e){return c.isBlank(e)?s:e},c.isSupportBase64=function(){var e=new Image,t=!0;return e.onload=e.onerror=function(){1===this.width&&1===this.height||(t=!1)},e.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",t}(),c.flashVersion=function(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(t){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}(),c.supportTransition=function(){var e=document.createElement("p").style,t="transition"in e||"WebkitTransition"in e||"MozTransition"in e||"msTransition"in e||"OTransition"in e;return e=null,t}(),c.noop=new Function,c.onlyHasProperty=function(e,t){var r=!0;if(null==t)return!1;n.isArray(t)||(t=[t]);for(var i in e)e.hasOwnProperty(i)&&c.arrayIndexOf(t,i)===-1&&(r=!1);return r},c}),define("dt/lib/json",["require"],function(e){var t={};return t.parseJSONLaxly=function(e,t){return new Function("return ("+e+");").call(t)},t}),define("dt/lib/throttle",["require"],function(e){var t={};return t.throttle=function(e,t,n,r){function i(i){function f(){c=(new Date).getTime(),d=null,(p?e:e[i]).apply(a,s||[])}return function(){l=(new Date).getTime(),a=this,s=arguments,o=l-(r?u:c)-t,clearTimeout(d),r?n?d=setTimeout(f,t):o>=0&&f():o>=0?f():n&&(d=setTimeout(f,-o)),u=l}}var o,a,s,l=(new Date).getTime(),u=0,c=0,d=null,p="function"==typeof e;if(t=t||0,p)return i();for(var f=[],h=0;h<e.length;h++)f[h]=i(h);return f},t.fixedRate=function(e,n){return null!=n?t.throttle(e,n,!0,!1):e},t.debounce=function(e,n){return null!=n?t.throttle(e,n,!0,!0):e},t}),define("dt/lib/dataDriven",["require","./base","jquery","./throttle"],function(e){function t(e,t){var n=null===e||l.type(e)in m;return!!n&&e===t}function n(e,t){var n,r,i=[],o=this[f+"children"];for(n=0;r=o[n];n++)i.push(r.getCallback());for(i=t(i,e),n=0;r=o[n];n++)r.setCallback(i[n])}function r(e,t,n,r){if(!(arguments.length>1))return this()[e];this[f+"currValueInfo"]=n;var i=this();(r&&r.force||this.isDifferent(i[e],t))&&((!r||!r.silent)&&this.valueWillMutate(),i[e]=t,(!r||!r.silent)&&this.valueHasMutated()),o(this,r)}function i(e){return{ob:1,obArray:1,obHash:1}.hasOwnProperty(E(e))}function o(e,t){for(var n=t&&t.volatiles||[],r=e[f+"currValueInfo"],i=0,o=n.length;i<o;i++)delete r[n[i]]}var a,s=e("./base"),l=e("jquery"),u=e("./throttle"),c=Array.prototype.slice,d={},p="__ob__type__",f="__prop__",h="change",v="arrayChange";d.subscribable=function(e){s.assign(e,g),e._subscriptions={}};var g={subscribe:function(e,t,n){n=n||h;var r=this._subscriptions[n]||(this._subscriptions[n]=[]),i=new y(e,t,function(){s.arrayRemoveItem(r,i)});return r.push(i),i},notify:function(e,t){if(t=t||h,this.hasSubscriptionsForEvent(t))for(var n,r=this._subscriptions[t].slice(),i=0;n=r[i];i++)n.callback(e)},hasSubscriptionsForEvent:function(e){return this._subscriptions[e]&&this._subscriptions[e].length},isDifferent:function(e,t){return!this.equalityComparer||!this.equalityComparer(e,t)},equalityComparer:t},m={undefined:1,boolean:1,number:1,string:1},y=function(e,t,n){this[f+"callback"]=e,this[f+"callbackScope"]=t,this[f+"disposeCallback"]=n,this[f+"isDisposed"]=!1},b=y.prototype;b.callback=function(e){return this[f+"isDisposed"]||this[f+"callback"].apply(this[f+"callbackScope"],e||[]),this},b.setCallback=function(e){return this[f+"callback"]=e,this},b.getCallback=function(){return this[f+"callback"]},b.dispose=function(){return this[f+"isDisposed"]=!0,this[f+"disposeCallback"](),this},b.throttle=function(e){return this[f+"callback"]=u.fixedRate(this[f+"callback"],e),this},b.debounce=function(e){return this[f+"callback"]=u.debounce(this[f+"callback"],e),this};var w=function(e){this[f+"children"]=l.extend([],e)},x=w.prototype;x.callback=function(e){for(var t,n=0;t=this[f+"children"][n];n++)t.callback(e)},x.dispose=function(){for(var e,t=0;e=this[f+"children"][t];t++)e.dispose()},x.throttle=function(e){return n.call(this,e,u.fixedRate),this},x.debounce=function(e){return n.call(this,e,u.debounce),this},d.ob=d.observable=function(e,t,n){function r(e,t,n){return arguments.length>0?void r[f+"writer"](e,t,n):r[f+"currValue"]}return E(e)&&(e=e.peek(),t=e.peekValueInfo()),r[f+"currValue"]=e,r[f+"currValueInfo"]=t,r[f+"authKey"]=n?n.authKey:null,d.subscribable(r),s.assign(r,_),r[p]="ob",r[f+"writer"]=function(e,t,n){r.validateAuthKey(n?n.authKey:null),s.assert(null==t||l.isPlainObject(t)),r[f+"currValueInfo"]=t;var i=n&&n.force;(i||r.isDifferent(r[f+"currValue"],e))&&((!n||!n.silent)&&r.valueWillMutate(),r[f+"currValue"]=e,(!n||!n.silent)&&r.valueHasMutated()),o(this,n)},r};var _={force:function(e,t,n){n=n||{},n.force=!0,this[f+"writer"](e,t,n)},peek:function(){return this[f+"currValue"]},peekValueInfo:function(e){if(0===arguments.length){var t=this[f+"currValueInfo"];return t&&(t=l.extend({},t)),t}if(s.isObject(this[f+"currValueInfo"]))return this[f+"currValueInfo"][e]},extendWriter:function(e){var t=this,n=t[f+"writer"];return this[f+"writer"]=function(r,i,o){t.validateAuthKey(o?o.authKey:null),e.call(t,n,r,i,o)},this},valueHasMutated:function(){this.notify([this[f+"currValue"],this])},valueWillMutate:function(){this.notify([this[f+"currValue"],this],"beforeChange")},validateAuthKey:function(e){var t=this[f+"authKey"];if(null!=t&&e!==t)throw new Error("AuthKey error: "+e)}};d.obHash=function(e){var t=d.ob(e||{});return t[p]="obHash",t.prop=r,t},d.obArray=function(e){s.assert(e===a||l.isArray(e));var t=d.ob(e||[]);return s.assign(t,T),t[p]="obArray",t};var T={remove:function(e){for(var t,n=this(),r=[],i=[],o=0,a=n.length;o<a;)("function"==typeof e?e(n[o]):n[o]===e)?(t||(this.valueWillMutate(),t=!0),r.push(n.splice(o,1)),i.push(o),a--):o++;if(r.length){var s={key:C.REMOVE,indexes:i};this.notify([s,this],v),this.valueHasMutated()}return r},removeAll:function(){return this.splice(0,this.count())},indexOf:function(e){return s.arrayIndexOf(this(),e)},pop:function(){return this.splice(this.count()-1,1)},push:function(){return this.splice.apply(this,[this.count(),0].concat(c.call(arguments)))},shift:function(){return this.splice(0,1)},unshift:function(e){return this.splice(0,0,e)},splice:function(e,t){var n=this(),r=n.length,i=arguments.length;if(!i||!(e>=0&&e<=r))return[];1===i?t=r:t>=0?t>r-e&&(t=r-e):t=0,this.valueWillMutate();var o=n.splice.apply(n,arguments),a={key:C.SPLICE,index:e,removeCount:t,added:c.call(arguments,2)};return this.notify([a,this],v),this.valueHasMutated(),o},slice:function(){return c.apply(this(),arguments)},pushArray:function(e){return this.push.apply(this,e||[])},count:function(){return this().length},move:function(e,t){var n=this(),r=n.length;if(!(e<0||e>=r||t<0||t>=r||e===t)){this.valueWillMutate();var i=n.splice(e,1)[0];n.splice(t,0,i);var o={key:C.MOVE,originIndex:e,finalIndex:t};this.notify([o,this],v),this.valueHasMutated()}}},C=d.obArray.ChangeKey={REMOVE:"remove",SPLICE:"splice",MOVE:"move"};d.obSubscribe=function(e,t,n,r){if(E(e))return e.subscribe(t,n,r);if(l.isArray(e)){for(var i=[],o=0,a=e.length;o<a;o++)E(e[o])&&i.push(e[o].subscribe(t,n,r));return new w(i)}},d.value=function(e){return E(e)?e():e},d.peek=function(e){return E(e)?e.peek():e},d.setValue=function(e,t,n){return t=d.peek(t),i(e)?(e(t,n),e):t},d.valueInfo=function(e,t){return s.isObject(e)?s.assign({},e,["type","info"]):{type:e,info:t}},d.valueInfo.CONFIRMED="confirmed",d.valueInfoForConfirmed=function(e,t){var n=d.valueInfo(d.valueInfo.CONFIRMED,e);return t&&s.assign(n,t,null,["type","info"]),n},d.checkValueInfo=function(e,t,n){var r=d.obTypeOf(e)?e.peekValueInfo():e;return s.isObject(r)&&(null==t||r.type===t)&&(null==n||r.info===n)},d.checkValueInfoForConfirmed=function(e,t){return d.checkValueInfo(e,d.valueInfo.CONFIRMED,t)};var E=d.obTypeOf=function(e){return Object(e)===e&&e[p]};return d}),define("dt/lib/model",["require","jquery","./base","./dataDriven"],function(e){var t,n=e("jquery"),r=e("./base"),i=e("./dataDriven"),o={},a="__atom__",s=o.isAtom=function(e,t){return Object(e)!==e||!t&&e[a]||i.obTypeOf(e)||r.isComponent(e)||!n.isPlainObject(e)};o.isPlain=function(e,t){return n.isArray(e)||!s(e,t)},o.atom=function(e){return Object(e)!==e||e[a]||(e[a]=1),e},o.cloneAtom=function(e,t){var o,u,c=n.type(e);if(!s(e,!0))return e[a]?(e[a]=0,u=l({},e,{clone:!0}),u[a]=e[a]=1,u):void 0;if(o=i.obTypeOf(e))return i[o](l({},e.peek(),{clone:!0}));if(r.isComponent(e))return e.clone();if("date"===c)return new Date(e.getTime());if("regexp"===c)return new RegExp(e);if("array"===c){u=[];for(var d in e)e.hasOwnProperty(d)&&(u[d]=l({},e[d],{clone:!0}));return u}return c in{function:1,undefined:1,null:1,boolean:1,number:1,string:1}||t&&t.assignWhenCannotClone?e:void 0};var l=o.merge=function(e,n,r){if(n===t)return e;if(s(n))return r&&r.clone?o.cloneAtom(n,r):n;s(e)&&(e={});var i=r&&r.levelOneNeedMerge;r&&(r.levelOneNeedMerge=null);for(var a in n)!n.hasOwnProperty(a)||r&&r.onlyMergeOwnPropertyInTarget&&!e.hasOwnProperty(a)||(e[a]=!i||i[a]?l(e[a],n[a],r):n[a]);return e};return o.clone=function(e,n){return e===t?t:l({},e,{clone:!0,assignWhenCannotClone:n})},o}),define("dt/lib/objectAccess",["require","./model"],function(e){function t(e){return e===Object(e)}function n(e){return"[object Array]"===Object.prototype.toString.call(e)}var r,i={},o=e("./model"),a=/[\.\[]/,s=/\[/g,l=/\]/g,u=i.getByPath=function(e,t,r){if(null==e)return t;var i=n(e)?e:u.parsePath(e),r=r||p;t={k:t},i.unshift("k");for(var o=0,a=i.length;o<a;o++){var s=i[o],l=o?r(t,s):c.DRILL_DOWN;switch(l){case c.DRILL_DOWN:t=t[s];break;case c.RETURN:return;default:throw new Error("path: "+s)}}return t},c=u.Action={DRILL_DOWN:"drillDown",THROW:"throw",RETURN:"return"},d=u.actionChoice={notObjectThrow:function(e){return t(e)?c.DRILL_DOWN:c.THROW},notObjectReturn:function(e){return t(e)?c.DRILL_DOWN:c.RETURN},atomThrow:function(e){return t(e)&&!o.isAtom(e)?c.DRILL_DOWN:c.THROW},notPlainThrow:function(e){return t(e)&&o.isPlain(e)?c.DRILL_DOWN:c.THROW},notPlainReturn:function(e){return t(e)&&o.isPlain(e)?c.DRILL_DOWN:c.RETURN}},p=d.notObjectThrow;u.normalizePath=function(e){return e.replace(s,".").replace(l,"")},u.parsePath=function(e){return e.replace(l,"").split(a)};var f=i.setByPath=function(e,t,n,r,i){if(null!=e){var o,s,l=e.split(a),r=r||g;n={k:n},l.unshift("k");for(var u,c=0,d=l.length;c<d;c++){s=l[c];var p=s.length;u=0,s.indexOf("]")===p-1&&(l[c]=s=s.slice(0,p-1),u=1);var f=c?r(n,s):h.DRILL_DOWN;switch(f){case h.OVERLAP:o[l[c-1]]=n=u?[]:{};break;case h.DELETE:return void delete o[l[c-1]];case h.DRILL_DOWN:break;case h.RETURN:return;default:throw new Error("path: "+s)}o=n,n=n[s]}return"function"==typeof i?t=i(o,s,t):o[s]=t,t}},h=f.Action={DRILL_DOWN:"drillDown",THROW:"throw",RETURN:"return",OVERLAP:"overlap",DELETE:"delete"},v=f.actionChoice={notObjectOverlap:function(e){return t(e)?h.DRILL_DOWN:h.OVERLAP},notObjectThrow:function(e){return t(e)?h.DRILL_DOWN:e!==r?h.THROW:h.OVERLAP},notObjectReturn:function(e){return t(e)?h.DRILL_DOWN:e!==r?h.RETURN:h.OVERLAP},atomThrow:function(e){return t(e)&&!o.isAtom(e)?h.DRILL_DOWN:e!==r?h.THROW:h.OVERLAP},notPlainThrow:function(e){return t(e)&&o.isPlain(e)?h.DRILL_DOWN:e!==r?h.THROW:h.OVERLAP},notPlainOverlap:function(e){return t(e)&&o.isPlain(e)?h.DRILL_DOWN:h.OVERLAP}},g=v.notObjectThrow;return i.deleteByPath=function(e,t,n,i){function o(e,t){a=e[t],delete e[t]}var a;return f(e,r,t,n,o),a},i.reducePath=function(e,t){for(var n=e.split(a),r=[],i=0,o=n.length;i<o;i++){var s=n[i],l=s.length,u=!1;if(s.indexOf("]")===l-1&&(u=!0,s=s.slice(0,l-1)),s!==t[i])break;r.push((0===i?"":u?"[":".")+n[i])}return r.join("")},i}),define("dt/lib/objectOriented",["require","exports","module","./base"],function(e,t){function n(e,t){for(var n,r=this.constructor,i=this[e];(r=r.prototype._superClass)&&(n=r.prototype[e])&&n===i;);if(n)return n.apply(this,t||[]);throw new Error("parent Class has no method named "+e)}function r(e,t){var n=this[u]||(this[u]={});return arguments.length>1?n[e]=t:n[e]}function i(e){var r=this,i=t.newClass({_define:r.defineProperties}),o=function(){};o.prototype=r.prototype;var s=i.prototype=new o;return a(i.defineProperties,e._define),e._define=null,i.implement(e),s._applySuper=n,s._superClass=r,s.constructor=i,i}function o(e){return a(this.prototype,e)}function a(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function s(e){return"[object Function]"===Object.prototype.toString.call(e)}var l=e("./base"),u="privateProps";return t.newClass=function(e){var t=function(){return s(this._construct)?this._construct.apply(this,arguments):this};return t.extend=i,t.implement=o,a(t.defineProperties={},e._define),e._define=null,t.implement(e),t.uid="Class_"+l.localUID(),t.prototype._prop=r,t},t.simpleInherit=function(e,t){var r=e.prototype,i=new Function;i.prototype=t.prototype;var o=e.prototype=new i;return a(o,r),o._applySuper=n,o._superClass=t,o.constructor=e,e},t}),define("dt/lib/event",["require","jquery"],function(e){function t(e){return n.extend(e,o)}var n=e("jquery"),r=n.isFunction,i=n.inArray,o={addEventListener:function(e,t){r(e)&&(t=e,e="*"),this.__listeners=this.__listeners||{};var n=this.__listeners[e]||(this.__listeners[e]=[]);return i(n,t)<0&&n.push(t),this},removeEventListener:function(e,t){r(e)&&(t=e,e="*"),this.__listeners=this.__listeners||{};var n=this.__listeners[e];if(n)if(t){var o=i(n,t);~o&&delete n[o]}else n.length=0,delete this.__listeners[e];return this},removeAllEventListener:function(){return this.__listeners=[],this},fire:function(e,t){this.__listeners=this.__listeners||{};var r=this.__listeners[e],i=this;return r&&n.each(r,function(n,r){t=t||{},t.type=e,r.call(i,t)}),"*"!==e&&this.fire("*",t),this}};return{enableEvent:t}}),define("dt/lib/enumeration",["require","jquery"],function(e){function t(e){var t;if("array"===r.type(e)){t={};for(var n=0,i=e.length;n<i;n++)t[e[n]]=e[n]}else t=e;return t}function n(e){for(var t in e)if(e.hasOwnProperty(t)&&!o.test(t))throw new Error('Key must be spelled like "AAAA_BBB".')}var r=e("jquery"),i={},o=/^[A-Z][A-Z_]*$/;i.makeEnum=function(e,i){function o(){}return i=i||{},e=t(e),n(e),r.extend(o.prototype,a,i),r.extend(new o,e)};var a={has:function(e){return this.hasOwnProperty(e)},hasValue:function(e){return null!=this.getKeyByValue(e)},get:function(e){return this.hasOwnProperty(e)?this[e]:null},getKeyByValue:function(e){for(var t in this)if(this.hasOwnProperty(t)&&this[t]===e)return t;return null},contains:function(e,t){t&&!r.isArray(t)&&(t=[t]);for(var n=0,i=t.length;n<i;n++){for(var o=!1,a=0,s=e.length;a<s;a++)this[e[a]]===t[n]&&(o=!0);if(!o)return!1}return!0},forEachEnum:function(e,t){for(var n in this)this.hasOwnProperty(n)&&o.test(n)&&e.call(t,n,this[n])}};return i}),define("dt/lib/disable",["require","jquery"],function(e){function t(e,t,r){e=null!=e?e:"";var o=a[e];if(!o&&r){var s=null!=t?i+"-"+t:"";o=a[e]=n('<div class="'+i+" "+s+'"></div>').appendTo(document.body)}return o}var n=e("jquery"),r={},i="dt-global-mask",o="dtGlobalMask",a={};return r.globalDisable=function(e){r.globalMask(!!e&&0)},r.globalMask=function(e,n,r,i){var a;if(e===!1)a=t(n),a&&a.hide().off("."+o);else{null==e&&(e=.5),a=t(n,r,!0),a.css({opacity:e}).show();for(var s in i)i.hasOwnProperty(s)&&a.on(s+"."+o,i[s])}},r.disposeGlobalMask=function(e){var n=t(e);n&&n.off().remove()},r}),define("dt/lib/number",["require"],function(e){var t={},n=/^(\d+)px$/,r=/^(\d+|\d+\.\d+)%$/;t.ordinalSuffix=function(e){return 1==e?"st":2==e?"nd":3==e?"rd":"th"},t.pad=function(e,t){var n="",r=e<0,i=String(Math.abs(e));return i.length<t&&(n=new Array(t-i.length+1).join("0")),(r?"-":"")+n+i},t.formatNumber=function(e,n,r,i,o){if(!n)return e;o&&/[ID]%/.test(n)&&(e*=100);var a=/D+/.exec(n),s=a&&a.length>0?a[0].length:0;e=t.fixNumber(e,s,i);var l,u=e.toString(),c=u.split("."),d=c[0],p=c.length>1?c[1]:"";return l=n.replace(/I+,*I*/g,function(){var e,t,n=arguments[0],i=n.lastIndexOf(","),o=[];if(i>=0&&i!==d.length-1){t=n.length-1-i;for(var a;(a=d.length-t)>0&&t>0;)o.push(d.substr(a,t)),d=d.substring(0,a);o.push(d),o.reverse(),"-"===o[0]?(o.shift(),e="-"+o.join(",")):e=o.join(",")}else e=d;return r&&e&&e.indexOf("-")<0&&(e="+"+e),e}),l=l.replace(/D+/g,function(){var e=arguments[0],t=p;return t.length>e.length?t=t.substr(0,e.length):t+=new Array(e.length-t.length).join("0"),t})},t.fixNumber=function(e,t,n){if(e=i(e),null==t||null==e)return e;if(n)return 2==n?Number(e).toFixed(t):Number(e);var r=Math.pow(10,t);return Math.round(e*r)/r};var i=t.getNumber=function(e){var t=parseFloat(e);return e-t>=0?t:null};return t.refineNumber=function(e){for(var t=[],n=0,r=e.length;n<r;n++){var o=i(e[n]);null!=o&&t.push(o)}return t},t.validateNumeric=function(e){return e-parseFloat(e)>=0},t.isInteger=function(e){return t.validateNumeric(e)&&e%1===0},t.isPxStr=function(e){return n.test(e)},t.parsePxStr=function(e){return n.test(e)?parseFloat(RegExp.$1):null},t.isPercentStr=function(e){return r.test(e)},t.parsePercentStr=function(e){return r.test(e)?parseFloat(RegExp.$1):null},t}),define("dt/lib/htmlCleaner",["require"],function(e){function t(e,n){switch(e.nodeType){case 1:var r=e.tagName,o=e.attributes,a=n[r.toLowerCase()];if(!a)return i;for(var s=document.createElement(r),l=0,u=o.length;l<u;l++)~a.indexOf(o[l].name)&&s.setAttribute(o[l].name,o[l].value);for(var c=e.childNodes,l=0,u=c.length;l<u;l++){var d=t(c[l],n);d!==i&&s.appendChild(d)}return s;case 3:return document.createTextNode(e.nodeValue);default:return i}}function n(e){try{return(new DOMParser).parseFromString(e,"text/html")}catch(n){var t=new ActiveXObject("MSXML2.DOMDocument");return t.loadXML(e)}}function r(e,r){r=r||{};var a=n(e),s=r.htmlAllow||o.BASE,l=r.targetEl||document.createElement("div"),u=a.body.childNodes;l.innerHTML="";for(var c=0,d=u.length;c<d;c++){var p=t(u[c],s);p!==i&&l.appendChild(p)}return l.innerHTML}var i,o={BASE:{a:["title","alt","href","class","style"],b:["class","style"],em:["class","style"],strong:["class","style"],i:["class","style"],img:["src","class","style"],div:["class","style"],p:["class","style"],br:[]},EC_FORMATTER:{a:["title","alt","href","class","style"],b:["class","style"],em:["class","style"],strong:["class","style"],i:["class","style"],img:["src","class","style"],div:["class","style"],p:["class","style"],br:[]}};return{htmlClean:r,HTMLCleanAllow:o}}),define("dt/lib/codeStringify",["require","jquery"],function(e){function t(e,o,s,l){var u,c=l.singleLineDepth,d=null!=c?c<=s?"single":"multiple":"auto",p=l.quotationMark,h=l.indentBase,v=l.lineBreak,g=l.inlineDelimiterSpace,m=a.type(e),y=new Array(s*h+1).join(" "),b=new Array((s+1)*h+1).join(" "),w=!1,x=null!=o?n(o,p)+": ":"";switch(m){case"function":w="single"!==d,u=x+f.printFunction(e,s,h);break;case"regexp":u=x+p+e+p;break;case"date":u=x+i(e,p);break;case"array":for(var _=[],T=0,C=e.length;T<C;T++){var E=t(e[T],null,s+1,l);_.push(E.str),E.hasLineBreak&&(w=!0)}"multiple"===d&&(w=!0);var A=w?v:"",D=","+(w?v+b:g),S=w?b:"",k=w?y:"";u=""+x+"["+A+S+_.join(D)+A+k+"]";break;case"object":var _=[];for(var T in e)if(e.hasOwnProperty(T)){var E=t(e[T],T,s+1,l);_.push(E.str)}w="single"!==d;var A=w?v:"",D=","+(w?v+b:g),S=w?b:"",k=w?y:"";u=""+x+"{"+A+S+_.join(D)+A+k+"}";break;case"boolean":case"null":case"undefined":u=x+String(e);break;case"number":u=x+(isFinite(e)?String(e):"null");break;case"string":u=x+r(e,p);break;default:throw new Error('Illegal type "'+m+'" at "'+e+'"')}return{str:u,hasLineBreak:w}}function n(e,t){return f.jsReservedWordsMap[e]?t+e+t:/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)?e:r(e,t)}function r(e,t){var n=c[t];n.lastIndex=0;var r=p[t],i=n.test(e)?e.replace(n,function(e){var t=r[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)}):e;return t+i+t}function i(e,t){return isFinite(e.valueOf())?r(e.getUTCFullYear()+"-"+o(e.getUTCMonth()+1)+"-"+o(e.getUTCDate())+"T"+o(e.getUTCHours())+":"+o(e.getUTCMinutes())+":"+o(e.getUTCSeconds())+"Z",t):"null"}function o(e){return e<10?"0"+e:e}var a=e("jquery"),s=4,l="\n",u='"',c={'"':/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,"'":/[\\\'\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g},d={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"},p={'"':a.extend({},d,{'"':'\\"'}),"'":a.extend({},d,{"'":"\\'"})},f={};return f.jsReservedWords=["break","delete","function","return","typeof","case","do","if","switch","var","catch","else","in","this","void","continue","false","instanceof","throw","while","debugger","finally","new","true","with","default","for","null","try","abstract","double","goto","native","static","boolean","enum","implements","package","super","byte","export","import","private","synchronized","char","extends","int","protected","throws","class","final","interface","public","transient","const","float","long","short","volatile"],f.jsReservedWordsMap=function(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=1;return t}(f.jsReservedWords),f.stringifyJSObject=function(e,n){if(n=n||{},null==n.indentBase&&(n.indentBase=s),null==n.lineBreak&&(n.lineBreak=l),null==n.quotationMark&&(n.quotationMark=u),'"'!==n.quotationMark&&"'"!==n.quotationMark)throw new Error("Illegal quotation mark: "+n.quotationMark);n.compress&&(n.indentBase=0,n.lineBreak=""),n.inlineDelimiterSpace=n.compress?"":" ";try{var r=t(e,null,0,n);return r.str}catch(e){return n.errorMessage||""}},f.stringifyJSObject2HTML=function(e,t,n){return"<pre>"+f.stringifyJSObject(e,t,n)+"</pre>"},f.printFunction=function(e,t,n){var r=new Array((t+1)*n).join(" "),i=(e+"").split("\n"),o="";return i.length>1&&"}"===a.trim(i[i.length-1])&&(i.pop(),o="\n"+new Array(t*n).join(" ")+"}"),i.join("\n"+r)+o},f}),define("dt/lib/others",["require","jquery","./base"],function(e){var t=e("jquery"),n=e("./base"),r={},i=/#\{(.+?)\}/g;r.parseURL=function(e){var t=[];if(!e)return t;var n=document.createElement("a");n.href=e;for(var r=(n.search||"").replace(/^\?/,"").split("&"),i=0,o=r.length;i<o;i++){var a=(r[i]||"").split("=");a.length>1&&a[0]&&t.push({name:a[0],value:a[1]})}return t},r.loadLazyImg=function(e,n){!n&&(n="src-origin"),e.each(function(e,r){r=t(r);var i=r.data(n);i&&(r.attr("src",i),r.data(n,""))})},r.parseInlineCss=function(e){e=e||"";for(var n={},r=e.split(";"),i=0,o=r.length;i<o;i++){var a=r[i].split(":");n[t.trim(a[0])]=t.trim(a[1])}return n},r.showBalloonTip=function(){var e,n,i="BAIDUHUI_BALLOON_TIP_SHOWN",o="DNOT_SHOW_WHEN_CLOSE";return function(a,s,l,u){function c(){e&&e.hide(),n===o&&r.cookie(i,1),n=null}if(a===!1)c();else{if(n=u,n===o&&r.cookie(i))return;e||(e=t(['<div class="balloon-tip">','<div class="content"></div>','<div class="triangle"><i></i><em></em></div>','<div class="close-btn">X</div>',"</div>"].join("")).hide().appendTo(document.body),t(".close-btn",e).click(c)),t(".content",e).html(a),e.css({position:"absolute",left:s,top:l}).show()}}}(),r.cookie=function(e,t){if(null!=t)return document.cookie=e+"="+encodeURIComponent(t),t;var n=new RegExp("(^| )"+e+"=([^;]*)(;|$)"),r=n.exec(document.cookie);return r?decodeURIComponent(r[2]):null},function(){var e=!1;r.enableWindowScroll=function(t){e=!t},t(window).scroll(function(t){e&&(t.preventDefault(),t.stopPropagation())})}(),r.linkTargetBlank=function(e){var t=document,n=t.body,r=t.createElement("a");r.style.display="none",r.href=e||"#",r.target="_blank",n.appendChild(r),r.click(),n.removeChild(r)};var o=r.appendParam=function(e,t){return e+(e.indexOf("?")<0?"?":"&")+t};return r.replaceIntoParam=function(e,t,r){if(!e||n.isBlank(e))return e;r=null!=r?encodeURIComponent(r):"";var i=new RegExp("([&~?])"+t+"=[^&]*"),a=t+"="+r;return e=i.test(e)?e.replace(i,"$1"+a):o(e,a)},r.strTemplate=function(e,r){e=String(e);var o=Array.prototype.slice.call(arguments,1);return o.length?(o=1===o.length&&n.isObject(r)?r:o,e.replace(i,function(e,n){var r=o[n];return t.isFunction(r)&&(r=r(n)),null==r?"":r})):e},r.enhanceContentEditable=function(e){e.keypress(function(e){13===(e.keyCode||e.witch)&&e.preventDefault()})},r.getOpposite=function(e){var n=["top","right","bottom","left"],r=t.inArray(e,n);return r<0?null:r+2<n.length?n[r+2]:n[n.length-r-2]},function(){var e=[],t=!1;r.enableBeforeUnloadCheck=function(){t||(t=!0,window.onbeforeunload=function(){for(var t,n,r,i=0;n=e[i];i++)(r=n())&&(t=r);t&&(window.event.returnValue=t)})},r.addBeforeUnloadChecker=function(t){e.push(t)},r.removeBeforeUnloadChecker=function(t){var r=n.arrayIndexOf(e,t);return~r&&e.splice(r,1),!!~r}}(),r}),define("dt/lib/liteHashMap",["require","./base"],function(e){function t(e){var r=this;if(e instanceof t)e.each(function(e,t){r.set(t,e)});else if($.isArray(e))for(var i=0;i<e.length;i++)r.set(e[i],i);else e&&n.objForEach(e,function(e,t){r.set(e,t)})}var n=e("./base");return t.prototype={constructor:t,get:function(e){return this.hasOwnProperty(e)?this[e]:null},set:function(e,t){return this[e]=t},each:function(e,t){void 0!==t&&(e=$.proxy(e,t));for(var n in this)this.hasOwnProperty(n)&&e(this[n],n)},removeKey:function(e){delete this[e]}},{createLiteHashMap:function(e){return new t(e)}}}),define("dt/ui/tooltip",["require","jquery","../lib/base","../lib/model"],function(e){function t(e){var t=n(),r=e.x,i=e.y;null==r&&(r=0),null==i&&(i=0);
var o=e.xAnchor||"center",a=e.yAnchor||"top",s="left"===o?0:t.outerWidth(),l="top"===a?0:t.outerHeight();t.css({left:Math.round("left"===o?r:"center"===o?r-s/2:r-s)+"px",top:Math.round("top"===a?i:"center"===a?i-l/2:i-l)+"px"})}function n(){return f||(f=r('<div class="'+u+'" style="display:none;"></div>').appendTo(document.body)),f}var r=e("jquery"),i=e("../lib/base"),o=e("../lib/model"),a=r.isFunction,s=r.extend,l=".dtui-global-tooltip-namespace",u="dtui-global-tooltip",c={x:0,y:-5,xAnchor:"center",yAnchor:"bottom"},d={x:0,y:-15,xAnchor:"center",yAnchor:"bottom"},p={},f=null,h=!1;return p.showTooltip=function(e){if(!h){e=e||{};var r=e.text;if(null==r)return void p.hideTooltip();r=e.encodeHTML!==!1?i.encodeHTML(r):r,n().html(r).show(),t(e.location)}},p.hideTooltip=function(){n().hide()},p.disableTooltip=function(){p.hideTooltip(),h=!0},p.enableTooltip=function(){h=!1},p.bindTooltip=function(e){function n(e){g={currentTarget:e.currentTarget,pageX:e.pageX,pageY:e.pageY}}function u(t){var n=e.text;return a(n)?n(t.currentTarget):n}function f(e){var t=a(h)?h(e.currentTarget):s({},h||(v?d:c));if(v)t.x+=e.pageX,t.y+=e.pageY;else if(!h){var n=r(e.currentTarget),i=n.offset();t.x+=i.left+n.outerWidth()/2,t.y+=i.top}return t}e=o.merge({},e,{clone:!0,assignWhenCannotClone:!0});var h=e.location,v=e.followMouse;i.assert(!i.isJQuery(e.bindEl));var g,m=r(e.bindEl),y=["mouseenter"+l,function(t){n(t),p.showTooltip({text:u(g),encodeHTML:e.encodeHTML,location:f(g)})}],b=["mouseleave"+l,function(){g=null,p.hideTooltip()}],w=["mousemove"+l,function(e){n(e),t(f(g))}],x=e.selector;x&&(y.splice(1,0,x),b.splice(1,0,x),w.splice(1,0,x)),m.on.apply(m,y).on.apply(m,b),v&&m.on.apply(m,w);var _={refresh:function(){g&&p.showTooltip({text:u(g),encodeHTML:e.encodeHTML,location:f(g)})},setText:function(t){g&&p.showTooltip({text:t,encodeHTML:e.encodeHTML,location:f(g)})},hide:function(){g&&p.hideTooltip()},dispose:function(){g&&(p.hideTooltip(),g=null),m.off(l)}};return _},p}),define("dt/lib",["require","./lib/Set","./lib/base","./lib/json","./lib/dataDriven","./lib/objectAccess","./lib/objectOriented","./lib/model","./lib/event","./lib/enumeration","./lib/disable","./lib/number","./lib/throttle","./lib/htmlCleaner","./lib/codeStringify","./lib/others","./lib/liteHashMap","./ui/tooltip"],function(e){function t(e){for(var t=1,n=arguments.length;t<n;t++){var r=arguments[t];for(var i in r)if(r.hasOwnProperty(i)){if(e[i])throw new Error("Duplicate key: "+i);e[i]=r[i]}}return e}var n={Set:e("./lib/Set")};return t(n,e("./lib/base"),e("./lib/json"),e("./lib/dataDriven"),e("./lib/objectAccess"),e("./lib/objectOriented"),e("./lib/model"),e("./lib/event"),e("./lib/enumeration"),e("./lib/disable"),e("./lib/number"),e("./lib/throttle"),e("./lib/htmlCleaner"),e("./lib/codeStringify"),e("./lib/others"),e("./lib/liteHashMap"),e("./ui/tooltip")),n}),!function(e){function t(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function n(){this.raw=[],this.length=0}function r(){return"___"+k++}function i(e,t){var n=new Function;n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}function o(e){return L[e]}function a(e){return'"'+e.replace(/\x5C/g,"\\\\").replace(/"/g,'\\"').replace(/\x0A/g,"\\n").replace(/\x09/g,"\\t").replace(/\x0D/g,"\\r")+'"'}function s(e){return e.replace(/[\^\[\]\$\(\)\{\}\?\*\.\+]/g,function(e){return"\\"+e})}function l(e){var t=arguments;return e.replace(/\{([0-9]+)\}/g,function(e,n){return t[n-0+1]})}function u(e){return e=e.replace(/^\s*\*/,""),l('gv({0},["{1}"])',a(e),e.replace(/\[['"]?([^'"]+)['"]?\]/g,function(e,t){return"."+t}).split(".").join('","'))}function c(e,t,n,r,i,o){for(var a=n.length,s=e.split(t),l=0,u=[],c=0,d=s.length;d>c;c++){var p=s[c];if(c){var f=1;for(l++;;){var h=p.indexOf(n);if(0>h){u.push(l>1&&f?t:"",p);break}if(l=r?l-1:0,u.push(l>0&&f?t:"",p.slice(0,h),l>0?n:""),p=p.slice(h+a),f=0,0===l)break}0===l&&(i(u.join("")),o(p),u=[])}else p&&o(p)}l>0&&u.length>0&&(o(t),o(u.join("")))}function d(e,t,n){var r,i=[],o=t.options,s="",l="",p="",f="";return n&&(s="ts(",l=")",p=P,f=I,r=o.defaultFilter),c(e,o.variableOpen,o.variableClose,1,function(e){n&&e.indexOf("|")<0&&r&&(e+="|"+r);var o=e.indexOf("|"),a=(o>0?e.slice(0,o):e).replace(/^\s+/,"").replace(/\s+$/,""),c=o>0?e.slice(o+1):"",h=0===a.indexOf("*"),v=[h?"":s,u(a),h?"":l];if(c){c=d(c,t);for(var g=c.split("|"),m=0,y=g.length;y>m;m++){var b=g[m];/^\s*([a-z0-9_-]+)(\((.*)\))?\s*$/i.test(b)&&(v.unshift('fs["'+RegExp.$1+'"]('),RegExp.$3&&v.push(",",RegExp.$3),v.push(")"))}}i.push(p,v.join(""),f)},function(e){i.push(p,n?a(e):e,f)}),i.join("")}function p(e,t){this.value=e,this.engine=t}function f(e,t){this.value=e,this.engine=t,this.children=[],this.cloneProps=[]}function h(e,t){var n=e.stack,r=t?n.find(function(e){return e instanceof t}):n.bottom();if(r){for(var i;(i=n.top())!==r;){if(!i.autoClose)throw new Error(i.type+" must be closed manually: "+i.value);i.autoClose(e)}r.close(e)}return r}function v(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*(\(\s*master\s*=\s*([a-z0-9\/_-]+)\s*\))?\s*/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.master=RegExp.$3,this.name=RegExp.$1,f.call(this,e,t),this.blocks={}}function g(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,f.call(this,e,t),this.cloneProps=["name"]}function m(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,f.call(this,e,t),this.cloneProps=["name","state","blocks"],this.blocks={}}function y(e,t){if(!/^\s*([a-z0-9_]+)\s*=([\s\S]*)$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.expr=RegExp.$2,f.call(this,e,t),this.cloneProps=["name","expr"]}function b(e,t){if(!/^\s*([a-z0-9_-]+)\s*(\(([\s\S]*)\))?\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.args=RegExp.$3,f.call(this,e,t),this.cloneProps=["name","args"]}function w(e,t){if(!/^\s*([a-z0-9\/_-]+)\s*(\(([\s\S]*)\))?\s*$/i.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.name=RegExp.$1,this.args=RegExp.$3,f.call(this,e,t),this.cloneProps=["name","args"]}function x(e,t){var n=new RegExp(l("^\\s*({0}[\\s\\S]+{1})\\s+as\\s+{0}([0-9a-z_]+){1}\\s*(,\\s*{0}([0-9a-z_]+){1})?\\s*$",s(t.options.variableOpen),s(t.options.variableClose)),"i");if(!n.test(e))throw new Error("Invalid "+this.type+" syntax: "+e);this.list=RegExp.$1,this.item=RegExp.$2,this.index=RegExp.$4,f.call(this,e,t),this.cloneProps=["list","item","index"]}function _(e,t){f.call(this,e,t)}function T(e,t){_.call(this,e,t)}function C(e,t){f.call(this,e,t)}function E(e,t){t.target=e;var n=t.engine,r=e.name;if(n.targets[r])switch(n.options.namingConflict){case"override":n.targets[r]=e,t.targets.push(r);case"ignore":break;default:throw new Error("Target exists: "+r)}else n.targets[r]=e,t.targets.push(r)}function A(e,t){j[e]=t,t.prototype.type=e}function D(e){this.options={commandOpen:"<!--",commandClose:"-->",commandSyntax:/^\s*(\/)?([a-z]+)\s*(?::([\s\S]*))?$/,variableOpen:"${",variableClose:"}",defaultFilter:"html"},this.config(e),this.targets={},this.filters=t({},M)}function S(e,t){function r(){var e;if(d.length>0&&(e=d.join(""))){var n=new p(e,t);n.beforeAdd(u),l.top().addChild(n),d=[],t.options.strip&&u.current instanceof f&&(n.value=e.replace(/^[\x20\t\r]*\n/,"")),u.current=n}}var i,o=t.options.commandOpen,a=t.options.commandClose,s=t.options.commandSyntax,l=new n,u={engine:t,targets:[],stack:l,target:null},d=[];return c(e,o,a,0,function(e){var n=s.exec(e);if(n&&(i=j[n[2].toLowerCase()])&&"function"==typeof i){r();var l=u.current;t.options.strip&&l instanceof p&&(l.value=l.value.replace(/\r?\n[\x20\t]*$/,"\n")),n[1]?l=h(u,i):(l=new i(n[3],t),"function"==typeof l.beforeOpen&&l.beforeOpen(u),l.open(u)),u.current=l}else/^\s*\/\//.test(e)||d.push(o,e,a);i=null},function(e){d.push(e)}),r(),h(u),u.targets}n.prototype={push:function(e){this.raw[this.length++]=e},pop:function(){if(this.length>0){var e=this.raw[--this.length];return this.raw.length=this.length,e}},top:function(){return this.raw[this.length-1]},bottom:function(){return this.raw[0]},find:function(e){for(var t=this.length;t--;){var n=this.raw[t];if(e(n))return n}}};var k=178245,L={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},M={html:function(e){return e.replace(/[&<>"']/g,o)},url:encodeURIComponent,raw:function(e){return e}},O='var r="";',P="r+=",I=";",H="return r;";"undefined"!=typeof navigator&&/msie\s*([0-9]+)/i.test(navigator.userAgent)&&RegExp.$1-0<8&&(O="var r=[],ri=0;",P="r[ri++]=",H='return r.join("");'),p.prototype={getRendererBody:function(){var e=this.value,t=this.engine.options;return!e||t.strip&&/^\s*$/.test(e)?"":d(e,this.engine,1)},clone:function(){return this}},f.prototype={addChild:function(e){this.children.push(e)},open:function(e){var t=e.stack.top();t&&t.addChild(this),e.stack.push(this)},close:function(e){e.stack.top()===this&&e.stack.pop()},getRendererBody:function(){for(var e=[],t=this.children,n=0;n<t.length;n++)e.push(t[n].getRendererBody());return e.join("")},clone:function(){for(var e=new this.constructor(this.value,this.engine),t=0,n=this.children.length;n>t;t++)e.addChild(this.children[t].clone());for(var t=0,n=this.cloneProps.length;n>t;t++){var r=this.cloneProps[t];e[r]=this[r]}return e}};var N='data=data||{};var v={},fs=engine.filters,hg=typeof data.get=="function",gv=function(n,ps){var p=ps[0],d=v[p];if(d==null){if(hg){return data.get(n);}d=data[p];}for(var i=1,l=ps.length;i<l;i++)if(d!=null)d = d[ps[i]];return d;},ts=function(s){if(typeof s==="string"){return s;}if(s==null){s="";}return ""+s;};';i(v,f),i(g,f),i(m,f),i(y,f),i(b,f),i(w,f),i(x,f),i(_,f),i(T,_),i(C,_);var R={READING:1,READED:2,APPLIED:3,READY:4};m.prototype.applyMaster=v.prototype.applyMaster=function(e){function t(e){var r=e.children;if(r instanceof Array)for(var i=0,o=r.length;o>i;i++){var a=r[i];a instanceof g&&n[a.name]&&(a=r[i]=n[a.name]),t(a)}}if(this.state>=R.APPLIED)return 1;var n=this.blocks,r=this.engine.targets[e];return r&&r.applyMaster(r.master)?(this.children=r.clone().children,t(this),this.state=R.APPLIED,1):void 0},v.prototype.isReady=function(){function e(r){for(var i=0,o=r.children.length;o>i;i++){var a=r.children[i];if(a instanceof m){var s=t.targets[a.name];n=n&&s&&s.isReady(t)}else a instanceof f&&e(a)}}if(this.state>=R.READY)return 1;var t=this.engine,n=1;return this.applyMaster(this.master)?(e(this),n&&(this.state=R.READY),n):void 0},v.prototype.getRenderer=function(){if(this.renderer)return this.renderer;if(this.isReady()){var e=new Function("data","engine",[N,O,this.getRendererBody(),H].join("\n")),t=this.engine;return this.renderer=function(n){return e(n,t)},this.renderer}return null},v.prototype.open=function(e){h(e),f.prototype.open.call(this,e),this.state=R.READING,E(this,e)},y.prototype.open=w.prototype.open=function(e){e.stack.top().addChild(this)},g.prototype.open=function(e){f.prototype.open.call(this,e),(e.imp||e.target).blocks[this.name]=this},T.prototype.open=function(e){var t=new C;t.open(e);var n=h(e,_);n.addChild(this),e.stack.push(this)},C.prototype.open=function(e){var t=h(e,_);t.addChild(this),e.stack.push(this)},m.prototype.open=function(e){this.parent=e.stack.top(),this.target=e.target,f.prototype.open.call(this,e),this.state=R.READING,e.imp=this},w.prototype.close=y.prototype.close=function(){},m.prototype.close=function(e){f.prototype.close.call(this,e),this.state=R.READED,e.imp=null},v.prototype.close=function(e){f.prototype.close.call(this,e),this.state=this.master?R.READED:R.APPLIED,e.target=null},m.prototype.autoClose=function(e){var t=this.parent.children;t.push.apply(t,this.children),this.children.length=0;for(var n in this.blocks)this.target.blocks[n]=this.blocks[n];this.blocks={},this.close(e)},w.prototype.beforeOpen=m.prototype.beforeOpen=y.prototype.beforeOpen=x.prototype.beforeOpen=b.prototype.beforeOpen=g.prototype.beforeOpen=_.prototype.beforeOpen=p.prototype.beforeAdd=function(e){if(!e.stack.bottom()){var t=new v(r(),e.engine);t.open(e)}},m.prototype.getRendererBody=function(){return this.applyMaster(this.name),f.prototype.getRendererBody.call(this)},w.prototype.getRendererBody=function(){return l("{0}engine.render({2},{{3}}){1}",P,I,a(this.name),d(this.args,this.engine).replace(/(^|,)\s*([a-z0-9_]+)\s*=/gi,function(e,t,n){return(t||"")+a(n)+":"}))},y.prototype.getRendererBody=function(){return this.expr?l("v[{0}]={1};",a(this.name),d(this.expr,this.engine)):""},_.prototype.getRendererBody=function(){return l("if({0}){{1}}",d(this.value,this.engine),f.prototype.getRendererBody.call(this))},C.prototype.getRendererBody=function(){return l("}else{{0}",f.prototype.getRendererBody.call(this))},x.prototype.getRendererBody=function(){return l('var {0}={1};if({0} instanceof Array)for (var {4}=0,{5}={0}.length;{4}<{5};{4}++){v[{2}]={4};v[{3}]={0}[{4}];{6}}else if(typeof {0}==="object")for(var {4} in {0}){v[{2}]={4};v[{3}]={0}[{4}];{6}}',r(),d(this.list,this.engine),a(this.index||r()),a(this.item),r(),r(),f.prototype.getRendererBody.call(this))},b.prototype.getRendererBody=function(){var e=this.args;return l("{2}fs[{5}]((function(){{0}{4}{1}})(){6}){3}",O,H,P,I,f.prototype.getRendererBody.call(this),a(this.name),e?","+d(e,this.engine):"")};var j={};A("target",v),A("block",g),A("import",m),A("use",w),A("var",y),A("for",x),A("if",_),A("elif",T),A("else",C),A("filter",b),D.prototype.config=function(e){t(this.options,e)},D.prototype.compile=D.prototype.parse=function(e){if(e){var t=S(e,this);if(t.length)return this.targets[t[0]].getRenderer()}return new Function('return ""')},D.prototype.getRenderer=function(e){var t=this.targets[e];return t?t.getRenderer():void 0},D.prototype.render=function(e,t){var n=this.getRenderer(e);return n?n(t):""},D.prototype.addFilter=function(e,t){"function"==typeof t&&(this.filters[e]=t)};var q=new D;q.Engine=D,"object"==typeof exports&&"object"==typeof module?exports=module.exports=q:"function"==typeof define&&define.amd?define("etpl",q):e.etpl=q}(this),define("dt/tpl",["require","etpl","./lib"],function(e){function t(e){for(var t=!1,n=!1,r=1;r<arguments.length;r++)"raw"===arguments[r]&&(t=!0),"null"===arguments[r]&&(n=!0);return null!=e||n||(e=""),i.obTypeOf(e)&&(e=e()),e=String(e),t?e:i.encodeHTML(e)}function n(e){return null==e&&(e=""),String(e).replace(/^option\./,"")}var r=e("etpl"),i=e("./lib"),o={};return r.config({commandOpen:"{{",commandClose:"}}",defaultFilter:"ob"}),r.addFilter("ob",t),r.addFilter("dsp",n),o.render=function(e,t,n){return!r.getRenderer(e)&&n&&r.compile(n),r.render(e,t||{})},o}),define("dt/ui/Component",["require","jquery","dt/lib","dt/tpl"],function(e){function t(){function e(e){t.disabled(e)}var t=this._viewModel();t.visible=g.ob(!0);var n=t.disabled;t.disabled=g.ob(!1),null!=n&&this._disposable(n.subscribe(e,this))}function n(e){if(e){var t=w(this);e=t.$el=v(e),t.el=e[0],g.bindComponent(e,this),e.addClass(this.getFullCss().join(" "));var n=this._viewModel(),o=n.disabled,a=n.visible;this._disposable(o.subscribe(r,this)),this._disposable(a.subscribe(i,this)),r.call(this,o()),a("none"!==e[0].style.display)}}function r(e){this.$el()[e?"addClass":"removeClass"](this.getFullCss("-disabled").join(" "))}function i(e){this.$el()[e?"show":"hide"]()}function o(){var e=w(this).cptDef.tplTarget||this._getDefineProperty("tplTarget"),t=this.$el();e&&t&&t.length&&this._renderTpl(e,null,t),!this._getDefineProperty("suppressConstructSub")&&t&&t.length&&this._constructSub(t)}function a(){var e=this.$el(),t=w(this);e.off(t.eventNamespace),e.removeClass(this.getFullCss().join(" ")),t.viewModel=null,t.el=null,t.$el=null,t.subComponents=null,t.sub$Els=null,g.bindComponent(e,!1)}function s(e,t,n){if(!n&&g.isComponent(e)||n&&g.isJQuery(e))t(e);else if("object"===v.type(e)&&!g.isAtom(e))for(var r in e)e.hasOwnProperty(r)&&null!=e[r]&&s(e[r],t,n)}function l(e){var t=w(this),n=t.viewModel={},r=this;return this._traverseFromAncestor(function(e){n=g.merge(n,e.defineProperties.viewModel.call(r),{onlyMergeOwnPropertyInTarget:!1,levelOneNeedMerge:null,clone:!1})}),n=g.merge(n,e,{onlyMergeOwnPropertyInTarget:!!this._getDefineProperty("viewModelOnlyAccessDeclaredProperties"),levelOneNeedMerge:t.viewModelMergeMap||{}}),t.viewModel=n,n}function u(){var e=w(this),t=e.viewModelPublicMap={},n=e.viewModelMergeMap={};this._traverseFromAncestor(function(e){for(var r=e.defineProperties.viewModelPublic||[],i=0,o=r.length;i<o;i++)t[r[i]]=1;for(var a=e.defineProperties.viewModelMerge||[],i=0,o=a.length;i<o;i++)n[a[i]]=1})}function c(){var e=this._viewModel(),t=w(this),n=[];this._traverseFromAncestor(function(e){var t=e.defineProperties.css;v.isArray(t)?n.push.apply(n,t):t&&n.push(t)}),t.basicCss=n;var r=e&&e.css||[];v.isArray(r)||(r=[r]),t.extraCss=r}function d(e){return e=y.normalizePath(e),!!w(this).viewModelPublicMap[e]}function p(e){if(e&&v.isFunction(e.dispose))try{e.dispose()}catch(e){if(T.debug)throw e;T.printLog&&T.printLog.error(e)}else e&&g.isJQuery(e)&&e.off(this._event())}function f(e){if(e=e||w(this).subComponents,s(e,function(e){try{e.dispose()}catch(e){if(T.debug)throw e;T.printLog&&T.printLog.error(e)}}),!g.isAtom(e))for(var t in e)e.hasOwnProperty(t)&&(e[t]=null)}function h(e){e=e||w(this).sub$els;var t=this._event();if(s(e,function(e){e.off(t)},!0),!g.isAtom(e))for(var n in e)e.hasOwnProperty(n)&&(e[n]=null)}var v=e("jquery"),g=e("dt/lib"),m=e("dt/tpl"),y=g.getByPath,b=g.setByPath,w=g.makeInner(),x="dtui-cpt",_="__originalHTML",T=w.attach(g.newClass(g.enableEvent({_define:{tpl:"",tplTarget:"",css:"",viewModel:function(){return{disabled:null,visible:null,css:"",tplTarget:null,tplRenderMode:"html"}},viewModelPublic:["disabled","visible"],viewModelMerge:[],viewModelOnlyAccessDeclaredProperties:!0,suppressConstructSub:!1},_prepare:v.noop,_init:v.noop,_dispose:v.noop,_disposeFinally:v.noop,_run:v.noop,_event:function(e){var t=w(this).eventNamespace;return(null!=e?e:"")+t},_parseViewModel:function(e,t){return e},_parseCptDef:function(e){return e},_construct:function(e,r,i){arguments.length>0&&g.assert(null!=e),!e||v.isPlainObject(e)?(i=r,r=e,e=null):e=v(e),i=v.extend({},i),g.isComponent(this,!0);var a=w(this);a.cptDef=i,a.eventNamespace=".namespace"+g.localUID(),a.subComponents={},a.sub$Els={},a.disposed=!1,a.cptDisposableArea={},a.cptInstanceUID="cpt-instance-"+g.localUID(),u.call(this),r=this._parseViewModel(r||{},i)||{},l.call(this,r),c.call(this),t.call(this),n.call(this,e),this._prepare(),o.call(this),this._init()},dispose:function(){var e=w(this);if(!e.disposed){var t=this.el(),n=this[_]||"";this._dispose(),f.call(this),h.call(this),this._disposable(!1),a.call(this),this._disposeFinally(),t.innerHTML=n,e.disposed=!0}},isDisposed:function(){return!!w(this).disposed},isFrozen:function(){return this._viewModel().disabled()||this.isDisposed()},_disposable:function(e,t){g.assert(null!=e);var n=w(this).cptDisposableArea;if(null==e)return e;if(e===!1)for(var r in n)n.hasOwnProperty(r)&&(p.call(this,n[r]),n[r]=null);else"string"===v.type(e)?(p.call(this,n[e]),n[e]=null):(g.assert(v.isFunction(e.dispose)||g.isJQuery(e),"No dispose method nor not jQuery!"),t=t||"-component-anonymouse-disposable"+g.localUID(),n[t]=e);return e},resize:v.noop,_manuInitView:function(e){n.call(this,e),this._constructSub(e)},_applyTpl:function(e,t){t&&(this._renderTpl(t,null,e),this._constructSub(e))},_renderTpl:function(e,t,n){var r={viewModel:t||this._viewModel(),lang:this.getLang(),constant:this.getConstant()},i=m.render(e,r,this._getDefineProperty("tpl"))||"";return n&&v(n)[this._viewModel().tplRenderMode](i),i},_constructSub:function(e,t){var n=v(e);g.assert(n.length),t&&n.data("cpt")&&this._constructSubCpt.call(this,e);var r=this;v("*[data-cpt]",n).each(function(e,t){r._constructSubCpt(t)})},_constructSubCpt:function(e){var t=v(e),n=e.innerHTML,r=this._viewModel(),i=this._parseCptDef(new Function("viewModel","lib","lang","constant","return {"+t.data("cpt")+"};").call(this,r,g,this.getLang(),this.getConstant())),o=this.getCptClass(i.type),a=i.viewModelGet?y(i.viewModelGet,r):i.viewModel,s=new o(e,a,i);return s[_]=n,this._sub(i.name||"-sub-cpt-name-"+g.localUID(),s)},recreateSubCpt:function(e){var t=this._sub(e);if(t){var n=t.el();t.dispose(),this._sub(e,null),this._constructSubCpt(n)}},traversalRun:function(e){s(w(this).subComponents,function(t){t.traversalRun(e)}),this._run(e)},_sub:function(e,t,n){var r=w(this).subComponents;return arguments.length<2?y(e,r,y.actionChoice.notPlainReturn):(b(e,t,r,n?b.actionChoice.notPlainOverlap:b.actionChoice.notPlainThrow),t)},_getDefineProperty:function(e){return this.constructor.defineProperties[e]},el:function(){return w(this).el},$el:function(e,t,n){var r=w(this);return 0===arguments.length?r.$el:1===arguments.length?y(e,r.sub$Els,y.actionChoice.notPlainReturn):(b(e,t,r.sub$Els,n?b.actionChoice.notPlainOverlap:b.actionChoice.notPlainThrow),t)},css:function(){return this._getDefineProperty("css")||""},viewModel:function(e){if(d.call(this,e))return y(e,w(this).viewModel);throw new Error(e+" is private!")},_viewModel:function(){return w(this).viewModel},getCptClass:function(e){return T.cptClasses[e]},getCptDef:function(e){return w(this).cptDef[e]},uid:function(){return w(this).cptInstanceUID},getFullCss:function(e){var t=[x],n=w(this);return t.push.apply(t,n.basicCss||[]),t.push.apply(t,n.extraCss||[]),v.map(t,function(t){return t+(e||"")})},isDisabled:function(){return!!g.peek(this._viewModel().disabled)},getLang:function(){return T.defaultLanguageSet},getConstant:function(){return T.defaultConstant},clone:v.noop,_traverseFromAncestor:function(e){for(var t=[],n=this.constructor;n;n=n.prototype._superClass)t.push(n);for(var r=t.length;r--;)e.call(this,t[r])},localOb:function(e,t){var n,r=w(this),i=r.localObRepo||(r.localObRepo={});return arguments.length>1?t===!1?(n=i[e],delete i[e]):(g.assert(null==i[e]),n=i[e]=t):n=i[e],n},getAncestorLocalOb:function(e){for(var t,n,r=this.$el();(r=r&&r.parent())[0]&&!(n=(t=g.getComponent(r))&&t.localOb(e))&&r[0]!==document.body;);return n}})));return T.cptClasses={},T.defaultLanguageSet={},T.defaultConstant={},T.consoleLog=function(e){var t=window.console;g.isObject(t)&&"function"==typeof t.log&&t.log(g.stringifyJSON(e))},T}),define("docTool/docUtil",["require","jquery","globalArgs","dt/lib"],function(e){var t=e("jquery"),n=e("globalArgs"),r=e("dt/lib"),i={};return i.getGlobalArg=function(e,t){return n.hasOwnProperty(e)?n[e]:t},i.addVersionArg=function(e){return n.basePath+e+(e.indexOf("?")>=0?"&":"?")+"_v_="+n.version},i.parseToObject=function(e){var n=new Function("return ("+e+")")(),i=t.type(n);return r.assert("object"===i||"array"===i),n},i.contains=function(e,t){return r.arrayIndexOf(e,t)>=0},i.changeIterationSequence=function(e,t,n,r){var i;for(var o in e)if(e.hasOwnProperty(o)&&t===o){i=e[o];break}var a={};"first"===n&&(a[t]=i);for(var o in e)e.hasOwnProperty(o)&&o!==t&&("before"===n&&o===r&&(a[t]=i),a[o]=e[o],"after"===n&&o===r&&(a[t]=i));return"last"===n&&(a[t]=i),a},i.normalizeToArray=function(e){return e?t.isArray(e)?e:[e]:[]},i.log=function(e){console&&t.isFunction(console.log)&&console.log(e)},i}),define("docTool/schemaHelper",["require","jquery","dt/lib","./docUtil","globalArgs"],function(e){function t(e,t,r,i,a,s,l){var d=t,f=s===w?o(r):null;if("hasArrayItems"!==e){var h=n(r,a,s,l);d={value:"id-"+u.localUID(),parent:t,hasObjectProperties:"hasObjectProperties"===e,isEnumParent:s===x,type:r.type,typeEnum:f,description:h.description,defau:h.defau,defaultValueText:m.getDefaultValueText(h.defau),itemEncodeHTML:!1,tooltipEncodeHTML:!1},s!==w&&(d.propertyName=i),a===b&&(d.arrayDepth=l.length),(t.children=t.children||[]).push(d)}var v="",g="",y="...";if(s===w)y="type: '"+p(f)+"', ...";else if(i&&(v='<span class="ecdoc-api-tree-text-prop">'+p(i)+"</span>",c.getGlobalArg("pureTitle")||(v+=": ")),l&&l.length)if(1===l.length)v+="[",g+="]";else{var _=new Array(l.length+1);v+=_.join("["),g+=_.join("]")}if("hasObjectProperties"===e)d.childrenPre=v+"{",d.childrenPost="}"+g+",",d.childrenBrief=y;else if("isAtom"===e){var T=m.getDefaultValueText(d.defau,{getBrief:!0});d.text=v,c.getGlobalArg("pureTitle")||(d.text+='<span class="ecdoc-api-tree-text-default">'+p(T)+"</span>"+g+",")}else"isEnumParent"===e&&(d.childrenPre=v,d.childrenPost=g+",",d.childrenBrief=y);return d}function n(e,t,n,r){var r=(r||[]).slice(),i=r&&r.length&&(n===x||t===b&&n!==w)?r[0]:e,o={description:"option3"===d.schemaName?i.descriptionCN:i.description,defau:{type:i.type}};return i.hasOwnProperty("default")&&(o.defau.default=i.default),o}function r(e,t,n){for(var r,o=[];e&&e.parent&&e.parent.parent;){var a=e.typeEnum,s=a?i(e.parent,t)+"-"+a:i(e,t);n&&(s=u.encodeHTML(s||""),r||(s="<strong>"+s+"</strong>")),o.push(s),e=e.parent,a&&(e=e.parent),r=!0}return o.reverse().join(".")}function i(e,t){var n=e.propertyName,r=e.arrayDepth;return t&&r&&(n+=1===r?"[i]":new Array(r+1).join("[i]")),n}function o(e){var t=e.properties.type.default;return a(t)}function a(e,t){var n=e.match(h)||e.match(v);return n?n[1]:t?null:e}function s(e,t){function n(e){return e.length>t?e.slice(0,t)+"...":e}var r=a(e,!0);return null!=r?"'"+n(r)+"'":n(e)}var l=e("jquery"),u=e("dt/lib"),c=e("./docUtil"),d=e("globalArgs"),p=u.encodeHTML,f=20,h=/^\s*'(.*)'\s*$/,v=/^\s*"(.*)"\s*$/,g=/^([^\[\]\-]+|i\])(\-([0-9a-zA-Z_ \/,]*))?$/,m={},y="isPropertyItem",b="isArrayItem",w="isEnumItem",x="isEnumParent";return m.parseOptionPath=function(e,t){t=t||{};var n="Path is illegal: '"+e+"'";u.assert(e&&(e=l.trim(e)),n);for(var r=e.replace(/\[i\]/g,"").split(/\./),i=[],o=0,a=r.length;o<a;o++){var s=l.trim(r[o]);if(""!==s){var c=s.match(g)||[],d=c[1],p=c[2],f=c[3];t.noTypeEnum&&(d+=p||"",f=null),i.push({propertyName:d,typeEnum:f?f:null})}}return i},m.queryDocTree=function(e,t){function n(e,t,r){if(u.isObject(e)){var a=(t.optionPath||t.fuzzyPath)[r],s=(t.optionPath||t.fuzzyPath)[r-1];if(a||(e.isEnumParent&&!t.fuzzyPath&&s&&s.typeEnum||t.result.push(e),e.isEnumParent))for(var l=0,c=(e.children||[]).length;l<c;l++){var d=e.children[l],p=null;e.isEnumParent?s&&s.typeEnum&&d.typeEnum!==s.typeEnum||(p=r):t.optionPath&&i(d,a.propertyName,a.arrayName)?p=r+1:t.fuzzyPath&&(p=o(d,a.propertyName,a.arrayName)?r+1:r),null!=p&&n(d,t,p)}}}function r(e,t){if(u.isObject(e)){if(t.anyText&&(o(e,t.anyText)||e.description&&e.description.indexOf(t.anyText)>=0))return void t.result.push(e);for(var n=0,i=(e.children||[]).length;n<i;n++)r(e.children[n],t)}}function i(e,t,n){return null!=e.propertyName&&e.propertyName===t}function o(e,t,n){return null!=t&&(t=t.toLowerCase()),null!=n&&(n=n.replace(/\[i\]/g,"").toLowerCase()),null!=e.propertyName&&e.propertyName.toLowerCase().indexOf(t)>=0}t=t||{};var a={originalDocTree:e,result:[],optionPath:t.optionPath?m.parseOptionPath(t.optionPath,{noTypeEnum:t.noTypeEnum}):null,fuzzyPath:t.fuzzyPath?m.parseOptionPath(t.fuzzyPath,{noTypeEnum:t.noTypeEnum}):null,anyText:t.anyText&&l.trim(t.anyText)||null};return u.assert((a.optionPath||a.fuzzyPath||a.anyText)&&(!!a.optionPath&&!!a.fuzzyPath)==!1,"invalid query string!"),a.optionPath||a.fuzzyPath?n(e,a,0):r(e,a),a.result},m.buildDoc=function(e,n){function r(e,n,i,o,a,s){if(u.isObject(n))if(n.anyOf)for(var l=t("isEnumParent",e,n,i,o,x,s),c=0;c<n.anyOf.length;c++)r(l,n.anyOf[c],i,null,w,s?s.slice():null);else if(n.items){var l=t("hasArrayItems",e,n,i,o,a,s);r(l,n.items,i,b,null,s?(s.push(n),s):[n])}else if(n.properties){var l=t("hasObjectProperties",e,n,i,o,a,s),d=n.properties;for(var p in n.properties)d.hasOwnProperty(p)&&r(l,n.properties[p],p,y,null,null)}else t("isAtom",e,n,i,o,a,s)}return r(n,e.option),n},m.getDefaultValueText=function(e,t){t=t||{};var n=l.extend({object:"{...}",array:"[...]",regexp:"/.../",function:"Function","?":"..."},t.briefMapping);if(!e.hasOwnProperty("default")){if(t.getBrief){var r=c.normalizeToArray(e.type);return 1===r.length&&n[r[0].toLowerCase()]||n["?"]}return""}var i=e.default,r=l.type(i);if("null,undefined,number,boolean".indexOf(r)>=0)return i+"";if("string"===r)return t.getBrief?s(i,f):i;if(t.getBrief)return n[r]||n["?"];try{return JSON.stringify(i,null,4)}catch(e){return i+""}},m.getOptionPathForHash=function(e){return r(e)},m.getOptionPathForHTML=function(e){return r(e,!0,!0)},m}),define("docTool/lang",["require","jquery","globalArgs"],function(e){var t=e("jquery"),n=e("globalArgs"),r={langCode:"zh",quickLinkTutorial:"教程",quickLinkAPI:"API",quickLinkOption:"配置项",quickLinkOptionGL:"GL",queryBoxPlaceholderFuzzyPath:"配置项模糊搜索（快捷键'/'）",queryBoxPlaceholderAnyText:"全文搜索（快捷键'/'）",queryBoxTextFuzzyPath:"配置项搜索",queryBoxTextAnyText:"全文搜索",descAreaLabelType:"类型",descAreaLabelDefaultValue:"默认值",showProperties:"展开详情 ...",hideProperties:"折叠详情",collapseAll:"折叠",queryResultInfo:"共 #{count} 条结果",queryBoxNoResult:"没有搜索到信息",exampleCategory:"示例类型",apiMainTitle:"ECharts API检索工具",apiChartDesc:"使用说明：鼠标移动到<strong>箭头</strong>上，可以查看并定位到对应的<strong>ECharts配置项</strong>。"},i={langCode:"en",quickLinkTutorial:"Tutorial",quickLinkAPI:"API",quickLinkOption:"Option",quickLinkOptionGL:"GL",queryBoxPlaceholderFuzzyPath:"Search (Short cut:'/'). Try input: ser(line).border",queryBoxPlaceholderAnyText:"Search (Short cut:'/'). Try input: style",queryBoxTextFuzzyPath:"In properties",queryBoxTextAnyText:"Full-text",descAreaLabelType:"Type",descAreaLabelDefaultValue:"Default Value",showProperties:"Show Properties ...",hideProperties:"Hide Properties",collapseAll:"Collapse",queryResultInfo:"Got #{count} results.",queryBoxNoResult:"No result",exampleCategory:"Category",apiMainTitle:"ECharts API Tool",apiChartDesc:"Tip: Mouse hover on <strong>arrows</strong> to get <strong>option details</strong>."},o=n.lang||{};return t.extend(r,o.zh||{}),t.extend(i,o.en||{}),"en"===window.EC_WWW_LANG?i:r}),function(e){function t(e,t,n,r,i){this._listener=t,this._isOnce=n,this.context=r,this._signal=e,this._priority=i||0}function n(e,t){if("function"!=typeof e)throw Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",t))}function r(){this._bindings=[],this._prevParams=null;var e=this;this.dispatch=function(){r.prototype.dispatch.apply(e,arguments)}}t.prototype={active:!0,params:null,execute:function(e){var t;return this.active&&this._listener&&(e=this.params?this.params.concat(e):e,t=this._listener.apply(this.context,e),this._isOnce&&this.detach()),t},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal,delete this._listener,delete this.context},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+", isBound:"+this.isBound()+", active:"+this.active+"]"}},r.prototype={VERSION:"1.0.0",memorize:!1,_shouldPropagate:!0,active:!0,_registerListener:function(e,n,r,i){var o=this._indexOfListener(e,r);if(o!==-1){if(e=this._bindings[o],e.isOnce()!==n)throw Error("You cannot add"+(n?"":"Once")+"() then add"+(n?"Once":"")+"() the same listener without removing the relationship first.")}else e=new t(this,e,n,r,i),this._addBinding(e);return this.memorize&&this._prevParams&&e.execute(this._prevParams),e},_addBinding:function(e){var t=this._bindings.length;do--t;while(this._bindings[t]&&e._priority<=this._bindings[t]._priority);this._bindings.splice(t+1,0,e)},_indexOfListener:function(e,t){for(var n,r=this._bindings.length;r--;)if(n=this._bindings[r],n._listener===e&&n.context===t)return r;return-1},has:function(e,t){return this._indexOfListener(e,t)!==-1},add:function(e,t,r){return n(e,"add"),this._registerListener(e,!1,t,r)},addOnce:function(e,t,r){return n(e,"addOnce"),this._registerListener(e,!0,t,r)},remove:function(e,t){n(e,"remove");var r=this._indexOfListener(e,t);return r!==-1&&(this._bindings[r]._destroy(),this._bindings.splice(r,1)),e},removeAll:function(){for(var e=this._bindings.length;e--;)this._bindings[e]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length;
},halt:function(){this._shouldPropagate=!1},dispatch:function(e){if(this.active){var t,n=Array.prototype.slice.call(arguments),r=this._bindings.length;if(this.memorize&&(this._prevParams=n),r){t=this._bindings.slice(),this._shouldPropagate=!0;do r--;while(t[r]&&this._shouldPropagate&&t[r].execute(n)!==!1)}}},forget:function(){this._prevParams=null},dispose:function(){this.removeAll(),delete this._bindings,delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};var i=r;i.Signal=r,"function"==typeof define&&define.amd?define("signals",[],function(){return i}):"undefined"!=typeof module&&module.exports?module.exports=i:e.signals=i}(this),function(){var e=function(e){var t=function(t){function n(e){return String(e||"").replace(/\W/g,"\\$&")}function r(e){if(!e)return"";var t=new RegExp("^"+n(f.prependHash)+"|"+n(f.appendHash)+"$","g");return e.replace(t,"")}function i(){var e=_.exec(f.getURL()),t=e&&e[1]||"";try{return f.raw?t:decodeURIComponent(t)}catch(e){return t}}function o(){return m?m.contentWindow.frameHash:null}function a(){m=w.createElement("iframe"),m.src="about:blank",m.style.display="none",w.body.appendChild(m)}function s(){if(m&&h!==o()){var e=m.contentWindow.document;e.open(),e.write("<html><head><title>"+w.title+'</title><script type="text/javascript">var frameHash="'+h+'";</script></head><body>&nbsp;</body></html>'),e.close()}}function l(e,t){if(h!==e){var n=h;h=e,D&&(t?m.contentWindow.frameHash=e:s()),f.changed.dispatch(r(e),r(n))}}function u(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent&&e.attachEvent("on"+t,n)}function c(e,t,n){e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent&&e.detachEvent("on"+t,n)}function d(e){e=Array.prototype.slice.call(arguments);var t=e.join(f.separator);return t=t?f.prependHash+t.replace(C,"")+f.appendHash:t}function p(e){return e=encodeURI(e),E&&S&&(e=e.replace(/\?/,"%3F")),e}var f,h,v,g,m,y,b=25,w=t.document,x=(t.history,e.Signal),_=/#(.*)$/,T=/(\?.*)|(\#.*)/,C=/^\#/,E=!1,A="onhashchange"in t&&7!==w.documentMode,D=E&&!A,S="file:"===location.protocol;return y=D?function(){var e=i(),t=o();t!==h&&t!==e?f.setHash(r(t)):e!==h&&l(e)}:function(){var e=i();e!==h&&l(e)},f={VERSION:"1.2.0",raw:!1,appendHash:"",prependHash:"/",separator:"/",changed:new x,stopped:new x,initialized:new x,init:function(){g||(h=i(),A?u(t,"hashchange",y):(D&&(m||a(),s()),v=setInterval(y,b)),g=!0,f.initialized.dispatch(r(h)))},stop:function(){g&&(A?c(t,"hashchange",y):(clearInterval(v),v=null),g=!1,f.stopped.dispatch(r(h)))},isActive:function(){return g},getURL:function(){return t.location.href},getBaseURL:function(){return f.getURL().replace(T,"")},setHash:function(e){e=d.apply(null,arguments),e!==h&&(l(e),e===h&&(f.raw||(e=p(e)),t.location.hash="#"+e))},replaceHash:function(e){e=d.apply(null,arguments),e!==h&&(l(e,!0),e===h&&(f.raw||(e=p(e)),t.location.replace("#"+e)))},getHash:function(){return r(h)},getHashAsArray:function(){return f.getHash().split(f.separator)},dispose:function(){f.stop(),f.initialized.dispose(),f.stopped.dispose(),f.changed.dispose(),m=f=t.hasher=null},toString:function(){return'[hasher version="'+f.VERSION+'" hash="'+f.getHash()+'"]'}},f.initialized.memorize=!0,f}(window);return t};"function"==typeof define&&define.amd?define("hasher",["signals"],e):"object"==typeof exports?module.exports=e(require("signals")):window.hasher=e(window.signals)}(),define("docTool/hashHelper",["require","hasher","dt/lib"],function(e){var t=e("hasher"),n=e("dt/lib"),r={};return r.initHash=function(e){t.prependHash="",t.initialized.add(e),t.changed.add(e),t.init()},r.parseHash=function(e){n.assert(t.isActive());var r={};if(e){var i=/^#?(?:([^~]*)~)?(.*)$/.exec(e);r.category=i[1],r.queryString=i[2]}return r},r.getHashInfo=function(){return r.parseHash(t.getHash())},r.hashRoute=function(e){n.assert(t.isActive());var i=r.getHashInfo();n.assign(i,e);var o="";i.category&&(o+=i.category+"~"),i.queryString&&(o+=i.queryString),t.setHash(o)},r}),function e(t,n,r){function i(a,s){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return i(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(e,t,n){var r=e("../main");"function"==typeof define&&define.amd?define("perfectScrollbar",r):(window.PerfectScrollbar=r,"undefined"==typeof window.Ps&&(window.Ps=r))},{"../main":7}],2:[function(e,t,n){function r(e,t){var n=e.className.split(" ");n.indexOf(t)<0&&n.push(t),e.className=n.join(" ")}function i(e,t){var n=e.className.split(" "),r=n.indexOf(t);r>=0&&n.splice(r,1),e.className=n.join(" ")}n.add=function(e,t){e.classList?e.classList.add(t):r(e,t)},n.remove=function(e,t){e.classList?e.classList.remove(t):i(e,t)},n.list=function(e){return e.classList?Array.prototype.slice.apply(e.classList):e.className.split(" ")}},{}],3:[function(e,t,n){function r(e,t){return window.getComputedStyle(e)[t]}function i(e,t,n){return"number"==typeof n&&(n=n.toString()+"px"),e.style[t]=n,e}function o(e,t){for(var n in t){var r=t[n];"number"==typeof r&&(r=r.toString()+"px"),e.style[n]=r}return e}var a={};a.e=function(e,t){var n=document.createElement(e);return n.className=t,n},a.appendTo=function(e,t){return t.appendChild(e),e},a.css=function(e,t,n){return"object"==typeof t?o(e,t):"undefined"==typeof n?r(e,t):i(e,t,n)},a.matches=function(e,t){return"undefined"!=typeof e.matches?e.matches(t):"undefined"!=typeof e.matchesSelector?e.matchesSelector(t):"undefined"!=typeof e.webkitMatchesSelector?e.webkitMatchesSelector(t):"undefined"!=typeof e.mozMatchesSelector?e.mozMatchesSelector(t):"undefined"!=typeof e.msMatchesSelector?e.msMatchesSelector(t):void 0},a.remove=function(e){"undefined"!=typeof e.remove?e.remove():e.parentNode&&e.parentNode.removeChild(e)},a.queryChildren=function(e,t){return Array.prototype.filter.call(e.childNodes,function(e){return a.matches(e,t)})},t.exports=a},{}],4:[function(e,t,n){var r=function(e){this.element=e,this.events={}};r.prototype.bind=function(e,t){"undefined"==typeof this.events[e]&&(this.events[e]=[]),this.events[e].push(t),this.element.addEventListener(e,t,!1)},r.prototype.unbind=function(e,t){var n="undefined"!=typeof t;this.events[e]=this.events[e].filter(function(r){return!(!n||r===t)||(this.element.removeEventListener(e,r,!1),!1)},this)},r.prototype.unbindAll=function(){for(var e in this.events)this.unbind(e)};var i=function(){this.eventElements=[]};i.prototype.eventElement=function(e){var t=this.eventElements.filter(function(t){return t.element===e})[0];return"undefined"==typeof t&&(t=new r(e),this.eventElements.push(t)),t},i.prototype.bind=function(e,t,n){this.eventElement(e).bind(t,n)},i.prototype.unbind=function(e,t,n){this.eventElement(e).unbind(t,n)},i.prototype.unbindAll=function(){for(var e=0;e<this.eventElements.length;e++)this.eventElements[e].unbindAll()},i.prototype.once=function(e,t,n){var r=this.eventElement(e),i=function(e){r.unbind(t,i),n(e)};r.bind(t,i)},t.exports=i},{}],5:[function(e,t,n){t.exports=function(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}}()},{}],6:[function(e,t,n){var r=e("./class"),i=e("./dom");n.toInt=function(e){return parseInt(e,10)||0},n.clone=function(e){if(null===e)return null;if("object"==typeof e){var t={};for(var n in e)t[n]=this.clone(e[n]);return t}return e},n.extend=function(e,t){var n=this.clone(e);for(var r in t)n[r]=this.clone(t[r]);return n},n.isEditable=function(e){return i.matches(e,"input,[contenteditable]")||i.matches(e,"select,[contenteditable]")||i.matches(e,"textarea,[contenteditable]")||i.matches(e,"button,[contenteditable]")},n.removePsClasses=function(e){for(var t=r.list(e),n=0;n<t.length;n++){var i=t[n];0===i.indexOf("ps-")&&r.remove(e,i)}},n.outerWidth=function(e){return this.toInt(i.css(e,"width"))+this.toInt(i.css(e,"paddingLeft"))+this.toInt(i.css(e,"paddingRight"))+this.toInt(i.css(e,"borderLeftWidth"))+this.toInt(i.css(e,"borderRightWidth"))},n.startScrolling=function(e,t){r.add(e,"ps-in-scrolling"),"undefined"!=typeof t?r.add(e,"ps-"+t):(r.add(e,"ps-x"),r.add(e,"ps-y"))},n.stopScrolling=function(e,t){r.remove(e,"ps-in-scrolling"),"undefined"!=typeof t?r.remove(e,"ps-"+t):(r.remove(e,"ps-x"),r.remove(e,"ps-y"))},n.env={isWebKit:"WebkitAppearance"in document.documentElement.style,supportsTouch:"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch,supportsIePointer:null!==window.navigator.msMaxTouchPoints}},{"./class":2,"./dom":3}],7:[function(e,t,n){var r=e("./plugin/destroy"),i=e("./plugin/initialize"),o=e("./plugin/update");t.exports={initialize:i,update:o,destroy:r}},{"./plugin/destroy":9,"./plugin/initialize":17,"./plugin/update":21}],8:[function(e,t,n){t.exports={maxScrollbarLength:null,minScrollbarLength:null,scrollXMarginOffset:0,scrollYMarginOffset:0,stopPropagationOnClick:!0,suppressScrollX:!1,suppressScrollY:!1,swipePropagation:!0,useBothWheelAxes:!1,useKeyboard:!0,useSelectionScroll:!1,wheelPropagation:!1,wheelSpeed:1}},{}],9:[function(e,t,n){var r=e("../lib/dom"),i=e("../lib/helper"),o=e("./instances");t.exports=function(e){var t=o.get(e);t&&(t.event.unbindAll(),r.remove(t.scrollbarX),r.remove(t.scrollbarY),r.remove(t.scrollbarXRail),r.remove(t.scrollbarYRail),i.removePsClasses(e),o.remove(e))}},{"../lib/dom":3,"../lib/helper":6,"./instances":18}],10:[function(e,t,n){function r(e,t){function n(e){return e.getBoundingClientRect()}var r=window.Event.prototype.stopPropagation.bind;t.settings.stopPropagationOnClick&&t.event.bind(t.scrollbarY,"click",r),t.event.bind(t.scrollbarYRail,"click",function(r){var o=i.toInt(t.scrollbarYHeight/2),l=t.railYRatio*(r.pageY-window.pageYOffset-n(t.scrollbarYRail).top-o),u=t.railYRatio*(t.railYHeight-t.scrollbarYHeight),c=l/u;c<0?c=0:c>1&&(c=1),s(e,"top",(t.contentHeight-t.containerHeight)*c),a(e),r.stopPropagation()}),t.settings.stopPropagationOnClick&&t.event.bind(t.scrollbarX,"click",r),t.event.bind(t.scrollbarXRail,"click",function(r){var o=i.toInt(t.scrollbarXWidth/2),l=t.railXRatio*(r.pageX-window.pageXOffset-n(t.scrollbarXRail).left-o),u=t.railXRatio*(t.railXWidth-t.scrollbarXWidth),c=l/u;c<0?c=0:c>1&&(c=1),s(e,"left",(t.contentWidth-t.containerWidth)*c-t.negativeScrollAdjustment),a(e),r.stopPropagation()})}var i=e("../../lib/helper"),o=e("../instances"),a=e("../update-geometry"),s=e("../update-scroll");t.exports=function(e){var t=o.get(e);r(e,t)}},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],11:[function(e,t,n){function r(e,t){function n(n){var i=r+n*t.railXRatio,o=Math.max(0,t.scrollbarXRail.getBoundingClientRect().left)+t.railXRatio*(t.railXWidth-t.scrollbarXWidth);i<0?t.scrollbarXLeft=0:i>o?t.scrollbarXLeft=o:t.scrollbarXLeft=i;var s=a.toInt(t.scrollbarXLeft*(t.contentWidth-t.containerWidth)/(t.containerWidth-t.railXRatio*t.scrollbarXWidth))-t.negativeScrollAdjustment;u(e,"left",s)}var r=null,i=null,s=function(t){n(t.pageX-i),l(e),t.stopPropagation(),t.preventDefault()},c=function(){a.stopScrolling(e,"x"),t.event.unbind(t.ownerDocument,"mousemove",s)};t.event.bind(t.scrollbarX,"mousedown",function(n){i=n.pageX,r=a.toInt(o.css(t.scrollbarX,"left"))*t.railXRatio,a.startScrolling(e,"x"),t.event.bind(t.ownerDocument,"mousemove",s),t.event.once(t.ownerDocument,"mouseup",c),n.stopPropagation(),n.preventDefault()})}function i(e,t){function n(n){var i=r+n*t.railYRatio,o=Math.max(0,t.scrollbarYRail.getBoundingClientRect().top)+t.railYRatio*(t.railYHeight-t.scrollbarYHeight);i<0?t.scrollbarYTop=0:i>o?t.scrollbarYTop=o:t.scrollbarYTop=i;var s=a.toInt(t.scrollbarYTop*(t.contentHeight-t.containerHeight)/(t.containerHeight-t.railYRatio*t.scrollbarYHeight));u(e,"top",s)}var r=null,i=null,s=function(t){n(t.pageY-i),l(e),t.stopPropagation(),t.preventDefault()},c=function(){a.stopScrolling(e,"y"),t.event.unbind(t.ownerDocument,"mousemove",s)};t.event.bind(t.scrollbarY,"mousedown",function(n){i=n.pageY,r=a.toInt(o.css(t.scrollbarY,"top"))*t.railYRatio,a.startScrolling(e,"y"),t.event.bind(t.ownerDocument,"mousemove",s),t.event.once(t.ownerDocument,"mouseup",c),n.stopPropagation(),n.preventDefault()})}var o=e("../../lib/dom"),a=e("../../lib/helper"),s=e("../instances"),l=e("../update-geometry"),u=e("../update-scroll");t.exports=function(e){var t=s.get(e);r(e,t),i(e,t)}},{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],12:[function(e,t,n){function r(e,t){function n(n,r){var i=e.scrollTop;if(0===n){if(!t.scrollbarYActive)return!1;if(0===i&&r>0||i>=t.contentHeight-t.containerHeight&&r<0)return!t.settings.wheelPropagation}var o=e.scrollLeft;if(0===r){if(!t.scrollbarXActive)return!1;if(0===o&&n<0||o>=t.contentWidth-t.containerWidth&&n>0)return!t.settings.wheelPropagation}return!0}var r=!1;t.event.bind(e,"mouseenter",function(){r=!0}),t.event.bind(e,"mouseleave",function(){r=!1});var o=!1;t.event.bind(t.ownerDocument,"keydown",function(l){if((!l.isDefaultPrevented||!l.isDefaultPrevented())&&r){var u=document.activeElement?document.activeElement:t.ownerDocument.activeElement;if(u){for(;u.shadowRoot;)u=u.shadowRoot.activeElement;if(i.isEditable(u))return}var c=0,d=0;switch(l.which){case 37:c=-30;break;case 38:d=30;break;case 39:c=30;break;case 40:d=-30;break;case 33:d=90;break;case 32:d=l.shiftKey?90:-90;break;case 34:d=-90;break;case 35:d=l.ctrlKey?-t.contentHeight:-t.containerHeight;break;case 36:d=l.ctrlKey?e.scrollTop:t.containerHeight;break;default:return}s(e,"top",e.scrollTop-d),s(e,"left",e.scrollLeft+c),a(e),o=n(c,d),o&&l.preventDefault()}})}var i=e("../../lib/helper"),o=e("../instances"),a=e("../update-geometry"),s=e("../update-scroll");t.exports=function(e){var t=o.get(e);r(e,t)}},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],13:[function(e,t,n){function r(e,t){function n(n,r){var i=e.scrollTop;if(0===n){if(!t.scrollbarYActive)return!1;if(0===i&&r>0||i>=t.contentHeight-t.containerHeight&&r<0)return!t.settings.wheelPropagation}var o=e.scrollLeft;if(0===r){if(!t.scrollbarXActive)return!1;if(0===o&&n<0||o>=t.contentWidth-t.containerWidth&&n>0)return!t.settings.wheelPropagation}return!0}function r(e){var t=e.deltaX,n=-1*e.deltaY;return"undefined"!=typeof t&&"undefined"!=typeof n||(t=-1*e.wheelDeltaX/6,n=e.wheelDeltaY/6),e.deltaMode&&1===e.deltaMode&&(t*=10,n*=10),t!==t&&n!==n&&(t=0,n=e.wheelDelta),[t,n]}function i(t,n){var r=e.querySelector("textarea:hover");if(r){var i=r.scrollHeight-r.clientHeight;if(i>0&&!(0===r.scrollTop&&n>0||r.scrollTop===i&&n<0))return!0;var o=r.scrollLeft-r.clientWidth;if(o>0&&!(0===r.scrollLeft&&t<0||r.scrollLeft===o&&t>0))return!0}return!1}function s(s){var u=r(s),c=u[0],d=u[1];i(c,d)||(l=!1,t.settings.useBothWheelAxes?t.scrollbarYActive&&!t.scrollbarXActive?(d?a(e,"top",e.scrollTop-d*t.settings.wheelSpeed):a(e,"top",e.scrollTop+c*t.settings.wheelSpeed),l=!0):t.scrollbarXActive&&!t.scrollbarYActive&&(c?a(e,"left",e.scrollLeft+c*t.settings.wheelSpeed):a(e,"left",e.scrollLeft-d*t.settings.wheelSpeed),l=!0):(a(e,"top",e.scrollTop-d*t.settings.wheelSpeed),a(e,"left",e.scrollLeft+c*t.settings.wheelSpeed)),o(e),l=l||n(c,d),l&&(s.stopPropagation(),s.preventDefault()))}var l=!1;"undefined"!=typeof window.onwheel?t.event.bind(e,"wheel",s):"undefined"!=typeof window.onmousewheel&&t.event.bind(e,"mousewheel",s)}var i=e("../instances"),o=e("../update-geometry"),a=e("../update-scroll");t.exports=function(e){var t=i.get(e);r(e,t)}},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],14:[function(e,t,n){function r(e,t){t.event.bind(e,"scroll",function(){o(e)})}var i=e("../instances"),o=e("../update-geometry");t.exports=function(e){var t=i.get(e);r(e,t)}},{"../instances":18,"../update-geometry":19}],15:[function(e,t,n){function r(e,t){function n(){var e=window.getSelection?window.getSelection():document.getSelection?document.getSelection():"";return 0===e.toString().length?null:e.getRangeAt(0).commonAncestorContainer}function r(){u||(u=setInterval(function(){return o.get(e)?(s(e,"top",e.scrollTop+c.top),s(e,"left",e.scrollLeft+c.left),void a(e)):void clearInterval(u)},50))}function l(){u&&(clearInterval(u),u=null),i.stopScrolling(e)}var u=null,c={top:0,left:0},d=!1;t.event.bind(t.ownerDocument,"selectionchange",function(){e.contains(n())?d=!0:(d=!1,l())}),t.event.bind(window,"mouseup",function(){d&&(d=!1,l())}),t.event.bind(window,"mousemove",function(t){if(d){var n={x:t.pageX,y:t.pageY},o={left:e.offsetLeft,right:e.offsetLeft+e.offsetWidth,top:e.offsetTop,bottom:e.offsetTop+e.offsetHeight};n.x<o.left+3?(c.left=-5,i.startScrolling(e,"x")):n.x>o.right-3?(c.left=5,i.startScrolling(e,"x")):c.left=0,n.y<o.top+3?(o.top+3-n.y<5?c.top=-5:c.top=-20,i.startScrolling(e,"y")):n.y>o.bottom-3?(n.y-o.bottom+3<5?c.top=5:c.top=20,i.startScrolling(e,"y")):c.top=0,0===c.top&&0===c.left?l():r()}})}var i=e("../../lib/helper"),o=e("../instances"),a=e("../update-geometry"),s=e("../update-scroll");t.exports=function(e){var t=o.get(e);r(e,t)}},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],16:[function(e,t,n){function r(e,t,n,r){function s(n,r){var i=e.scrollTop,o=e.scrollLeft,a=Math.abs(n),s=Math.abs(r);if(s>a){if(r<0&&i===t.contentHeight-t.containerHeight||r>0&&0===i)return!t.settings.swipePropagation}else if(a>s&&(n<0&&o===t.contentWidth-t.containerWidth||n>0&&0===o))return!t.settings.swipePropagation;return!0}function l(t,n){a(e,"top",e.scrollTop-n),a(e,"left",e.scrollLeft-t),o(e)}function u(){w=!0}function c(){w=!1}function d(e){return e.targetTouches?e.targetTouches[0]:e}function p(e){return!(!e.targetTouches||1!==e.targetTouches.length)||!(!e.pointerType||"mouse"===e.pointerType||e.pointerType===e.MSPOINTER_TYPE_MOUSE)}function f(e){if(p(e)){x=!0;var t=d(e);g.pageX=t.pageX,g.pageY=t.pageY,m=(new Date).getTime(),null!==b&&clearInterval(b),e.stopPropagation()}}function h(e){if(!w&&x&&p(e)){var t=d(e),n={pageX:t.pageX,pageY:t.pageY},r=n.pageX-g.pageX,i=n.pageY-g.pageY;l(r,i),g=n;var o=(new Date).getTime(),a=o-m;a>0&&(y.x=r/a,y.y=i/a,m=o),s(r,i)&&(e.stopPropagation(),e.preventDefault())}}function v(){!w&&x&&(x=!1,clearInterval(b),b=setInterval(function(){return i.get(e)?Math.abs(y.x)<.01&&Math.abs(y.y)<.01?void clearInterval(b):(l(30*y.x,30*y.y),y.x*=.8,void(y.y*=.8)):void clearInterval(b)},10))}var g={},m=0,y={},b=null,w=!1,x=!1;n&&(t.event.bind(window,"touchstart",u),t.event.bind(window,"touchend",c),t.event.bind(e,"touchstart",f),t.event.bind(e,"touchmove",h),t.event.bind(e,"touchend",v)),r&&(window.PointerEvent?(t.event.bind(window,"pointerdown",u),t.event.bind(window,"pointerup",c),t.event.bind(e,"pointerdown",f),t.event.bind(e,"pointermove",h),t.event.bind(e,"pointerup",v)):window.MSPointerEvent&&(t.event.bind(window,"MSPointerDown",u),t.event.bind(window,"MSPointerUp",c),t.event.bind(e,"MSPointerDown",f),t.event.bind(e,"MSPointerMove",h),t.event.bind(e,"MSPointerUp",v)))}var i=e("../instances"),o=e("../update-geometry"),a=e("../update-scroll");t.exports=function(e,t,n){var o=i.get(e);r(e,o,t,n)}},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],17:[function(e,t,n){var r=e("../lib/class"),i=e("../lib/helper"),o=e("./instances"),a=e("./update-geometry"),s=e("./handler/click-rail"),l=e("./handler/drag-scrollbar"),u=e("./handler/keyboard"),c=e("./handler/mouse-wheel"),d=e("./handler/native-scroll"),p=e("./handler/selection"),f=e("./handler/touch");t.exports=function(e,t){t="object"==typeof t?t:{},r.add(e,"ps-container");var n=o.add(e);n.settings=i.extend(n.settings,t),s(e),l(e),c(e),d(e),n.settings.useSelectionScroll&&p(e),(i.env.supportsTouch||i.env.supportsIePointer)&&f(e,i.env.supportsTouch,i.env.supportsIePointer),n.settings.useKeyboard&&u(e),a(e)}},{"../lib/class":2,"../lib/helper":6,"./handler/click-rail":10,"./handler/drag-scrollbar":11,"./handler/keyboard":12,"./handler/mouse-wheel":13,"./handler/native-scroll":14,"./handler/selection":15,"./handler/touch":16,"./instances":18,"./update-geometry":19}],18:[function(e,t,n){function r(e){var t=this;t.settings=d.clone(l),t.containerWidth=null,t.containerHeight=null,t.contentWidth=null,t.contentHeight=null,t.isRtl="rtl"===s.css(e,"direction"),t.isNegativeScroll=function(){var t=e.scrollLeft,n=null;return e.scrollLeft=-1,n=e.scrollLeft<0,e.scrollLeft=t,n}(),t.negativeScrollAdjustment=t.isNegativeScroll?e.scrollWidth-e.clientWidth:0,t.event=new u,t.ownerDocument=e.ownerDocument||document,t.scrollbarXRail=s.appendTo(s.e("div","ps-scrollbar-x-rail"),e),t.scrollbarX=s.appendTo(s.e("div","ps-scrollbar-x"),t.scrollbarXRail),t.scrollbarX.setAttribute("tabindex",0),t.scrollbarXActive=null,t.scrollbarXWidth=null,t.scrollbarXLeft=null,t.scrollbarXBottom=d.toInt(s.css(t.scrollbarXRail,"bottom")),t.isScrollbarXUsingBottom=t.scrollbarXBottom===t.scrollbarXBottom,t.scrollbarXTop=t.isScrollbarXUsingBottom?null:d.toInt(s.css(t.scrollbarXRail,"top")),t.railBorderXWidth=d.toInt(s.css(t.scrollbarXRail,"borderLeftWidth"))+d.toInt(s.css(t.scrollbarXRail,"borderRightWidth")),s.css(t.scrollbarXRail,"display","block"),t.railXMarginWidth=d.toInt(s.css(t.scrollbarXRail,"marginLeft"))+d.toInt(s.css(t.scrollbarXRail,"marginRight")),s.css(t.scrollbarXRail,"display",""),t.railXWidth=null,t.railXRatio=null,t.scrollbarYRail=s.appendTo(s.e("div","ps-scrollbar-y-rail"),e),t.scrollbarY=s.appendTo(s.e("div","ps-scrollbar-y"),t.scrollbarYRail),t.scrollbarY.setAttribute("tabindex",0),t.scrollbarYActive=null,t.scrollbarYHeight=null,t.scrollbarYTop=null,t.scrollbarYRight=d.toInt(s.css(t.scrollbarYRail,"right")),t.isScrollbarYUsingRight=t.scrollbarYRight===t.scrollbarYRight,t.scrollbarYLeft=t.isScrollbarYUsingRight?null:d.toInt(s.css(t.scrollbarYRail,"left")),t.scrollbarYOuterWidth=t.isRtl?d.outerWidth(t.scrollbarY):null,t.railBorderYWidth=d.toInt(s.css(t.scrollbarYRail,"borderTopWidth"))+d.toInt(s.css(t.scrollbarYRail,"borderBottomWidth")),s.css(t.scrollbarYRail,"display","block"),t.railYMarginHeight=d.toInt(s.css(t.scrollbarYRail,"marginTop"))+d.toInt(s.css(t.scrollbarYRail,"marginBottom")),s.css(t.scrollbarYRail,"display",""),t.railYHeight=null,t.railYRatio=null}function i(e){return"undefined"==typeof e.dataset?e.getAttribute("data-ps-id"):e.dataset.psId}function o(e,t){"undefined"==typeof e.dataset?e.setAttribute("data-ps-id",t):e.dataset.psId=t}function a(e){"undefined"==typeof e.dataset?e.removeAttribute("data-ps-id"):delete e.dataset.psId}var s=e("../lib/dom"),l=e("./default-setting"),u=e("../lib/event-manager"),c=e("../lib/guid"),d=e("../lib/helper"),p={};n.add=function(e){var t=c();return o(e,t),p[t]=new r(e),p[t]},n.remove=function(e){delete p[i(e)],a(e)},n.get=function(e){return p[i(e)]}},{"../lib/dom":3,"../lib/event-manager":4,"../lib/guid":5,"../lib/helper":6,"./default-setting":8}],19:[function(e,t,n){function r(e,t){return e.settings.minScrollbarLength&&(t=Math.max(t,e.settings.minScrollbarLength)),e.settings.maxScrollbarLength&&(t=Math.min(t,e.settings.maxScrollbarLength)),t}function i(e,t){var n={width:t.railXWidth};t.isRtl?n.left=t.negativeScrollAdjustment+e.scrollLeft+t.containerWidth-t.contentWidth:n.left=e.scrollLeft,t.isScrollbarXUsingBottom?n.bottom=t.scrollbarXBottom-e.scrollTop:n.top=t.scrollbarXTop+e.scrollTop,a.css(t.scrollbarXRail,n);var r={top:e.scrollTop,height:t.railYHeight};t.isScrollbarYUsingRight?t.isRtl?r.right=t.contentWidth-(t.negativeScrollAdjustment+e.scrollLeft)-t.scrollbarYRight-t.scrollbarYOuterWidth:r.right=t.scrollbarYRight-e.scrollLeft:t.isRtl?r.left=t.negativeScrollAdjustment+e.scrollLeft+2*t.containerWidth-t.contentWidth-t.scrollbarYLeft-t.scrollbarYOuterWidth:r.left=t.scrollbarYLeft+e.scrollLeft,a.css(t.scrollbarYRail,r),a.css(t.scrollbarX,{left:t.scrollbarXLeft,width:t.scrollbarXWidth-t.railBorderXWidth}),a.css(t.scrollbarY,{top:t.scrollbarYTop,height:t.scrollbarYHeight-t.railBorderYWidth})}var o=e("../lib/class"),a=e("../lib/dom"),s=e("../lib/helper"),l=e("./instances"),u=e("./update-scroll");t.exports=function(e){var t=l.get(e);t.containerWidth=e.clientWidth,t.containerHeight=e.clientHeight,t.contentWidth=e.scrollWidth,t.contentHeight=e.scrollHeight;var n;e.contains(t.scrollbarXRail)||(n=a.queryChildren(e,".ps-scrollbar-x-rail"),n.length>0&&n.forEach(function(e){a.remove(e)}),a.appendTo(t.scrollbarXRail,e)),e.contains(t.scrollbarYRail)||(n=a.queryChildren(e,".ps-scrollbar-y-rail"),n.length>0&&n.forEach(function(e){a.remove(e)}),a.appendTo(t.scrollbarYRail,e)),!t.settings.suppressScrollX&&t.containerWidth+t.settings.scrollXMarginOffset<t.contentWidth?(t.scrollbarXActive=!0,t.railXWidth=t.containerWidth-t.railXMarginWidth,t.railXRatio=t.containerWidth/t.railXWidth,t.scrollbarXWidth=r(t,s.toInt(t.railXWidth*t.containerWidth/t.contentWidth)),t.scrollbarXLeft=s.toInt((t.negativeScrollAdjustment+e.scrollLeft)*(t.railXWidth-t.scrollbarXWidth)/(t.contentWidth-t.containerWidth))):t.scrollbarXActive=!1,!t.settings.suppressScrollY&&t.containerHeight+t.settings.scrollYMarginOffset<t.contentHeight?(t.scrollbarYActive=!0,t.railYHeight=t.containerHeight-t.railYMarginHeight,t.railYRatio=t.containerHeight/t.railYHeight,t.scrollbarYHeight=r(t,s.toInt(t.railYHeight*t.containerHeight/t.contentHeight)),t.scrollbarYTop=s.toInt(e.scrollTop*(t.railYHeight-t.scrollbarYHeight)/(t.contentHeight-t.containerHeight))):t.scrollbarYActive=!1,t.scrollbarXLeft>=t.railXWidth-t.scrollbarXWidth&&(t.scrollbarXLeft=t.railXWidth-t.scrollbarXWidth),t.scrollbarYTop>=t.railYHeight-t.scrollbarYHeight&&(t.scrollbarYTop=t.railYHeight-t.scrollbarYHeight),i(e,t),t.scrollbarXActive?o.add(e,"ps-active-x"):(o.remove(e,"ps-active-x"),t.scrollbarXWidth=0,t.scrollbarXLeft=0,u(e,"left",0)),t.scrollbarYActive?o.add(e,"ps-active-y"):(o.remove(e,"ps-active-y"),t.scrollbarYHeight=0,t.scrollbarYTop=0,u(e,"top",0))}},{"../lib/class":2,"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-scroll":20}],20:[function(e,t,n){var r,i,o=e("./instances"),a=document.createEvent("Event"),s=document.createEvent("Event"),l=document.createEvent("Event"),u=document.createEvent("Event"),c=document.createEvent("Event"),d=document.createEvent("Event"),p=document.createEvent("Event"),f=document.createEvent("Event"),h=document.createEvent("Event"),v=document.createEvent("Event");a.initEvent("ps-scroll-up",!0,!0),s.initEvent("ps-scroll-down",!0,!0),l.initEvent("ps-scroll-left",!0,!0),u.initEvent("ps-scroll-right",!0,!0),c.initEvent("ps-scroll-y",!0,!0),d.initEvent("ps-scroll-x",!0,!0),p.initEvent("ps-x-reach-start",!0,!0),f.initEvent("ps-x-reach-end",!0,!0),h.initEvent("ps-y-reach-start",!0,!0),v.initEvent("ps-y-reach-end",!0,!0),t.exports=function(e,t,n){if("undefined"==typeof e)throw"You must provide an element to the update-scroll function";if("undefined"==typeof t)throw"You must provide an axis to the update-scroll function";if("undefined"==typeof n)throw"You must provide a value to the update-scroll function";if("top"===t&&n<=0)return e.scrollTop=0,void e.dispatchEvent(h);if("left"===t&&n<=0)return e.scrollLeft=0,void e.dispatchEvent(p);var g=o.get(e);return"top"===t&&n>=g.contentHeight-g.containerHeight?(e.scrollTop=g.contentHeight-g.containerHeight,void e.dispatchEvent(v)):"left"===t&&n>=g.contentWidth-g.containerWidth?(e.scrollLeft=g.contentWidth-g.containerWidth,void e.dispatchEvent(f)):(r||(r=e.scrollTop),i||(i=e.scrollLeft),"top"===t&&n<r&&e.dispatchEvent(a),"top"===t&&n>r&&e.dispatchEvent(s),"left"===t&&n<i&&e.dispatchEvent(l),"left"===t&&n>i&&e.dispatchEvent(u),"top"===t&&(e.scrollTop=r=n,e.dispatchEvent(c)),void("left"===t&&(e.scrollLeft=i=n,e.dispatchEvent(d))))}},{"./instances":18}],21:[function(e,t,n){var r=e("../lib/dom"),i=e("../lib/helper"),o=e("./instances"),a=e("./update-geometry"),s=e("./update-scroll");t.exports=function(e){var t=o.get(e);t&&(t.negativeScrollAdjustment=t.isNegativeScroll?e.scrollWidth-e.clientWidth:0,r.css(t.scrollbarXRail,"display","block"),r.css(t.scrollbarYRail,"display","block"),t.railXMarginWidth=i.toInt(r.css(t.scrollbarXRail,"marginLeft"))+i.toInt(r.css(t.scrollbarXRail,"marginRight")),t.railYMarginHeight=i.toInt(r.css(t.scrollbarYRail,"marginTop"))+i.toInt(r.css(t.scrollbarYRail,"marginBottom")),r.css(t.scrollbarXRail,"display","none"),r.css(t.scrollbarYRail,"display","none"),a(e),s(e,"top",e.scrollTop),s(e,"left",e.scrollLeft),r.css(t.scrollbarXRail,"display",""),r.css(t.scrollbarYRail,"display",""))}},{"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-geometry":19,"./update-scroll":20}]},{},[1]),define("dt/ui/Text",["require","../lib","./Component"],function(e){var t=e("../lib"),n=e("./Component"),r=n.extend({_define:{css:"dtui-tx",viewModel:function(){return{value:t.ob(""),encodeHTML:t.ob(!0)}},viewModelPublic:["value","encodeHTML"]},_init:function(){function e(){var e=r();i()&&(e=t.encodeHTML(this._stringify(e))),this.el().innerHTML=e}var n=this._viewModel(),r=n.value,i=n.encodeHTML;n.value.subscribe(e,this),n.encodeHTML.subscribe(e,this),e.call(this)},_stringify:function(e){return null==e?"":String(e)},_dispose:function(){this.$el().html("")}});return r}),define("dt/ui/TextInput",["require","jquery","../lib","./Component"],function(e){var t=e("jquery"),n=e("../lib"),r=e("./Component"),i=r.extend({_define:{css:"dtui-txipt",viewModel:function(){return{value:n.ob(""),mouseEnterSelect:!1,type:"text",placeholder:n.ob(""),alert:n.ob(!1),confirmPoint:{pressEnter:!0,blur:!0}}},viewModelPublic:["value","placeholder","text","mouseEnterSelect","type","alert"]},_init:function(){var e=this._viewModel(),r=e.type=e.type||"text",i=this.$el();i.addClass(this.getFullCss("textarea"===r?"-type-textarea":"-type-text").join(" "));var o=""+("textarea"===r?"<textarea></textarea>":'<input type="text"/>')+'<span class="'+this.getFullCss("-alert-mark").join(" ")+'" style="display:none"></span><span class="'+this.getFullCss("-alert-text").join(" ")+'" style="display:none"></span>';this._$input=t(i.html(o)[0].firstChild),this._$input.on(this._event("mouseenter"),function(){n.peek(e.mouseEnterSelect)&&this.select&&this.select()}),this._initAlert(),this._initPlaceHolder(),this._initViewUpdater(),this._initModelUpdater()},focus:function(){this._$input.focus()},select:function(){this._$input.select()},_initAlert:function(){function e(e){var r=this.$el(),i=this.getFullCss("-alert").join(" ");e?(r.addClass(i),"string"===t.type(e)&&(u[0].innerHTML=n.encodeHTML(e),l.show())):(r.removeClass(i),l.hide())}function r(){u.show()}function i(){u.hide()}var o=this.$el(),a=this.getFullCss("-alert-mark"),s=this.getFullCss("-alert-text"),l=this.$el("alertMark",o.find("."+a[a.length-1])),u=this.$el("alertText",o.find("."+s[s.length-1]));l.on(this._event("mouseenter"),r),l.on(this._event("mouseleave"),i),this._disposable(this._viewModel().alert.subscribe(e,this))},_initPlaceHolder:function(){function e(e){this._$input.attr("placeholder",e)}var t=this._viewModel().placeholder;"ob"===n.obTypeOf(t)?(t.subscribe(e,this),e.call(this,t())):null!=t&&e.call(this,t)},_initViewUpdater:function(){function e(e){n.val(e)}var t=this._viewModel(),n=this._$input;this._disposable(t.disabled.subscribe(function(e){n[0].disabled=!!e},this)),this._disposable(t.value.subscribe(e,this)),e(t.value())},_initModelUpdater:function(){function e(e){a.isDisabled()||"text"===r.type&&13===e.which&&(t(),e.preventDefault())}function t(){a.isDisabled()||(r.value(o.val(),n.valueInfoForConfirmed(i),{force:!0}),o.val(r.value()))}var r=this._viewModel(),i=this.uid(),o=this._$input,a=this,s=r.confirmPoint||{};s.blur&&o.on(this._event("blur"),t),s.pressEnter&&o.on(this._event("keypress"),e)},_dispose:function(){this._$input.off(this._event()),this._$input=null,this.$el().html("")}});return i}),define("dt/ui/CheckButton",["require","jquery","../lib","./Component"],function(e){var t=e("jquery"),n=e("../lib"),r=e("./Component"),i=n.encodeHTML,o="value-index",a=r.extend({
_define:{css:"dtui-chkbtn",viewModel:function(){return{checked:n.ob(),dataList:[]}},viewModelPublic:["checked"]},getDataItem:function(e){var r=this._viewModel().dataList,i=n.arrayIndexOf(r,e,"value");return i>=0?t.extend({},r[i]):null},_init:function(){n.assert(n.obTypeOf(this._viewModel().checked)),this._initContent(),this._initTooltip(),this._initChange(),this._initMouse()},_getItemCss:function(e){var t={"":"-i",hover:"-i-hover",active:"-i-active"}[e||""];return this.css()+t},_initContent:function(){for(var e,t=this._viewModel().dataList,n=this._getItemCss(),r=[],a=0;e=t[a];a++)r.push('<span class="',n,'" data-',o,'="',a,'">',i(e.text),"</span>");this.el().innerHTML=r.join("")},_initTooltip:function(){function e(e){var n=r[t(e).data(o)],a=n.tooltip;if(null!=a)return n.tooltipEncodeHTML!==!1?i(a):a}var r=this._viewModel().dataList,a={x:0,y:-15,xAnchor:"center",yAnchor:"bottom"};this._disposable(n.bindTooltip({bindEl:this.el(),followMouse:!0,selector:"."+this._getItemCss(),location:a,text:e,encodeHTML:!1}))},_initChange:function(){function e(e){var s=n.obTypeOf(r.checked);i.each(function(){var i=t(this),l=r.dataList[i.data(o)].value;i[("obArray"===s?n.arrayIndexOf(e,l)>=0:l===e)?"addClass":"removeClass"](a)})}var r=this._viewModel(),i=this.$el().find("."+this._getItemCss()),a=this._getItemCss("active");this._disposable(n.obSubscribe(r.checked,e)),e(r.checked())},_initMouse:function(){function e(){s.disabled()||t(this).addClass(u)}function r(){t(this).removeClass(u)}function i(){if(!s.disabled()){var e=s.dataList[t(this).data(o)],r=e.value;if("obArray"===n.obTypeOf(s.checked)){var i=s.checked(),a=n.arrayIndexOf(i,r);a>=0?i.splice(a,1):i.push(r),r=i}s.checked(r,n.valueInfoForConfirmed(c,{dataItem:e}))}}var a=this.$el(),s=this._viewModel(),l=this._getItemCss(),u=this._getItemCss("hover"),c=this.uid();a.on(this._event("mouseenter"),"."+l,e),a.on(this._event("mouseleave"),"."+l,r),a.on(this._event("click"),"."+l,i)}});return a}),define("dt/ui/TreeList",["require","jquery","../lib","./Component"],function(e){function t(e){return e}function n(e){return null!=e?e:""}var r,i=e("jquery"),o=e("../lib"),a=e("./Component"),s=o.encodeHTML,l=200,u="id-0",c=a.extend({_define:{css:"dtui-treelist",viewModel:function(){return{selected:o.ob(),enhanceSelected:!0,hovered:o.ob(),enhanceHovered:!0,highlighted:o.obArray(),enhanceHighlighted:!0,datasource:[],resizeEvent:o.ob()}},viewModelPublic:["selected","hovered","highlighted","resizeEvent"]},_init:function(){var e=this._viewModel();o.assert(o.obTypeOf(e.selected)),o.assert("obArray"===o.obTypeOf(e.highlighted)),this._enhanceOb(),this._prepareDatasource(),this._initContent(),this._initChange(),this._initMouse()},_enhanceOb:function(){var e=this._viewModel();if(e.enhanceSelected){var t=e.selected;t.getTreeDataItem=i.proxy(this.findDataItemByOb,this,t)}if(e.enhanceHighlighted){var n=e.highlighted;n.getTreeDataItem=i.proxy(this.findDataItemByOb,this,n)}if(e.enhanceHovered){var r=e.hovered;r.getTreeDataItem=i.proxy(this.findDataItemByOb,this,r)}},_getCss:function(e){var t={item:"-i",thumb:"-thumb",text:"-text",textActive:"-text-active",textHover:"-text-hover",textHighlight:"-text-highlight",list:"-list",parent:"-parent",collapsed:"-collapsed",expanded:"-expanded",post:"-post"}[e||""];return this.css()+t},_prepareDatasource:function(){var e=this._viewModel().datasource;this._containerMap=o.createLiteHashMap();var t=this._dataItemMap=o.createLiteHashMap(),n=this._levelMap=o.createLiteHashMap();this._travelData(e,function(e,r){var i=e.value;t.set(i,e),n.set(i,r)})},_initContent:function(){var e=this._viewModel().datasource;if(e&&e.length){var t=[e[0].value],n=e[0].children;n&&n.length&&t.push(n[0].value),this._build(e,null,o.createLiteHashMap(t),!0)}},_initChange:function(){var e=this._viewModel(),t=e.selected;this._disposable(t.subscribe(this._updateSelectedByModel,this)),this._updateSelectedByModel(t(),t);var n=e.highlighted;this._disposable(n.subscribe(this._updateHighlightedByModel,this)),this._updateHighlightedByModel(n(),n)},_initMouse:function(){function e(e){if(!f.isFrozen()){var t=i(this);t.addClass(c);var n=f._findDataItemByEl(this);l.hovered(n.value,{dataItem:n})}}function t(e){f.isFrozen()||(i(this).removeClass(c),l.hovered(r))}function n(e){if(!f.isFrozen()){var t=o.obTypeOf(l.selected),n=f._findDataItemByEl(this),r=n.value;if("obArray"===t){var i=l.selected(),a=o.arrayIndexOf(i,r);a>=0?i.splice(a,1):i.push(r),r=i}l.selected(r,{preventExpand:!0,dataItem:n})}}function a(){f.isFrozen()||f._toggleSingleItem(f._findItemEl(i(this)))}var s=this.$el(),l=this._viewModel(),u=this._getCss("item"),c=this._getCss("textHover"),d=this._getCss("text"),p=this._getCss("thumb"),f=this;s.on(this._event("mouseenter"),"."+d,"."+u,e),s.on(this._event("mouseleave"),"."+d,"."+u,t),s.on(this._event("click"),"."+d,n),s.on(this._event("click"),"."+p,a)},_build:function(e,r,i,o){function a(e,t){if(e&&e.length){for(var n,r=0,o=e.length;r<o;r++){var s=e[r];n|=s.__needRenderChildren=a(s.children,s),null!=i.get(s.value)&&(n=!0)}var c=m.get(t?t.value:u);if(n&&c&&!e.__rendered){var d=[];l(e,t,d),c.innerHTML=d.join("");for(var p=c.getElementsByTagName("ul"),r=0;r<p.length;r++){var f=p[r];m.set(f.getAttribute("data-id"),f)}n=!1}return n}}function l(e,r,i){if(e&&e.length){for(var a=0;a<e.length;a++){var u=e[a],m=u.itemEncodeHTML!==!1?s:t,y=u.children&&u.children.length?p+" "+h:"",b=u.anchor?' name="'+u.anchor+'" ':" ",w=m(n(u.text)),x=m(n(u.childrenPre)),_=m(n(u.childrenPost)),T=m(n(u.childrenBrief)),C=' data-id="'+u.value+'" ';if(i.push('<li class="',d," ",y,'" ',C,">",'<i class="',f,'"></i>',b,'<span class="',v,'" ',C,">",w,x,T,_,"</span>"),u.children&&u.children.length){var E=o?"":' style="display:none" ';i.push('<ul class="',c,'" ',C,E,">"),u.__needRenderChildren&&l(u.children,u,i),i.push("</ul>"),u.__needRenderChildren=null}i.push("</li>"),a===e.length-1&&r&&r.childrenPost&&i.push('<li class="',g,'">',m(parent.childrenPost),"</li>")}e.__rendered=!0}}var c=this._getCss("list"),d=this._getCss("item"),p=this._getCss("parent"),f=this._getCss("thumb"),h=this._getCss("collapsed"),v=this._getCss("text"),c=this._getCss("list"),g=this._getCss("post"),m=this._containerMap;if(null==m.get(u)){var y=this.$el()[0];y.innerHTML='<ul class="'+c+'" data-id="'+u+'"></ul>',m.set(u,y.getElementsByTagName("ul")[0])}a(e,r)},_updateSelectedByModel:function(e,t){var n=this._viewModel(),r=o.obTypeOf(n.selected),a=this._getCss("textActive"),s=[],l=this;o.assert("obArray"!==r||i.isArray(e));var u=o.createLiteHashMap("obArray"===r?e:e?[e]:[]);this._build(n.datasource,null,u),this._travelItemText(function(e,n){u.hasOwnProperty(n)?(e.addClass(a),t.peekValueInfo("preventExpand")||s.push(l._findItemEl(e))):e.removeClass(a)}),this._showItems(i(s),{noAnimation:t.peekValueInfo("noAnimation"),collapseLevel:t.peekValueInfo("collapseLevel"),always:t.peekValueInfo("always"),scrollToTarget:t.peekValueInfo("scrollToTarget")})},_updateHighlightedByModel:function(e,t){var n=this._getCss("textHighlight"),r=[],a=this,s=o.createLiteHashMap(e);this._build(this._viewModel().datasource,null,s),this._travelItemText(function(e,i){s.hasOwnProperty(i)?(e.addClass(n),t.peekValueInfo("preventExpand")||r.push(a._findItemEl(e))):e.removeClass(n)}),this._showItems(i(r),{noAnimation:t.peekValueInfo("noAnimation"),collapseLevel:t.peekValueInfo("collapseLevel"),always:t.peekValueInfo("always"),scrollToTarget:t.peekValueInfo("scrollToTarget")})},_showItems:function(e,t){function n(){this.isDisposed()||this._expandOrCollapse(o,"expand",{noAnimation:t.noAnimation,always:i.proxy(r,this)})}function r(){if(!this.isDisposed()){var n=i(e[0]),r=t.scrollToTarget;r&&n.length&&(r.container||i("html,body")).animate({scrollTop:n.offset().top-(r.clientX||30)}),t.always&&t.always()}}t=t||{};var o=this._getAncestorItems(e);this._collapseAll({collapseLevel:t.collapseLevel,noAnimation:t.noAnimation,always:i.proxy(n,this)})},_getAncestorItems:function(e){var t=this,n=[];return e.each(function(){for(var e=i(this),r=t.css(),o=t._getCss("item"),a=e.parent();a&&a.length&&!a.hasClass(r);)a.hasClass(o)&&n.push(a[0]),a=a.parent()}),i(n)},_getParentItem:function(e){return e.parent().closest("."+this._getCss("item"))},_travelItemText:function(e){var t=this.$el().find("."+this._getCss("text")),n=this;t.each(function(){var t=i(this),r=n._findDataItemByEl(this).value;e.call(n,t,r)})},_collapseAll:function(e){function t(){!i.isDisposed()&&e.always&&e.always()}var n=e.collapseLevel,r=this._levelMap,i=this;if(null==n||n<0)setTimeout(t,0);else{var o="."+this._getCss("item"),a=this.$el().find(o).filter(function(){return r.get(this.getAttribute("data-id"))>=n});this._expandOrCollapse(a,"collapse",{noAnimation:e.noAnimation,always:t})}},_expandOrCollapse:function(e,t,n){function r(e){h.isDisposed()||h._findElInItem(i(g.withAnimation),"list")[c](n.noAnimation?0:l).promise().always(e)}function o(e){h.isDisposed()||h._findElInItem(i(g.withoutAnimation),"list")[c](0).promise().always(e)}function a(){h.isDisposed()||("collapse"===t&&h._resetItemText(v),f.resizeEvent({}),n.always&&n.always())}n=n||{};var s,u,c,d=this._getCss("collapsed"),p=this._getCss("expanded"),f=this._viewModel(),h=this;"expand"===t?(s=d,u=p,c="slideDown"):(s=p,u=d,c="slideUp");var v=e.filter("."+s),g={withAnimation:[],withoutAnimation:[]};v.each(function(){h._getParentItem(i(this)).hasClass(p)?g.withAnimation.push(this):g.withoutAnimation.push(this)}),v.removeClass(s).addClass(u),"expand"===t&&this._resetItemText(v),"expand"===t?o(i.proxy(r,this,a)):r(i.proxy(o,this,a))},_toggleSingleItem:function(e){function t(t){this.isDisposed()||(t&&this._resetItemText(e),a.resizeEvent({}))}var n=this._getCss("collapsed"),r=this._getCss("expanded"),a=this._viewModel(),s=this._findDataItemByEl(e[0]);s.children&&s.children.length&&!s.children.__rendered&&this._build(s.children,s,o.createLiteHashMap([s.children[0].value]));var u=this._findElInItem(e,"list");e.hasClass(n)?(e.removeClass(n).addClass(r),u.slideDown(l,i.proxy(t,this,!1)),this._resetItemText(e)):e.hasClass(r)&&(e.removeClass(r).addClass(n),u.slideUp(l,i.proxy(t,this,!0)))},hasValue:function(e){var t=!1;return this._travelData(this._viewModel().datasource,function(n){n.value===e&&(t=!0)}),t},findDataItemByOb:function(e,t){var n="obArray"===o.obTypeOf(e)?e():[e()];return this.findDataItemByValues(n,t)},findDataItemByValues:function(e,t){var n=[];return this._travelData(this._viewModel().datasource,function(t){o.arrayIndexOf(e,t.value)>=0&&n.push(t)}),t?n[0]:n},_travelData:function(e,t,n){if(n=n||0,e&&e.length)for(var r=0,i=e.length;r<i;r++)e[r]&&(t(e[r],n),this._travelData(e[r].children,t,n+1))},_findDataItemByEl:function(e){return e&&this._dataItemMap.get(e.getAttribute("data-id"))},_findItemEl:function(e){for(var t=this.css(),n=this._getCss("item");!e.hasClass(n);){if(e.hasClass(t))return null;e=e.parent()}return e},_findElInItem:function(e,t){return e.find("> ."+this._getCss(t))},_resetItemText:function(e){var r=this;e.each(function(){var e=i(this),o=r._findDataItemByEl(this),a=o.itemEncodeHTML!==!1?s:t,l=r._findElInItem(e,"text");e.hasClass(r._getCss("collapsed"))?l[0].innerHTML=a([n(o.text),n(o.childrenPre),n(o.childrenBrief),n(o.childrenPost)].join("")):e.hasClass(r._getCss("expanded"))&&(l[0].innerHTML=a([n(o.text),n(o.childrenPre)].join("")))})}});return c}),define("dt/config",["require"],function(e){function t(e){return r.hasOwnProperty(e)?r[e]:i[n].hasOwnProperty(e)?i[n][e]:void 0}var n="cn",r={panelBaseZIndex:9e5,panelMastOpacity:.7,winPanelAnimationDuration:300},i={cn:{langDialogConfirm:"确定",langDialogYes:"是",langDialogNo:"否",langDialogSave:"保存",langDialogDontSave:"不保存",langDialogCancel:"取消",langDialogSaveFail:"保存失败",langDialogRemove:"删除",langDialogConfirmRemove:"您确认要删除吗？一旦删除，不可恢复。"},en:{langDialogConfirm:"OK",langDialogYes:"Yes",langDialogNo:"No",langDialogSave:"Save",langDialogDontSave:"Don't Save",langDialogCancel:"Cancel",langDialogSaveFail:"Save Failed.",langDialogRemove:"Delete",langDialogConfirmRemove:"Confirm Deleting? Can not be restored when deleted."}};return t.setLang=function(e){e=e},t}),define("dt/ui/BasePanel",["require","jquery","../lib","./Component"],function(e){function t(e){a(this)[l]=e}function n(e){return~i.arrayIndexOf(e,this.getPanelState())}var r=e("jquery"),i=e("../lib"),o=e("./Component"),a=i.makeInner(),s=a.attach(o.extend({_define:{viewModel:function(){return{panelOpenStatus:null}},viewModelPublic:["panelOpenStatus"]},PanelState:{NONE:"NONE",CREATED:"CREATED",READY:"READY",DATA_FILLED:"DATA_FILLED",DISPOSED:"DISPOSED"},getPanelState:function(){return a(this)[l]},_construct:function(){t.call(this,this.PanelState.NONE);var e=this._applySuper("_construct",arguments);return t.call(this,this.PanelState.CREATED),e},dispose:function(){var e=this._applySuper("dispose",arguments);return t.call(this,this.PanelState.DISPOSED),e},enter:function(e){return!!this.isOpened()&&(this.getPanelState()===this.PanelState.CREATED&&(this._fillContent(e),t.call(this,this.PanelState.READY)),this._enter(e),void t.call(this,this.PanelState.DATA_FILLED))},_fillContent:r.noop,_enter:r.noop,clear:function(){n.call(this,[this.PanelState.DATA_FILLED,this.PanelState.READY])&&(this._clear(),t.call(this,this.PanelState.READY))},_clear:r.noop,isOpened:function(){var e=this._viewModel().panelOpenStatus;return!e||"opened"===e()}})),l="__panelState__"+s.uid;return s}),define("tpl",["require","exports","module","etpl"],function(e,t,n){var r=e("etpl");return{load:function(e,t,i,o){var a=t.toUrl(e);if("undefined"==typeof window)return void i();var s=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");s.open("GET",a,!0),s.onreadystatechange=function(){if(4===s.readyState){if(s.status>=200&&s.status<300){var e=s.responseText,t=n.config();("undefined"==typeof t.autoCompile||t.autoCompile)&&r.compile(e),i(e)}s.onreadystatechange=new Function,s=null}},s.send(null)}}}),define("dt/ui/WinPanel",["require","jquery","../lib","../config","./BasePanel","tpl!./ui.tpl.html"],function(e){var t,n=e("jquery"),r=e("../lib"),i=e("../config"),o=e("./BasePanel"),a=r.makeInner(),s="winPanel",l=".dtui-close-cross",u=".dtui-winpn-con",c="winpn",d=a.attach(o.extend({_define:{tpl:e("tpl!./ui.tpl.html"),tplTarget:"winPanel",closeWhenClickOther:!1},_init:function(){function e(){this._onCloseBtnClick&&this._onCloseBtnClick()===!1||this.close()}var r=n(this._renderTpl(s)).appendTo(document.body).hide();null==t&&(t=i("panelBaseZIndex")),this._manuInitView(r);var o=a(this);o.mainEl=r,o.isOpen=!1,this.$el("winPanel$content",r.find(u)),o.maskKey=Math.random()+"",r.on(this._event("click"),l,n.proxy(e,this)),this._afterInit(this.$content())},_disposeFinally:function(){var e=a(this);r.disposeGlobalMask(e.maskKey),e.mainEl.remove(),e.mainEl=null},open:function(e){function o(){this._getDefineProperty("closeWhenClickOther")&&this.close()}if(!this.isOpen()){var s=this.$el(),l=this.$content(),u=a(this);r.globalMask(i("panelMastOpacity"),u.maskKey,c,{click:n.proxy(o,this)}),u.isOpen=!0,this._beforeShow(l,e),s.show(),this._afterShow(l,e),s.css({top:0-Math.round(s.outerHeight()),marginLeft:0-Math.round(s.outerWidth()/2),marginTop:0,"z-index":t++});var d=this._getDefineProperty("noAnimate");s.animate({top:"50%",marginTop:0-Math.round(s.outerHeight()/2)},d?0:i("winPanelAnimationDuration"))}},close:function(){if(this.isOpen()){var e=this.$el(),t=a(this);t.isOpen=!1,this._beforeHide(this.$content());var n=this,o=this._getDefineProperty("noAnimate");e.animate({top:0-Math.round(e.outerHeight()),marginTop:0},o?0:i("winPanelAnimationDuration"),"swing",function(){e.hide(),r.globalMask(!1,t.maskKey),n._afterHide(n.$content()),n.fire("close")})}},$content:function(){return this.$el("winPanel$content")},isOpen:function(){return a(this).isOpen},_afterInit:n.noop,_beforeShow:n.noop,_afterShow:n.noop,_beforeHide:n.noop,_afterHide:n.noop,_onCloseBtnClick:n.noop}));return d}),define("dt/ui/Button",["require","jquery","./Component","../lib"],function(e){var t=e("jquery"),n=e("./Component"),r=e("../lib"),i="dtui-btn",o=["click","mouseenter","mouseleave"],a=n.extend({_define:{viewModel:function(){return{text:r.ob(""),dontEncodeHTML:!1}},viewModelPublic:["text"],css:i},_init:function(){function e(){l.disabled()||(u.addClass(d),f&&u.addClass(p))}function n(){u.removeClass(d),u.removeClass(p)}function i(){l.disabled()||(u.addClass(p),f=!0,h.one(c._event("mouseup"),function(){f=!1}))}function a(){u.removeClass(p)}function s(e){u.html(l.dontEncodeHTML?e:r.encodeHTML(e))}var l=this._viewModel(),u=this.$el(),c=this,d=this.getFullCss("-hover").join(" "),p=this.getFullCss("-active").join(" "),f=!1,h=t(document);this._eventHandlerMap={},u.on(this._event("mouseenter"),e),u.on(this._event("mouseleave"),n),u.on(this._event("mousedown"),i),u.on(this._event("mouseup"),a);var v=this;t.each(o,function(e,t){u.on(v._event(t),function(e){v.trigger.call(v,t,e)})}),"ob"===r.obTypeOf(l.text)&&this._disposable(l.text.subscribe(s,this));var g=r.value(l.text);u.html(l.dontEncodeHTML?g:r.encodeHTML(g))},_parseViewModel:function(e,t){return null!=t.text&&(e.text=t.text),null!=t.css&&(e.css=t.css),null!=t.dontEncodeHTML&&(e.dontEncodeHTML=t.dontEncodeHTML),e},on:function(e,n){r.assert(e.indexOf(".")<0);var i=this._eventHandlerMap;t.inArray(e,o)>=0&&(i[e]=i[e]||[],i[e].push(n))},trigger:function(e,n){var r=this._viewModel(),i=this._eventHandlerMap[e];r.disabled()||i&&i.length&&t.each(i,function(e,r){t.isFunction(r)&&r.call(this,n)})},_dispose:function(){this.$el().off(),this._eventHandlerMap=null}});return a}),define("dt/ui/Tab",["require","jquery","../lib","./Component"],function(e){function t(e,t){var n=i.getComponent(e);n?n.viewModel("visible")(t):e[t?"show":"hide"]()}function n(e,t){var n=i.getComponent(e);n&&n.viewModel("disabled")(t)}var r=e("jquery"),i=e("../lib"),o=e("./Component"),a=i.peek,s="cpt-tab",l=o.extend({_define:{viewModel:function(){return{currentTab:i.ob(),currentTab1:i.ob(),baseCss:s,tabAttr:null,tabAttr1:null,conAttr:null,conAttr1:null}},viewModelPublic:["currentTab","currentTab1"],suppressConstructSub:!0,css:s},_prepare:function(){var e=this._viewModel(),t=e.baseCss;e.headItemCss=t+"-hi",e.currentHeadItemCss=t+"-hi-curr",e.headItemCss1=t+"-hi1",e.currentHeadItemCss1=t+"-hi1-curr",e.conItemCss=t+"-coni",e.headItemDisabledCss=e.headItemCss+"-disabled",e.conItemDisabledCss=e.conItemCss+"-disabled"},_init:function(){var e=this._viewModel(),t=e.currentTab,n=e.currentTab1;this._disposable(t.subscribe(function(e){this._changeTabByModel(e,a(n))},this)),this._useTab1()&&this._disposable(n.subscribe(function(e){this._changeTabByModel(a(t),e)},this)),this.bind()},bind:function(){if(this._prop("bound"))throw new Error("It has been bound.");var e=this._viewModel();this._bindDom(),this._changeTabByModel(a(e.currentTab),a(e.currentTab1)),this._bindModelUpdater(),this._prop("bound",!0)},unbind:function(){this._removeCurrSelect(),this._unbindModelUpdater(),this._unbindDom(),this._prop("bound",!1)},isBound:function(){return this._prop("bound")},getCurrentTabKey:function(){return this._prop("currentTabKey")},getCurrentTabKey1:function(){return this._prop("currentTabKey1")},hasTab:function(e,t){return!!this._getTabWrap(e,t)},setTabDisabled:function(e,t,r){var i=this._viewModel(),o=this._getTabWrap(t,r);o.$tabEl[e?"addClass":"removeClass"](i.headItemDisabledCss),o.$conEl[e?"addClass":"removeClass"](i.conItemDisabledCss),n(o.$conEl,e)},isTabDisabled:function(e,t){var n=this._getTabWrap(e,t);return n?n.$tabEl.hasClass(this._viewModel().headItemDisabledCss):null},setTabLabel:function(e,t){var n=this._prop("tabWraps");n[e].$tabEl[0].innerHTML=t},_bindDom:function(){var e=this._prop("tabWraps",{}),n=this.$el(),i=this._viewModel(),o=i.tabAttr,a=i.tabAttr1,s=i.conAttr,l=i.conAttr1,u=this._useTab1(),c=n.find("*[data-"+o+"]"),d=u&&n.find("*[data-"+a+"]"),p=n.find("*[data-"+i.conAttr+"]");c.each(function(t,n){var s=r(n);s.addClass(i.headItemCss),u?d.each(function(t,n){var l=r(n);l.addClass(i.headItemCss1);var u=e[s.data(o)]||(e[s.data(o)]={});u[l.data(a)]={$tabEl:s,$tabEl1:l}}):e[s.data(o)]={$tabEl:s}}),p.each(function(n,o){var a=r(o);a.addClass(i.conItemCss),t(a,!1),u?e[a.data(s)][a.data(l)].$conEl=a:e[a.data(s)].$conEl=a})},_unbindDom:function(){this._prop("tabWraps",{})},_getTabWrap:function(e,t){var n=this._prop("tabWraps")[e];return this._useTab1()&&n&&(n=n[t]),n},_removeCurrSelect:function(){var e=this._viewModel(),n=this._useTab1(),r=this._getTabWrap(this._prop("currentTabKey"),this._prop("currentTabKey1"));r&&(r.$tabEl.removeClass(e.currentHeadItemCss),n&&r.$tabEl1.removeClass(e.currentHeadItemCss1),t(r.$conEl,!1),this._prop("currentTabKey",null),n&&this._prop("currentTabKey1",null))},_addSelect:function(e,n){var r=this._viewModel(),i=this._useTab1(),o=this._getTabWrap(e,n);o&&(o.$tabEl.addClass(r.currentHeadItemCss),i&&o.$tabEl1.addClass(r.currentHeadItemCss1),t(o.$conEl,!0),this._prop("currentTabKey",e),i&&this._prop("currentTabKey1",n))},_changeTabByModel:function(e,t){this._removeCurrSelect(),this._addSelect(e,t)},_bindModelUpdater:function(){var e=this._viewModel(),t=e.tabAttr,n=e.tabAttr1,i=this,o=this.$el();o.on(this._event("click"),"*[data-"+t+"]",function(){var n=r(this).data(t);n!==i._prop("currentTabKey")&&e.currentTab(n)}),o.on(this._event("click"),"*[data-"+n+"]",function(){var t=r(this).data(n);t!==i._prop("currentTabKey1")&&e.currentTab1(t)})},_unbindModelUpdater:function(){this.$el().off(this._event())},_useTab1:function(){return null!=this._viewModel().tabAttr1},_dispose:function(){this._prop("tabWraps",null)}});return l}),define("dt/ui/Foreach",["require","jquery","../lib","./Component"],function(e){function t(e){f[e.key].call(this,e)}function n(e,t){for(var n=this._items(),r=this._getCommonConfig("itemTplTarget"),i=this._getCommonConfig("itemTplParam"),l=this._getCommonConfig("itemType"),u=l?this.getCptClass(l):this.Item,c=0,d=t.length;c<d;c++){var p=t[c],f=this.getCptDef("itemConfigAttr");if(f&&p){var h=p[f];h.itemType&&(u=this.getCptClass(h.itemType)),h.itemTplTarget&&(r=h.itemTplTarget),h.itemTplParam&&(i=h.itemTplParam)}var v=a(r?this._renderTpl(r,a.extend({index:e+c,itemTplParam:i},p)):"<div></div>");s.assert(1===v.length,"MUST be only one root element in item tpl!"),o.call(this,v,e+c);var g=new u(v,p);n.splice(e+c,0,g)}}function r(e,t){for(var n=this._items(),r=n.splice(e,t),i=0,o=r.length;i<o;i++){var a=r[i],s=a.$el();a.dispose(),s.remove()}}function i(e,t){var n=this._items(),r=n[e],i=r.$el(),o=n[t].$el();t>e?i.insertAfter(o):i.insertBefore(o),n.splice(e,1)[0],n.splice(t,0,r)}function o(e,t){var n=this._items();return!n.length||t>=n.length?e.appendTo(c(this).$itemsContainer):e.insertBefore(n[t].el())}var a=e("jquery"),s=e("../lib"),l=e("./Component"),u=s.obArray.ChangeKey,c=s.makeInner(),d="-foreach-items-prop",p=c.attach(l.extend({_define:{viewModel:function(){return{data:s.obArray([])}},viewModelPublic:["data"],css:"cpt-foreach"},_prepare:function(){var e=this._viewModel().data;this._sub(d,[]),this._setItemsContainer(),this._disposable(e.subscribe(t,this,"arrayChange"));for(var n={key:u.SPLICE,index:0,removeCount:0,added:[]},r=0,i=e.peek(),o=i.length;r<o;r++)n.added.push(i[r]);t.call(this,n)},_dispose:function(){this.foreach(function(e,t){t.dispose()})},_parseViewModel:function(e){return s.assert("obArray"===s.obTypeOf(e)),{data:e}},foreach:function(e){for(var t=this._items(),n=0,r=t.length;n<r;n++)e(n,t[n])},getItemAt:function(e){return this._items()[e]},count:function(){return this._viewModel().data.count()},_items:function(){return this._sub(d)},_setItemsContainer:function(){c(this).$itemsContainer=this.$el()},_getCommonConfig:function(e){return this.getCptDef(e)||this._getDefineProperty(e)}})),f={};return f[u.REMOVE]=function(e){for(var t=e.indexes,n=0,i=t.length;n<i;n++)r.call(this,t[n],1)},f[u.SPLICE]=function(e){e.removeCount&&r.call(this,e.index,e.removeCount),e.added.length&&n.call(this,e.index,e.added)},f[u.MOVE]=function(e){i.call(this,e.originIndex,e.finalIndex)},p.prototype.Item=l.extend({_define:{css:"dtui-foreach-item",viewModelOnlyAccessDeclaredProperties:!1}}),p}),define("dt/componentConfig",["require","./ui/Component","./ui/Text","./ui/TextInput","./ui/CheckButton","./ui/TreeList","./ui/WinPanel","./ui/Button","./ui/Tab","./ui/Foreach"],function(e){var t=e("./ui/Component"),n=t.cptClasses;n.Text=e("./ui/Text"),n.TextInput=e("./ui/TextInput"),n.CheckButton=e("./ui/CheckButton"),n.TreeList=e("./ui/TreeList"),n.WinPanel=e("./ui/WinPanel"),n.Button=e("./ui/Button"),n.Tab=e("./ui/Tab"),n.Foreach=e("./ui/Foreach")}),define("docTool/main",["require","jquery","dt/ui/Component","./schemaHelper","dt/lib","dt/tpl","./docUtil","./lang","./hashHelper","perfectScrollbar","prettyPrint","dt/componentConfig","tpl!./main.tpl.html"],function(e){function t(e){return e.defaultValueText?"[ default: "+e.defaultValueText+" ]":""}function n(e){_hmt.push(["_trackEvent","doc-"+e.key,f,e.data])}var r=e("jquery"),i=e("dt/ui/Component"),o=e("./schemaHelper"),a=e("dt/lib"),s=e("dt/tpl"),l=e("./docUtil"),u=e("./lang"),c=e("./hashHelper"),d=e("perfectScrollbar"),p=e("prettyPrint"),f=l.getGlobalArg("pageName"),h=l.getGlobalArg("schemaName")||f;e("dt/componentConfig");var v,g="APIMain",m=".ecdoc-api-hover-desc",y=".query-collapse-radio input[type=radio]",b=".query-result-info",w=".ecdoc-api-doc-group-content",x=".ecdoc-api-tree-area",_=".ecdoc-api-doc-group-area",T=".ecdoc-quick-link",C="ecdoc-api-doc-prop-expand",E="ecdoc-api-doc-line-head",A="ecdoc-api-doc-group-line-highlight",D="ecdoc-api-doc-sub-group",S=u.hideProperties,k=u.showProperties,L="ecdoc-api-doc-group-line",M=/<iframe[^>]*>.*?<\/iframe>/g,O=!0,P={};P.init=function(){v=new I(r(".ecdoc-apidoc"))};var I=i.extend({_define:{tpl:e("tpl!./main.tpl.html"),css:"ecdoc-apidoc",viewModel:function(){return{apiTreeDatasource:[],apiTreeSelected:a.ob(),apiTreeHighlighted:a.obArray(),apiTreeHovered:a.ob(),apiTreeResize:a.ob()}}},getLang:function(){return u},_initHash:function(){function e(e){O&&n({key:"initHash",data:e}),e||(e=l.getGlobalArg("initHash","")),e&&t._handleHashQuery(e),O=!1}var t=this;c.initHash(e)},_initScroll:function(){var e=this.$el(),t={},n=e.find(_);d.initialize(e.find(x)[0],t),d.initialize(n[0],t);var r=this;n.on("ps-scroll-y",function(e){r._doLazyLoad()})},_prepare:function(){var e=Date.now();r.getJSON(l.addVersionArg(["../documents",u.langCode,h+".json"].join("/"))).done(r.proxy(function(t){var n=Date.now(),r=Math.round((n-e)/1e3);_hmt.push(["_setCustomVar",1,"optionLoadTime",r,3]),this._prepareDoc(t),this._applyTpl(this.$el(),g),this._initQuickLink(),this._initTree(),this._initQueryBox(),this._initDescArea(),this._initHash(),this._initScroll()},this))},_prepareDoc:function(e){var t={};o.buildDoc(e,t);var n=this._docTree={value:"root",text:l.getGlobalArg("docTreeRootText",""),childrenPre:l.getGlobalArg("docTreeChildrenPre","{"),childrenPost:l.getGlobalArg("docTreeChildrenPost","}"),childrenBrief:"...",children:t.children[0].children,expanded:!0,propertyName:"option",type:"Object",hasObjectProperties:!0};this._viewModel().apiTreeDatasource=l.getGlobalArg("hideTreeRoot")?n.children:[n]},_initQuickLink:function(){var e=[["tutorial",u.quickLinkTutorial],["api",u.quickLinkAPI],["option",u.quickLinkOption]];"zh"===u.langCode&&e.push(["option-gl",u.quickLinkOptionGL]);for(var t=[],n=0;n<e.length;n++)t.push(f===e[n][0]?"<span>"+e[n][1]+"</span>":'<a href="'+e[n][0]+'.html">'+e[n][1]+"</a>");this.$el().find(T)[0].innerHTML=t.join("")},_initTree:function(){function e(e,t,n){var r=n.getTreeDataItem(!0);this._showHoverTargetDesc(!!r&&r)}function t(e,t,r){var a=r.getTreeDataItem(!0),s=this.$el();e&&a&&(this._updateDescArea(a),O||n({key:"clickTreeItem",data:o.getOptionPathForHash(a)}),i.call(this,a),s.find("."+A).removeClass(A),this._findDescNode(a.value).addClass(A),c.hashRoute({queryString:o.getOptionPathForHash(a)}))}function i(e){var t=this.$el(),n=t.find(_),r=this._findDescNode(e.value),i=this.$el().find(w),o=r.length?r.offset().top-i.offset().top:0;n.animate({scrollTop:o-10},300).promise().always(function(){d.update(n[0])})}function a(e,t,n){d.update(this.$el().find(x)[0])}var s=this._viewModel();this._disposable(s.apiTreeHovered.subscribe(r.proxy(e,this,!1))),this._disposable(s.apiTreeSelected.subscribe(r.proxy(t,this,!0))),this._disposable(s.apiTreeResize.subscribe(r.proxy(a,this,!0)))},_initQueryBox:function(){function e(e){n({key:"changeSearchMode",data:e});var r=l.getDataItem(e);s.viewModel("placeholder")(r.placeholder),t.call(this,!0)}function t(e,t,r){var i=u(),o=u.peekValueInfo();o&&o.type===a.valueInfo.CONFIRMED&&(e||n({key:"search",data:i,queryMode:d()}),i&&this._confirmQuery(i,d(),!1,!0))}function i(){n({key:"collapseAll"}),this._setResultInfo(null),this._viewModel().apiTreeHighlighted([],{collapseLevel:1})}var s=this._sub("queryInput"),l=this._sub("queryMode"),u=s.viewModel("value");u.subscribe(r.proxy(t,this,!1));var d=l.viewModel("checked");d.subscribe(e,this),e.call(this,d()),this._sub("collapseAll").on("click",r.proxy(i,this)),r(document).keypress(function(e){var t=(e.target.tagName||"").toLowerCase();47===e.which&&"input"!==t&&"textarea"!==t&&(s.focus(),s.select(),e.preventDefault())});var p=this;s.$el().find("input").autoComplete({minChars:1,source:function(e,t){for(var n=e?p._doQuery(e,d()):[],r=[],i=0;i<n.length;i++)r.push(o.getOptionPathForHash(n[i]));t(r)},onSelect:function(e,t){c.hashRoute({queryString:t})}})},_initDescArea:function(){function e(e){var r=e.currentTarget.getAttribute("data-tree-item-id"),i=this._findDescNode(r),a=this._findElInDescNode(i);if(a.subGroup.length){var s=this._sub("apiDocTree").findDataItemByValues([a.expandBtn.attr("data-tree-item-id")],!0),l=s?o.getOptionPathForHash(s):"";"none"===a.subGroup[0].style.display?(n({key:"expandDesc",data:l}),a.expandBtn[0].innerHTML="<span>"+S+"</span>",this._completeSubGroupContent(a.subGroup),a.subGroup.slideDown().promise().always(t)):(n({key:"collapseDesc",data:l}),a.expandBtn[0].innerHTML="<span>"+k+"</span>",a.subGroup.slideUp().promise().always(t))}}this.$el().find(w).on("click","."+C,r.proxy(e,this)),this.$el().find(w).on("click","."+E,r.proxy(e,this));var t=r.proxy(function(){d.update(this.$el().find(_)[0])},this)},_updateDescArea:function(e){function t(){c.filter(function(){var e=r(this);if(e.attr("src"))return!1;var t=e.offset().top,n=o.height(),i=o.offset().top;return t<n+i&&t>i}).each(function(){r(this).attr("src",r(this).data("src"))})}var n=this.$el(),i=n.find(w),o=n.find(_),s=this._getTraceToComponentRoot(e),l=s[0],u="";l!==this._lastDescBase&&(this._pendingSubGroupMap=a.createLiteHashMap(),u=this._createDescHTML(l,e),i[0].innerHTML=u),this._lastDescBase=l,this._doExpand(s,i,e),i.find("pre code").each(function(e,t){r(t).addClass("prettyprint")}),p(),d.update(n.find(_)[0]);var c=o.find("iframe");t(),this._doLazyLoad=t,r.fn.twentytwenty&&!i.find(".twentytwenty-wrapper").length?i.find(".twentytwenty-container").each(function(){var e=this,t=0;r(this).find("img").one("load",function(){t--,0===t&&r(e).twentytwenty()}).each(function(){t++,this.complete&&r(this).load()})}):r.fn.twentytwenty&&r(window).trigger("resize.twentytwenty")},_completeSubGroupContent:function(e){var t=this._pendingSubGroupMap,n=e.attr("data-tree-item-id"),r=t.get(n);null!=r&&(e[0].innerHTML=this._createDescSubGroupHTML(r),t.set(n,null))},_findDescNode:function(e){var t=r.isArray(e),n={};if(t)for(var i=0;i<e.length;i++)n[e[i]]=1;return this.$el().find("."+L).filter(function(r,i){var o=i.getAttribute("data-tree-item-id");return t?!!n[o]:o===e})},_findElInDescNode:function(e){return{expandBtn:e.find("> ."+C),subGroup:e.find("> ."+D)}},_getTraceToComponentRoot:function(e){for(var t,n=[],r=e;r&&(t=r.parent)&&t.parent&&(!r.isEnumParent||r===e);)n.push(r),r=t;return n.reverse()},_createDescHTML:function(e,t){if(!e)return"";var n=this._wrapDesc(e),r=s.render("descGroupTitle",{baseDescOptionPath:n.optionPath,descText:n.descText});return r+this._createDescSubGroupHTML(e,t)},_createDescSubGroupHTML:function(e,n){var r=e.children;if(!r)return"";for(var i=[],o=this._pendingSubGroupMap,a=0;a<r.length;a++){var l=this._wrapDesc(r[a]),u=r[a].hasObjectProperties;
u&&o.set(r[a].value,r[a]),i.push(s.render("descGroupLine",{descItemOptionPath:l.optionPath,descItemType:l.type,descItemContent:t(l),descItemDescText:l.descText,expandIcon:k,hasSubGroup:u,highlightCSS:r[a]===n?A:"",idAttr:r[a].value}))}return i.join("")},_doExpand:function(e,t,n){for(var i=[],o=1;o<e.length;o++)i.push(e[o].value);var a=this._findDescNode(i),s=this;a.each(function(e,t){var n=s._findElInDescNode(r(t));n.subGroup.length&&(n.expandBtn[0].innerHTML="<span>"+S+"</span>",s._completeSubGroupContent(n.subGroup),n.subGroup.show())})},_wrapDesc:function(e,t){var n=e.type||"";r.isArray(n)&&(n=n.join(", "));var i=e.description;return t&&i&&(i=i.replace(M,"")),{type:a.encodeHTML(n),descText:i,defaultValueText:a.encodeHTML(e.defaultValueText),optionPath:o.getOptionPathForHTML(e)}},_showHoverTargetDesc:function(e){var n=this.$el(),r=n.find(m);if(e===!1)return void r.stop().fadeOut(100);r.stop().css("opacity",1).show();var i=this._wrapDesc(e,!0);r[0].innerHTML=s.render("descGroupLine",{descItemOptionPath:i.optionPath,descItemType:i.type,descItemContent:t(i),descItemDescText:i.descText})},_handleHashQuery:function(e){var t=this._viewModel().apiTreeSelected.getTreeDataItem(!0);t&&e===o.getOptionPathForHash(t)||(O||n({key:"innerLinkChangeHash",data:e}),this._confirmQuery(e,"optionPath",!0))},_doQuery:function(e,t){try{var n={};return n[t]=e,n.noTypeEnum=l.getGlobalArg("noTypeEnum"),o.queryDocTree(this._docTree,n)||[]}catch(e){return alert(e),[]}},_confirmQuery:function(e,t,n,i){var o=this._doQuery(e,t);i&&this._setResultInfo(o.length);var a=null;if(r(y).each(function(){this.checked&&"1"===this.value&&(a=2)}),o.length){for(var s=[],l=0,u=o.length;l<u;l++)s.push(o[l].value);var c=this._viewModel(),d={scrollToTarget:{container:this.$el().find(x),clientX:210},collapseLevel:a};n?c.apiTreeSelected(o[0].value,d):c.apiTreeHighlighted(s,d)}},_setResultInfo:function(e){var t=null==e?"":0===e?u.queryBoxNoResult:a.strTemplate(u.queryResultInfo,{count:e});this.$el().find(b)[0].innerHTML=t}});return P});