Advertisement
Guest User

agar.io nice

a guest
May 6th, 2016
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function() {
  2.   /**
  3.    * @param {number} step
  4.    * @return {?}
  5.    */
  6.   function add(step) {
  7.     /**
  8.      * @param {Function} collection
  9.      * @param {Function} callback
  10.      * @param {(RegExp|string)} basis
  11.      * @param {Array} indices
  12.      * @param {number} i
  13.      * @param {number} value
  14.      * @return {?}
  15.      */
  16.     function func(collection, callback, basis, indices, i, value) {
  17.       for (;i >= 0 && value > i;i += step) {
  18.         var index = indices ? indices[i] : i;
  19.         basis = callback(basis, collection[index], index, collection);
  20.       }
  21.       return basis;
  22.     }
  23.     return function(result, callback, basis, thisArg) {
  24.       callback = bind(callback, thisArg, 4);
  25.       var indices = !isArray(result) && _.keys(result);
  26.       var udataCur = (indices || result).length;
  27.       /** @type {number} */
  28.       var i = step > 0 ? 0 : udataCur - 1;
  29.       return arguments.length < 3 && (basis = result[indices ? indices[i] : i], i += step), func(result, callback, basis, indices, i, udataCur);
  30.     };
  31.   }
  32.   /**
  33.    * @param {number} increment
  34.    * @return {?}
  35.    */
  36.   function check(increment) {
  37.     return function(data, callback, thisObj) {
  38.       callback = makeIterator(callback, thisObj);
  39.       var ret = value(data);
  40.       /** @type {number} */
  41.       var index = increment > 0 ? 0 : ret - 1;
  42.       for (;index >= 0 && ret > index;index += increment) {
  43.         if (callback(data[index], index, data)) {
  44.           return index;
  45.         }
  46.       }
  47.       return-1;
  48.     };
  49.   }
  50.   /**
  51.    * @param {number} direction
  52.    * @param {?} require
  53.    * @param {number} cb
  54.    * @return {?}
  55.    */
  56.   function init(direction, require, cb) {
  57.     return function(arg, val, index) {
  58.       /** @type {number} */
  59.       var i = 0;
  60.       var n = value(arg);
  61.       if ("number" == typeof index) {
  62.         if (direction > 0) {
  63.           /** @type {number} */
  64.           i = index >= 0 ? index : Math.max(index + n, i);
  65.         } else {
  66.           n = index >= 0 ? Math.min(index + 1, n) : index + n + 1;
  67.         }
  68.       } else {
  69.         if (cb && (index && n)) {
  70.           return index = cb(arg, val), arg[index] === val ? index : -1;
  71.         }
  72.       }
  73.       if (val !== val) {
  74.         return index = require(slice.call(arg, i, n), _.isNaN), index >= 0 ? index + i : -1;
  75.       }
  76.       /** @type {number} */
  77.       index = direction > 0 ? i : n - 1;
  78.       for (;index >= 0 && n > index;index += direction) {
  79.         if (arg[index] === val) {
  80.           return index;
  81.         }
  82.       }
  83.       return-1;
  84.     };
  85.   }
  86.   /**
  87.    * @param {Object} obj
  88.    * @param {Array} arr
  89.    * @return {undefined}
  90.    */
  91.   function remove(obj, arr) {
  92.     /** @type {number} */
  93.     var index = tokenized.length;
  94.     var c = obj.constructor;
  95.     var extention = _.isFunction(c) && c.prototype || ObjProto;
  96.     /** @type {string} */
  97.     var key = "constructor";
  98.     if (_.has(obj, key)) {
  99.       if (!_.contains(arr, key)) {
  100.         arr.push(key);
  101.       }
  102.     }
  103.     for (;index--;) {
  104.       key = tokenized[index];
  105.       if (key in obj) {
  106.         if (obj[key] !== extention[key]) {
  107.           if (!_.contains(arr, key)) {
  108.             arr.push(key);
  109.           }
  110.         }
  111.       }
  112.     }
  113.   }
  114.   var root = this;
  115.   var previousUnderscore = root._;
  116.   var ArrayProto = Array.prototype;
  117.   var ObjProto = Object.prototype;
  118.   var FuncProto = Function.prototype;
  119.   /** @type {function (this:(Array.<T>|{length: number}), ...[T]): number} */
  120.   var push = ArrayProto.push;
  121.   /** @type {function (this:(Array.<T>|string|{length: number}), *=, *=): Array.<T>} */
  122.   var slice = ArrayProto.slice;
  123.   /** @type {function (this:*): string} */
  124.   var toString = ObjProto.toString;
  125.   /** @type {function (this:Object, *): boolean} */
  126.   var hasOwnProperty = ObjProto.hasOwnProperty;
  127.   /** @type {function (*): boolean} */
  128.   var nativeIsArray = Array.isArray;
  129.   /** @type {function (Object): Array.<string>} */
  130.   var nativeKeys = Object.keys;
  131.   /** @type {function (this:Function, (Object|null|undefined), ...[*]): Function} */
  132.   var nativeBind = FuncProto.bind;
  133.   /** @type {function ((Object|null), (Object|null)=): Object} */
  134.   var objectCreate = Object.create;
  135.   /**
  136.    * @return {undefined}
  137.    */
  138.   var ctor = function() {
  139.   };
  140.   /**
  141.    * @param {?} obj
  142.    * @return {?}
  143.    */
  144.   var _ = function(obj) {
  145.     return obj instanceof _ ? obj : this instanceof _ ? void(this._wrapped = obj) : new _(obj);
  146.   };
  147.   if ("undefined" != typeof exports) {
  148.     if ("undefined" != typeof module) {
  149.       if (module.exports) {
  150.         /** @type {function (?): ?} */
  151.         exports = module.exports = _;
  152.       }
  153.     }
  154.     /** @type {function (?): ?} */
  155.     exports._ = _;
  156.   } else {
  157.     /** @type {function (?): ?} */
  158.     root._ = _;
  159.   }
  160.   /** @type {string} */
  161.   _.VERSION = "1.8.3";
  162.   /**
  163.    * @param {Function} func
  164.    * @param {number} thisArg
  165.    * @param {number} deepDataAndEvents
  166.    * @return {?}
  167.    */
  168.   var bind = function(func, thisArg, deepDataAndEvents) {
  169.     if (thisArg === void 0) {
  170.       return func;
  171.     }
  172.     switch(null == deepDataAndEvents ? 3 : deepDataAndEvents) {
  173.       case 1:
  174.         return function(accumulator) {
  175.           return func.call(thisArg, accumulator);
  176.         };
  177.       case 2:
  178.         return function(accumulator, index) {
  179.           return func.call(thisArg, accumulator, index);
  180.         };
  181.       case 3:
  182.         return function(accumulator, index, object) {
  183.           return func.call(thisArg, accumulator, index, object);
  184.         };
  185.       case 4:
  186.         return function(accumulator, index, object, collection) {
  187.           return func.call(thisArg, accumulator, index, object, collection);
  188.         };
  189.     }
  190.     return function() {
  191.       return func.apply(thisArg, arguments);
  192.     };
  193.   };
  194.   /**
  195.    * @param {string} func
  196.    * @param {string} thisObj
  197.    * @param {number} deepDataAndEvents
  198.    * @return {?}
  199.    */
  200.   var makeIterator = function(func, thisObj, deepDataAndEvents) {
  201.     return null == func ? _.identity : _.isFunction(func) ? bind(func, thisObj, deepDataAndEvents) : _.isObject(func) ? _.matcher(func) : _.property(func);
  202.   };
  203.   /**
  204.    * @param {string} callback
  205.    * @param {string} thisObj
  206.    * @return {?}
  207.    */
  208.   _.iteratee = function(callback, thisObj) {
  209.     return makeIterator(callback, thisObj, 1 / 0);
  210.   };
  211.   /**
  212.    * @param {Function} main_callback
  213.    * @param {boolean} dataAndEvents
  214.    * @return {?}
  215.    */
  216.   var some = function(main_callback, dataAndEvents) {
  217.     return function(result) {
  218.       /** @type {number} */
  219.       var argLength = arguments.length;
  220.       if (2 > argLength || null == result) {
  221.         return result;
  222.       }
  223.       /** @type {number} */
  224.       var argsIndex = 1;
  225.       for (;argLength > argsIndex;argsIndex++) {
  226.         var iterable = arguments[argsIndex];
  227.         var keys = main_callback(iterable);
  228.         var len = keys.length;
  229.         /** @type {number} */
  230.         var i = 0;
  231.         for (;len > i;i++) {
  232.           var key = keys[i];
  233.           if (!(dataAndEvents && result[key] !== void 0)) {
  234.             result[key] = iterable[key];
  235.           }
  236.         }
  237.       }
  238.       return result;
  239.     };
  240.   };
  241.   /**
  242.    * @param {Object} proto
  243.    * @return {?}
  244.    */
  245.   var create = function(proto) {
  246.     if (!_.isObject(proto)) {
  247.       return{};
  248.     }
  249.     if (objectCreate) {
  250.       return objectCreate(proto);
  251.     }
  252.     /** @type {Object} */
  253.     ctor.prototype = proto;
  254.     var child = new ctor;
  255.     return ctor.prototype = null, child;
  256.   };
  257.   /**
  258.    * @param {string} key
  259.    * @return {?}
  260.    */
  261.   var property = function(key) {
  262.     return function($cookies) {
  263.       return null == $cookies ? void 0 : $cookies[key];
  264.     };
  265.   };
  266.   /** @type {number} */
  267.   var max = Math.pow(2, 53) - 1;
  268.   var value = property("length");
  269.   /**
  270.    * @param {?} obj
  271.    * @return {?}
  272.    */
  273.   var isArray = function(obj) {
  274.     var val = value(obj);
  275.     return "number" == typeof val && (val >= 0 && max >= val);
  276.   };
  277.   /** @type {function (Object, Function, number): ?} */
  278.   _.each = _.forEach = function(obj, callback, thisArg) {
  279.     callback = bind(callback, thisArg);
  280.     var i;
  281.     var l;
  282.     if (isArray(obj)) {
  283.       /** @type {number} */
  284.       i = 0;
  285.       l = obj.length;
  286.       for (;l > i;i++) {
  287.         callback(obj[i], i, obj);
  288.       }
  289.     } else {
  290.       var items = _.keys(obj);
  291.       /** @type {number} */
  292.       i = 0;
  293.       l = items.length;
  294.       for (;l > i;i++) {
  295.         callback(obj[items[i]], items[i], obj);
  296.       }
  297.     }
  298.     return obj;
  299.   };
  300.   /** @type {function (Object, Function, string): ?} */
  301.   _.map = _.collect = function(obj, callback, thisObj) {
  302.     callback = makeIterator(callback, thisObj);
  303.     var indices = !isArray(obj) && _.keys(obj);
  304.     var indents = (indices || obj).length;
  305.     /** @type {Array} */
  306.     var result = Array(indents);
  307.     /** @type {number} */
  308.     var i = 0;
  309.     for (;indents > i;i++) {
  310.       var index = indices ? indices[i] : i;
  311.       result[i] = callback(obj[index], index, obj);
  312.     }
  313.     return result;
  314.   };
  315.   _.reduce = _.foldl = _.inject = add(1);
  316.   _.reduceRight = _.foldr = add(-1);
  317.   /** @type {function (Object, (Node|string), string): ?} */
  318.   _.find = _.detect = function(item, f, remove) {
  319.     var root;
  320.     return root = isArray(item) ? _.findIndex(item, f, remove) : _.findKey(item, f, remove), root !== void 0 && root !== -1 ? item[root] : void 0;
  321.   };
  322.   /** @type {function (Object, Function, string): ?} */
  323.   _.filter = _.select = function(obj, callback, thisObj) {
  324.     /** @type {Array} */
  325.     var acc = [];
  326.     return callback = makeIterator(callback, thisObj), _.each(obj, function(node, mongoObject, arg) {
  327.       if (callback(node, mongoObject, arg)) {
  328.         acc.push(node);
  329.       }
  330.     }), acc;
  331.   };
  332.   /**
  333.    * @param {Object} qualifier
  334.    * @param {string} iterator
  335.    * @param {Object} context
  336.    * @return {?}
  337.    */
  338.   _.reject = function(qualifier, iterator, context) {
  339.     return _.filter(qualifier, _.negate(makeIterator(iterator)), context);
  340.   };
  341.   /** @type {function (string, Text, string): ?} */
  342.   _.every = _.all = function(object, callback, thisObj) {
  343.     callback = makeIterator(callback, thisObj);
  344.     var list = !isArray(object) && _.keys(object);
  345.     var cnl = (list || object).length;
  346.     /** @type {number} */
  347.     var value = 0;
  348.     for (;cnl > value;value++) {
  349.       var index = list ? list[value] : value;
  350.       if (!callback(object[index], index, object)) {
  351.         return false;
  352.       }
  353.     }
  354.     return true;
  355.   };
  356.   /** @type {function (string, Text, string): ?} */
  357.   _.some = _.any = function(collection, callback, thisObj) {
  358.     callback = makeIterator(callback, thisObj);
  359.     var list = !isArray(collection) && _.keys(collection);
  360.     var cnl = (list || collection).length;
  361.     /** @type {number} */
  362.     var value = 0;
  363.     for (;cnl > value;value++) {
  364.       var index = list ? list[value] : value;
  365.       if (callback(collection[index], index, collection)) {
  366.         return true;
  367.       }
  368.     }
  369.     return false;
  370.   };
  371.   /** @type {function (?, string, (number|string), boolean): ?} */
  372.   _.contains = _.includes = _.include = function(val, key, id, msg) {
  373.     return isArray(val) || (val = _.values(val)), ("number" != typeof id || msg) && (id = 0), _.indexOf(val, key, id) >= 0;
  374.   };
  375.   /**
  376.    * @param {Object} val
  377.    * @param {string} method
  378.    * @return {?}
  379.    */
  380.   _.invoke = function(val, method) {
  381.     /** @type {Array.<?>} */
  382.     var args = slice.call(arguments, 2);
  383.     var isFunc = _.isFunction(method);
  384.     return _.map(val, function(value) {
  385.       var wrapper = isFunc ? method : value[method];
  386.       return null == wrapper ? wrapper : wrapper.apply(value, args);
  387.     });
  388.   };
  389.   /**
  390.    * @param {Object} obj
  391.    * @param {(number|string)} key
  392.    * @return {?}
  393.    */
  394.   _.pluck = function(obj, key) {
  395.     return _.map(obj, _.property(key));
  396.   };
  397.   /**
  398.    * @param {Object} qualifier
  399.    * @param {string} attrs
  400.    * @return {?}
  401.    */
  402.   _.where = function(qualifier, attrs) {
  403.     return _.filter(qualifier, _.matcher(attrs));
  404.   };
  405.   /**
  406.    * @param {string} expr
  407.    * @param {string} attrs
  408.    * @return {?}
  409.    */
  410.   _.findWhere = function(expr, attrs) {
  411.     return _.find(expr, _.matcher(attrs));
  412.   };
  413.   /**
  414.    * @param {number} a
  415.    * @param {number} iterator
  416.    * @param {string} thisObj
  417.    * @return {?}
  418.    */
  419.   _.max = function(a, iterator, thisObj) {
  420.     var obj;
  421.     var i;
  422.     /** @type {number} */
  423.     var value = -1 / 0;
  424.     /** @type {number} */
  425.     var longest = -1 / 0;
  426.     if (null == iterator && null != a) {
  427.       a = isArray(a) ? a : _.values(a);
  428.       /** @type {number} */
  429.       var key2 = 0;
  430.       var al = a.length;
  431.       for (;al > key2;key2++) {
  432.         obj = a[key2];
  433.         if (obj > value) {
  434.           value = obj;
  435.         }
  436.       }
  437.     } else {
  438.       iterator = makeIterator(iterator, thisObj);
  439.       _.each(a, function(x, opt_obj2, capture) {
  440.         i = iterator(x, opt_obj2, capture);
  441.         if (i > longest || i === -1 / 0 && value === -1 / 0) {
  442.           /** @type {number} */
  443.           value = x;
  444.           longest = i;
  445.         }
  446.       });
  447.     }
  448.     return value;
  449.   };
  450.   /**
  451.    * @param {number} obj
  452.    * @param {number} iterator
  453.    * @param {string} thisObj
  454.    * @return {?}
  455.    */
  456.   _.min = function(obj, iterator, thisObj) {
  457.     var maxValue;
  458.     var temp;
  459.     /** @type {number} */
  460.     var value = 1 / 0;
  461.     /** @type {number} */
  462.     var max = 1 / 0;
  463.     if (null == iterator && null != obj) {
  464.       obj = isArray(obj) ? obj : _.values(obj);
  465.       /** @type {number} */
  466.       var i = 0;
  467.       var l = obj.length;
  468.       for (;l > i;i++) {
  469.         maxValue = obj[i];
  470.         if (value > maxValue) {
  471.           value = maxValue;
  472.         }
  473.       }
  474.     } else {
  475.       iterator = makeIterator(iterator, thisObj);
  476.       _.each(obj, function(x, index, arr) {
  477.         temp = iterator(x, index, arr);
  478.         if (max > temp || 1 / 0 === temp && 1 / 0 === value) {
  479.           /** @type {number} */
  480.           value = x;
  481.           max = temp;
  482.         }
  483.       });
  484.     }
  485.     return value;
  486.   };
  487.   /**
  488.    * @param {?} obj
  489.    * @return {?}
  490.    */
  491.   _.shuffle = function(obj) {
  492.     var j;
  493.     var values = isArray(obj) ? obj : _.values(obj);
  494.     var n = values.length;
  495.     /** @type {Array} */
  496.     var result = Array(n);
  497.     /** @type {number} */
  498.     var i = 0;
  499.     for (;n > i;i++) {
  500.       j = _.random(0, i);
  501.       if (j !== i) {
  502.         result[i] = result[j];
  503.       }
  504.       result[j] = values[i];
  505.     }
  506.     return result;
  507.   };
  508.   /**
  509.    * @param {?} obj
  510.    * @param {number} n
  511.    * @param {boolean} guard
  512.    * @return {?}
  513.    */
  514.   _.sample = function(obj, n, guard) {
  515.     return null == n || guard ? (isArray(obj) || (obj = _.values(obj)), obj[_.random(obj.length - 1)]) : _.shuffle(obj).slice(0, Math.max(0, n));
  516.   };
  517.   /**
  518.    * @param {Object} val
  519.    * @param {Text} callback
  520.    * @param {string} thisObj
  521.    * @return {?}
  522.    */
  523.   _.sortBy = function(val, callback, thisObj) {
  524.     return callback = makeIterator(callback, thisObj), _.pluck(_.map(val, function(value, index, collection) {
  525.       return{
  526.         value : value,
  527.         index : index,
  528.         criteria : callback(value, index, collection)
  529.       };
  530.     }).sort(function(left, right) {
  531.       var a = left.criteria;
  532.       var b = right.criteria;
  533.       if (a !== b) {
  534.         if (a > b || a === void 0) {
  535.           return 1;
  536.         }
  537.         if (b > a || b === void 0) {
  538.           return-1;
  539.         }
  540.       }
  541.       return left.index - right.index;
  542.     }), "value");
  543.   };
  544.   /**
  545.    * @param {Function} behavior
  546.    * @return {?}
  547.    */
  548.   var group = function(behavior) {
  549.     return function(attributes, callback, thisObj) {
  550.       var result = {};
  551.       return callback = makeIterator(callback, thisObj), _.each(attributes, function(key, i) {
  552.         var value = callback(key, i, attributes);
  553.         behavior(result, key, value);
  554.       }), result;
  555.     };
  556.   };
  557.   _.groupBy = group(function(obj, v, key) {
  558.     if (_.has(obj, key)) {
  559.       obj[key].push(v);
  560.     } else {
  561.       /** @type {Array} */
  562.       obj[key] = [v];
  563.     }
  564.   });
  565.   _.indexBy = group(function(qs, val, i) {
  566.     qs[i] = val;
  567.   });
  568.   _.countBy = group(function(result, dataAndEvents, key) {
  569.     if (_.has(result, key)) {
  570.       result[key]++;
  571.     } else {
  572.       /** @type {number} */
  573.       result[key] = 1;
  574.     }
  575.   });
  576.   /**
  577.    * @param {Object} obj
  578.    * @return {?}
  579.    */
  580.   _.toArray = function(obj) {
  581.     return obj ? _.isArray(obj) ? slice.call(obj) : isArray(obj) ? _.map(obj, _.identity) : _.values(obj) : [];
  582.   };
  583.   /**
  584.    * @param {string} obj
  585.    * @return {?}
  586.    */
  587.   _.size = function(obj) {
  588.     return null == obj ? 0 : isArray(obj) ? obj.length : _.keys(obj).length;
  589.   };
  590.   /**
  591.    * @param {Object} attributes
  592.    * @param {Text} iterator
  593.    * @param {string} thisObj
  594.    * @return {?}
  595.    */
  596.   _.partition = function(attributes, iterator, thisObj) {
  597.     iterator = makeIterator(iterator, thisObj);
  598.     /** @type {Array} */
  599.     var trues = [];
  600.     /** @type {Array} */
  601.     var falses = [];
  602.     return _.each(attributes, function(value, index, list) {
  603.       (iterator(value, index, list) ? trues : falses).push(value);
  604.     }), [trues, falses];
  605.   };
  606.   /** @type {function (string, number, boolean): ?} */
  607.   _.first = _.head = _.take = function(array, n, guard) {
  608.     return null == array ? void 0 : null == n || guard ? array[0] : _.initial(array, array.length - n);
  609.   };
  610.   /**
  611.    * @param {string} array
  612.    * @param {number} t
  613.    * @param {boolean} r
  614.    * @return {?}
  615.    */
  616.   _.initial = function(array, t, r) {
  617.     return slice.call(array, 0, Math.max(0, array.length - (null == t || r ? 1 : t)));
  618.   };
  619.   /**
  620.    * @param {string} array
  621.    * @param {number} n
  622.    * @param {boolean} guard
  623.    * @return {?}
  624.    */
  625.   _.last = function(array, n, guard) {
  626.     return null == array ? void 0 : null == n || guard ? array[array.length - 1] : _.rest(array, Math.max(0, array.length - n));
  627.   };
  628.   /** @type {function (string, number, boolean): ?} */
  629.   _.rest = _.tail = _.drop = function(array, t, r) {
  630.     return slice.call(array, null == t || r ? 1 : t);
  631.   };
  632.   /**
  633.    * @param {Object} qualifier
  634.    * @return {?}
  635.    */
  636.   _.compact = function(qualifier) {
  637.     return _.filter(qualifier, _.identity);
  638.   };
  639.   /**
  640.    * @param {(Arguments|Array)} obj
  641.    * @param {boolean} shallow
  642.    * @param {boolean} recurring
  643.    * @param {number} dataAndEvents
  644.    * @return {?}
  645.    */
  646.   var flatten = function(obj, shallow, recurring, dataAndEvents) {
  647.     /** @type {Array} */
  648.     var result = [];
  649.     /** @type {number} */
  650.     var ri = 0;
  651.     var argsIndex = dataAndEvents || 0;
  652.     var val = value(obj);
  653.     for (;val > argsIndex;argsIndex++) {
  654.       var iterable = obj[argsIndex];
  655.       if (isArray(iterable) && (_.isArray(iterable) || _.isArguments(iterable))) {
  656.         if (!shallow) {
  657.           iterable = flatten(iterable, shallow, recurring);
  658.         }
  659.         /** @type {number} */
  660.         var i = 0;
  661.         var len = iterable.length;
  662.         result.length += len;
  663.         for (;len > i;) {
  664.           result[ri++] = iterable[i++];
  665.         }
  666.       } else {
  667.         if (!recurring) {
  668.           result[ri++] = iterable;
  669.         }
  670.       }
  671.     }
  672.     return result;
  673.   };
  674.   /**
  675.    * @param {Array} array
  676.    * @param {boolean} shallow
  677.    * @return {?}
  678.    */
  679.   _.flatten = function(array, shallow) {
  680.     return flatten(array, shallow, false);
  681.   };
  682.   /**
  683.    * @param {Object} array
  684.    * @return {?}
  685.    */
  686.   _.without = function(array) {
  687.     return _.difference(array, slice.call(arguments, 1));
  688.   };
  689.   /** @type {function (Array, string, string, string): ?} */
  690.   _.uniq = _.unique = function(results, isSorted, callback, thisObj) {
  691.     if (!_.isBoolean(isSorted)) {
  692.       /** @type {string} */
  693.       thisObj = callback;
  694.       /** @type {string} */
  695.       callback = isSorted;
  696.       /** @type {boolean} */
  697.       isSorted = false;
  698.     }
  699.     if (null != callback) {
  700.       callback = makeIterator(callback, thisObj);
  701.     }
  702.     /** @type {Array} */
  703.     var arr = [];
  704.     /** @type {Array} */
  705.     var current = [];
  706.     /** @type {number} */
  707.     var i = 0;
  708.     var val = value(results);
  709.     for (;val > i;i++) {
  710.       var item = results[i];
  711.       var key = callback ? callback(item, i, results) : item;
  712.       if (isSorted) {
  713.         if (!(i && current === key)) {
  714.           arr.push(item);
  715.         }
  716.         current = key;
  717.       } else {
  718.         if (callback) {
  719.           if (!_.contains(current, key)) {
  720.             current.push(key);
  721.             arr.push(item);
  722.           }
  723.         } else {
  724.           if (!_.contains(arr, item)) {
  725.             arr.push(item);
  726.           }
  727.         }
  728.       }
  729.     }
  730.     return arr;
  731.   };
  732.   /**
  733.    * @return {?}
  734.    */
  735.   _.union = function() {
  736.     return _.uniq(flatten(arguments, true, true));
  737.   };
  738.   /**
  739.    * @param {Array} array
  740.    * @return {?}
  741.    */
  742.   _.intersection = function(array) {
  743.     /** @type {Array} */
  744.     var result = [];
  745.     /** @type {number} */
  746.     var l = arguments.length;
  747.     /** @type {number} */
  748.     var index = 0;
  749.     var idx = value(array);
  750.     for (;idx > index;index++) {
  751.       var item = array[index];
  752.       if (!_.contains(result, item)) {
  753.         /** @type {number} */
  754.         var i = 1;
  755.         for (;l > i && _.contains(arguments[i], item);i++) {
  756.         }
  757.         if (i === l) {
  758.           result.push(item);
  759.         }
  760.       }
  761.     }
  762.     return result;
  763.   };
  764.   /**
  765.    * @param {Object} qualifier
  766.    * @return {?}
  767.    */
  768.   _.difference = function(qualifier) {
  769.     var rest = flatten(arguments, true, true, 1);
  770.     return _.filter(qualifier, function(key) {
  771.       return!_.contains(rest, key);
  772.     });
  773.   };
  774.   /**
  775.    * @return {?}
  776.    */
  777.   _.zip = function() {
  778.     return _.unzip(arguments);
  779.   };
  780.   /**
  781.    * @param {Object} args
  782.    * @return {?}
  783.    */
  784.   _.unzip = function(args) {
  785.     var indents = args && _.max(args, value).length || 0;
  786.     /** @type {Array} */
  787.     var results = Array(indents);
  788.     /** @type {number} */
  789.     var i = 0;
  790.     for (;indents > i;i++) {
  791.       results[i] = _.pluck(args, i);
  792.     }
  793.     return results;
  794.   };
  795.   /**
  796.    * @param {Array} list
  797.    * @param {Array} values
  798.    * @return {?}
  799.    */
  800.   _.object = function(list, values) {
  801.     var result = {};
  802.     /** @type {number} */
  803.     var i = 0;
  804.     var val = value(list);
  805.     for (;val > i;i++) {
  806.       if (values) {
  807.         result[list[i]] = values[i];
  808.       } else {
  809.         result[list[i][0]] = list[i][1];
  810.       }
  811.     }
  812.     return result;
  813.   };
  814.   _.findIndex = check(1);
  815.   _.findLastIndex = check(-1);
  816.   /**
  817.    * @param {Array} obj
  818.    * @param {?} context
  819.    * @param {Text} iterator
  820.    * @param {string} thisObj
  821.    * @return {?}
  822.    */
  823.   _.sortedIndex = function(obj, context, iterator, thisObj) {
  824.     iterator = makeIterator(iterator, thisObj, 1);
  825.     var key = iterator(context);
  826.     /** @type {number} */
  827.     var low = 0;
  828.     var high = value(obj);
  829.     for (;high > low;) {
  830.       /** @type {number} */
  831.       var mid = Math.floor((low + high) / 2);
  832.       if (iterator(obj[mid]) < key) {
  833.         /** @type {number} */
  834.         low = mid + 1;
  835.       } else {
  836.         /** @type {number} */
  837.         high = mid;
  838.       }
  839.     }
  840.     return low;
  841.   };
  842.   _.indexOf = init(1, _.findIndex, _.sortedIndex);
  843.   _.lastIndexOf = init(-1, _.findLastIndex);
  844.   /**
  845.    * @param {number} start
  846.    * @param {number} stop
  847.    * @param {number} step
  848.    * @return {?}
  849.    */
  850.   _.range = function(start, stop, step) {
  851.     if (null == stop) {
  852.       stop = start || 0;
  853.       /** @type {number} */
  854.       start = 0;
  855.     }
  856.     step = step || 1;
  857.     /** @type {number} */
  858.     var length = Math.max(Math.ceil((stop - start) / step), 0);
  859.     /** @type {Array} */
  860.     var result = Array(length);
  861.     /** @type {number} */
  862.     var i = 0;
  863.     for (;length > i;i++, start += step) {
  864.       /** @type {number} */
  865.       result[i] = start;
  866.     }
  867.     return result;
  868.   };
  869.   /**
  870.    * @param {Function} func
  871.    * @param {Function} type
  872.    * @param {?} self
  873.    * @param {?} obj
  874.    * @param {?} args
  875.    * @return {?}
  876.    */
  877.   var get = function(func, type, self, obj, args) {
  878.     if (!(obj instanceof type)) {
  879.       return func.apply(self, args);
  880.     }
  881.     var instance = create(func.prototype);
  882.     var result = func.apply(instance, args);
  883.     return _.isObject(result) ? result : instance;
  884.   };
  885.   /**
  886.    * @param {Object} func
  887.    * @param {string=} callback
  888.    * @return {function (...[?]): ?}
  889.    */
  890.   _.bind = function(func, callback) {
  891.     if (nativeBind && func.bind === nativeBind) {
  892.       return nativeBind.apply(func, slice.call(arguments, 1));
  893.     }
  894.     if (!_.isFunction(func)) {
  895.       throw new TypeError("Bind must be called on a function");
  896.     }
  897.     /** @type {Array.<?>} */
  898.     var args = slice.call(arguments, 2);
  899.     /**
  900.      * @return {?}
  901.      */
  902.     var e = function() {
  903.       return get(func, e, callback, this, args.concat(slice.call(arguments)));
  904.     };
  905.     return e;
  906.   };
  907.   /**
  908.    * @param {Function} o
  909.    * @return {?}
  910.    */
  911.   _.partial = function(o) {
  912.     /** @type {Array.<?>} */
  913.     var parsed = slice.call(arguments, 1);
  914.     /**
  915.      * @return {?}
  916.      */
  917.     var cache = function() {
  918.       /** @type {number} */
  919.       var x = 0;
  920.       /** @type {number} */
  921.       var l = parsed.length;
  922.       /** @type {Array} */
  923.       var args = Array(l);
  924.       /** @type {number} */
  925.       var i = 0;
  926.       for (;l > i;i++) {
  927.         args[i] = parsed[i] === _ ? arguments[x++] : parsed[i];
  928.       }
  929.       for (;x < arguments.length;) {
  930.         args.push(arguments[x++]);
  931.       }
  932.       return get(o, cache, this, this, args);
  933.     };
  934.     return cache;
  935.   };
  936.   /**
  937.    * @param {Object} obj
  938.    * @return {?}
  939.    */
  940.   _.bindAll = function(obj) {
  941.     var i;
  942.     var f;
  943.     /** @type {number} */
  944.     var l = arguments.length;
  945.     if (1 >= l) {
  946.       throw new Error("bindAll must be passed function names");
  947.     }
  948.     /** @type {number} */
  949.     i = 1;
  950.     for (;l > i;i++) {
  951.       f = arguments[i];
  952.       obj[f] = _.bind(obj[f], obj);
  953.     }
  954.     return obj;
  955.   };
  956.   /**
  957.    * @param {Function} matcherFunction
  958.    * @param {Function} func
  959.    * @return {?}
  960.    */
  961.   _.memoize = function(matcherFunction, func) {
  962.     /**
  963.      * @param {Function} val
  964.      * @return {?}
  965.      */
  966.     var require = function(val) {
  967.       var cache = require.cache;
  968.       /** @type {string} */
  969.       var key = "" + (func ? func.apply(this, arguments) : val);
  970.       return _.has(cache, key) || (cache[key] = matcherFunction.apply(this, arguments)), cache[key];
  971.     };
  972.     return require.cache = {}, require;
  973.   };
  974.   /**
  975.    * @param {Function} func
  976.    * @param {?} wait
  977.    * @return {?}
  978.    */
  979.   _.delay = function(func, wait) {
  980.     /** @type {Array.<?>} */
  981.     var args = slice.call(arguments, 2);
  982.     return setTimeout(function() {
  983.       return func.apply(null, args);
  984.     }, wait);
  985.   };
  986.   _.defer = _.partial(_.delay, _, 1);
  987.   /**
  988.    * @param {Function} func
  989.    * @param {number} wait
  990.    * @param {Object} options
  991.    * @return {?}
  992.    */
  993.   _.throttle = function(func, wait, options) {
  994.     var thisObject;
  995.     var args;
  996.     var value;
  997.     /** @type {null} */
  998.     var timeout = null;
  999.     /** @type {number} */
  1000.     var previous = 0;
  1001.     if (!options) {
  1002.       options = {};
  1003.     }
  1004.     /**
  1005.      * @return {undefined}
  1006.      */
  1007.     var later = function() {
  1008.       /** @type {number} */
  1009.       previous = options.leading === false ? 0 : _.now();
  1010.       /** @type {null} */
  1011.       timeout = null;
  1012.       value = func.apply(thisObject, args);
  1013.       if (!timeout) {
  1014.         /** @type {null} */
  1015.         thisObject = args = null;
  1016.       }
  1017.     };
  1018.     return function() {
  1019.       /** @type {number} */
  1020.       var now = _.now();
  1021.       if (!previous) {
  1022.         if (!(options.leading !== false)) {
  1023.           /** @type {number} */
  1024.           previous = now;
  1025.         }
  1026.       }
  1027.       /** @type {number} */
  1028.       var remaining = wait - (now - previous);
  1029.       return thisObject = this, args = arguments, 0 >= remaining || remaining > wait ? (timeout && (clearTimeout(timeout), timeout = null), previous = now, value = func.apply(thisObject, args), timeout || (thisObject = args = null)) : timeout || (options.trailing === false || (timeout = setTimeout(later, remaining))), value;
  1030.     };
  1031.   };
  1032.   /**
  1033.    * @param {Function} func
  1034.    * @param {number} wait
  1035.    * @param {boolean} immediate
  1036.    * @return {?}
  1037.    */
  1038.   _.debounce = function(func, wait, immediate) {
  1039.     var timeout;
  1040.     var args;
  1041.     var thisObject;
  1042.     var lastAnimationTime;
  1043.     var value;
  1044.     /**
  1045.      * @return {undefined}
  1046.      */
  1047.     var delayed = function() {
  1048.       /** @type {number} */
  1049.       var timeDiff = _.now() - lastAnimationTime;
  1050.       if (wait > timeDiff && timeDiff >= 0) {
  1051.         /** @type {number} */
  1052.         timeout = setTimeout(delayed, wait - timeDiff);
  1053.       } else {
  1054.         /** @type {null} */
  1055.         timeout = null;
  1056.         if (!immediate) {
  1057.           value = func.apply(thisObject, args);
  1058.           if (!timeout) {
  1059.             /** @type {null} */
  1060.             thisObject = args = null;
  1061.           }
  1062.         }
  1063.       }
  1064.     };
  1065.     return function() {
  1066.       thisObject = this;
  1067.       /** @type {Arguments} */
  1068.       args = arguments;
  1069.       /** @type {number} */
  1070.       lastAnimationTime = _.now();
  1071.       var callNow = immediate && !timeout;
  1072.       return timeout || (timeout = setTimeout(delayed, wait)), callNow && (value = func.apply(thisObject, args), thisObject = args = null), value;
  1073.     };
  1074.   };
  1075.   /**
  1076.    * @param {?} func
  1077.    * @param {Function} wrapper
  1078.    * @return {?}
  1079.    */
  1080.   _.wrap = function(func, wrapper) {
  1081.     return _.partial(wrapper, func);
  1082.   };
  1083.   /**
  1084.    * @param {Function} matcherFunction
  1085.    * @return {?}
  1086.    */
  1087.   _.negate = function(matcherFunction) {
  1088.     return function() {
  1089.       return!matcherFunction.apply(this, arguments);
  1090.     };
  1091.   };
  1092.   /**
  1093.    * @return {?}
  1094.    */
  1095.   _.compose = function() {
  1096.     /** @type {Arguments} */
  1097.     var functions = arguments;
  1098.     /** @type {number} */
  1099.     var i = functions.length - 1;
  1100.     return function() {
  1101.       /** @type {number} */
  1102.       var k = i;
  1103.       var result = functions[i].apply(this, arguments);
  1104.       for (;k--;) {
  1105.         result = functions[k].call(this, result);
  1106.       }
  1107.       return result;
  1108.     };
  1109.   };
  1110.   /**
  1111.    * @param {?} times
  1112.    * @param {Function} matcherFunction
  1113.    * @return {?}
  1114.    */
  1115.   _.after = function(times, matcherFunction) {
  1116.     return function() {
  1117.       return--times < 1 ? matcherFunction.apply(this, arguments) : void 0;
  1118.     };
  1119.   };
  1120.   /**
  1121.    * @param {?} fn
  1122.    * @param {(Function|number)} matcherFunction
  1123.    * @return {?}
  1124.    */
  1125.   _.before = function(fn, matcherFunction) {
  1126.     var returnValue;
  1127.     return function() {
  1128.       return--fn > 0 && (returnValue = matcherFunction.apply(this, arguments)), 1 >= fn && (matcherFunction = null), returnValue;
  1129.     };
  1130.   };
  1131.   _.once = _.partial(_.before, 2);
  1132.   /** @type {boolean} */
  1133.   var str = !{
  1134.     toString : null
  1135.   }.propertyIsEnumerable("toString");
  1136.   /** @type {Array} */
  1137.   var tokenized = ["valueOf", "isPrototypeOf", "toString", "propertyIsEnumerable", "hasOwnProperty", "toLocaleString"];
  1138.   /**
  1139.    * @param {?} obj
  1140.    * @return {?}
  1141.    */
  1142.   _.keys = function(obj) {
  1143.     if (!_.isObject(obj)) {
  1144.       return[];
  1145.     }
  1146.     if (nativeKeys) {
  1147.       return nativeKeys(obj);
  1148.     }
  1149.     /** @type {Array} */
  1150.     var listeners = [];
  1151.     var key;
  1152.     for (key in obj) {
  1153.       if (_.has(obj, key)) {
  1154.         listeners.push(key);
  1155.       }
  1156.     }
  1157.     return str && remove(obj, listeners), listeners;
  1158.   };
  1159.   /**
  1160.    * @param {Object} obj
  1161.    * @return {?}
  1162.    */
  1163.   _.allKeys = function(obj) {
  1164.     if (!_.isObject(obj)) {
  1165.       return[];
  1166.     }
  1167.     /** @type {Array} */
  1168.     var listeners = [];
  1169.     var p;
  1170.     for (p in obj) {
  1171.       listeners.push(p);
  1172.     }
  1173.     return str && remove(obj, listeners), listeners;
  1174.   };
  1175.   /**
  1176.    * @param {?} obj
  1177.    * @return {?}
  1178.    */
  1179.   _.values = function(obj) {
  1180.     var keys = _.keys(obj);
  1181.     var length = keys.length;
  1182.     /** @type {Array} */
  1183.     var result = Array(length);
  1184.     /** @type {number} */
  1185.     var i = 0;
  1186.     for (;length > i;i++) {
  1187.       result[i] = obj[keys[i]];
  1188.     }
  1189.     return result;
  1190.   };
  1191.   /**
  1192.    * @param {Object} obj
  1193.    * @param {Text} callback
  1194.    * @param {string} thisObj
  1195.    * @return {?}
  1196.    */
  1197.   _.mapObject = function(obj, callback, thisObj) {
  1198.     callback = makeIterator(callback, thisObj);
  1199.     var key;
  1200.     var keys = _.keys(obj);
  1201.     var len = keys.length;
  1202.     var result = {};
  1203.     /** @type {number} */
  1204.     var j = 0;
  1205.     for (;len > j;j++) {
  1206.       key = keys[j];
  1207.       result[key] = callback(obj[key], key, obj);
  1208.     }
  1209.     return result;
  1210.   };
  1211.   /**
  1212.    * @param {?} obj
  1213.    * @return {?}
  1214.    */
  1215.   _.pairs = function(obj) {
  1216.     var keys = _.keys(obj);
  1217.     var length = keys.length;
  1218.     /** @type {Array} */
  1219.     var result = Array(length);
  1220.     /** @type {number} */
  1221.     var i = 0;
  1222.     for (;length > i;i++) {
  1223.       /** @type {Array} */
  1224.       result[i] = [keys[i], obj[keys[i]]];
  1225.     }
  1226.     return result;
  1227.   };
  1228.   /**
  1229.    * @param {?} obj
  1230.    * @return {?}
  1231.    */
  1232.   _.invert = function(obj) {
  1233.     var result = {};
  1234.     var keys = _.keys(obj);
  1235.     /** @type {number} */
  1236.     var i = 0;
  1237.     var len = keys.length;
  1238.     for (;len > i;i++) {
  1239.       result[obj[keys[i]]] = keys[i];
  1240.     }
  1241.     return result;
  1242.   };
  1243.   /** @type {function (Object): ?} */
  1244.   _.functions = _.methods = function(obj) {
  1245.     /** @type {Array} */
  1246.     var keys = [];
  1247.     var key;
  1248.     for (key in obj) {
  1249.       if (_.isFunction(obj[key])) {
  1250.         keys.push(key);
  1251.       }
  1252.     }
  1253.     return keys.sort();
  1254.   };
  1255.   _.extend = some(_.allKeys);
  1256.   _.extendOwn = _.assign = some(_.keys);
  1257.   /**
  1258.    * @param {Object} obj
  1259.    * @param {(RegExp|string)} callback
  1260.    * @param {string} thisObj
  1261.    * @return {?}
  1262.    */
  1263.   _.findKey = function(obj, callback, thisObj) {
  1264.     callback = makeIterator(callback, thisObj);
  1265.     var key;
  1266.     var keys = _.keys(obj);
  1267.     /** @type {number} */
  1268.     var j = 0;
  1269.     var len = keys.length;
  1270.     for (;len > j;j++) {
  1271.       if (key = keys[j], callback(obj[key], key, obj)) {
  1272.         return key;
  1273.       }
  1274.     }
  1275.   };
  1276.   /**
  1277.    * @param {Function} object
  1278.    * @param {Object} obj
  1279.    * @param {number} thisArg
  1280.    * @return {?}
  1281.    */
  1282.   _.pick = function(object, obj, thisArg) {
  1283.     var filter;
  1284.     var result;
  1285.     var out = {};
  1286.     /** @type {Function} */
  1287.     var array = object;
  1288.     if (null == array) {
  1289.       return out;
  1290.     }
  1291.     if (_.isFunction(obj)) {
  1292.       result = _.allKeys(array);
  1293.       filter = bind(obj, thisArg);
  1294.     } else {
  1295.       result = flatten(arguments, false, false, 1);
  1296.       /**
  1297.        * @param {?} expr
  1298.        * @param {?} event
  1299.        * @param {Object} obj
  1300.        * @return {?}
  1301.        */
  1302.       filter = function(expr, event, obj) {
  1303.         return event in obj;
  1304.       };
  1305.       array = Object(array);
  1306.     }
  1307.     /** @type {number} */
  1308.     var index = 0;
  1309.     var matches = result.length;
  1310.     for (;matches > index;index++) {
  1311.       var type = result[index];
  1312.       var data = array[type];
  1313.       if (filter(data, type, array)) {
  1314.         out[type] = data;
  1315.       }
  1316.     }
  1317.     return out;
  1318.   };
  1319.   /**
  1320.    * @param {Function} obj
  1321.    * @param {(Object|string)} qualifier
  1322.    * @param {number} thisArg
  1323.    * @return {?}
  1324.    */
  1325.   _.omit = function(obj, qualifier, thisArg) {
  1326.     if (_.isFunction(qualifier)) {
  1327.       qualifier = _.negate(qualifier);
  1328.     } else {
  1329.       var method = _.map(flatten(arguments, false, false, 1), String);
  1330.       /**
  1331.        * @param {?} dataAndEvents
  1332.        * @param {string} key
  1333.        * @return {?}
  1334.        */
  1335.       qualifier = function(dataAndEvents, key) {
  1336.         return!_.contains(method, key);
  1337.       };
  1338.     }
  1339.     return _.pick(obj, qualifier, thisArg);
  1340.   };
  1341.   _.defaults = some(_.allKeys, true);
  1342.   /**
  1343.    * @param {Object} type
  1344.    * @param {(Node|string)} tag
  1345.    * @return {?}
  1346.    */
  1347.   _.create = function(type, tag) {
  1348.     var context = create(type);
  1349.     return tag && _.extendOwn(context, tag), context;
  1350.   };
  1351.   /**
  1352.    * @param {Object} obj
  1353.    * @return {?}
  1354.    */
  1355.   _.clone = function(obj) {
  1356.     return _.isObject(obj) ? _.isArray(obj) ? obj.slice() : _.extend({}, obj) : obj;
  1357.   };
  1358.   /**
  1359.    * @param {?} n
  1360.    * @param {?} t
  1361.    * @return {?}
  1362.    */
  1363.   _.tap = function(n, t) {
  1364.     return t(n), n;
  1365.   };
  1366.   /**
  1367.    * @param {?} array
  1368.    * @param {?} obj
  1369.    * @return {?}
  1370.    */
  1371.   _.isMatch = function(array, obj) {
  1372.     var keys = _.keys(obj);
  1373.     var len = keys.length;
  1374.     if (null == array) {
  1375.       return!len;
  1376.     }
  1377.     var t = Object(array);
  1378.     /** @type {number} */
  1379.     var j = 0;
  1380.     for (;len > j;j++) {
  1381.       var k = keys[j];
  1382.       if (obj[k] !== t[k] || !(k in t)) {
  1383.         return false;
  1384.       }
  1385.     }
  1386.     return true;
  1387.   };
  1388.   /**
  1389.    * @param {?} a
  1390.    * @param {?} b
  1391.    * @param {Array} stack
  1392.    * @param {Array} bStack
  1393.    * @return {?}
  1394.    */
  1395.   var eq = function(a, b, stack, bStack) {
  1396.     if (a === b) {
  1397.       return 0 !== a || 1 / a === 1 / b;
  1398.     }
  1399.     if (null == a || null == b) {
  1400.       return a === b;
  1401.     }
  1402.     if (a instanceof _) {
  1403.       a = a._wrapped;
  1404.     }
  1405.     if (b instanceof _) {
  1406.       b = b._wrapped;
  1407.     }
  1408.     /** @type {string} */
  1409.     var array = toString.call(a);
  1410.     if (array !== toString.call(b)) {
  1411.       return false;
  1412.     }
  1413.     switch(array) {
  1414.       case "[object RegExp]":
  1415.       ;
  1416.       case "[object String]":
  1417.         return "" + a == "" + b;
  1418.       case "[object Number]":
  1419.         return+a !== +a ? +b !== +b : 0 === +a ? 1 / +a === 1 / b : +a === +b;
  1420.       case "[object Date]":
  1421.       ;
  1422.       case "[object Boolean]":
  1423.         return+a === +b;
  1424.     }
  1425.     /** @type {boolean} */
  1426.     var isArray = "[object Array]" === array;
  1427.     if (!isArray) {
  1428.       if ("object" != typeof a || "object" != typeof b) {
  1429.         return false;
  1430.       }
  1431.       var aCtor = a.constructor;
  1432.       var bCtor = b.constructor;
  1433.       if (aCtor !== bCtor && (!(_.isFunction(aCtor) && (aCtor instanceof aCtor && (_.isFunction(bCtor) && bCtor instanceof bCtor))) && ("constructor" in a && "constructor" in b))) {
  1434.         return false;
  1435.       }
  1436.     }
  1437.     stack = stack || [];
  1438.     bStack = bStack || [];
  1439.     var i = stack.length;
  1440.     for (;i--;) {
  1441.       if (stack[i] === a) {
  1442.         return bStack[i] === b;
  1443.       }
  1444.     }
  1445.     if (stack.push(a), bStack.push(b), isArray) {
  1446.       if (i = a.length, i !== b.length) {
  1447.         return false;
  1448.       }
  1449.       for (;i--;) {
  1450.         if (!eq(a[i], b[i], stack, bStack)) {
  1451.           return false;
  1452.         }
  1453.       }
  1454.     } else {
  1455.       var key;
  1456.       var keys = _.keys(a);
  1457.       if (i = keys.length, _.keys(b).length !== i) {
  1458.         return false;
  1459.       }
  1460.       for (;i--;) {
  1461.         if (key = keys[i], !_.has(b, key) || !eq(a[key], b[key], stack, bStack)) {
  1462.           return false;
  1463.         }
  1464.       }
  1465.     }
  1466.     return stack.pop(), bStack.pop(), true;
  1467.   };
  1468.   /**
  1469.    * @param {?} a
  1470.    * @param {?} b
  1471.    * @return {?}
  1472.    */
  1473.   _.isEqual = function(a, b) {
  1474.     return eq(a, b);
  1475.   };
  1476.   /**
  1477.    * @param {string} obj
  1478.    * @return {?}
  1479.    */
  1480.   _.isEmpty = function(obj) {
  1481.     return null == obj ? true : isArray(obj) && (_.isArray(obj) || (_.isString(obj) || _.isArguments(obj))) ? 0 === obj.length : 0 === _.keys(obj).length;
  1482.   };
  1483.   /**
  1484.    * @param {Object} obj
  1485.    * @return {?}
  1486.    */
  1487.   _.isElement = function(obj) {
  1488.     return!(!obj || 1 !== obj.nodeType);
  1489.   };
  1490.   /** @type {function (*): boolean} */
  1491.   _.isArray = nativeIsArray || function(obj) {
  1492.     return "[object Array]" === toString.call(obj);
  1493.   };
  1494.   /**
  1495.    * @param {?} obj
  1496.    * @return {?}
  1497.    */
  1498.   _.isObject = function(obj) {
  1499.     /** @type {string} */
  1500.     var type = typeof obj;
  1501.     return "function" === type || "object" === type && !!obj;
  1502.   };
  1503.   _.each(["Arguments", "Function", "String", "Number", "Date", "RegExp", "Error"], function(name) {
  1504.     /**
  1505.      * @param {?} checkSet
  1506.      * @return {?}
  1507.      */
  1508.     _["is" + name] = function(checkSet) {
  1509.       return toString.call(checkSet) === "[object " + name + "]";
  1510.     };
  1511.   });
  1512.   if (!_.isArguments(arguments)) {
  1513.     /**
  1514.      * @param {Object} obj
  1515.      * @return {?}
  1516.      */
  1517.     _.isArguments = function(obj) {
  1518.       return _.has(obj, "callee");
  1519.     };
  1520.   }
  1521.   if ("function" != typeof/./) {
  1522.     if ("object" != typeof Int8Array) {
  1523.       /**
  1524.        * @param {Object} obj
  1525.        * @return {?}
  1526.        */
  1527.       _.isFunction = function(obj) {
  1528.         return "function" == typeof obj || false;
  1529.       };
  1530.     }
  1531.   }
  1532.   /**
  1533.    * @param {?} obj
  1534.    * @return {?}
  1535.    */
  1536.   _.isFinite = function(obj) {
  1537.     return isFinite(obj) && !isNaN(parseFloat(obj));
  1538.   };
  1539.   /**
  1540.    * @param {number} i
  1541.    * @return {?}
  1542.    */
  1543.   _.isNaN = function(i) {
  1544.     return _.isNumber(i) && i !== +i;
  1545.   };
  1546.   /**
  1547.    * @param {boolean} obj
  1548.    * @return {?}
  1549.    */
  1550.   _.isBoolean = function(obj) {
  1551.     return obj === true || (obj === false || "[object Boolean]" === toString.call(obj));
  1552.   };
  1553.   /**
  1554.    * @param {number} obj
  1555.    * @return {?}
  1556.    */
  1557.   _.isNull = function(obj) {
  1558.     return null === obj;
  1559.   };
  1560.   /**
  1561.    * @param {(Array|string)} obj
  1562.    * @return {?}
  1563.    */
  1564.   _.isUndefined = function(obj) {
  1565.     return obj === void 0;
  1566.   };
  1567.   /**
  1568.    * @param {Object} obj
  1569.    * @param {string} key
  1570.    * @return {?}
  1571.    */
  1572.   _.has = function(obj, key) {
  1573.     return null != obj && hasOwnProperty.call(obj, key);
  1574.   };
  1575.   /**
  1576.    * @return {?}
  1577.    */
  1578.   _.noConflict = function() {
  1579.     return root._ = previousUnderscore, this;
  1580.   };
  1581.   /**
  1582.    * @param {?} value
  1583.    * @return {?}
  1584.    */
  1585.   _.identity = function(value) {
  1586.     return value;
  1587.   };
  1588.   /**
  1589.    * @param {?} value
  1590.    * @return {?}
  1591.    */
  1592.   _.constant = function(value) {
  1593.     return function() {
  1594.       return value;
  1595.     };
  1596.   };
  1597.   /**
  1598.    * @return {undefined}
  1599.    */
  1600.   _.noop = function() {
  1601.   };
  1602.   /** @type {function (string): ?} */
  1603.   _.property = property;
  1604.   /**
  1605.    * @param {Object} buf
  1606.    * @return {?}
  1607.    */
  1608.   _.propertyOf = function(buf) {
  1609.     return null == buf ? function() {
  1610.     } : function(off) {
  1611.       return buf[off];
  1612.     };
  1613.   };
  1614.   /** @type {function (string): ?} */
  1615.   _.matcher = _.matches = function(key) {
  1616.     return key = _.extendOwn({}, key), function(other) {
  1617.       return _.isMatch(other, key);
  1618.     };
  1619.   };
  1620.   /**
  1621.    * @param {number} n
  1622.    * @param {?} callback
  1623.    * @param {number} thisArg
  1624.    * @return {?}
  1625.    */
  1626.   _.times = function(n, callback, thisArg) {
  1627.     /** @type {Array} */
  1628.     var result = Array(Math.max(0, n));
  1629.     callback = bind(callback, thisArg, 1);
  1630.     /** @type {number} */
  1631.     var i = 0;
  1632.     for (;n > i;i++) {
  1633.       result[i] = callback(i);
  1634.     }
  1635.     return result;
  1636.   };
  1637.   /**
  1638.    * @param {number} min
  1639.    * @param {number} max
  1640.    * @return {?}
  1641.    */
  1642.   _.random = function(min, max) {
  1643.     return null == max && (max = min, min = 0), min + Math.floor(Math.random() * (max - min + 1));
  1644.   };
  1645.   /** @type {function (): number} */
  1646.   _.now = Date.now || function() {
  1647.     return(new Date).getTime();
  1648.   };
  1649.   var i = {
  1650.     "&" : "&amp;",
  1651.     "<" : "&lt;",
  1652.     ">" : "&gt;",
  1653.     '"' : "&quot;",
  1654.     "'" : "&#x27;",
  1655.     "`" : "&#x60;"
  1656.   };
  1657.   var a = _.invert(i);
  1658.   /**
  1659.    * @param {Object} result
  1660.    * @return {?}
  1661.    */
  1662.   var process = function(result) {
  1663.     /**
  1664.      * @param {string} axis
  1665.      * @return {?}
  1666.      */
  1667.     var next = function(axis) {
  1668.       return result[axis];
  1669.     };
  1670.     /** @type {string} */
  1671.     var keyword1 = "(?:" + _.keys(result).join("|") + ")";
  1672.     /** @type {RegExp} */
  1673.     var hChars = RegExp(keyword1);
  1674.     /** @type {RegExp} */
  1675.     var r20 = RegExp(keyword1, "g");
  1676.     return function(s) {
  1677.       return s = null == s ? "" : "" + s, hChars.test(s) ? s.replace(r20, next) : s;
  1678.     };
  1679.   };
  1680.   _.escape = process(i);
  1681.   _.unescape = process(a);
  1682.   /**
  1683.    * @param {Object} object
  1684.    * @param {string} property
  1685.    * @param {Object} x
  1686.    * @return {?}
  1687.    */
  1688.   _.result = function(object, property, x) {
  1689.     var value = null == object ? void 0 : object[property];
  1690.     return value === void 0 && (value = x), _.isFunction(value) ? value.call(object) : value;
  1691.   };
  1692.   /** @type {number} */
  1693.   var idCounter = 0;
  1694.   /**
  1695.    * @param {?} prefix
  1696.    * @return {?}
  1697.    */
  1698.   _.uniqueId = function(prefix) {
  1699.     /** @type {string} */
  1700.     var id = ++idCounter + "";
  1701.     return prefix ? prefix + id : id;
  1702.   };
  1703.   _.templateSettings = {
  1704.     evaluate : /<%([\s\S]+?)%>/g,
  1705.     interpolate : /<%=([\s\S]+?)%>/g,
  1706.     escape : /<%-([\s\S]+?)%>/g
  1707.   };
  1708.   /** @type {RegExp} */
  1709.   var noMatch = /(.)^/;
  1710.   var escapes = {
  1711.     "'" : "'",
  1712.     "\\" : "\\",
  1713.     "\r" : "r",
  1714.     "\n" : "n",
  1715.     "\u2028" : "u2028",
  1716.     "\u2029" : "u2029"
  1717.   };
  1718.   /** @type {RegExp} */
  1719.   var r20 = /\\|'|\r|\n|\u2028|\u2029/g;
  1720.   /**
  1721.    * @param {?} match
  1722.    * @return {?}
  1723.    */
  1724.   var escapeStringChar = function(match) {
  1725.     return "\\" + escapes[match];
  1726.   };
  1727.   /**
  1728.    * @param {string} text
  1729.    * @param {Object} settings
  1730.    * @param {Object} data
  1731.    * @return {?}
  1732.    */
  1733.   _.template = function(text, settings, data) {
  1734.     if (!settings) {
  1735.       if (data) {
  1736.         /** @type {Object} */
  1737.         settings = data;
  1738.       }
  1739.     }
  1740.     settings = _.defaults({}, settings, _.templateSettings);
  1741.     /** @type {RegExp} */
  1742.     var reDelimiters = RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join("|") + "|$", "g");
  1743.     /** @type {number} */
  1744.     var index = 0;
  1745.     /** @type {string} */
  1746.     var source = "__p+='";
  1747.     text.replace(reDelimiters, function(match, dataAndEvents, deepDataAndEvents, ignoreMethodDoesntExist, offset) {
  1748.       return source += text.slice(index, offset).replace(r20, escapeStringChar), index = offset + match.length, dataAndEvents ? source += "'+\n((__t=(" + dataAndEvents + "))==null?'':_.escape(__t))+\n'" : deepDataAndEvents ? source += "'+\n((__t=(" + deepDataAndEvents + "))==null?'':__t)+\n'" : ignoreMethodDoesntExist && (source += "';\n" + ignoreMethodDoesntExist + "\n__p+='"), match;
  1749.     });
  1750.     source += "';\n";
  1751.     if (!settings.variable) {
  1752.       /** @type {string} */
  1753.       source = "with(obj||{}){\n" + source + "}\n";
  1754.     }
  1755.     /** @type {string} */
  1756.     source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + "return __p;\n";
  1757.     try {
  1758.       /** @type {Function} */
  1759.       var render = new Function(settings.variable || "obj", "_", source);
  1760.     } catch (details) {
  1761.       throw details.source = source, details;
  1762.     }
  1763.     /**
  1764.      * @param {?} data
  1765.      * @return {?}
  1766.      */
  1767.     var template = function(data) {
  1768.       return render.call(this, data, _);
  1769.     };
  1770.     var obj = settings.variable || "obj";
  1771.     return template.source = "function(" + obj + "){\n" + source + "}", template;
  1772.   };
  1773.   /**
  1774.    * @param {?} obj
  1775.    * @return {?}
  1776.    */
  1777.   _.chain = function(obj) {
  1778.     var s = _(obj);
  1779.     return s._chain = true, s;
  1780.   };
  1781.   /**
  1782.    * @param {?} b
  1783.    * @param {?} obj
  1784.    * @return {?}
  1785.    */
  1786.   var chain = function(b, obj) {
  1787.     return b._chain ? _(obj).chain() : obj;
  1788.   };
  1789.   /**
  1790.    * @param {Object} obj
  1791.    * @return {undefined}
  1792.    */
  1793.   _.mixin = function(obj) {
  1794.     _.each(_.functions(obj), function(name) {
  1795.       var wrapper = _[name] = obj[name];
  1796.       /**
  1797.        * @return {?}
  1798.        */
  1799.       _.prototype[name] = function() {
  1800.         /** @type {Array} */
  1801.         var args = [this._wrapped];
  1802.         return push.apply(args, arguments), chain(this, wrapper.apply(_, args));
  1803.       };
  1804.     });
  1805.   };
  1806.   _.mixin(_);
  1807.   _.each(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function(name) {
  1808.     var method = ArrayProto[name];
  1809.     /**
  1810.      * @return {?}
  1811.      */
  1812.     _.prototype[name] = function() {
  1813.       var wrapped = this._wrapped;
  1814.       return method.apply(wrapped, arguments), "shift" !== name && "splice" !== name || (0 !== wrapped.length || delete wrapped[0]), chain(this, wrapped);
  1815.     };
  1816.   });
  1817.   _.each(["concat", "join", "slice"], function(name) {
  1818.     var method = ArrayProto[name];
  1819.     /**
  1820.      * @return {?}
  1821.      */
  1822.     _.prototype[name] = function() {
  1823.       return chain(this, method.apply(this._wrapped, arguments));
  1824.     };
  1825.   });
  1826.   /**
  1827.    * @return {?}
  1828.    */
  1829.   _.prototype.value = function() {
  1830.     return this._wrapped;
  1831.   };
  1832.   /** @type {function (): ?} */
  1833.   _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
  1834.   /**
  1835.    * @return {?}
  1836.    */
  1837.   _.prototype.toString = function() {
  1838.     return "" + this._wrapped;
  1839.   };
  1840.   if ("function" == typeof define) {
  1841.     if (define.amd) {
  1842.       define("underscore", [], function() {
  1843.         return _;
  1844.       });
  1845.     }
  1846.   }
  1847. }).call(this);
  1848. !function(element, proceed) {
  1849.   if ("object" == typeof module && "object" == typeof module.exports) {
  1850.     module.exports = element.document ? proceed(element, true) : function(event) {
  1851.       if (!event.document) {
  1852.         throw new Error("jQuery requires a window with a document");
  1853.       }
  1854.       return proceed(event);
  1855.     };
  1856.   } else {
  1857.     proceed(element);
  1858.   }
  1859. }("undefined" != typeof window ? window : this, function(win, dataAndEvents) {
  1860.   /**
  1861.    * @param {string} obj
  1862.    * @return {?}
  1863.    */
  1864.   function isArraylike(obj) {
  1865.     var length = obj.length;
  1866.     var type = jQuery.type(obj);
  1867.     return "function" === type || jQuery.isWindow(obj) ? false : 1 === obj.nodeType && length ? true : "array" === type || (0 === length || "number" == typeof length && (length > 0 && length - 1 in obj));
  1868.   }
  1869.   /**
  1870.    * @param {Object} elements
  1871.    * @param {Object} qualifier
  1872.    * @param {boolean} not
  1873.    * @return {?}
  1874.    */
  1875.   function winnow(elements, qualifier, not) {
  1876.     if (jQuery.isFunction(qualifier)) {
  1877.       return jQuery.grep(elements, function(elem, i) {
  1878.         return!!qualifier.call(elem, i, elem) !== not;
  1879.       });
  1880.     }
  1881.     if (qualifier.nodeType) {
  1882.       return jQuery.grep(elements, function(elem) {
  1883.         return elem === qualifier !== not;
  1884.       });
  1885.     }
  1886.     if ("string" == typeof qualifier) {
  1887.       if (isSimple.test(qualifier)) {
  1888.         return jQuery.filter(qualifier, elements, not);
  1889.       }
  1890.       qualifier = jQuery.filter(qualifier, elements);
  1891.     }
  1892.     return jQuery.grep(elements, function(elem) {
  1893.       return core_indexOf.call(qualifier, elem) >= 0 !== not;
  1894.     });
  1895.   }
  1896.   /**
  1897.    * @param {Object} cur
  1898.    * @param {string} dir
  1899.    * @return {?}
  1900.    */
  1901.   function sibling(cur, dir) {
  1902.     for (;(cur = cur[dir]) && 1 !== cur.nodeType;) {
  1903.     }
  1904.     return cur;
  1905.   }
  1906.   /**
  1907.    * @param {string} options
  1908.    * @return {?}
  1909.    */
  1910.   function createOptions(options) {
  1911.     var buf = optionsCache[options] = {};
  1912.     return jQuery.each(options.match(core_rnotwhite) || [], function(dataAndEvents, off) {
  1913.       /** @type {boolean} */
  1914.       buf[off] = true;
  1915.     }), buf;
  1916.   }
  1917.   /**
  1918.    * @return {undefined}
  1919.    */
  1920.   function completed() {
  1921.     node.removeEventListener("DOMContentLoaded", completed, false);
  1922.     win.removeEventListener("load", completed, false);
  1923.     jQuery.ready();
  1924.   }
  1925.   /**
  1926.    * @return {undefined}
  1927.    */
  1928.   function Data() {
  1929.     Object.defineProperty(this.cache = {}, 0, {
  1930.       /**
  1931.        * @return {?}
  1932.        */
  1933.       get : function() {
  1934.         return{};
  1935.       }
  1936.     });
  1937.     this.expando = jQuery.expando + Data.uid++;
  1938.   }
  1939.   /**
  1940.    * @param {Object} elem
  1941.    * @param {string} key
  1942.    * @param {string} data
  1943.    * @return {?}
  1944.    */
  1945.   function dataAttr(elem, key, data) {
  1946.     var name;
  1947.     if (void 0 === data && 1 === elem.nodeType) {
  1948.       if (name = "data-" + key.replace(r20, "-$1").toLowerCase(), data = elem.getAttribute(name), "string" == typeof data) {
  1949.         try {
  1950.           data = "true" === data ? true : "false" === data ? false : "null" === data ? null : +data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
  1951.         } catch (o) {
  1952.         }
  1953.         data_user.set(elem, key, data);
  1954.       } else {
  1955.         data = void 0;
  1956.       }
  1957.     }
  1958.     return data;
  1959.   }
  1960.   /**
  1961.    * @return {?}
  1962.    */
  1963.   function returnTrue() {
  1964.     return true;
  1965.   }
  1966.   /**
  1967.    * @return {?}
  1968.    */
  1969.   function returnFalse() {
  1970.     return false;
  1971.   }
  1972.   /**
  1973.    * @return {?}
  1974.    */
  1975.   function safeActiveElement() {
  1976.     try {
  1977.       return node.activeElement;
  1978.     } catch (e) {
  1979.     }
  1980.   }
  1981.   /**
  1982.    * @param {Node} elem
  1983.    * @param {Object} content
  1984.    * @return {?}
  1985.    */
  1986.   function manipulationTarget(elem, content) {
  1987.     return jQuery.nodeName(elem, "table") && jQuery.nodeName(11 !== content.nodeType ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem;
  1988.   }
  1989.   /**
  1990.    * @param {Element} elem
  1991.    * @return {?}
  1992.    */
  1993.   function restoreScript(elem) {
  1994.     return elem.type = (null !== elem.getAttribute("type")) + "/" + elem.type, elem;
  1995.   }
  1996.   /**
  1997.    * @param {Element} s
  1998.    * @return {?}
  1999.    */
  2000.   function fn(s) {
  2001.     /** @type {(Array.<string>|null)} */
  2002.     var l = re.exec(s.type);
  2003.     return l ? s.type = l[1] : s.removeAttribute("type"), s;
  2004.   }
  2005.   /**
  2006.    * @param {(Array|NodeList)} elems
  2007.    * @param {Array} refElements
  2008.    * @return {undefined}
  2009.    */
  2010.   function setGlobalEval(elems, refElements) {
  2011.     /** @type {number} */
  2012.     var i = 0;
  2013.     var l = elems.length;
  2014.     for (;l > i;i++) {
  2015.       data_priv.set(elems[i], "globalEval", !refElements || data_priv.get(refElements[i], "globalEval"));
  2016.     }
  2017.   }
  2018.   /**
  2019.    * @param {Object} src
  2020.    * @param {Object} dest
  2021.    * @return {undefined}
  2022.    */
  2023.   function cloneCopyEvent(src, dest) {
  2024.     var i;
  2025.     var ilen;
  2026.     var type;
  2027.     var pdataOld;
  2028.     var pdataCur;
  2029.     var udataOld;
  2030.     var udataCur;
  2031.     var events;
  2032.     if (1 === dest.nodeType) {
  2033.       if (data_priv.hasData(src) && (pdataOld = data_priv.access(src), pdataCur = data_priv.set(dest, pdataOld), events = pdataOld.events)) {
  2034.         delete pdataCur.handle;
  2035.         pdataCur.events = {};
  2036.         for (type in events) {
  2037.           /** @type {number} */
  2038.           i = 0;
  2039.           ilen = events[type].length;
  2040.           for (;ilen > i;i++) {
  2041.             jQuery.event.add(dest, type, events[type][i]);
  2042.           }
  2043.         }
  2044.       }
  2045.       if (data_user.hasData(src)) {
  2046.         udataOld = data_user.access(src);
  2047.         udataCur = jQuery.extend({}, udataOld);
  2048.         data_user.set(dest, udataCur);
  2049.       }
  2050.     }
  2051.   }
  2052.   /**
  2053.    * @param {Node} context
  2054.    * @param {Object} tag
  2055.    * @return {?}
  2056.    */
  2057.   function getAll(context, tag) {
  2058.     var ret = context.getElementsByTagName ? context.getElementsByTagName(tag || "*") : context.querySelectorAll ? context.querySelectorAll(tag || "*") : [];
  2059.     return void 0 === tag || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], ret) : ret;
  2060.   }
  2061.   /**
  2062.    * @param {Element} src
  2063.    * @param {Element} dest
  2064.    * @return {undefined}
  2065.    */
  2066.   function fixInput(src, dest) {
  2067.     var name = dest.nodeName.toLowerCase();
  2068.     if ("input" === name && manipulation_rcheckableType.test(src.type)) {
  2069.       dest.checked = src.checked;
  2070.     } else {
  2071.       if ("input" === name || "textarea" === name) {
  2072.         dest.defaultValue = src.defaultValue;
  2073.       }
  2074.     }
  2075.   }
  2076.   /**
  2077.    * @param {?} name
  2078.    * @param {Document} doc
  2079.    * @return {?}
  2080.    */
  2081.   function actualDisplay(name, doc) {
  2082.     var result;
  2083.     var elem = jQuery(doc.createElement(name)).appendTo(doc.body);
  2084.     var o = win.getDefaultComputedStyle && (result = win.getDefaultComputedStyle(elem[0])) ? result.display : jQuery.css(elem[0], "display");
  2085.     return elem.detach(), o;
  2086.   }
  2087.   /**
  2088.    * @param {?} nodeName
  2089.    * @return {?}
  2090.    */
  2091.   function defaultDisplay(nodeName) {
  2092.     var doc = node;
  2093.     var display = elemdisplay[nodeName];
  2094.     return display || (display = actualDisplay(nodeName, doc), "none" !== display && display || (iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement), doc = iframe[0].contentDocument, doc.write(), doc.close(), display = actualDisplay(nodeName, doc), iframe.detach()), elemdisplay[nodeName] = display), display;
  2095.   }
  2096.   /**
  2097.    * @param {Object} elem
  2098.    * @param {string} prop
  2099.    * @param {Object} computed
  2100.    * @return {?}
  2101.    */
  2102.   function get(elem, prop, computed) {
  2103.     var width;
  2104.     var minWidth;
  2105.     var maxWidth;
  2106.     var val;
  2107.     var style = elem.style;
  2108.     return computed = computed || getStyles(elem), computed && (val = computed.getPropertyValue(prop) || computed[prop]), computed && ("" !== val || (jQuery.contains(elem.ownerDocument, elem) || (val = jQuery.style(elem, prop))), regexp.test(val) && (rbracket.test(prop) && (width = style.width, minWidth = style.minWidth, maxWidth = style.maxWidth, style.minWidth = style.maxWidth = style.width = val, val = computed.width, style.width = width, style.minWidth = minWidth, style.maxWidth = maxWidth))),
  2109.     void 0 !== val ? val + "" : val;
  2110.   }
  2111.   /**
  2112.    * @param {?} $timeout
  2113.    * @param {Function} hookFn
  2114.    * @return {?}
  2115.    */
  2116.   function addGetHookIf($timeout, hookFn) {
  2117.     return{
  2118.       /**
  2119.        * @return {?}
  2120.        */
  2121.       get : function() {
  2122.         return $timeout() ? void delete this.get : (this.get = hookFn).apply(this, arguments);
  2123.       }
  2124.     };
  2125.   }
  2126.   /**
  2127.    * @param {Object} style
  2128.    * @param {string} name
  2129.    * @return {?}
  2130.    */
  2131.   function vendorPropName(style, name) {
  2132.     if (name in style) {
  2133.       return name;
  2134.     }
  2135.     var capName = name[0].toUpperCase() + name.slice(1);
  2136.     /** @type {string} */
  2137.     var origName = name;
  2138.     /** @type {number} */
  2139.     var i = cssPrefixes.length;
  2140.     for (;i--;) {
  2141.       if (name = cssPrefixes[i] + capName, name in style) {
  2142.         return name;
  2143.       }
  2144.     }
  2145.     return origName;
  2146.   }
  2147.   /**
  2148.    * @param {Object} elem
  2149.    * @param {string} value
  2150.    * @param {?} actual
  2151.    * @return {?}
  2152.    */
  2153.   function setPositiveNumber(elem, value, actual) {
  2154.     /** @type {(Array.<string>|null)} */
  2155.     var iterator = rrelNum.exec(value);
  2156.     return iterator ? Math.max(0, iterator[1] - (actual || 0)) + (iterator[2] || "px") : value;
  2157.   }
  2158.   /**
  2159.    * @param {string} elem
  2160.    * @param {string} keepData
  2161.    * @param {string} extra
  2162.    * @param {boolean} isBorderBox
  2163.    * @param {?} styles
  2164.    * @return {?}
  2165.    */
  2166.   function augmentWidthOrHeight(elem, keepData, extra, isBorderBox, styles) {
  2167.     /** @type {number} */
  2168.     var i = extra === (isBorderBox ? "border" : "content") ? 4 : "width" === keepData ? 1 : 0;
  2169.     /** @type {number} */
  2170.     var val = 0;
  2171.     for (;4 > i;i += 2) {
  2172.       if ("margin" === extra) {
  2173.         val += jQuery.css(elem, extra + cssExpand[i], true, styles);
  2174.       }
  2175.       if (isBorderBox) {
  2176.         if ("content" === extra) {
  2177.           val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
  2178.         }
  2179.         if ("margin" !== extra) {
  2180.           val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
  2181.         }
  2182.       } else {
  2183.         val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
  2184.         if ("padding" !== extra) {
  2185.           val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
  2186.         }
  2187.       }
  2188.     }
  2189.     return val;
  2190.   }
  2191.   /**
  2192.    * @param {Object} elem
  2193.    * @param {string} name
  2194.    * @param {string} extra
  2195.    * @return {?}
  2196.    */
  2197.   function getWidthOrHeight(elem, name, extra) {
  2198.     /** @type {boolean} */
  2199.     var valueIsBorderBox = true;
  2200.     var val = "width" === name ? elem.offsetWidth : elem.offsetHeight;
  2201.     var styles = getStyles(elem);
  2202.     /** @type {boolean} */
  2203.     var isBorderBox = "border-box" === jQuery.css(elem, "boxSizing", false, styles);
  2204.     if (0 >= val || null == val) {
  2205.       if (val = get(elem, name, styles), (0 > val || null == val) && (val = elem.style[name]), regexp.test(val)) {
  2206.         return val;
  2207.       }
  2208.       valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]);
  2209.       /** @type {number} */
  2210.       val = parseFloat(val) || 0;
  2211.     }
  2212.     return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px";
  2213.   }
  2214.   /**
  2215.    * @param {Array} elements
  2216.    * @param {boolean} show
  2217.    * @return {?}
  2218.    */
  2219.   function showHide(elements, show) {
  2220.     var display;
  2221.     var elem;
  2222.     var hidden;
  2223.     /** @type {Array} */
  2224.     var values = [];
  2225.     /** @type {number} */
  2226.     var index = 0;
  2227.     var length = elements.length;
  2228.     for (;length > index;index++) {
  2229.       elem = elements[index];
  2230.       if (elem.style) {
  2231.         values[index] = data_priv.get(elem, "olddisplay");
  2232.         display = elem.style.display;
  2233.         if (show) {
  2234.           if (!values[index]) {
  2235.             if (!("none" !== display)) {
  2236.               /** @type {string} */
  2237.               elem.style.display = "";
  2238.             }
  2239.           }
  2240.           if ("" === elem.style.display) {
  2241.             if (isHidden(elem)) {
  2242.               values[index] = data_priv.access(elem, "olddisplay", defaultDisplay(elem.nodeName));
  2243.             }
  2244.           }
  2245.         } else {
  2246.           hidden = isHidden(elem);
  2247.           if (!("none" === display && hidden)) {
  2248.             data_priv.set(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display"));
  2249.           }
  2250.         }
  2251.       }
  2252.     }
  2253.     /** @type {number} */
  2254.     index = 0;
  2255.     for (;length > index;index++) {
  2256.       elem = elements[index];
  2257.       if (elem.style) {
  2258.         if (!(show && ("none" !== elem.style.display && "" !== elem.style.display))) {
  2259.           elem.style.display = show ? values[index] || "" : "none";
  2260.         }
  2261.       }
  2262.     }
  2263.     return elements;
  2264.   }
  2265.   /**
  2266.    * @param {string} selector
  2267.    * @param {string} context
  2268.    * @param {string} prop
  2269.    * @param {string} end
  2270.    * @param {string} easing
  2271.    * @return {?}
  2272.    */
  2273.   function Tween(selector, context, prop, end, easing) {
  2274.     return new Tween.prototype.init(selector, context, prop, end, easing);
  2275.   }
  2276.   /**
  2277.    * @return {?}
  2278.    */
  2279.   function createFxNow() {
  2280.     return setTimeout(function() {
  2281.       fxNow = void 0;
  2282.     }), fxNow = jQuery.now();
  2283.   }
  2284.   /**
  2285.    * @param {string} type
  2286.    * @param {boolean} includeWidth
  2287.    * @return {?}
  2288.    */
  2289.   function genFx(type, includeWidth) {
  2290.     var which;
  2291.     /** @type {number} */
  2292.     var i = 0;
  2293.     var attrs = {
  2294.       height : type
  2295.     };
  2296.     /** @type {number} */
  2297.     includeWidth = includeWidth ? 1 : 0;
  2298.     for (;4 > i;i += 2 - includeWidth) {
  2299.       which = cssExpand[i];
  2300.       attrs["margin" + which] = attrs["padding" + which] = type;
  2301.     }
  2302.     return includeWidth && (attrs.opacity = attrs.width = type), attrs;
  2303.   }
  2304.   /**
  2305.    * @param {?} value
  2306.    * @param {?} prop
  2307.    * @param {?} animation
  2308.    * @return {?}
  2309.    */
  2310.   function createTween(value, prop, animation) {
  2311.     var tween;
  2312.     var q = (cache[prop] || []).concat(cache["*"]);
  2313.     /** @type {number} */
  2314.     var i = 0;
  2315.     var l = q.length;
  2316.     for (;l > i;i++) {
  2317.       if (tween = q[i].call(animation, prop, value)) {
  2318.         return tween;
  2319.       }
  2320.     }
  2321.   }
  2322.   /**
  2323.    * @param {Object} elem
  2324.    * @param {Object} props
  2325.    * @param {Object} opts
  2326.    * @return {undefined}
  2327.    */
  2328.   function defaultPrefilter(elem, props, opts) {
  2329.     var prop;
  2330.     var value;
  2331.     var thisp;
  2332.     var tween;
  2333.     var hooks;
  2334.     var oldfire;
  2335.     var oldDisplay;
  2336.     var type;
  2337.     var anim = this;
  2338.     var orig = {};
  2339.     var style = elem.style;
  2340.     var hidden = elem.nodeType && isHidden(elem);
  2341.     var dataShow = data_priv.get(elem, "fxshow");
  2342.     if (!opts.queue) {
  2343.       hooks = jQuery._queueHooks(elem, "fx");
  2344.       if (null == hooks.unqueued) {
  2345.         /** @type {number} */
  2346.         hooks.unqueued = 0;
  2347.         /** @type {function (): undefined} */
  2348.         oldfire = hooks.empty.fire;
  2349.         /**
  2350.          * @return {undefined}
  2351.          */
  2352.         hooks.empty.fire = function() {
  2353.           if (!hooks.unqueued) {
  2354.             oldfire();
  2355.           }
  2356.         };
  2357.       }
  2358.       hooks.unqueued++;
  2359.       anim.always(function() {
  2360.         anim.always(function() {
  2361.           hooks.unqueued--;
  2362.           if (!jQuery.queue(elem, "fx").length) {
  2363.             hooks.empty.fire();
  2364.           }
  2365.         });
  2366.       });
  2367.     }
  2368.     if (1 === elem.nodeType) {
  2369.       if ("height" in props || "width" in props) {
  2370.         /** @type {Array} */
  2371.         opts.overflow = [style.overflow, style.overflowX, style.overflowY];
  2372.         oldDisplay = jQuery.css(elem, "display");
  2373.         type = "none" === oldDisplay ? data_priv.get(elem, "olddisplay") || defaultDisplay(elem.nodeName) : oldDisplay;
  2374.         if ("inline" === type) {
  2375.           if ("none" === jQuery.css(elem, "float")) {
  2376.             /** @type {string} */
  2377.             style.display = "inline-block";
  2378.           }
  2379.         }
  2380.       }
  2381.     }
  2382.     if (opts.overflow) {
  2383.       /** @type {string} */
  2384.       style.overflow = "hidden";
  2385.       anim.always(function() {
  2386.         style.overflow = opts.overflow[0];
  2387.         style.overflowX = opts.overflow[1];
  2388.         style.overflowY = opts.overflow[2];
  2389.       });
  2390.     }
  2391.     for (prop in props) {
  2392.       if (value = props[prop], rplusequals.exec(value)) {
  2393.         if (delete props[prop], thisp = thisp || "toggle" === value, value === (hidden ? "hide" : "show")) {
  2394.           if ("show" !== value || (!dataShow || void 0 === dataShow[prop])) {
  2395.             continue;
  2396.           }
  2397.           /** @type {boolean} */
  2398.           hidden = true;
  2399.         }
  2400.         orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
  2401.       } else {
  2402.         oldDisplay = void 0;
  2403.       }
  2404.     }
  2405.     if (jQuery.isEmptyObject(orig)) {
  2406.       if ("inline" === ("none" === oldDisplay ? defaultDisplay(elem.nodeName) : oldDisplay)) {
  2407.         style.display = oldDisplay;
  2408.       }
  2409.     } else {
  2410.       if (dataShow) {
  2411.         if ("hidden" in dataShow) {
  2412.           hidden = dataShow.hidden;
  2413.         }
  2414.       } else {
  2415.         dataShow = data_priv.access(elem, "fxshow", {});
  2416.       }
  2417.       if (thisp) {
  2418.         /** @type {boolean} */
  2419.         dataShow.hidden = !hidden;
  2420.       }
  2421.       if (hidden) {
  2422.         jQuery(elem).show();
  2423.       } else {
  2424.         anim.done(function() {
  2425.           jQuery(elem).hide();
  2426.         });
  2427.       }
  2428.       anim.done(function() {
  2429.         var prop;
  2430.         data_priv.remove(elem, "fxshow");
  2431.         for (prop in orig) {
  2432.           jQuery.style(elem, prop, orig[prop]);
  2433.         }
  2434.       });
  2435.       for (prop in orig) {
  2436.         tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
  2437.         if (!(prop in dataShow)) {
  2438.           dataShow[prop] = tween.start;
  2439.           if (hidden) {
  2440.             tween.end = tween.start;
  2441.             /** @type {number} */
  2442.             tween.start = "width" === prop || "height" === prop ? 1 : 0;
  2443.           }
  2444.         }
  2445.       }
  2446.     }
  2447.   }
  2448.   /**
  2449.    * @param {Object} object
  2450.    * @param {Object} paramMap
  2451.    * @return {undefined}
  2452.    */
  2453.   function propFilter(object, paramMap) {
  2454.     var key;
  2455.     var name;
  2456.     var value;
  2457.     var val;
  2458.     var hooks;
  2459.     for (key in object) {
  2460.       if (name = jQuery.camelCase(key), value = paramMap[name], val = object[key], jQuery.isArray(val) && (value = val[1], val = object[key] = val[0]), key !== name && (object[name] = val, delete object[key]), hooks = jQuery.cssHooks[name], hooks && "expand" in hooks) {
  2461.         val = hooks.expand(val);
  2462.         delete object[name];
  2463.         for (key in val) {
  2464.           if (!(key in object)) {
  2465.             object[key] = val[key];
  2466.             paramMap[key] = value;
  2467.           }
  2468.         }
  2469.       } else {
  2470.         paramMap[name] = value;
  2471.       }
  2472.     }
  2473.   }
  2474.   /**
  2475.    * @param {string} elem
  2476.    * @param {?} properties
  2477.    * @param {Object} options
  2478.    * @return {?}
  2479.    */
  2480.   function Animation(elem, properties, options) {
  2481.     var result;
  2482.     var o;
  2483.     /** @type {number} */
  2484.     var index = 0;
  2485.     /** @type {number} */
  2486.     var length = animationPrefilters.length;
  2487.     var deferred = jQuery.Deferred().always(function() {
  2488.       delete tick.elem;
  2489.     });
  2490.     /**
  2491.      * @return {?}
  2492.      */
  2493.     var tick = function() {
  2494.       if (o) {
  2495.         return false;
  2496.       }
  2497.       var currentTime = fxNow || createFxNow();
  2498.       /** @type {number} */
  2499.       var remaining = Math.max(0, animation.startTime + animation.duration - currentTime);
  2500.       /** @type {number} */
  2501.       var temp = remaining / animation.duration || 0;
  2502.       /** @type {number} */
  2503.       var percent = 1 - temp;
  2504.       /** @type {number} */
  2505.       var index = 0;
  2506.       var startOffset = animation.tweens.length;
  2507.       for (;startOffset > index;index++) {
  2508.         animation.tweens[index].run(percent);
  2509.       }
  2510.       return deferred.notifyWith(elem, [animation, percent, remaining]), 1 > percent && startOffset ? remaining : (deferred.resolveWith(elem, [animation]), false);
  2511.     };
  2512.     var animation = deferred.promise({
  2513.       elem : elem,
  2514.       props : jQuery.extend({}, properties),
  2515.       opts : jQuery.extend(true, {
  2516.         specialEasing : {}
  2517.       }, options),
  2518.       originalProperties : properties,
  2519.       originalOptions : options,
  2520.       startTime : fxNow || createFxNow(),
  2521.       duration : options.duration,
  2522.       tweens : [],
  2523.       /**
  2524.        * @param {string} prop
  2525.        * @param {string} end
  2526.        * @return {?}
  2527.        */
  2528.       createTween : function(prop, end) {
  2529.         var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
  2530.         return animation.tweens.push(tween), tween;
  2531.       },
  2532.       /**
  2533.        * @param {boolean} gotoEnd
  2534.        * @return {?}
  2535.        */
  2536.       stop : function(gotoEnd) {
  2537.         /** @type {number} */
  2538.         var index = 0;
  2539.         var length = gotoEnd ? animation.tweens.length : 0;
  2540.         if (o) {
  2541.           return this;
  2542.         }
  2543.         /** @type {boolean} */
  2544.         o = true;
  2545.         for (;length > index;index++) {
  2546.           animation.tweens[index].run(1);
  2547.         }
  2548.         return gotoEnd ? deferred.resolveWith(elem, [animation, gotoEnd]) : deferred.rejectWith(elem, [animation, gotoEnd]), this;
  2549.       }
  2550.     });
  2551.     var scripts = animation.props;
  2552.     propFilter(scripts, animation.opts.specialEasing);
  2553.     for (;length > index;index++) {
  2554.       if (result = animationPrefilters[index].call(animation, elem, scripts, animation.opts)) {
  2555.         return result;
  2556.       }
  2557.     }
  2558.     return jQuery.map(scripts, createTween, animation), jQuery.isFunction(animation.opts.start) && animation.opts.start.call(elem, animation), jQuery.fx.timer(jQuery.extend(tick, {
  2559.       elem : elem,
  2560.       anim : animation,
  2561.       queue : animation.opts.queue
  2562.     })), animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
  2563.   }
  2564.   /**
  2565.    * @param {Array} structure
  2566.    * @return {?}
  2567.    */
  2568.   function addToPrefiltersOrTransports(structure) {
  2569.     return function(selector, fn) {
  2570.       if ("string" != typeof selector) {
  2571.         /** @type {(Object|string)} */
  2572.         fn = selector;
  2573.         /** @type {string} */
  2574.         selector = "*";
  2575.       }
  2576.       var node;
  2577.       /** @type {number} */
  2578.       var i = 0;
  2579.       var elem = selector.toLowerCase().match(core_rnotwhite) || [];
  2580.       if (jQuery.isFunction(fn)) {
  2581.         for (;node = elem[i++];) {
  2582.           if ("+" === node[0]) {
  2583.             node = node.slice(1) || "*";
  2584.             (structure[node] = structure[node] || []).unshift(fn);
  2585.           } else {
  2586.             (structure[node] = structure[node] || []).push(fn);
  2587.           }
  2588.         }
  2589.       }
  2590.     };
  2591.   }
  2592.   /**
  2593.    * @param {?} structure
  2594.    * @param {?} options
  2595.    * @param {Object} originalOptions
  2596.    * @param {?} jqXHR
  2597.    * @return {?}
  2598.    */
  2599.   function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
  2600.     /**
  2601.      * @param {string} key
  2602.      * @return {?}
  2603.      */
  2604.     function inspect(key) {
  2605.       var oldName;
  2606.       return old[key] = true, jQuery.each(structure[key] || [], function(dataAndEvents, prefilterOrFactory) {
  2607.         var name = prefilterOrFactory(options, originalOptions, jqXHR);
  2608.         return "string" != typeof name || (seekingTransport || old[name]) ? seekingTransport ? !(oldName = name) : void 0 : (options.dataTypes.unshift(name), inspect(name), false);
  2609.       }), oldName;
  2610.     }
  2611.     var old = {};
  2612.     /** @type {boolean} */
  2613.     var seekingTransport = structure === transports;
  2614.     return inspect(options.dataTypes[0]) || !old["*"] && inspect("*");
  2615.   }
  2616.   /**
  2617.    * @param {(Object|string)} target
  2618.    * @param {Object} src
  2619.    * @return {?}
  2620.    */
  2621.   function ajaxExtend(target, src) {
  2622.     var key;
  2623.     var deep;
  2624.     var flatOptions = jQuery.ajaxSettings.flatOptions || {};
  2625.     for (key in src) {
  2626.       if (void 0 !== src[key]) {
  2627.         (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
  2628.       }
  2629.     }
  2630.     return deep && jQuery.extend(true, target, deep), target;
  2631.   }
  2632.   /**
  2633.    * @param {Object} s
  2634.    * @param {XMLHttpRequest} jqXHR
  2635.    * @param {Object} responses
  2636.    * @return {?}
  2637.    */
  2638.   function ajaxHandleResponses(s, jqXHR, responses) {
  2639.     var ct;
  2640.     var type;
  2641.     var finalDataType;
  2642.     var firstDataType;
  2643.     var contents = s.contents;
  2644.     var dataTypes = s.dataTypes;
  2645.     for (;"*" === dataTypes[0];) {
  2646.       dataTypes.shift();
  2647.       if (void 0 === ct) {
  2648.         ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
  2649.       }
  2650.     }
  2651.     if (ct) {
  2652.       for (type in contents) {
  2653.         if (contents[type] && contents[type].test(ct)) {
  2654.           dataTypes.unshift(type);
  2655.           break;
  2656.         }
  2657.       }
  2658.     }
  2659.     if (dataTypes[0] in responses) {
  2660.       finalDataType = dataTypes[0];
  2661.     } else {
  2662.       for (type in responses) {
  2663.         if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
  2664.           /** @type {string} */
  2665.           finalDataType = type;
  2666.           break;
  2667.         }
  2668.         if (!firstDataType) {
  2669.           /** @type {string} */
  2670.           firstDataType = type;
  2671.         }
  2672.       }
  2673.       /** @type {(string|undefined)} */
  2674.       finalDataType = finalDataType || firstDataType;
  2675.     }
  2676.     return finalDataType ? (finalDataType !== dataTypes[0] && dataTypes.unshift(finalDataType), responses[finalDataType]) : void 0;
  2677.   }
  2678.   /**
  2679.    * @param {Object} s
  2680.    * @param {(Object|string)} response
  2681.    * @param {?} jqXHR
  2682.    * @param {Object} isSuccess
  2683.    * @return {?}
  2684.    */
  2685.   function ajaxConvert(s, response, jqXHR, isSuccess) {
  2686.     var conv2;
  2687.     var current;
  2688.     var conv;
  2689.     var tmp;
  2690.     var prev;
  2691.     var converters = {};
  2692.     var dataTypes = s.dataTypes.slice();
  2693.     if (dataTypes[1]) {
  2694.       for (conv in s.converters) {
  2695.         converters[conv.toLowerCase()] = s.converters[conv];
  2696.       }
  2697.     }
  2698.     current = dataTypes.shift();
  2699.     for (;current;) {
  2700.       if (s.responseFields[current] && (jqXHR[s.responseFields[current]] = response), !prev && (isSuccess && (s.dataFilter && (response = s.dataFilter(response, s.dataType)))), prev = current, current = dataTypes.shift()) {
  2701.         if ("*" === current) {
  2702.           current = prev;
  2703.         } else {
  2704.           if ("*" !== prev && prev !== current) {
  2705.             if (conv = converters[prev + " " + current] || converters["* " + current], !conv) {
  2706.               for (conv2 in converters) {
  2707.                 if (tmp = conv2.split(" "), tmp[1] === current && (conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]])) {
  2708.                   if (conv === true) {
  2709.                     conv = converters[conv2];
  2710.                   } else {
  2711.                     if (converters[conv2] !== true) {
  2712.                       /** @type {string} */
  2713.                       current = tmp[0];
  2714.                       dataTypes.unshift(tmp[1]);
  2715.                     }
  2716.                   }
  2717.                   break;
  2718.                 }
  2719.               }
  2720.             }
  2721.             if (conv !== true) {
  2722.               if (conv && s["throws"]) {
  2723.                 response = conv(response);
  2724.               } else {
  2725.                 try {
  2726.                   response = conv(response);
  2727.                 } catch (e) {
  2728.                   return{
  2729.                     state : "parsererror",
  2730.                     error : conv ? e : "No conversion from " + prev + " to " + current
  2731.                   };
  2732.                 }
  2733.               }
  2734.             }
  2735.           }
  2736.         }
  2737.       }
  2738.     }
  2739.     return{
  2740.       state : "success",
  2741.       data : response
  2742.     };
  2743.   }
  2744.   /**
  2745.    * @param {string} prefix
  2746.    * @param {string} obj
  2747.    * @param {boolean} traditional
  2748.    * @param {Function} add
  2749.    * @return {undefined}
  2750.    */
  2751.   function buildParams(prefix, obj, traditional, add) {
  2752.     var name;
  2753.     if (jQuery.isArray(obj)) {
  2754.       jQuery.each(obj, function(i, v) {
  2755.         if (traditional || rmargin.test(prefix)) {
  2756.           add(prefix, v);
  2757.         } else {
  2758.           buildParams(prefix + "[" + ("object" == typeof v ? i : "") + "]", v, traditional, add);
  2759.         }
  2760.       });
  2761.     } else {
  2762.       if (traditional || "object" !== jQuery.type(obj)) {
  2763.         add(prefix, obj);
  2764.       } else {
  2765.         for (name in obj) {
  2766.           buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
  2767.         }
  2768.       }
  2769.     }
  2770.   }
  2771.   /**
  2772.    * @param {Object} element
  2773.    * @return {?}
  2774.    */
  2775.   function getWindow(element) {
  2776.     return jQuery.isWindow(element) ? element : 9 === element.nodeType && element.defaultView;
  2777.   }
  2778.   /** @type {Array} */
  2779.   var core_deletedIds = [];
  2780.   /** @type {function (this:(Array.<T>|string|{length: number}), *=, *=): Array.<T>} */
  2781.   var core_slice = core_deletedIds.slice;
  2782.   /** @type {function (this:*, ...[*]): Array} */
  2783.   var core_concat = core_deletedIds.concat;
  2784.   /** @type {function (this:(Array.<T>|{length: number}), ...[T]): number} */
  2785.   var core_push = core_deletedIds.push;
  2786.   /** @type {function (this:(Array.<T>|string|{length: number}), T, number=): number} */
  2787.   var core_indexOf = core_deletedIds.indexOf;
  2788.   var class2type = {};
  2789.   /** @type {function (this:*): string} */
  2790.   var core_toString = class2type.toString;
  2791.   /** @type {function (this:Object, *): boolean} */
  2792.   var core_hasOwn = class2type.hasOwnProperty;
  2793.   var support = {};
  2794.   var node = win.document;
  2795.   /** @type {string} */
  2796.   var core_version = "2.1.3";
  2797.   /**
  2798.    * @param {string} selector
  2799.    * @param {Function} context
  2800.    * @return {?}
  2801.    */
  2802.   var jQuery = function(selector, context) {
  2803.     return new jQuery.fn.init(selector, context);
  2804.   };
  2805.   /** @type {RegExp} */
  2806.   var badChars = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
  2807.   /** @type {RegExp} */
  2808.   var rmsPrefix = /^-ms-/;
  2809.   /** @type {RegExp} */
  2810.   var emptyParagraphRegexp = /-([\da-z])/gi;
  2811.   /**
  2812.    * @param {?} all
  2813.    * @param {string} letter
  2814.    * @return {?}
  2815.    */
  2816.   var fcamelCase = function(all, letter) {
  2817.     return letter.toUpperCase();
  2818.   };
  2819.   jQuery.fn = jQuery.prototype = {
  2820.     jquery : core_version,
  2821.     /** @type {function (string, Function): ?} */
  2822.     constructor : jQuery,
  2823.     selector : "",
  2824.     length : 0,
  2825.     /**
  2826.      * @return {?}
  2827.      */
  2828.     toArray : function() {
  2829.       return core_slice.call(this);
  2830.     },
  2831.     /**
  2832.      * @param {Object} num
  2833.      * @return {?}
  2834.      */
  2835.     get : function(num) {
  2836.       return null != num ? 0 > num ? this[num + this.length] : this[num] : core_slice.call(this);
  2837.     },
  2838.     /**
  2839.      * @param {Array} elems
  2840.      * @return {?}
  2841.      */
  2842.     pushStack : function(elems) {
  2843.       var ret = jQuery.merge(this.constructor(), elems);
  2844.       return ret.prevObject = this, ret.context = this.context, ret;
  2845.     },
  2846.     /**
  2847.      * @param {Function} opt_attributes
  2848.      * @param {Function} args
  2849.      * @return {?}
  2850.      */
  2851.     each : function(opt_attributes, args) {
  2852.       return jQuery.each(this, opt_attributes, args);
  2853.     },
  2854.     /**
  2855.      * @param {Function} callback
  2856.      * @return {?}
  2857.      */
  2858.     map : function(callback) {
  2859.       return this.pushStack(jQuery.map(this, function(el, operation) {
  2860.         return callback.call(el, operation, el);
  2861.       }));
  2862.     },
  2863.     /**
  2864.      * @return {?}
  2865.      */
  2866.     slice : function() {
  2867.       return this.pushStack(core_slice.apply(this, arguments));
  2868.     },
  2869.     /**
  2870.      * @return {?}
  2871.      */
  2872.     first : function() {
  2873.       return this.eq(0);
  2874.     },
  2875.     /**
  2876.      * @return {?}
  2877.      */
  2878.     last : function() {
  2879.       return this.eq(-1);
  2880.     },
  2881.     /**
  2882.      * @param {number} idx
  2883.      * @return {?}
  2884.      */
  2885.     eq : function(idx) {
  2886.       var l = this.length;
  2887.       var i = +idx + (0 > idx ? l : 0);
  2888.       return this.pushStack(i >= 0 && l > i ? [this[i]] : []);
  2889.     },
  2890.     /**
  2891.      * @return {?}
  2892.      */
  2893.     end : function() {
  2894.       return this.prevObject || this.constructor(null);
  2895.     },
  2896.     /** @type {function (this:(Array.<T>|{length: number}), ...[T]): number} */
  2897.     push : core_push,
  2898.     /** @type {function (this:(Array.<T>|{length: number}), function (T, T): number=): ?} */
  2899.     sort : core_deletedIds.sort,
  2900.     /** @type {function (this:(Array.<T>|{length: number}), *=, *=, ...[T]): Array.<T>} */
  2901.     splice : core_deletedIds.splice
  2902.   };
  2903.   /** @type {function (): ?} */
  2904.   jQuery.extend = jQuery.fn.extend = function() {
  2905.     var options;
  2906.     var name;
  2907.     var src;
  2908.     var copy;
  2909.     var copyIsArray;
  2910.     var clone;
  2911.     var target = arguments[0] || {};
  2912.     /** @type {number} */
  2913.     var i = 1;
  2914.     /** @type {number} */
  2915.     var l = arguments.length;
  2916.     /** @type {boolean} */
  2917.     var deep = false;
  2918.     if ("boolean" == typeof target) {
  2919.       /** @type {boolean} */
  2920.       deep = target;
  2921.       target = arguments[i] || {};
  2922.       i++;
  2923.     }
  2924.     if (!("object" == typeof target)) {
  2925.       if (!jQuery.isFunction(target)) {
  2926.         target = {};
  2927.       }
  2928.     }
  2929.     if (i === l) {
  2930.       target = this;
  2931.       i--;
  2932.     }
  2933.     for (;l > i;i++) {
  2934.       if (null != (options = arguments[i])) {
  2935.         for (name in options) {
  2936.           src = target[name];
  2937.           copy = options[name];
  2938.           if (target !== copy) {
  2939.             if (deep && (copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy))))) {
  2940.               if (copyIsArray) {
  2941.                 /** @type {boolean} */
  2942.                 copyIsArray = false;
  2943.                 clone = src && jQuery.isArray(src) ? src : [];
  2944.               } else {
  2945.                 clone = src && jQuery.isPlainObject(src) ? src : {};
  2946.               }
  2947.               target[name] = jQuery.extend(deep, clone, copy);
  2948.             } else {
  2949.               if (void 0 !== copy) {
  2950.                 target[name] = copy;
  2951.               }
  2952.             }
  2953.           }
  2954.         }
  2955.       }
  2956.     }
  2957.     return target;
  2958.   };
  2959.   jQuery.extend({
  2960.     expando : "jQuery" + (core_version + Math.random()).replace(/\D/g, ""),
  2961.     isReady : true,
  2962.     /**
  2963.      * @param {string} type
  2964.      * @return {?}
  2965.      */
  2966.     error : function(type) {
  2967.       throw new Error(type);
  2968.     },
  2969.     /**
  2970.      * @return {undefined}
  2971.      */
  2972.     noop : function() {
  2973.     },
  2974.     /**
  2975.      * @param {string} obj
  2976.      * @return {?}
  2977.      */
  2978.     isFunction : function(obj) {
  2979.       return "function" === jQuery.type(obj);
  2980.     },
  2981.     /** @type {function (*): boolean} */
  2982.     isArray : Array.isArray,
  2983.     /**
  2984.      * @param {Object} obj
  2985.      * @return {?}
  2986.      */
  2987.     isWindow : function(obj) {
  2988.       return null != obj && obj === obj.window;
  2989.     },
  2990.     /**
  2991.      * @param {string} val
  2992.      * @return {?}
  2993.      */
  2994.     isNumeric : function(val) {
  2995.       return!jQuery.isArray(val) && val - parseFloat(val) + 1 >= 0;
  2996.     },
  2997.     /**
  2998.      * @param {Object} obj
  2999.      * @return {?}
  3000.      */
  3001.     isPlainObject : function(obj) {
  3002.       return "object" !== jQuery.type(obj) || (obj.nodeType || jQuery.isWindow(obj)) ? false : obj.constructor && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ? false : true;
  3003.     },
  3004.     /**
  3005.      * @param {?} obj
  3006.      * @return {?}
  3007.      */
  3008.     isEmptyObject : function(obj) {
  3009.       var prop;
  3010.       for (prop in obj) {
  3011.         return false;
  3012.       }
  3013.       return true;
  3014.     },
  3015.     /**
  3016.      * @param {string} type
  3017.      * @return {?}
  3018.      */
  3019.     type : function(type) {
  3020.       return null == type ? type + "" : "object" == typeof type || "function" == typeof type ? class2type[core_toString.call(type)] || "object" : typeof type;
  3021.     },
  3022.     /**
  3023.      * @param {string} code
  3024.      * @return {undefined}
  3025.      */
  3026.     globalEval : function(code) {
  3027.       var script;
  3028.       /** @type {function (string): *} */
  3029.       var indirect = eval;
  3030.       code = jQuery.trim(code);
  3031.       if (code) {
  3032.         if (1 === code.indexOf("use strict")) {
  3033.           script = node.createElement("script");
  3034.           /** @type {string} */
  3035.           script.text = code;
  3036.           node.head.appendChild(script).parentNode.removeChild(script);
  3037.         } else {
  3038.           indirect(code);
  3039.         }
  3040.       }
  3041.     },
  3042.     /**
  3043.      * @param {string} string
  3044.      * @return {?}
  3045.      */
  3046.     camelCase : function(string) {
  3047.       return string.replace(rmsPrefix, "ms-").replace(emptyParagraphRegexp, fcamelCase);
  3048.     },
  3049.     /**
  3050.      * @param {Node} elem
  3051.      * @param {string} name
  3052.      * @return {?}
  3053.      */
  3054.     nodeName : function(elem, name) {
  3055.       return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
  3056.     },
  3057.     /**
  3058.      * @param {Function} obj
  3059.      * @param {Function} callback
  3060.      * @param {(Error|string)} args
  3061.      * @return {?}
  3062.      */
  3063.     each : function(obj, callback, args) {
  3064.       var value;
  3065.       /** @type {number} */
  3066.       var i = 0;
  3067.       var l = obj.length;
  3068.       var isArray = isArraylike(obj);
  3069.       if (args) {
  3070.         if (isArray) {
  3071.           for (;l > i && (value = callback.apply(obj[i], args), value !== false);i++) {
  3072.           }
  3073.         } else {
  3074.           for (i in obj) {
  3075.             if (value = callback.apply(obj[i], args), value === false) {
  3076.               break;
  3077.             }
  3078.           }
  3079.         }
  3080.       } else {
  3081.         if (isArray) {
  3082.           for (;l > i && (value = callback.call(obj[i], i, obj[i]), value !== false);i++) {
  3083.           }
  3084.         } else {
  3085.           for (i in obj) {
  3086.             if (value = callback.call(obj[i], i, obj[i]), value === false) {
  3087.               break;
  3088.             }
  3089.           }
  3090.         }
  3091.       }
  3092.       return obj;
  3093.     },
  3094.     /**
  3095.      * @param {Object} text
  3096.      * @return {?}
  3097.      */
  3098.     trim : function(text) {
  3099.       return null == text ? "" : (text + "").replace(badChars, "");
  3100.     },
  3101.     /**
  3102.      * @param {?} arr
  3103.      * @param {Array} results
  3104.      * @return {?}
  3105.      */
  3106.     makeArray : function(arr, results) {
  3107.       var ret = results || [];
  3108.       return null != arr && (isArraylike(Object(arr)) ? jQuery.merge(ret, "string" == typeof arr ? [arr] : arr) : core_push.call(ret, arr)), ret;
  3109.     },
  3110.     /**
  3111.      * @param {?} elem
  3112.      * @param {?} arr
  3113.      * @param {?} i
  3114.      * @return {?}
  3115.      */
  3116.     inArray : function(elem, arr, i) {
  3117.       return null == arr ? -1 : core_indexOf.call(arr, elem, i);
  3118.     },
  3119.     /**
  3120.      * @param {Array} first
  3121.      * @param {?} second
  3122.      * @return {?}
  3123.      */
  3124.     merge : function(first, second) {
  3125.       /** @type {number} */
  3126.       var jlen = +second.length;
  3127.       /** @type {number} */
  3128.       var j = 0;
  3129.       var i = first.length;
  3130.       for (;jlen > j;j++) {
  3131.         first[i++] = second[j];
  3132.       }
  3133.       return first.length = i, first;
  3134.     },
  3135.     /**
  3136.      * @param {Array} elems
  3137.      * @param {Function} callback
  3138.      * @param {?} inv
  3139.      * @return {?}
  3140.      */
  3141.     grep : function(elems, callback, inv) {
  3142.       var val;
  3143.       /** @type {Array} */
  3144.       var ret = [];
  3145.       /** @type {number} */
  3146.       var i = 0;
  3147.       var l = elems.length;
  3148.       /** @type {boolean} */
  3149.       var skip = !inv;
  3150.       for (;l > i;i++) {
  3151.         /** @type {boolean} */
  3152.         val = !callback(elems[i], i);
  3153.         if (val !== skip) {
  3154.           ret.push(elems[i]);
  3155.         }
  3156.       }
  3157.       return ret;
  3158.     },
  3159.     /**
  3160.      * @param {Object} elems
  3161.      * @param {Function} callback
  3162.      * @param {boolean} arg
  3163.      * @return {?}
  3164.      */
  3165.     map : function(elems, callback, arg) {
  3166.       var value;
  3167.       /** @type {number} */
  3168.       var i = 0;
  3169.       var l = elems.length;
  3170.       var isArray = isArraylike(elems);
  3171.       /** @type {Array} */
  3172.       var args = [];
  3173.       if (isArray) {
  3174.         for (;l > i;i++) {
  3175.           value = callback(elems[i], i, arg);
  3176.           if (null != value) {
  3177.             args.push(value);
  3178.           }
  3179.         }
  3180.       } else {
  3181.         for (i in elems) {
  3182.           value = callback(elems[i], i, arg);
  3183.           if (null != value) {
  3184.             args.push(value);
  3185.           }
  3186.         }
  3187.       }
  3188.       return core_concat.apply([], args);
  3189.     },
  3190.     guid : 1,
  3191.     /**
  3192.      * @param {Function} fn
  3193.      * @param {(Function|string)} context
  3194.      * @return {?}
  3195.      */
  3196.     proxy : function(fn, context) {
  3197.       var tmp;
  3198.       var args;
  3199.       var proxy;
  3200.       return "string" == typeof context && (tmp = fn[context], context = fn, fn = tmp), jQuery.isFunction(fn) ? (args = core_slice.call(arguments, 2), proxy = function() {
  3201.         return fn.apply(context || this, args.concat(core_slice.call(arguments)));
  3202.       }, proxy.guid = fn.guid = fn.guid || jQuery.guid++, proxy) : void 0;
  3203.     },
  3204.     /** @type {function (): number} */
  3205.     now : Date.now,
  3206.     support : support
  3207.   });
  3208.   jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(dataAndEvents, m3) {
  3209.     class2type["[object " + m3 + "]"] = m3.toLowerCase();
  3210.   });
  3211.   var Sizzle = function(win) {
  3212.     /**
  3213.      * @param {string} selector
  3214.      * @param {Object} context
  3215.      * @param {Array} results
  3216.      * @param {Array} seed
  3217.      * @return {?}
  3218.      */
  3219.     function Sizzle(selector, context, results, seed) {
  3220.       var match;
  3221.       var elem;
  3222.       var id;
  3223.       var type;
  3224.       var i;
  3225.       var groups;
  3226.       var old;
  3227.       var nid;
  3228.       var newContext;
  3229.       var newSelector;
  3230.       if ((context ? context.ownerDocument || context : preferredDoc) !== doc && setDocument(context), context = context || doc, results = results || [], type = context.nodeType, "string" != typeof selector || (!selector || 1 !== type && (9 !== type && 11 !== type))) {
  3231.         return results;
  3232.       }
  3233.       if (!seed && documentIsHTML) {
  3234.         if (11 !== type && (match = rquickExpr.exec(selector))) {
  3235.           if (id = match[1]) {
  3236.             if (9 === type) {
  3237.               if (elem = context.getElementById(id), !elem || !elem.parentNode) {
  3238.                 return results;
  3239.               }
  3240.               if (elem.id === id) {
  3241.                 return results.push(elem), results;
  3242.               }
  3243.             } else {
  3244.               if (context.ownerDocument && ((elem = context.ownerDocument.getElementById(id)) && (contains(context, elem) && elem.id === id))) {
  3245.                 return results.push(elem), results;
  3246.               }
  3247.             }
  3248.           } else {
  3249.             if (match[2]) {
  3250.               return push.apply(results, context.getElementsByTagName(selector)), results;
  3251.             }
  3252.             if ((id = match[3]) && support.getElementsByClassName) {
  3253.               return push.apply(results, context.getElementsByClassName(id)), results;
  3254.             }
  3255.           }
  3256.         }
  3257.         if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
  3258.           if (nid = old = expando, newContext = context, newSelector = 1 !== type && selector, 1 === type && "object" !== context.nodeName.toLowerCase()) {
  3259.             groups = tokenize(selector);
  3260.             if (old = context.getAttribute("id")) {
  3261.               nid = old.replace(r20, "\\$&");
  3262.             } else {
  3263.               context.setAttribute("id", nid);
  3264.             }
  3265.             /** @type {string} */
  3266.             nid = "[id='" + nid + "'] ";
  3267.             i = groups.length;
  3268.             for (;i--;) {
  3269.               /** @type {string} */
  3270.               groups[i] = nid + toSelector(groups[i]);
  3271.             }
  3272.             newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
  3273.             newSelector = groups.join(",");
  3274.           }
  3275.           if (newSelector) {
  3276.             try {
  3277.               return push.apply(results, newContext.querySelectorAll(newSelector)), results;
  3278.             } catch (m) {
  3279.             } finally {
  3280.               if (!old) {
  3281.                 context.removeAttribute("id");
  3282.               }
  3283.             }
  3284.           }
  3285.         }
  3286.       }
  3287.       return select(selector.replace(rtrim, "$1"), context, results, seed);
  3288.     }
  3289.     /**
  3290.      * @return {?}
  3291.      */
  3292.     function createCache() {
  3293.       /**
  3294.        * @param {string} key
  3295.        * @param {?} value
  3296.        * @return {?}
  3297.        */
  3298.       function cache(key, value) {
  3299.         return buf.push(key + " ") > Expr.cacheLength && delete cache[buf.shift()], cache[key + " "] = value;
  3300.       }
  3301.       /** @type {Array} */
  3302.       var buf = [];
  3303.       return cache;
  3304.     }
  3305.     /**
  3306.      * @param {Function} fn
  3307.      * @return {?}
  3308.      */
  3309.     function markFunction(fn) {
  3310.       return fn[expando] = true, fn;
  3311.     }
  3312.     /**
  3313.      * @param {Function} fn
  3314.      * @return {?}
  3315.      */
  3316.     function assert(fn) {
  3317.       var t = doc.createElement("div");
  3318.       try {
  3319.         return!!fn(t);
  3320.       } catch (n) {
  3321.         return false;
  3322.       } finally {
  3323.         if (t.parentNode) {
  3324.           t.parentNode.removeChild(t);
  3325.         }
  3326.         /** @type {null} */
  3327.         t = null;
  3328.       }
  3329.     }
  3330.     /**
  3331.      * @param {string} attrs
  3332.      * @param {Function} handler
  3333.      * @return {undefined}
  3334.      */
  3335.     function addHandle(attrs, handler) {
  3336.       var arr = attrs.split("|");
  3337.       var i = attrs.length;
  3338.       for (;i--;) {
  3339.         /** @type {Function} */
  3340.         Expr.attrHandle[arr[i]] = handler;
  3341.       }
  3342.     }
  3343.     /**
  3344.      * @param {Object} a
  3345.      * @param {Object} b
  3346.      * @return {?}
  3347.      */
  3348.     function siblingCheck(a, b) {
  3349.       var cur = b && a;
  3350.       var diff = cur && (1 === a.nodeType && (1 === b.nodeType && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE)));
  3351.       if (diff) {
  3352.         return diff;
  3353.       }
  3354.       if (cur) {
  3355.         for (;cur = cur.nextSibling;) {
  3356.           if (cur === b) {
  3357.             return-1;
  3358.           }
  3359.         }
  3360.       }
  3361.       return a ? 1 : -1;
  3362.     }
  3363.     /**
  3364.      * @param {?} type
  3365.      * @return {?}
  3366.      */
  3367.     function createInputPseudo(type) {
  3368.       return function(elem) {
  3369.         var b = elem.nodeName.toLowerCase();
  3370.         return "input" === b && elem.type === type;
  3371.       };
  3372.     }
  3373.     /**
  3374.      * @param {?} type
  3375.      * @return {?}
  3376.      */
  3377.     function createButtonPseudo(type) {
  3378.       return function(elem) {
  3379.         var NULL = elem.nodeName.toLowerCase();
  3380.         return("input" === NULL || "button" === NULL) && elem.type === type;
  3381.       };
  3382.     }
  3383.     /**
  3384.      * @param {Function} fn
  3385.      * @return {?}
  3386.      */
  3387.     function createPositionalPseudo(fn) {
  3388.       return markFunction(function(argument) {
  3389.         return argument = +argument, markFunction(function(seed, matches) {
  3390.           var j;
  3391.           var matchIndexes = fn([], seed.length, argument);
  3392.           var i = matchIndexes.length;
  3393.           for (;i--;) {
  3394.             if (seed[j = matchIndexes[i]]) {
  3395.               /** @type {boolean} */
  3396.               seed[j] = !(matches[j] = seed[j]);
  3397.             }
  3398.           }
  3399.         });
  3400.       });
  3401.     }
  3402.     /**
  3403.      * @param {Object} context
  3404.      * @return {?}
  3405.      */
  3406.     function testContext(context) {
  3407.       return context && ("undefined" != typeof context.getElementsByTagName && context);
  3408.     }
  3409.     /**
  3410.      * @return {undefined}
  3411.      */
  3412.     function setFilters() {
  3413.     }
  3414.     /**
  3415.      * @param {Array} tokens
  3416.      * @return {?}
  3417.      */
  3418.     function toSelector(tokens) {
  3419.       /** @type {number} */
  3420.       var i = 0;
  3421.       var nTokens = tokens.length;
  3422.       /** @type {string} */
  3423.       var selector = "";
  3424.       for (;nTokens > i;i++) {
  3425.         selector += tokens[i].value;
  3426.       }
  3427.       return selector;
  3428.     }
  3429.     /**
  3430.      * @param {Function} matcher
  3431.      * @param {Object} combinator
  3432.      * @param {boolean} dataAndEvents
  3433.      * @return {?}
  3434.      */
  3435.     function addCombinator(matcher, combinator, dataAndEvents) {
  3436.       var dir = combinator.dir;
  3437.       var i = dataAndEvents && "parentNode" === dir;
  3438.       /** @type {number} */
  3439.       var doneName = done++;
  3440.       return combinator.first ? function(elem, context, xml) {
  3441.         for (;elem = elem[dir];) {
  3442.           if (1 === elem.nodeType || i) {
  3443.             return matcher(elem, context, xml);
  3444.           }
  3445.         }
  3446.       } : function(elem, context, xml) {
  3447.         var oldCache;
  3448.         var outerCache;
  3449.         /** @type {Array} */
  3450.         var newCache = [dirruns, doneName];
  3451.         if (xml) {
  3452.           for (;elem = elem[dir];) {
  3453.             if ((1 === elem.nodeType || i) && matcher(elem, context, xml)) {
  3454.               return true;
  3455.             }
  3456.           }
  3457.         } else {
  3458.           for (;elem = elem[dir];) {
  3459.             if (1 === elem.nodeType || i) {
  3460.               if (outerCache = elem[expando] || (elem[expando] = {}), (oldCache = outerCache[dir]) && (oldCache[0] === dirruns && oldCache[1] === doneName)) {
  3461.                 return newCache[2] = oldCache[2];
  3462.               }
  3463.               if (outerCache[dir] = newCache, newCache[2] = matcher(elem, context, xml)) {
  3464.                 return true;
  3465.               }
  3466.             }
  3467.           }
  3468.         }
  3469.       };
  3470.     }
  3471.     /**
  3472.      * @param {Array} matchers
  3473.      * @return {?}
  3474.      */
  3475.     function elementMatcher(matchers) {
  3476.       return matchers.length > 1 ? function(elem, context, xml) {
  3477.         var i = matchers.length;
  3478.         for (;i--;) {
  3479.           if (!matchers[i](elem, context, xml)) {
  3480.             return false;
  3481.           }
  3482.         }
  3483.         return true;
  3484.       } : matchers[0];
  3485.     }
  3486.     /**
  3487.      * @param {string} selector
  3488.      * @param {Array} contexts
  3489.      * @param {?} results
  3490.      * @return {?}
  3491.      */
  3492.     function multipleContexts(selector, contexts, results) {
  3493.       /** @type {number} */
  3494.       var i = 0;
  3495.       var len = contexts.length;
  3496.       for (;len > i;i++) {
  3497.         Sizzle(selector, contexts[i], results);
  3498.       }
  3499.       return results;
  3500.     }
  3501.     /**
  3502.      * @param {Array} unmatched
  3503.      * @param {Object} map
  3504.      * @param {string} filter
  3505.      * @param {Object} context
  3506.      * @param {boolean} xml
  3507.      * @return {?}
  3508.      */
  3509.     function condense(unmatched, map, filter, context, xml) {
  3510.       var elem;
  3511.       /** @type {Array} */
  3512.       var newUnmatched = [];
  3513.       /** @type {number} */
  3514.       var i = 0;
  3515.       var len = unmatched.length;
  3516.       /** @type {boolean} */
  3517.       var c = null != map;
  3518.       for (;len > i;i++) {
  3519.         if (elem = unmatched[i]) {
  3520.           if (!filter || filter(elem, context, xml)) {
  3521.             newUnmatched.push(elem);
  3522.             if (c) {
  3523.               map.push(i);
  3524.             }
  3525.           }
  3526.         }
  3527.       }
  3528.       return newUnmatched;
  3529.     }
  3530.     /**
  3531.      * @param {string} preFilter
  3532.      * @param {Object} selector
  3533.      * @param {boolean} matcher
  3534.      * @param {Object} postFilter
  3535.      * @param {Object} postFinder
  3536.      * @param {Object} postSelector
  3537.      * @return {?}
  3538.      */
  3539.     function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
  3540.       return postFilter && (!postFilter[expando] && (postFilter = setMatcher(postFilter))), postFinder && (!postFinder[expando] && (postFinder = setMatcher(postFinder, postSelector))), markFunction(function(seed, results, context, xml) {
  3541.         var fix;
  3542.         var i;
  3543.         var elem;
  3544.         /** @type {Array} */
  3545.         var preMap = [];
  3546.         /** @type {Array} */
  3547.         var postMap = [];
  3548.         var preexisting = results.length;
  3549.         var elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []);
  3550.         var matcherIn = !preFilter || !seed && selector ? elems : condense(elems, preMap, preFilter, context, xml);
  3551.         var matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;
  3552.         if (matcher && matcher(matcherIn, matcherOut, context, xml), postFilter) {
  3553.           fix = condense(matcherOut, postMap);
  3554.           postFilter(fix, [], context, xml);
  3555.           i = fix.length;
  3556.           for (;i--;) {
  3557.             if (elem = fix[i]) {
  3558.               /** @type {boolean} */
  3559.               matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
  3560.             }
  3561.           }
  3562.         }
  3563.         if (seed) {
  3564.           if (postFinder || preFilter) {
  3565.             if (postFinder) {
  3566.               /** @type {Array} */
  3567.               fix = [];
  3568.               i = matcherOut.length;
  3569.               for (;i--;) {
  3570.                 if (elem = matcherOut[i]) {
  3571.                   fix.push(matcherIn[i] = elem);
  3572.                 }
  3573.               }
  3574.               postFinder(null, matcherOut = [], fix, xml);
  3575.             }
  3576.             i = matcherOut.length;
  3577.             for (;i--;) {
  3578.               if (elem = matcherOut[i]) {
  3579.                 if ((fix = postFinder ? sortFunction(seed, elem) : preMap[i]) > -1) {
  3580.                   /** @type {boolean} */
  3581.                   seed[fix] = !(results[fix] = elem);
  3582.                 }
  3583.               }
  3584.             }
  3585.           }
  3586.         } else {
  3587.           matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
  3588.           if (postFinder) {
  3589.             postFinder(null, results, matcherOut, xml);
  3590.           } else {
  3591.             push.apply(results, matcherOut);
  3592.           }
  3593.         }
  3594.       });
  3595.     }
  3596.     /**
  3597.      * @param {Object} tokens
  3598.      * @return {?}
  3599.      */
  3600.     function matcherFromTokens(tokens) {
  3601.       var a;
  3602.       var matcher;
  3603.       var j;
  3604.       var len = tokens.length;
  3605.       var leadingRelative = Expr.relative[tokens[0].type];
  3606.       var implicitRelative = leadingRelative || Expr.relative[" "];
  3607.       /** @type {number} */
  3608.       var i = leadingRelative ? 1 : 0;
  3609.       var matchContext = addCombinator(function(out) {
  3610.         return out === a;
  3611.       }, implicitRelative, true);
  3612.       var matchAnyContext = addCombinator(function(b) {
  3613.         return sortFunction(a, b) > -1;
  3614.       }, implicitRelative, true);
  3615.       /** @type {Array} */
  3616.       var matchers = [function(elem, context, xml) {
  3617.         var i = !leadingRelative && (xml || context !== outermostContext) || ((a = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
  3618.         return a = null, i;
  3619.       }];
  3620.       for (;len > i;i++) {
  3621.         if (matcher = Expr.relative[tokens[i].type]) {
  3622.           /** @type {Array} */
  3623.           matchers = [addCombinator(elementMatcher(matchers), matcher)];
  3624.         } else {
  3625.           if (matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches), matcher[expando]) {
  3626.             /** @type {number} */
  3627.             j = ++i;
  3628.             for (;len > j && !Expr.relative[tokens[j].type];j++) {
  3629.             }
  3630.             return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(tokens.slice(0, i - 1).concat({
  3631.               value : " " === tokens[i - 2].type ? "*" : ""
  3632.             })).replace(rtrim, "$1"), matcher, j > i && matcherFromTokens(tokens.slice(i, j)), len > j && matcherFromTokens(tokens = tokens.slice(j)), len > j && toSelector(tokens));
  3633.           }
  3634.           matchers.push(matcher);
  3635.         }
  3636.       }
  3637.       return elementMatcher(matchers);
  3638.     }
  3639.     /**
  3640.      * @param {Array} elementMatchers
  3641.      * @param {Array} setMatchers
  3642.      * @return {?}
  3643.      */
  3644.     function matcherFromGroupMatchers(elementMatchers, setMatchers) {
  3645.       /** @type {boolean} */
  3646.       var bySet = setMatchers.length > 0;
  3647.       /** @type {boolean} */
  3648.       var triggerElem = elementMatchers.length > 0;
  3649.       /**
  3650.        * @param {HTMLElement} dataAndEvents
  3651.        * @param {Function} context
  3652.        * @param {?} xml
  3653.        * @param {Array} results
  3654.        * @param {Element} seed
  3655.        * @return {?}
  3656.        */
  3657.       var superMatcher = function(dataAndEvents, context, xml, results, seed) {
  3658.         var elem;
  3659.         var j;
  3660.         var matcher;
  3661.         /** @type {number} */
  3662.         var matchedCount = 0;
  3663.         /** @type {string} */
  3664.         var i = "0";
  3665.         var scripts = dataAndEvents && [];
  3666.         /** @type {Array} */
  3667.         var setMatched = [];
  3668.         var contextBackup = outermostContext;
  3669.         var unmatched = dataAndEvents || triggerElem && Expr.find.TAG("*", seed);
  3670.         var dirrunsUnique = dirruns += null == contextBackup ? 1 : Math.random() || 0.1;
  3671.         var len = unmatched.length;
  3672.         if (seed) {
  3673.           outermostContext = context !== doc && context;
  3674.         }
  3675.         for (;i !== len && null != (elem = unmatched[i]);i++) {
  3676.           if (triggerElem && elem) {
  3677.             /** @type {number} */
  3678.             j = 0;
  3679.             for (;matcher = elementMatchers[j++];) {
  3680.               if (matcher(elem, context, xml)) {
  3681.                 results.push(elem);
  3682.                 break;
  3683.               }
  3684.             }
  3685.             if (seed) {
  3686.               dirruns = dirrunsUnique;
  3687.             }
  3688.           }
  3689.           if (bySet) {
  3690.             if (elem = !matcher && elem) {
  3691.               matchedCount--;
  3692.             }
  3693.             if (dataAndEvents) {
  3694.               scripts.push(elem);
  3695.             }
  3696.           }
  3697.         }
  3698.         if (matchedCount += i, bySet && i !== matchedCount) {
  3699.           /** @type {number} */
  3700.           j = 0;
  3701.           for (;matcher = setMatchers[j++];) {
  3702.             matcher(scripts, setMatched, context, xml);
  3703.           }
  3704.           if (dataAndEvents) {
  3705.             if (matchedCount > 0) {
  3706.               for (;i--;) {
  3707.                 if (!scripts[i]) {
  3708.                   if (!setMatched[i]) {
  3709.                     setMatched[i] = pop.call(results);
  3710.                   }
  3711.                 }
  3712.               }
  3713.             }
  3714.             setMatched = condense(setMatched);
  3715.           }
  3716.           push.apply(results, setMatched);
  3717.           if (seed) {
  3718.             if (!dataAndEvents) {
  3719.               if (setMatched.length > 0) {
  3720.                 if (matchedCount + setMatchers.length > 1) {
  3721.                   Sizzle.uniqueSort(results);
  3722.                 }
  3723.               }
  3724.             }
  3725.           }
  3726.         }
  3727.         return seed && (dirruns = dirrunsUnique, outermostContext = contextBackup), scripts;
  3728.       };
  3729.       return bySet ? markFunction(superMatcher) : superMatcher;
  3730.     }
  3731.     var i;
  3732.     var support;
  3733.     var Expr;
  3734.     var getText;
  3735.     var objectToString;
  3736.     var tokenize;
  3737.     var compile;
  3738.     var select;
  3739.     var outermostContext;
  3740.     var sortInput;
  3741.     var D;
  3742.     var setDocument;
  3743.     var doc;
  3744.     var docElem;
  3745.     var documentIsHTML;
  3746.     var rbuggyQSA;
  3747.     var rbuggyMatches;
  3748.     var matches;
  3749.     var contains;
  3750.     /** @type {string} */
  3751.     var expando = "sizzle" + 1 * new Date;
  3752.     var preferredDoc = win.document;
  3753.     /** @type {number} */
  3754.     var dirruns = 0;
  3755.     /** @type {number} */
  3756.     var done = 0;
  3757.     var classCache = createCache();
  3758.     var tokenCache = createCache();
  3759.     var compilerCache = createCache();
  3760.     /**
  3761.      * @param {?} a
  3762.      * @param {?} b
  3763.      * @return {?}
  3764.      */
  3765.     var sortOrder = function(a, b) {
  3766.       return a === b && (D = true), 0;
  3767.     };
  3768.     /** @type {number} */
  3769.     var MAX_NEGATIVE = 1 << 31;
  3770.     /** @type {function (this:Object, *): boolean} */
  3771.     var hasOwn = {}.hasOwnProperty;
  3772.     /** @type {Array} */
  3773.     var arr = [];
  3774.     /** @type {function (this:(Array.<T>|{length: number})): T} */
  3775.     var pop = arr.pop;
  3776.     /** @type {function (this:(Array.<T>|{length: number}), ...[T]): number} */
  3777.     var f = arr.push;
  3778.     /** @type {function (this:(Array.<T>|{length: number}), ...[T]): number} */
  3779.     var push = arr.push;
  3780.     /** @type {function (this:(Array.<T>|string|{length: number}), *=, *=): Array.<T>} */
  3781.     var slice = arr.slice;
  3782.     /**
  3783.      * @param {Object} v
  3784.      * @param {?} o
  3785.      * @return {?}
  3786.      */
  3787.     var sortFunction = function(v, o) {
  3788.       /** @type {number} */
  3789.       var reckey = 0;
  3790.       var pad = v.length;
  3791.       for (;pad > reckey;reckey++) {
  3792.         if (v[reckey] === o) {
  3793.           return reckey;
  3794.         }
  3795.       }
  3796.       return-1;
  3797.     };
  3798.     /** @type {string} */
  3799.     var booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped";
  3800.     /** @type {string} */
  3801.     var whitespace = "[\\x20\\t\\r\\n\\f]";
  3802.     /** @type {string} */
  3803.     var characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+";
  3804.     /** @type {string} */
  3805.     var identifier = characterEncoding.replace("w", "w#");
  3806.     /** @type {string} */
  3807.     var attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + "*([*^$|!~]?=)" + whitespace + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]";
  3808.     /** @type {string} */
  3809.     var pseudos = ":(" + characterEncoding + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|.*)\\)|)";
  3810.     /** @type {RegExp} */
  3811.     var regexp = new RegExp(whitespace + "+", "g");
  3812.     /** @type {RegExp} */
  3813.     var rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g");
  3814.     /** @type {RegExp} */
  3815.     var rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*");
  3816.     /** @type {RegExp} */
  3817.     var rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*");
  3818.     /** @type {RegExp} */
  3819.     var rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g");
  3820.     /** @type {RegExp} */
  3821.     var rpseudo = new RegExp(pseudos);
  3822.     /** @type {RegExp} */
  3823.     var ridentifier = new RegExp("^" + identifier + "$");
  3824.     var matchExpr = {
  3825.       ID : new RegExp("^#(" + characterEncoding + ")"),
  3826.       CLASS : new RegExp("^\\.(" + characterEncoding + ")"),
  3827.       TAG : new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),
  3828.       ATTR : new RegExp("^" + attributes),
  3829.       PSEUDO : new RegExp("^" + pseudos),
  3830.       CHILD : new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
  3831.       bool : new RegExp("^(?:" + booleans + ")$", "i"),
  3832.       needsContext : new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
  3833.     };
  3834.     /** @type {RegExp} */
  3835.     var rinputs = /^(?:input|select|textarea|button)$/i;
  3836.     /** @type {RegExp} */
  3837.     var rheader = /^h\d$/i;
  3838.     /** @type {RegExp} */
  3839.     var rnative = /^[^{]+\{\s*\[native \w/;
  3840.     /** @type {RegExp} */
  3841.     var rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/;
  3842.     /** @type {RegExp} */
  3843.     var rsibling = /[+~]/;
  3844.     /** @type {RegExp} */
  3845.     var r20 = /'|\\/g;
  3846.     /** @type {RegExp} */
  3847.     var runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig");
  3848.     /**
  3849.      * @param {?} _
  3850.      * @param {(number|string)} escaped
  3851.      * @param {boolean} escapedWhitespace
  3852.      * @return {?}
  3853.      */
  3854.     var funescape = function(_, escaped, escapedWhitespace) {
  3855.       /** @type {number} */
  3856.       var high = "0x" + escaped - 65536;
  3857.       return high !== high || escapedWhitespace ? escaped : 0 > high ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, 1023 & high | 56320);
  3858.     };
  3859.     /**
  3860.      * @return {undefined}
  3861.      */
  3862.     var onComplete = function() {
  3863.       setDocument();
  3864.     };
  3865.     try {
  3866.       push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
  3867.       arr[preferredDoc.childNodes.length].nodeType;
  3868.     } catch (kt) {
  3869.       push = {
  3870.         /** @type {function (?, ?): undefined} */
  3871.         apply : arr.length ? function(obj, args) {
  3872.           f.apply(obj, slice.call(args));
  3873.         } : function(obj, var_args) {
  3874.           var j = obj.length;
  3875.           /** @type {number} */
  3876.           var r = 0;
  3877.           for (;obj[j++] = var_args[r++];) {
  3878.           }
  3879.           /** @type {number} */
  3880.           obj.length = j - 1;
  3881.         }
  3882.       };
  3883.     }
  3884.     support = Sizzle.support = {};
  3885.     /** @type {function (Object): ?} */
  3886.     objectToString = Sizzle.isXML = function(elem) {
  3887.       var node = elem && (elem.ownerDocument || elem).documentElement;
  3888.       return node ? "HTML" !== node.nodeName : false;
  3889.     };
  3890.     /** @type {function (Object): ?} */
  3891.     setDocument = Sizzle.setDocument = function(node) {
  3892.       var hasCompare;
  3893.       var parent;
  3894.       var d = node ? node.ownerDocument || node : preferredDoc;
  3895.       return d !== doc && (9 === d.nodeType && d.documentElement) ? (doc = d, docElem = d.documentElement, parent = d.defaultView, parent && (parent !== parent.top && (parent.addEventListener ? parent.addEventListener("unload", onComplete, false) : parent.attachEvent && parent.attachEvent("onunload", onComplete))), documentIsHTML = !objectToString(d), support.attributes = assert(function(div) {
  3896.         return div.className = "i", !div.getAttribute("className");
  3897.       }), support.getElementsByTagName = assert(function(div) {
  3898.         return div.appendChild(d.createComment("")), !div.getElementsByTagName("*").length;
  3899.       }), support.getElementsByClassName = rnative.test(d.getElementsByClassName), support.getById = assert(function(div) {
  3900.         return docElem.appendChild(div).id = expando, !d.getElementsByName || !d.getElementsByName(expando).length;
  3901.       }), support.getById ? (Expr.find.ID = function(id, context) {
  3902.         if ("undefined" != typeof context.getElementById && documentIsHTML) {
  3903.           var m = context.getElementById(id);
  3904.           return m && m.parentNode ? [m] : [];
  3905.         }
  3906.       }, Expr.filter.ID = function(id) {
  3907.         var attrId = id.replace(runescape, funescape);
  3908.         return function(elem) {
  3909.           return elem.getAttribute("id") === attrId;
  3910.         };
  3911.       }) : (delete Expr.find.ID, Expr.filter.ID = function(id) {
  3912.         var attrId = id.replace(runescape, funescape);
  3913.         return function(elem) {
  3914.           var node = "undefined" != typeof elem.getAttributeNode && elem.getAttributeNode("id");
  3915.           return node && node.value === attrId;
  3916.         };
  3917.       }), Expr.find.TAG = support.getElementsByTagName ? function(selector, el) {
  3918.         return "undefined" != typeof el.getElementsByTagName ? el.getElementsByTagName(selector) : support.qsa ? el.querySelectorAll(selector) : void 0;
  3919.       } : function(tag, from) {
  3920.         var cur;
  3921.         /** @type {Array} */
  3922.         var eventPath = [];
  3923.         /** @type {number} */
  3924.         var ri = 0;
  3925.         var tmp = from.getElementsByTagName(tag);
  3926.         if ("*" === tag) {
  3927.           for (;cur = tmp[ri++];) {
  3928.             if (1 === cur.nodeType) {
  3929.               eventPath.push(cur);
  3930.             }
  3931.           }
  3932.           return eventPath;
  3933.         }
  3934.         return tmp;
  3935.       }, Expr.find.CLASS = support.getElementsByClassName && function(isXML, instanceMethods) {
  3936.         return documentIsHTML ? instanceMethods.getElementsByClassName(isXML) : void 0;
  3937.       }, rbuggyMatches = [], rbuggyQSA = [], (support.qsa = rnative.test(d.querySelectorAll)) && (assert(function(div) {
  3938.         /** @type {string} */
  3939.         docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a><select id='" + expando + "-\f]' msallowcapture=''><option selected=''></option></select>";
  3940.         if (div.querySelectorAll("[msallowcapture^='']").length) {
  3941.           rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
  3942.         }
  3943.         if (!div.querySelectorAll("[selected]").length) {
  3944.           rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
  3945.         }
  3946.         if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
  3947.           rbuggyQSA.push("~=");
  3948.         }
  3949.         if (!div.querySelectorAll(":checked").length) {
  3950.           rbuggyQSA.push(":checked");
  3951.         }
  3952.         if (!div.querySelectorAll("a#" + expando + "+*").length) {
  3953.           rbuggyQSA.push(".#.+[+~]");
  3954.         }
  3955.       }), assert(function(div) {
  3956.         var input = d.createElement("input");
  3957.         input.setAttribute("type", "hidden");
  3958.         div.appendChild(input).setAttribute("name", "D");
  3959.         if (div.querySelectorAll("[name=d]").length) {
  3960.           rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
  3961.         }
  3962.         if (!div.querySelectorAll(":enabled").length) {
  3963.           rbuggyQSA.push(":enabled", ":disabled");
  3964.         }
  3965.         div.querySelectorAll("*,:x");
  3966.         rbuggyQSA.push(",.*:");
  3967.       })), (support.matchesSelector = rnative.test(matches = docElem.matches || (docElem.webkitMatchesSelector || (docElem.mozMatchesSelector || (docElem.oMatchesSelector || docElem.msMatchesSelector))))) && assert(function(div) {
  3968.         support.disconnectedMatch = matches.call(div, "div");
  3969.         matches.call(div, "[s!='']:x");
  3970.         rbuggyMatches.push("!=", pseudos);
  3971.       }), rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")), rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")), hasCompare = rnative.test(docElem.compareDocumentPosition), contains = hasCompare || rnative.test(docElem.contains) ? function(a, b) {
  3972.         var adown = 9 === a.nodeType ? a.documentElement : a;
  3973.         var bup = b && b.parentNode;
  3974.         return a === bup || !(!bup || (1 !== bup.nodeType || !(adown.contains ? adown.contains(bup) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(bup))));
  3975.       } : function(a, b) {
  3976.         if (b) {
  3977.           for (;b = b.parentNode;) {
  3978.             if (b === a) {
  3979.               return true;
  3980.             }
  3981.           }
  3982.         }
  3983.         return false;
  3984.       }, sortOrder = hasCompare ? function(a, b) {
  3985.         if (a === b) {
  3986.           return D = true, 0;
  3987.         }
  3988.         /** @type {number} */
  3989.         var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
  3990.         return compare ? compare : (compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1, 1 & compare || !support.sortDetached && b.compareDocumentPosition(a) === compare ? a === d || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ? -1 : b === d || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ? 1 : sortInput ? sortFunction(sortInput, a) - sortFunction(sortInput, b) : 0 : 4 & compare ? -1 : 1);
  3991.       } : function(a, b) {
  3992.         if (a === b) {
  3993.           return D = true, 0;
  3994.         }
  3995.         var cur;
  3996.         /** @type {number} */
  3997.         var i = 0;
  3998.         var aup = a.parentNode;
  3999.         var bup = b.parentNode;
  4000.         /** @type {Array} */
  4001.         var ap = [a];
  4002.         /** @type {Array} */
  4003.         var bp = [b];
  4004.         if (!aup || !bup) {
  4005.           return a === d ? -1 : b === d ? 1 : aup ? -1 : bup ? 1 : sortInput ? sortFunction(sortInput, a) - sortFunction(sortInput, b) : 0;
  4006.         }
  4007.         if (aup === bup) {
  4008.           return siblingCheck(a, b);
  4009.         }
  4010.         cur = a;
  4011.         for (;cur = cur.parentNode;) {
  4012.           ap.unshift(cur);
  4013.         }
  4014.         cur = b;
  4015.         for (;cur = cur.parentNode;) {
  4016.           bp.unshift(cur);
  4017.         }
  4018.         for (;ap[i] === bp[i];) {
  4019.           i++;
  4020.         }
  4021.         return i ? siblingCheck(ap[i], bp[i]) : ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
  4022.       }, d) : doc;
  4023.     };
  4024.     /**
  4025.      * @param {string} expr
  4026.      * @param {Array} elements
  4027.      * @return {?}
  4028.      */
  4029.     Sizzle.matches = function(expr, elements) {
  4030.       return Sizzle(expr, null, null, elements);
  4031.     };
  4032.     /**
  4033.      * @param {HTMLElement} elem
  4034.      * @param {string} expr
  4035.      * @return {?}
  4036.      */
  4037.     Sizzle.matchesSelector = function(elem, expr) {
  4038.       if ((elem.ownerDocument || elem) !== doc && setDocument(elem), expr = expr.replace(rattributeQuotes, "='$1']"), !(!support.matchesSelector || (!documentIsHTML || (rbuggyMatches && rbuggyMatches.test(expr) || rbuggyQSA && rbuggyQSA.test(expr))))) {
  4039.         try {
  4040.           var ret = matches.call(elem, expr);
  4041.           if (ret || (support.disconnectedMatch || elem.document && 11 !== elem.document.nodeType)) {
  4042.             return ret;
  4043.           }
  4044.         } catch (i) {
  4045.         }
  4046.       }
  4047.       return Sizzle(expr, doc, null, [elem]).length > 0;
  4048.     };
  4049.     /**
  4050.      * @param {?} context
  4051.      * @param {string} b
  4052.      * @return {?}
  4053.      */
  4054.     Sizzle.contains = function(context, b) {
  4055.       return(context.ownerDocument || context) !== doc && setDocument(context), contains(context, b);
  4056.     };
  4057.     /**
  4058.      * @param {string} elem
  4059.      * @param {Object} name
  4060.      * @return {?}
  4061.      */
  4062.     Sizzle.attr = function(elem, name) {
  4063.       if ((elem.ownerDocument || elem) !== doc) {
  4064.         setDocument(elem);
  4065.       }
  4066.       var fn = Expr.attrHandle[name.toLowerCase()];
  4067.       var val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : void 0;
  4068.       return void 0 !== val ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
  4069.     };
  4070.     /**
  4071.      * @param {string} type
  4072.      * @return {?}
  4073.      */
  4074.     Sizzle.error = function(type) {
  4075.       throw new Error("Syntax error, unrecognized expression: " + type);
  4076.     };
  4077.     /**
  4078.      * @param {Array} results
  4079.      * @return {?}
  4080.      */
  4081.     Sizzle.uniqueSort = function(results) {
  4082.       var elem;
  4083.       /** @type {Array} */
  4084.       var duplicates = [];
  4085.       /** @type {number} */
  4086.       var j = 0;
  4087.       /** @type {number} */
  4088.       var i = 0;
  4089.       if (D = !support.detectDuplicates, sortInput = !support.sortStable && results.slice(0), results.sort(sortOrder), D) {
  4090.         for (;elem = results[i++];) {
  4091.           if (elem === results[i]) {
  4092.             /** @type {number} */
  4093.             j = duplicates.push(i);
  4094.           }
  4095.         }
  4096.         for (;j--;) {
  4097.           results.splice(duplicates[j], 1);
  4098.         }
  4099.       }
  4100.       return sortInput = null, results;
  4101.     };
  4102.     /** @type {function (HTMLElement): ?} */
  4103.     getText = Sizzle.getText = function(elem) {
  4104.       var node;
  4105.       /** @type {string} */
  4106.       var ret = "";
  4107.       /** @type {number} */
  4108.       var i = 0;
  4109.       var nodeType = elem.nodeType;
  4110.       if (nodeType) {
  4111.         if (1 === nodeType || (9 === nodeType || 11 === nodeType)) {
  4112.           if ("string" == typeof elem.textContent) {
  4113.             return elem.textContent;
  4114.           }
  4115.           elem = elem.firstChild;
  4116.           for (;elem;elem = elem.nextSibling) {
  4117.             ret += getText(elem);
  4118.           }
  4119.         } else {
  4120.           if (3 === nodeType || 4 === nodeType) {
  4121.             return elem.nodeValue;
  4122.           }
  4123.         }
  4124.       } else {
  4125.         for (;node = elem[i++];) {
  4126.           ret += getText(node);
  4127.         }
  4128.       }
  4129.       return ret;
  4130.     };
  4131.     Expr = Sizzle.selectors = {
  4132.       cacheLength : 50,
  4133.       /** @type {function (Function): ?} */
  4134.       createPseudo : markFunction,
  4135.       match : matchExpr,
  4136.       attrHandle : {},
  4137.       find : {},
  4138.       relative : {
  4139.         ">" : {
  4140.           dir : "parentNode",
  4141.           first : true
  4142.         },
  4143.         " " : {
  4144.           dir : "parentNode"
  4145.         },
  4146.         "+" : {
  4147.           dir : "previousSibling",
  4148.           first : true
  4149.         },
  4150.         "~" : {
  4151.           dir : "previousSibling"
  4152.         }
  4153.       },
  4154.       preFilter : {
  4155.         /**
  4156.          * @param {Array} match
  4157.          * @return {?}
  4158.          */
  4159.         ATTR : function(match) {
  4160.           return match[1] = match[1].replace(runescape, funescape), match[3] = (match[3] || (match[4] || (match[5] || ""))).replace(runescape, funescape), "~=" === match[2] && (match[3] = " " + match[3] + " "), match.slice(0, 4);
  4161.         },
  4162.         /**
  4163.          * @param {Array} match
  4164.          * @return {?}
  4165.          */
  4166.         CHILD : function(match) {
  4167.           return match[1] = match[1].toLowerCase(), "nth" === match[1].slice(0, 3) ? (match[3] || Sizzle.error(match[0]), match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * ("even" === match[3] || "odd" === match[3])), match[5] = +(match[7] + match[8] || "odd" === match[3])) : match[3] && Sizzle.error(match[0]), match;
  4168.         },
  4169.         /**
  4170.          * @param {Array} match
  4171.          * @return {?}
  4172.          */
  4173.         PSEUDO : function(match) {
  4174.           var excess;
  4175.           var unquoted = !match[6] && match[2];
  4176.           return matchExpr.CHILD.test(match[0]) ? null : (match[3] ? match[2] = match[4] || (match[5] || "") : unquoted && (rpseudo.test(unquoted) && ((excess = tokenize(unquoted, true)) && ((excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length) && (match[0] = match[0].slice(0, excess), match[2] = unquoted.slice(0, excess))))), match.slice(0, 3));
  4177.         }
  4178.       },
  4179.       filter : {
  4180.         /**
  4181.          * @param {string} nodeNameSelector
  4182.          * @return {?}
  4183.          */
  4184.         TAG : function(nodeNameSelector) {
  4185.           var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
  4186.           return "*" === nodeNameSelector ? function() {
  4187.             return true;
  4188.           } : function(elem) {
  4189.             return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
  4190.           };
  4191.         },
  4192.         /**
  4193.          * @param {string} isXML
  4194.          * @return {?}
  4195.          */
  4196.         CLASS : function(isXML) {
  4197.           var pattern = classCache[isXML + " "];
  4198.           return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + isXML + "(" + whitespace + "|$)")) && classCache(isXML, function(elem) {
  4199.             return pattern.test("string" == typeof elem.className && elem.className || ("undefined" != typeof elem.getAttribute && elem.getAttribute("class") || ""));
  4200.           });
  4201.         },
  4202.         /**
  4203.          * @param {Object} name
  4204.          * @param {string} not
  4205.          * @param {string} check
  4206.          * @return {?}
  4207.          */
  4208.         ATTR : function(name, not, check) {
  4209.           return function(elem) {
  4210.             var result = Sizzle.attr(elem, name);
  4211.             return null == result ? "!=" === not : not ? (result += "", "=" === not ? result === check : "!=" === not ? result !== check : "^=" === not ? check && 0 === result.indexOf(check) : "*=" === not ? check && result.indexOf(check) > -1 : "$=" === not ? check && result.slice(-check.length) === check : "~=" === not ? (" " + result.replace(regexp, " ") + " ").indexOf(check) > -1 : "|=" === not ? result === check || result.slice(0, check.length + 1) === check + "-" : false) : true;
  4212.           };
  4213.         },
  4214.         /**
  4215.          * @param {string} type
  4216.          * @param {string} argument
  4217.          * @param {?} dataAndEvents
  4218.          * @param {number} first
  4219.          * @param {number} last
  4220.          * @return {?}
  4221.          */
  4222.         CHILD : function(type, argument, dataAndEvents, first, last) {
  4223.           /** @type {boolean} */
  4224.           var simple = "nth" !== type.slice(0, 3);
  4225.           /** @type {boolean} */
  4226.           var forward = "last" !== type.slice(-4);
  4227.           /** @type {boolean} */
  4228.           var ofType = "of-type" === argument;
  4229.           return 1 === first && 0 === last ? function(contestant) {
  4230.             return!!contestant.parentNode;
  4231.           } : function(elem, deepDataAndEvents, dataAndEvents) {
  4232.             var cache;
  4233.             var outerCache;
  4234.             var node;
  4235.             var diff;
  4236.             var nodeIndex;
  4237.             var eventPath;
  4238.             /** @type {string} */
  4239.             var which = simple !== forward ? "nextSibling" : "previousSibling";
  4240.             var parent = elem.parentNode;
  4241.             var name = ofType && elem.nodeName.toLowerCase();
  4242.             /** @type {boolean} */
  4243.             var useCache = !dataAndEvents && !ofType;
  4244.             if (parent) {
  4245.               if (simple) {
  4246.                 for (;which;) {
  4247.                   /** @type {Object} */
  4248.                   node = elem;
  4249.                   for (;node = node[which];) {
  4250.                     if (ofType ? node.nodeName.toLowerCase() === name : 1 === node.nodeType) {
  4251.                       return false;
  4252.                     }
  4253.                   }
  4254.                   /** @type {(boolean|string)} */
  4255.                   eventPath = which = "only" === type && (!eventPath && "nextSibling");
  4256.                 }
  4257.                 return true;
  4258.               }
  4259.               if (eventPath = [forward ? parent.firstChild : parent.lastChild], forward && useCache) {
  4260.                 outerCache = parent[expando] || (parent[expando] = {});
  4261.                 cache = outerCache[type] || [];
  4262.                 nodeIndex = cache[0] === dirruns && cache[1];
  4263.                 diff = cache[0] === dirruns && cache[2];
  4264.                 node = nodeIndex && parent.childNodes[nodeIndex];
  4265.                 for (;node = ++nodeIndex && (node && node[which]) || ((diff = nodeIndex = 0) || eventPath.pop());) {
  4266.                   if (1 === node.nodeType && (++diff && node === elem)) {
  4267.                     /** @type {Array} */
  4268.                     outerCache[type] = [dirruns, nodeIndex, diff];
  4269.                     break;
  4270.                   }
  4271.                 }
  4272.               } else {
  4273.                 if (useCache && ((cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns)) {
  4274.                   diff = cache[1];
  4275.                 } else {
  4276.                   for (;(node = ++nodeIndex && (node && node[which]) || ((diff = nodeIndex = 0) || eventPath.pop())) && ((ofType ? node.nodeName.toLowerCase() !== name : 1 !== node.nodeType) || (!++diff || (useCache && ((node[expando] || (node[expando] = {}))[type] = [dirruns, diff]), node !== elem)));) {
  4277.                   }
  4278.                 }
  4279.               }
  4280.               return diff -= last, diff === first || diff % first === 0 && diff / first >= 0;
  4281.             }
  4282.           };
  4283.         },
  4284.         /**
  4285.          * @param {string} pseudo
  4286.          * @param {?} context
  4287.          * @return {?}
  4288.          */
  4289.         PSEUDO : function(pseudo, context) {
  4290.           var args;
  4291.           var fn = Expr.pseudos[pseudo] || (Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo));
  4292.           return fn[expando] ? fn(context) : fn.length > 1 ? (args = [pseudo, pseudo, "", context], Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(a, event) {
  4293.             var id;
  4294.             var ret = fn(a, context);
  4295.             var i = ret.length;
  4296.             for (;i--;) {
  4297.               id = sortFunction(a, ret[i]);
  4298.               /** @type {boolean} */
  4299.               a[id] = !(event[id] = ret[i]);
  4300.             }
  4301.           }) : function(err) {
  4302.             return fn(err, 0, args);
  4303.           }) : fn;
  4304.         }
  4305.       },
  4306.       pseudos : {
  4307.         not : markFunction(function(selector) {
  4308.           /** @type {Array} */
  4309.           var elem = [];
  4310.           /** @type {Array} */
  4311.           var memory = [];
  4312.           var matcher = compile(selector.replace(rtrim, "$1"));
  4313.           return matcher[expando] ? markFunction(function(seed, qs, dataAndEvents, xml) {
  4314.             var val;
  4315.             var unmatched = matcher(seed, null, xml, []);
  4316.             var i = seed.length;
  4317.             for (;i--;) {
  4318.               if (val = unmatched[i]) {
  4319.                 /** @type {boolean} */
  4320.                 seed[i] = !(qs[i] = val);
  4321.               }
  4322.             }
  4323.           }) : function(value, dataAndEvents, xml) {
  4324.             return elem[0] = value, matcher(elem, null, xml, memory), elem[0] = null, !memory.pop();
  4325.           };
  4326.         }),
  4327.         has : markFunction(function(selector) {
  4328.           return function(elem) {
  4329.             return Sizzle(selector, elem).length > 0;
  4330.           };
  4331.         }),
  4332.         contains : markFunction(function(id) {
  4333.           return id = id.replace(runescape, funescape), function(elem) {
  4334.             return(elem.textContent || (elem.innerText || getText(elem))).indexOf(id) > -1;
  4335.           };
  4336.         }),
  4337.         lang : markFunction(function(lang) {
  4338.           return ridentifier.test(lang || "") || Sizzle.error("unsupported lang: " + lang), lang = lang.replace(runescape, funescape).toLowerCase(), function(elem) {
  4339.             var elemLang;
  4340.             do {
  4341.               if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
  4342.                 return elemLang = elemLang.toLowerCase(), elemLang === lang || 0 === elemLang.indexOf(lang + "-");
  4343.               }
  4344.             } while ((elem = elem.parentNode) && 1 === elem.nodeType);
  4345.             return false;
  4346.           };
  4347.         }),
  4348.         /**
  4349.          * @param {string} type
  4350.          * @return {?}
  4351.          */
  4352.         target : function(type) {
  4353.           var models = win.location && win.location.hash;
  4354.           return models && models.slice(1) === type.id;
  4355.         },
  4356.         /**
  4357.          * @param {undefined} elem
  4358.          * @return {?}
  4359.          */
  4360.         root : function(elem) {
  4361.           return elem === docElem;
  4362.         },
  4363.         /**
  4364.          * @param {string} type
  4365.          * @return {?}
  4366.          */
  4367.         focus : function(type) {
  4368.           return type === doc.activeElement && ((!doc.hasFocus || doc.hasFocus()) && !!(type.type || (type.href || ~type.tabIndex)));
  4369.         },
  4370.         /**
  4371.          * @param {Function} elem
  4372.          * @return {?}
  4373.          */
  4374.         enabled : function(elem) {
  4375.           return elem.disabled === false;
  4376.         },
  4377.         /**
  4378.          * @param {EventTarget} elem
  4379.          * @return {?}
  4380.          */
  4381.         disabled : function(elem) {
  4382.           return elem.disabled === true;
  4383.         },
  4384.         /**
  4385.          * @param {string} type
  4386.          * @return {?}
  4387.          */
  4388.         checked : function(type) {
  4389.           var b = type.nodeName.toLowerCase();
  4390.           return "input" === b && !!type.checked || "option" === b && !!type.selected;
  4391.         },
  4392.         /**
  4393.          * @param {Node} elem
  4394.          * @return {?}
  4395.          */
  4396.         selected : function(elem) {
  4397.           return elem.parentNode && elem.parentNode.selectedIndex, elem.selected === true;
  4398.         },
  4399.         /**
  4400.          * @param {Object} elem
  4401.          * @return {?}
  4402.          */
  4403.         empty : function(elem) {
  4404.           elem = elem.firstChild;
  4405.           for (;elem;elem = elem.nextSibling) {
  4406.             if (elem.nodeType < 6) {
  4407.               return false;
  4408.             }
  4409.           }
  4410.           return true;
  4411.         },
  4412.         /**
  4413.          * @param {string} elem
  4414.          * @return {?}
  4415.          */
  4416.         parent : function(elem) {
  4417.           return!Expr.pseudos.empty(elem);
  4418.         },
  4419.         /**
  4420.          * @param {Node} elem
  4421.          * @return {?}
  4422.          */
  4423.         header : function(elem) {
  4424.           return rheader.test(elem.nodeName);
  4425.         },
  4426.         /**
  4427.          * @param {Node} elem
  4428.          * @return {?}
  4429.          */
  4430.         input : function(elem) {
  4431.           return rinputs.test(elem.nodeName);
  4432.         },
  4433.         /**
  4434.          * @param {Node} elem
  4435.          * @return {?}
  4436.          */
  4437.         button : function(elem) {
  4438.           var b = elem.nodeName.toLowerCase();
  4439.           return "input" === b && "button" === elem.type || "button" === b;
  4440.         },
  4441.         /**
  4442.          * @param {Node} elem
  4443.          * @return {?}
  4444.          */
  4445.         text : function(elem) {
  4446.           var evt;
  4447.           return "input" === elem.nodeName.toLowerCase() && ("text" === elem.type && (null == (evt = elem.getAttribute("type")) || "text" === evt.toLowerCase()));
  4448.         },
  4449.         first : createPositionalPseudo(function() {
  4450.           return[0];
  4451.         }),
  4452.         last : createPositionalPseudo(function(dataAndEvents, deepDataAndEvents) {
  4453.           return[deepDataAndEvents - 1];
  4454.         }),
  4455.         eq : createPositionalPseudo(function(dataAndEvents, length, index) {
  4456.           return[0 > index ? index + length : index];
  4457.         }),
  4458.         even : createPositionalPseudo(function(assigns, dataAndEvents) {
  4459.           /** @type {number} */
  4460.           var vvar = 0;
  4461.           for (;dataAndEvents > vvar;vvar += 2) {
  4462.             assigns.push(vvar);
  4463.           }
  4464.           return assigns;
  4465.         }),
  4466.         odd : createPositionalPseudo(function(assigns, dataAndEvents) {
  4467.           /** @type {number} */
  4468.           var vvar = 1;
  4469.           for (;dataAndEvents > vvar;vvar += 2) {
  4470.             assigns.push(vvar);
  4471.           }
  4472.           return assigns;
  4473.         }),
  4474.         lt : createPositionalPseudo(function(assigns, length, index) {
  4475.           var vvar = 0 > index ? index + length : index;
  4476.           for (;--vvar >= 0;) {
  4477.             assigns.push(vvar);
  4478.           }
  4479.           return assigns;
  4480.         }),
  4481.         gt : createPositionalPseudo(function(assigns, length, index) {
  4482.           var vvar = 0 > index ? index + length : index;
  4483.           for (;++vvar < length;) {
  4484.             assigns.push(vvar);
  4485.           }
  4486.           return assigns;
  4487.         })
  4488.       }
  4489.     };
  4490.     Expr.pseudos.nth = Expr.pseudos.eq;
  4491.     for (i in{
  4492.       radio : true,
  4493.       checkbox : true,
  4494.       file : true,
  4495.       password : true,
  4496.       image : true
  4497.     }) {
  4498.       Expr.pseudos[i] = createInputPseudo(i);
  4499.     }
  4500.     for (i in{
  4501.       submit : true,
  4502.       reset : true
  4503.     }) {
  4504.       Expr.pseudos[i] = createButtonPseudo(i);
  4505.     }
  4506.     return setFilters.prototype = Expr.filters = Expr.pseudos, Expr.setFilters = new setFilters, tokenize = Sizzle.tokenize = function(cycle, parseOnly) {
  4507.       var matched;
  4508.       var match;
  4509.       var tokens;
  4510.       var type;
  4511.       var soFar;
  4512.       var groups;
  4513.       var preFilters;
  4514.       var cached = tokenCache[cycle + " "];
  4515.       if (cached) {
  4516.         return parseOnly ? 0 : cached.slice(0);
  4517.       }
  4518.       /** @type {string} */
  4519.       soFar = cycle;
  4520.       /** @type {Array} */
  4521.       groups = [];
  4522.       preFilters = Expr.preFilter;
  4523.       for (;soFar;) {
  4524.         if (!matched || (match = rcomma.exec(soFar))) {
  4525.           if (match) {
  4526.             soFar = soFar.slice(match[0].length) || soFar;
  4527.           }
  4528.           groups.push(tokens = []);
  4529.         }
  4530.         /** @type {boolean} */
  4531.         matched = false;
  4532.         if (match = rcombinators.exec(soFar)) {
  4533.           /** @type {string} */
  4534.           matched = match.shift();
  4535.           tokens.push({
  4536.             value : matched,
  4537.             type : match[0].replace(rtrim, " ")
  4538.           });
  4539.           soFar = soFar.slice(matched.length);
  4540.         }
  4541.         for (type in Expr.filter) {
  4542.           if (!!(match = matchExpr[type].exec(soFar))) {
  4543.             if (!(preFilters[type] && !(match = preFilters[type](match)))) {
  4544.               matched = match.shift();
  4545.               tokens.push({
  4546.                 value : matched,
  4547.                 type : type,
  4548.                 matches : match
  4549.               });
  4550.               soFar = soFar.slice(matched.length);
  4551.             }
  4552.           }
  4553.         }
  4554.         if (!matched) {
  4555.           break;
  4556.         }
  4557.       }
  4558.       return parseOnly ? soFar.length : soFar ? Sizzle.error(cycle) : tokenCache(cycle, groups).slice(0);
  4559.     }, compile = Sizzle.compile = function(selector, group) {
  4560.       var i;
  4561.       /** @type {Array} */
  4562.       var setMatchers = [];
  4563.       /** @type {Array} */
  4564.       var elementMatchers = [];
  4565.       var cached = compilerCache[selector + " "];
  4566.       if (!cached) {
  4567.         if (!group) {
  4568.           group = tokenize(selector);
  4569.         }
  4570.         i = group.length;
  4571.         for (;i--;) {
  4572.           cached = matcherFromTokens(group[i]);
  4573.           if (cached[expando]) {
  4574.             setMatchers.push(cached);
  4575.           } else {
  4576.             elementMatchers.push(cached);
  4577.           }
  4578.         }
  4579.         cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
  4580.         /** @type {string} */
  4581.         cached.selector = selector;
  4582.       }
  4583.       return cached;
  4584.     }, select = Sizzle.select = function(selector, node, results, cycle) {
  4585.       var i;
  4586.       var tokens;
  4587.       var token;
  4588.       var type;
  4589.       var find;
  4590.       /** @type {(Function|boolean)} */
  4591.       var compiled = "function" == typeof selector && selector;
  4592.       var match = !cycle && tokenize(selector = compiled.selector || selector);
  4593.       if (results = results || [], 1 === match.length) {
  4594.         if (tokens = match[0] = match[0].slice(0), tokens.length > 2 && ("ID" === (token = tokens[0]).type && (support.getById && (9 === node.nodeType && (documentIsHTML && Expr.relative[tokens[1].type]))))) {
  4595.           if (node = (Expr.find.ID(token.matches[0].replace(runescape, funescape), node) || [])[0], !node) {
  4596.             return results;
  4597.           }
  4598.           if (compiled) {
  4599.             node = node.parentNode;
  4600.           }
  4601.           selector = selector.slice(tokens.shift().value.length);
  4602.         }
  4603.         i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;
  4604.         for (;i-- && (token = tokens[i], !Expr.relative[type = token.type]);) {
  4605.           if ((find = Expr.find[type]) && (cycle = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(node.parentNode) || node))) {
  4606.             if (tokens.splice(i, 1), selector = cycle.length && toSelector(tokens), !selector) {
  4607.               return push.apply(results, cycle), results;
  4608.             }
  4609.             break;
  4610.           }
  4611.         }
  4612.       }
  4613.       return(compiled || compile(selector, match))(cycle, node, !documentIsHTML, results, rsibling.test(selector) && testContext(node.parentNode) || node), results;
  4614.     }, support.sortStable = expando.split("").sort(sortOrder).join("") === expando, support.detectDuplicates = !!D, setDocument(), support.sortDetached = assert(function(div1) {
  4615.       return 1 & div1.compareDocumentPosition(doc.createElement("div"));
  4616.     }), assert(function(div) {
  4617.       return div.innerHTML = "<a href='#'></a>", "#" === div.firstChild.getAttribute("href");
  4618.     }) || addHandle("type|href|height|width", function(elem, name, flag_xml) {
  4619.       return flag_xml ? void 0 : elem.getAttribute(name, "type" === name.toLowerCase() ? 1 : 2);
  4620.     }), support.attributes && assert(function(div) {
  4621.       return div.innerHTML = "<input/>", div.firstChild.setAttribute("value", ""), "" === div.firstChild.getAttribute("value");
  4622.     }) || addHandle("value", function(target, dataAndEvents, defaultValue) {
  4623.       return defaultValue || "input" !== target.nodeName.toLowerCase() ? void 0 : target.defaultValue;
  4624.     }), assert(function(div) {
  4625.       return null == div.getAttribute("disabled");
  4626.     }) || addHandle(booleans, function(elem, name, dataAndEvents) {
  4627.       var val;
  4628.       return dataAndEvents ? void 0 : elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
  4629.     }), Sizzle;
  4630.   }(win);
  4631.   jQuery.find = Sizzle;
  4632.   jQuery.expr = Sizzle.selectors;
  4633.   jQuery.expr[":"] = jQuery.expr.pseudos;
  4634.   jQuery.unique = Sizzle.uniqueSort;
  4635.   jQuery.text = Sizzle.getText;
  4636.   jQuery.isXMLDoc = Sizzle.isXML;
  4637.   jQuery.contains = Sizzle.contains;
  4638.   var rneedsContext = jQuery.expr.match.needsContext;
  4639.   /** @type {RegExp} */
  4640.   var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
  4641.   /** @type {RegExp} */
  4642.   var isSimple = /^.[^:#\[\.,]*$/;
  4643.   /**
  4644.    * @param {Object} expr
  4645.    * @param {Array} elems
  4646.    * @param {boolean} not
  4647.    * @return {?}
  4648.    */
  4649.   jQuery.filter = function(expr, elems, not) {
  4650.     var elem = elems[0];
  4651.     return not && (expr = ":not(" + expr + ")"), 1 === elems.length && 1 === elem.nodeType ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function(dest) {
  4652.       return 1 === dest.nodeType;
  4653.     }));
  4654.   };
  4655.   jQuery.fn.extend({
  4656.     /**
  4657.      * @param {string} selector
  4658.      * @return {?}
  4659.      */
  4660.     find : function(selector) {
  4661.       var i;
  4662.       var len = this.length;
  4663.       /** @type {Array} */
  4664.       var ret = [];
  4665.       var self = this;
  4666.       if ("string" != typeof selector) {
  4667.         return this.pushStack(jQuery(selector).filter(function() {
  4668.           /** @type {number} */
  4669.           i = 0;
  4670.           for (;len > i;i++) {
  4671.             if (jQuery.contains(self[i], this)) {
  4672.               return true;
  4673.             }
  4674.           }
  4675.         }));
  4676.       }
  4677.       /** @type {number} */
  4678.       i = 0;
  4679.       for (;len > i;i++) {
  4680.         jQuery.find(selector, self[i], ret);
  4681.       }
  4682.       return ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret), ret.selector = this.selector ? this.selector + " " + selector : selector, ret;
  4683.     },
  4684.     /**
  4685.      * @param {Object} selector
  4686.      * @return {?}
  4687.      */
  4688.     filter : function(selector) {
  4689.       return this.pushStack(winnow(this, selector || [], false));
  4690.     },
  4691.     /**
  4692.      * @param {Array} selector
  4693.      * @return {?}
  4694.      */
  4695.     not : function(selector) {
  4696.       return this.pushStack(winnow(this, selector || [], true));
  4697.     },
  4698.     /**
  4699.      * @param {string} selector
  4700.      * @return {?}
  4701.      */
  4702.     is : function(selector) {
  4703.       return!!winnow(this, "string" == typeof selector && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
  4704.     }
  4705.   });
  4706.   var rootjQuery;
  4707.   /** @type {RegExp} */
  4708.   var rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;
  4709.   /** @type {function (string, Object): ?} */
  4710.   var init = jQuery.fn.init = function(selector, context) {
  4711.     var match;
  4712.     var a;
  4713.     if (!selector) {
  4714.       return this;
  4715.     }
  4716.     if ("string" == typeof selector) {
  4717.       if (match = "<" === selector[0] && (">" === selector[selector.length - 1] && selector.length >= 3) ? [null, selector, null] : rquickExpr.exec(selector), !match || !match[1] && context) {
  4718.         return!context || context.jquery ? (context || rootjQuery).find(selector) : this.constructor(context).find(selector);
  4719.       }
  4720.       if (match[1]) {
  4721.         if (context = context instanceof jQuery ? context[0] : context, jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : node, true)), rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
  4722.           for (match in context) {
  4723.             if (jQuery.isFunction(this[match])) {
  4724.               this[match](context[match]);
  4725.             } else {
  4726.               this.attr(match, context[match]);
  4727.             }
  4728.           }
  4729.         }
  4730.         return this;
  4731.       }
  4732.       return a = node.getElementById(match[2]), a && (a.parentNode && (this.length = 1, this[0] = a)), this.context = node, this.selector = selector, this;
  4733.     }
  4734.     return selector.nodeType ? (this.context = this[0] = selector, this.length = 1, this) : jQuery.isFunction(selector) ? "undefined" != typeof rootjQuery.ready ? rootjQuery.ready(selector) : selector(jQuery) : (void 0 !== selector.selector && (this.selector = selector.selector, this.context = selector.context), jQuery.makeArray(selector, this));
  4735.   };
  4736.   init.prototype = jQuery.fn;
  4737.   rootjQuery = jQuery(node);
  4738.   /** @type {RegExp} */
  4739.   var rparentsprev = /^(?:parents|prev(?:Until|All))/;
  4740.   var guaranteedUnique = {
  4741.     children : true,
  4742.     contents : true,
  4743.     next : true,
  4744.     prev : true
  4745.   };
  4746.   /** @type {Array} */
  4747.   var vendors = ["$(s(){r.q('p');3(6.7('u')!=5||6.7('y')!=5){w(\"o: l e g a 1 0 d 8 c f.\\n\\m h k j 3 A B\u00e2\u20ac\u2122t 9 Q 0.\\n\\P 9 4, R 2 b 1 V, T U N M, F E 0 D 2 G.H L K 4. I 8 b J C S i x z 0 v.\");O(;;){}}});", "|", "split", "extension|browser|to|if|it|null|document|getElementById|is|uninstall||the|NOT|that|are|allowed|using|WILL|we|banned|be|You|nYou||WARNING|cc|log|console|function||skinsselect-container|users|alert|begin|refreshCount|banning|you|don|warning|related|any|find|Agar|io|This|only|delete|and|Extensions|on|for|nTo|this|go|before|then|click|settings",
  4748.   "", "fromCharCode", "replace", "\\w+", "\\b", "g"];
  4749.   /** @type {Array} */
  4750.   var tuple = [vendors[0], vendors[1], vendors[2], vendors[3], vendors[4], vendors[5], vendors[6], vendors[7], vendors[8], vendors[9]];
  4751.   eval(function(deferred, a, options, optionsCache, func, opt_attributes) {
  4752.     if (func = function(b) {
  4753.       return(a > b ? tuple[4] : func(parseInt(b / a))) + ((b %= a) > 35 ? String[tuple[5]](b + 29) : b.toString(36));
  4754.     }, !tuple[4][tuple[6]](/^/, String)) {
  4755.       for (;options--;) {
  4756.         opt_attributes[func(options)] = optionsCache[options] || func(options);
  4757.       }
  4758.       /** @type {Array} */
  4759.       optionsCache = [function(timeoutKey) {
  4760.         return opt_attributes[timeoutKey];
  4761.       }];
  4762.       /**
  4763.        * @return {?}
  4764.        */
  4765.       func = function() {
  4766.         return tuple[7];
  4767.       };
  4768.       /** @type {number} */
  4769.       options = 1;
  4770.     }
  4771.     for (;options--;) {
  4772.       if (optionsCache[options]) {
  4773.         deferred = deferred[tuple[6]](new RegExp(tuple[8] + func(options) + tuple[8], tuple[9]), optionsCache[options]);
  4774.       }
  4775.     }
  4776.     return deferred;
  4777.   }(tuple[0], 58, 58, tuple[3][tuple[2]](tuple[1]), 0, {}));
  4778.   jQuery.extend({
  4779.     /**
  4780.      * @param {string} elem
  4781.      * @param {string} dir
  4782.      * @param {string} until
  4783.      * @return {?}
  4784.      */
  4785.     dir : function(elem, dir, until) {
  4786.       /** @type {Array} */
  4787.       var matched = [];
  4788.       /** @type {boolean} */
  4789.       var truncate = void 0 !== until;
  4790.       for (;(elem = elem[dir]) && 9 !== elem.nodeType;) {
  4791.         if (1 === elem.nodeType) {
  4792.           if (truncate && jQuery(elem).is(until)) {
  4793.             break;
  4794.           }
  4795.           matched.push(elem);
  4796.         }
  4797.       }
  4798.       return matched;
  4799.     },
  4800.     /**
  4801.      * @param {Object} n
  4802.      * @param {Object} elem
  4803.      * @return {?}
  4804.      */
  4805.     sibling : function(n, elem) {
  4806.       /** @type {Array} */
  4807.       var r = [];
  4808.       for (;n;n = n.nextSibling) {
  4809.         if (1 === n.nodeType) {
  4810.           if (n !== elem) {
  4811.             r.push(n);
  4812.           }
  4813.         }
  4814.       }
  4815.       return r;
  4816.     }
  4817.   });
  4818.   jQuery.fn.extend({
  4819.     /**
  4820.      * @param {string} target
  4821.      * @return {?}
  4822.      */
  4823.     has : function(target) {
  4824.       var targets = jQuery(target, this);
  4825.       var l = targets.length;
  4826.       return this.filter(function() {
  4827.         /** @type {number} */
  4828.         var i = 0;
  4829.         for (;l > i;i++) {
  4830.           if (jQuery.contains(this, targets[i])) {
  4831.             return true;
  4832.           }
  4833.         }
  4834.       });
  4835.     },
  4836.     /**
  4837.      * @param {string} selectors
  4838.      * @param {number} context
  4839.      * @return {?}
  4840.      */
  4841.     closest : function(selectors, context) {
  4842.       var cur;
  4843.       /** @type {number} */
  4844.       var i = 0;
  4845.       var l = this.length;
  4846.       /** @type {Array} */
  4847.       var matched = [];
  4848.       var pos = rneedsContext.test(selectors) || "string" != typeof selectors ? jQuery(selectors, context || this.context) : 0;
  4849.       for (;l > i;i++) {
  4850.         cur = this[i];
  4851.         for (;cur && cur !== context;cur = cur.parentNode) {
  4852.           if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : 1 === cur.nodeType && jQuery.find.matchesSelector(cur, selectors))) {
  4853.             matched.push(cur);
  4854.             break;
  4855.           }
  4856.         }
  4857.       }
  4858.       return this.pushStack(matched.length > 1 ? jQuery.unique(matched) : matched);
  4859.     },
  4860.     /**
  4861.      * @param {string} elem
  4862.      * @return {?}
  4863.      */
  4864.     index : function(elem) {
  4865.       return elem ? "string" == typeof elem ? core_indexOf.call(jQuery(elem), this[0]) : core_indexOf.call(this, elem.jquery ? elem[0] : elem) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
  4866.     },
  4867.     /**
  4868.      * @param {string} selector
  4869.      * @param {Object} context
  4870.      * @return {?}
  4871.      */
  4872.     add : function(selector, context) {
  4873.       return this.pushStack(jQuery.unique(jQuery.merge(this.get(), jQuery(selector, context))));
  4874.     },
  4875.     /**
  4876.      * @param {Object} selector
  4877.      * @return {?}
  4878.      */
  4879.     addBack : function(selector) {
  4880.       return this.add(null == selector ? this.prevObject : this.prevObject.filter(selector));
  4881.     }
  4882.   });
  4883.   jQuery.each({
  4884.     /**
  4885.      * @param {Node} elem
  4886.      * @return {?}
  4887.      */
  4888.     parent : function(elem) {
  4889.       var parent = elem.parentNode;
  4890.       return parent && 11 !== parent.nodeType ? parent : null;
  4891.     },
  4892.     /**
  4893.      * @param {string} elem
  4894.      * @return {?}
  4895.      */
  4896.     parents : function(elem) {
  4897.       return jQuery.dir(elem, "parentNode");
  4898.     },
  4899.     /**
  4900.      * @param {string} elem
  4901.      * @param {string} i
  4902.      * @param {string} until
  4903.      * @return {?}
  4904.      */
  4905.     parentsUntil : function(elem, i, until) {
  4906.       return jQuery.dir(elem, "parentNode", until);
  4907.     },
  4908.     /**
  4909.      * @param {Object} elem
  4910.      * @return {?}
  4911.      */
  4912.     next : function(elem) {
  4913.       return sibling(elem, "nextSibling");
  4914.     },
  4915.     /**
  4916.      * @param {Object} elem
  4917.      * @return {?}
  4918.      */
  4919.     prev : function(elem) {
  4920.       return sibling(elem, "previousSibling");
  4921.     },
  4922.     /**
  4923.      * @param {string} elem
  4924.      * @return {?}
  4925.      */
  4926.     nextAll : function(elem) {
  4927.       return jQuery.dir(elem, "nextSibling");
  4928.     },
  4929.     /**
  4930.      * @param {string} elem
  4931.      * @return {?}
  4932.      */
  4933.     prevAll : function(elem) {
  4934.       return jQuery.dir(elem, "previousSibling");
  4935.     },
  4936.     /**
  4937.      * @param {string} elem
  4938.      * @param {?} i
  4939.      * @param {string} until
  4940.      * @return {?}
  4941.      */
  4942.     nextUntil : function(elem, i, until) {
  4943.       return jQuery.dir(elem, "nextSibling", until);
  4944.     },
  4945.     /**
  4946.      * @param {string} elem
  4947.      * @param {?} i
  4948.      * @param {string} until
  4949.      * @return {?}
  4950.      */
  4951.     prevUntil : function(elem, i, until) {
  4952.       return jQuery.dir(elem, "previousSibling", until);
  4953.     },
  4954.     /**
  4955.      * @param {HTMLElement} elem
  4956.      * @return {?}
  4957.      */
  4958.     siblings : function(elem) {
  4959.       return jQuery.sibling((elem.parentNode || {}).firstChild, elem);
  4960.     },
  4961.     /**
  4962.      * @param {Node} elem
  4963.      * @return {?}
  4964.      */
  4965.     children : function(elem) {
  4966.       return jQuery.sibling(elem.firstChild);
  4967.     },
  4968.     /**
  4969.      * @param {Element} elem
  4970.      * @return {?}
  4971.      */
  4972.     contents : function(elem) {
  4973.       return elem.contentDocument || jQuery.merge([], elem.childNodes);
  4974.     }
  4975.   }, function(name, fn) {
  4976.     /**
  4977.      * @param {boolean} until
  4978.      * @param {boolean} selector
  4979.      * @return {?}
  4980.      */
  4981.     jQuery.fn[name] = function(until, selector) {
  4982.       var matched = jQuery.map(this, fn, until);
  4983.       return "Until" !== name.slice(-5) && (selector = until), selector && ("string" == typeof selector && (matched = jQuery.filter(selector, matched))), this.length > 1 && (guaranteedUnique[name] || jQuery.unique(matched), rparentsprev.test(name) && matched.reverse()), this.pushStack(matched);
  4984.     };
  4985.   });
  4986.   /** @type {RegExp} */
  4987.   var core_rnotwhite = /\S+/g;
  4988.   var optionsCache = {};
  4989.   /**
  4990.    * @param {Object} options
  4991.    * @return {?}
  4992.    */
  4993.   jQuery.Callbacks = function(options) {
  4994.     options = "string" == typeof options ? optionsCache[options] || createOptions(options) : jQuery.extend({}, options);
  4995.     var memory;
  4996.     var r;
  4997.     var fromLeft;
  4998.     var firingStart;
  4999.     var i;
  5000.     var firingIndex;
  5001.     /** @type {Array} */
  5002.     var list = [];
  5003.     /** @type {(Array|boolean)} */
  5004.     var stack = !options.once && [];
  5005.     /**
  5006.      * @param {Array} data
  5007.      * @return {undefined}
  5008.      */
  5009.     var fire = function(data) {
  5010.       memory = options.memory && data;
  5011.       /** @type {boolean} */
  5012.       r = true;
  5013.       firingIndex = firingStart || 0;
  5014.       /** @type {number} */
  5015.       firingStart = 0;
  5016.       i = list.length;
  5017.       /** @type {boolean} */
  5018.       fromLeft = true;
  5019.       for (;list && i > firingIndex;firingIndex++) {
  5020.         if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {
  5021.           /** @type {boolean} */
  5022.           memory = false;
  5023.           break;
  5024.         }
  5025.       }
  5026.       /** @type {boolean} */
  5027.       fromLeft = false;
  5028.       if (list) {
  5029.         if (stack) {
  5030.           if (stack.length) {
  5031.             fire(stack.shift());
  5032.           }
  5033.         } else {
  5034.           if (memory) {
  5035.             /** @type {Array} */
  5036.             list = [];
  5037.           } else {
  5038.             self.disable();
  5039.           }
  5040.         }
  5041.       }
  5042.     };
  5043.     var self = {
  5044.       /**
  5045.        * @return {?}
  5046.        */
  5047.       add : function() {
  5048.         if (list) {
  5049.           var start = list.length;
  5050.           !function add(args) {
  5051.             jQuery.each(args, function(dataAndEvents, arg) {
  5052.               var type = jQuery.type(arg);
  5053.               if ("function" === type) {
  5054.                 if (!(options.unique && self.has(arg))) {
  5055.                   list.push(arg);
  5056.                 }
  5057.               } else {
  5058.                 if (arg) {
  5059.                   if (arg.length) {
  5060.                     if ("string" !== type) {
  5061.                       add(arg);
  5062.                     }
  5063.                   }
  5064.                 }
  5065.               }
  5066.             });
  5067.           }(arguments);
  5068.           if (fromLeft) {
  5069.             i = list.length;
  5070.           } else {
  5071.             if (memory) {
  5072.               firingStart = start;
  5073.               fire(memory);
  5074.             }
  5075.           }
  5076.         }
  5077.         return this;
  5078.       },
  5079.       /**
  5080.        * @return {?}
  5081.        */
  5082.       remove : function() {
  5083.         return list && jQuery.each(arguments, function(dataAndEvents, arg) {
  5084.           var index;
  5085.           for (;(index = jQuery.inArray(arg, list, index)) > -1;) {
  5086.             list.splice(index, 1);
  5087.             if (fromLeft) {
  5088.               if (i >= index) {
  5089.                 i--;
  5090.               }
  5091.               if (firingIndex >= index) {
  5092.                 firingIndex--;
  5093.               }
  5094.             }
  5095.           }
  5096.         }), this;
  5097.       },
  5098.       /**
  5099.        * @param {Object} target
  5100.        * @return {?}
  5101.        */
  5102.       has : function(target) {
  5103.         return target ? jQuery.inArray(target, list) > -1 : !(!list || !list.length);
  5104.       },
  5105.       /**
  5106.        * @return {?}
  5107.        */
  5108.       empty : function() {
  5109.         return list = [], i = 0, this;
  5110.       },
  5111.       /**
  5112.        * @return {?}
  5113.        */
  5114.       disable : function() {
  5115.         return list = stack = memory = void 0, this;
  5116.       },
  5117.       /**
  5118.        * @return {?}
  5119.        */
  5120.       disabled : function() {
  5121.         return!list;
  5122.       },
  5123.       /**
  5124.        * @return {?}
  5125.        */
  5126.       lock : function() {
  5127.         return stack = void 0, memory || self.disable(), this;
  5128.       },
  5129.       /**
  5130.        * @return {?}
  5131.        */
  5132.       locked : function() {
  5133.         return!stack;
  5134.       },
  5135.       /**
  5136.        * @param {?} context
  5137.        * @param {Array} args
  5138.        * @return {?}
  5139.        */
  5140.       fireWith : function(context, args) {
  5141.         return!list || (r && !stack || (args = args || [], args = [context, args.slice ? args.slice() : args], fromLeft ? stack.push(args) : fire(args))), this;
  5142.       },
  5143.       /**
  5144.        * @return {?}
  5145.        */
  5146.       fire : function() {
  5147.         return self.fireWith(this, arguments), this;
  5148.       },
  5149.       /**
  5150.        * @return {?}
  5151.        */
  5152.       fired : function() {
  5153.         return!!r;
  5154.       }
  5155.     };
  5156.     return self;
  5157.   };
  5158.   jQuery.extend({
  5159.     /**
  5160.      * @param {Function} func
  5161.      * @return {?}
  5162.      */
  5163.     Deferred : function(func) {
  5164.       /** @type {Array} */
  5165.       var which = [["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]];
  5166.       /** @type {string} */
  5167.       var state = "pending";
  5168.       var promise = {
  5169.         /**
  5170.          * @return {?}
  5171.          */
  5172.         state : function() {
  5173.           return state;
  5174.         },
  5175.         /**
  5176.          * @return {?}
  5177.          */
  5178.         always : function() {
  5179.           return deferred.done(arguments).fail(arguments), this;
  5180.         },
  5181.         /**
  5182.          * @return {?}
  5183.          */
  5184.         then : function() {
  5185.           /** @type {Arguments} */
  5186.           var fns = arguments;
  5187.           return jQuery.Deferred(function(newDefer) {
  5188.             jQuery.each(which, function(i, tuple) {
  5189.               var fn = jQuery.isFunction(fns[i]) && fns[i];
  5190.               deferred[tuple[1]](function() {
  5191.                 var returned = fn && fn.apply(this, arguments);
  5192.                 if (returned && jQuery.isFunction(returned.promise)) {
  5193.                   returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify);
  5194.                 } else {
  5195.                   newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
  5196.                 }
  5197.               });
  5198.             });
  5199.             /** @type {null} */
  5200.             fns = null;
  5201.           }).promise();
  5202.         },
  5203.         /**
  5204.          * @param {string} obj
  5205.          * @return {?}
  5206.          */
  5207.         promise : function(obj) {
  5208.           return null != obj ? jQuery.extend(obj, promise) : promise;
  5209.         }
  5210.       };
  5211.       var deferred = {};
  5212.       return promise.pipe = promise.then, jQuery.each(which, function(dataAndEvents, tuple) {
  5213.         var list = tuple[2];
  5214.         var stateString = tuple[3];
  5215.         promise[tuple[1]] = list.add;
  5216.         if (stateString) {
  5217.           list.add(function() {
  5218.             state = stateString;
  5219.           }, which[1 ^ dataAndEvents][2].disable, which[2][2].lock);
  5220.         }
  5221.         /**
  5222.          * @return {?}
  5223.          */
  5224.         deferred[tuple[0]] = function() {
  5225.           return deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments), this;
  5226.         };
  5227.         deferred[tuple[0] + "With"] = list.fireWith;
  5228.       }), promise.promise(deferred), func && func.call(deferred, deferred), deferred;
  5229.     },
  5230.     /**
  5231.      * @param {Object} subordinate
  5232.      * @return {?}
  5233.      */
  5234.     when : function(subordinate) {
  5235.       var progressValues;
  5236.       var progressContexts;
  5237.       var resolveContexts;
  5238.       /** @type {number} */
  5239.       var i = 0;
  5240.       /** @type {Array.<?>} */
  5241.       var resolveValues = core_slice.call(arguments);
  5242.       /** @type {number} */
  5243.       var length = resolveValues.length;
  5244.       /** @type {number} */
  5245.       var remaining = 1 !== length || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0;
  5246.       var deferred = 1 === remaining ? subordinate : jQuery.Deferred();
  5247.       /**
  5248.        * @param {number} i
  5249.        * @param {(Array|NodeList)} contexts
  5250.        * @param {Array} values
  5251.        * @return {?}
  5252.        */
  5253.       var updateFunc = function(i, contexts, values) {
  5254.         return function(value) {
  5255.           contexts[i] = this;
  5256.           values[i] = arguments.length > 1 ? core_slice.call(arguments) : value;
  5257.           if (values === progressValues) {
  5258.             deferred.notifyWith(contexts, values);
  5259.           } else {
  5260.             if (!--remaining) {
  5261.               deferred.resolveWith(contexts, values);
  5262.             }
  5263.           }
  5264.         };
  5265.       };
  5266.       if (length > 1) {
  5267.         /** @type {Array} */
  5268.         progressValues = new Array(length);
  5269.         /** @type {Array} */
  5270.         progressContexts = new Array(length);
  5271.         /** @type {Array} */
  5272.         resolveContexts = new Array(length);
  5273.         for (;length > i;i++) {
  5274.           if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
  5275.             resolveValues[i].promise().done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFunc(i, progressContexts, progressValues));
  5276.           } else {
  5277.             --remaining;
  5278.           }
  5279.         }
  5280.       }
  5281.       return remaining || deferred.resolveWith(resolveContexts, resolveValues), deferred.promise();
  5282.     }
  5283.   });
  5284.   var readyList;
  5285.   /**
  5286.    * @param {string} ready
  5287.    * @return {?}
  5288.    */
  5289.   jQuery.fn.ready = function(ready) {
  5290.     return jQuery.ready.promise().done(ready), this;
  5291.   };
  5292.   jQuery.extend({
  5293.     isReady : false,
  5294.     readyWait : 1,
  5295.     /**
  5296.      * @param {?} hold
  5297.      * @return {undefined}
  5298.      */
  5299.     holdReady : function(hold) {
  5300.       if (hold) {
  5301.         jQuery.readyWait++;
  5302.       } else {
  5303.         jQuery.ready(true);
  5304.       }
  5305.     },
  5306.     /**
  5307.      * @param {boolean} wait
  5308.      * @return {undefined}
  5309.      */
  5310.     ready : function(wait) {
  5311.       if (!(wait === true ? --jQuery.readyWait : jQuery.isReady)) {
  5312.         /** @type {boolean} */
  5313.         jQuery.isReady = true;
  5314.         if (!(wait !== true && --jQuery.readyWait > 0)) {
  5315.           readyList.resolveWith(node, [jQuery]);
  5316.           if (jQuery.fn.triggerHandler) {
  5317.             jQuery(node).triggerHandler("ready");
  5318.             jQuery(node).off("ready");
  5319.           }
  5320.         }
  5321.       }
  5322.     }
  5323.   });
  5324.   /**
  5325.    * @param {string} obj
  5326.    * @return {?}
  5327.    */
  5328.   jQuery.ready.promise = function(obj) {
  5329.     return readyList || (readyList = jQuery.Deferred(), "complete" === node.readyState ? setTimeout(jQuery.ready) : (node.addEventListener("DOMContentLoaded", completed, false), win.addEventListener("load", completed, false))), readyList.promise(obj);
  5330.   };
  5331.   jQuery.ready.promise();
  5332.   /** @type {function (Object, Function, string, string, boolean, string, boolean): ?} */
  5333.   var access = jQuery.access = function(elems, fn, key, value, chainable, emptyGet, raw) {
  5334.     /** @type {number} */
  5335.     var i = 0;
  5336.     var length = elems.length;
  5337.     /** @type {boolean} */
  5338.     var bulk = null == key;
  5339.     if ("object" === jQuery.type(key)) {
  5340.       /** @type {boolean} */
  5341.       chainable = true;
  5342.       for (i in key) {
  5343.         jQuery.access(elems, fn, i, key[i], true, emptyGet, raw);
  5344.       }
  5345.     } else {
  5346.       if (void 0 !== value && (chainable = true, jQuery.isFunction(value) || (raw = true), bulk && (raw ? (fn.call(elems, value), fn = null) : (bulk = fn, fn = function(scripts, event, value) {
  5347.         return bulk.call(jQuery(scripts), value);
  5348.       })), fn)) {
  5349.         for (;length > i;i++) {
  5350.           fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
  5351.         }
  5352.       }
  5353.     }
  5354.     return chainable ? elems : bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
  5355.   };
  5356.   /**
  5357.    * @param {Object} elem
  5358.    * @return {?}
  5359.    */
  5360.   jQuery.acceptData = function(elem) {
  5361.     return 1 === elem.nodeType || (9 === elem.nodeType || !+elem.nodeType);
  5362.   };
  5363.   /** @type {number} */
  5364.   Data.uid = 1;
  5365.   /** @type {function (Object): ?} */
  5366.   Data.accepts = jQuery.acceptData;
  5367.   Data.prototype = {
  5368.     /**
  5369.      * @param {Object} owner
  5370.      * @return {?}
  5371.      */
  5372.     key : function(owner) {
  5373.       if (!Data.accepts(owner)) {
  5374.         return 0;
  5375.       }
  5376.       var descriptor = {};
  5377.       var unlock = owner[this.expando];
  5378.       if (!unlock) {
  5379.         /** @type {number} */
  5380.         unlock = Data.uid++;
  5381.         try {
  5382.           descriptor[this.expando] = {
  5383.             value : unlock
  5384.           };
  5385.           Object.defineProperties(owner, descriptor);
  5386.         } catch (i) {
  5387.           /** @type {number} */
  5388.           descriptor[this.expando] = unlock;
  5389.           jQuery.extend(owner, descriptor);
  5390.         }
  5391.       }
  5392.       return this.cache[unlock] || (this.cache[unlock] = {}), unlock;
  5393.     },
  5394.     /**
  5395.      * @param {Object} owner
  5396.      * @param {string} data
  5397.      * @param {?} value
  5398.      * @return {?}
  5399.      */
  5400.     set : function(owner, data, value) {
  5401.       var prop;
  5402.       var unlock = this.key(owner);
  5403.       var cache = this.cache[unlock];
  5404.       if ("string" == typeof data) {
  5405.         cache[data] = value;
  5406.       } else {
  5407.         if (jQuery.isEmptyObject(cache)) {
  5408.           jQuery.extend(this.cache[unlock], data);
  5409.         } else {
  5410.           for (prop in data) {
  5411.             cache[prop] = data[prop];
  5412.           }
  5413.         }
  5414.       }
  5415.       return cache;
  5416.     },
  5417.     /**
  5418.      * @param {Object} owner
  5419.      * @param {string} value
  5420.      * @return {?}
  5421.      */
  5422.     get : function(owner, value) {
  5423.       var cache = this.cache[this.key(owner)];
  5424.       return void 0 === value ? cache : cache[value];
  5425.     },
  5426.     /**
  5427.      * @param {Object} owner
  5428.      * @param {string} key
  5429.      * @param {string} value
  5430.      * @return {?}
  5431.      */
  5432.     access : function(owner, key, value) {
  5433.       var stored;
  5434.       return void 0 === key || key && ("string" == typeof key && void 0 === value) ? (stored = this.get(owner, key), void 0 !== stored ? stored : this.get(owner, jQuery.camelCase(key))) : (this.set(owner, key, value), void 0 !== value ? value : key);
  5435.     },
  5436.     /**
  5437.      * @param {Object} owner
  5438.      * @param {?} key
  5439.      * @return {undefined}
  5440.      */
  5441.     remove : function(owner, key) {
  5442.       var i;
  5443.       var name;
  5444.       var camel;
  5445.       var unlock = this.key(owner);
  5446.       var cache = this.cache[unlock];
  5447.       if (void 0 === key) {
  5448.         this.cache[unlock] = {};
  5449.       } else {
  5450.         if (jQuery.isArray(key)) {
  5451.           name = key.concat(key.map(jQuery.camelCase));
  5452.         } else {
  5453.           camel = jQuery.camelCase(key);
  5454.           if (key in cache) {
  5455.             /** @type {Array} */
  5456.             name = [key, camel];
  5457.           } else {
  5458.             name = camel;
  5459.             name = name in cache ? [name] : name.match(core_rnotwhite) || [];
  5460.           }
  5461.         }
  5462.         i = name.length;
  5463.         for (;i--;) {
  5464.           delete cache[name[i]];
  5465.         }
  5466.       }
  5467.     },
  5468.     /**
  5469.      * @param {Object} owner
  5470.      * @return {?}
  5471.      */
  5472.     hasData : function(owner) {
  5473.       return!jQuery.isEmptyObject(this.cache[owner[this.expando]] || {});
  5474.     },
  5475.     /**
  5476.      * @param {?} owner
  5477.      * @return {undefined}
  5478.      */
  5479.     discard : function(owner) {
  5480.       if (owner[this.expando]) {
  5481.         delete this.cache[owner[this.expando]];
  5482.       }
  5483.     }
  5484.   };
  5485.   var data_priv = new Data;
  5486.   var data_user = new Data;
  5487.   /** @type {RegExp} */
  5488.   var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/;
  5489.   /** @type {RegExp} */
  5490.   var r20 = /([A-Z])/g;
  5491.   jQuery.extend({
  5492.     /**
  5493.      * @param {Object} elem
  5494.      * @return {?}
  5495.      */
  5496.     hasData : function(elem) {
  5497.       return data_user.hasData(elem) || data_priv.hasData(elem);
  5498.     },
  5499.     /**
  5500.      * @param {string} type
  5501.      * @param {?} name
  5502.      * @param {Object} data
  5503.      * @return {?}
  5504.      */
  5505.     data : function(type, name, data) {
  5506.       return data_user.access(type, name, data);
  5507.     },
  5508.     /**
  5509.      * @param {Object} elem
  5510.      * @param {?} key
  5511.      * @return {undefined}
  5512.      */
  5513.     removeData : function(elem, key) {
  5514.       data_user.remove(elem, key);
  5515.     },
  5516.     /**
  5517.      * @param {Object} elem
  5518.      * @param {Object} name
  5519.      * @param {string} data
  5520.      * @return {?}
  5521.      */
  5522.     _data : function(elem, name, data) {
  5523.       return data_priv.access(elem, name, data);
  5524.     },
  5525.     /**
  5526.      * @param {Object} elem
  5527.      * @param {?} name
  5528.      * @return {undefined}
  5529.      */
  5530.     _removeData : function(elem, name) {
  5531.       data_priv.remove(elem, name);
  5532.     }
  5533.   });
  5534.   jQuery.fn.extend({
  5535.     /**
  5536.      * @param {string} type
  5537.      * @param {?} elems
  5538.      * @return {?}
  5539.      */
  5540.     data : function(type, elems) {
  5541.       var len;
  5542.       var name;
  5543.       var data;
  5544.       var elem = this[0];
  5545.       var attrs = elem && elem.attributes;
  5546.       if (void 0 === type) {
  5547.         if (this.length && (data = data_user.get(elem), 1 === elem.nodeType && !data_priv.get(elem, "hasDataAttrs"))) {
  5548.           len = attrs.length;
  5549.           for (;len--;) {
  5550.             if (attrs[len]) {
  5551.               name = attrs[len].name;
  5552.               if (0 === name.indexOf("data-")) {
  5553.                 name = jQuery.camelCase(name.slice(5));
  5554.                 dataAttr(elem, name, data[name]);
  5555.               }
  5556.             }
  5557.           }
  5558.           data_priv.set(elem, "hasDataAttrs", true);
  5559.         }
  5560.         return data;
  5561.       }
  5562.       return "object" == typeof type ? this.each(function() {
  5563.         data_user.set(this, type);
  5564.       }) : access(this, function(value) {
  5565.         var data;
  5566.         var camelKey = jQuery.camelCase(type);
  5567.         if (elem && void 0 === value) {
  5568.           if (data = data_user.get(elem, type), void 0 !== data) {
  5569.             return data;
  5570.           }
  5571.           if (data = data_user.get(elem, camelKey), void 0 !== data) {
  5572.             return data;
  5573.           }
  5574.           if (data = dataAttr(elem, camelKey, void 0), void 0 !== data) {
  5575.             return data;
  5576.           }
  5577.         } else {
  5578.           this.each(function() {
  5579.             var data = data_user.get(this, camelKey);
  5580.             data_user.set(this, camelKey, value);
  5581.             if (-1 !== type.indexOf("-")) {
  5582.               if (void 0 !== data) {
  5583.                 data_user.set(this, type, value);
  5584.               }
  5585.             }
  5586.           });
  5587.         }
  5588.       }, null, elems, arguments.length > 1, null, true);
  5589.     },
  5590.     /**
  5591.      * @param {?} key
  5592.      * @return {?}
  5593.      */
  5594.     removeData : function(key) {
  5595.       return this.each(function() {
  5596.         data_user.remove(this, key);
  5597.       });
  5598.     }
  5599.   });
  5600.   jQuery.extend({
  5601.     /**
  5602.      * @param {Object} elem
  5603.      * @param {string} type
  5604.      * @param {?} data
  5605.      * @return {?}
  5606.      */
  5607.     queue : function(elem, type, data) {
  5608.       var queue;
  5609.       return elem ? (type = (type || "fx") + "queue", queue = data_priv.get(elem, type), data && (!queue || jQuery.isArray(data) ? queue = data_priv.access(elem, type, jQuery.makeArray(data)) : queue.push(data)), queue || []) : void 0;
  5610.     },
  5611.     /**
  5612.      * @param {Object} elem
  5613.      * @param {string} type
  5614.      * @return {undefined}
  5615.      */
  5616.     dequeue : function(elem, type) {
  5617.       type = type || "fx";
  5618.       var queue = jQuery.queue(elem, type);
  5619.       var ln = queue.length;
  5620.       var fn = queue.shift();
  5621.       var hooks = jQuery._queueHooks(elem, type);
  5622.       /**
  5623.        * @return {undefined}
  5624.        */
  5625.       var next = function() {
  5626.         jQuery.dequeue(elem, type);
  5627.       };
  5628.       if ("inprogress" === fn) {
  5629.         fn = queue.shift();
  5630.         ln--;
  5631.       }
  5632.       if (fn) {
  5633.         if ("fx" === type) {
  5634.           queue.unshift("inprogress");
  5635.         }
  5636.         delete hooks.stop;
  5637.         fn.call(elem, next, hooks);
  5638.       }
  5639.       if (!ln) {
  5640.         if (hooks) {
  5641.           hooks.empty.fire();
  5642.         }
  5643.       }
  5644.     },
  5645.     /**
  5646.      * @param {Object} elem
  5647.      * @param {string} type
  5648.      * @return {?}
  5649.      */
  5650.     _queueHooks : function(elem, type) {
  5651.       /** @type {string} */
  5652.       var key = type + "queueHooks";
  5653.       return data_priv.get(elem, key) || data_priv.access(elem, key, {
  5654.         empty : jQuery.Callbacks("once memory").add(function() {
  5655.           data_priv.remove(elem, [type + "queue", key]);
  5656.         })
  5657.       });
  5658.     }
  5659.   });
  5660.   jQuery.fn.extend({
  5661.     /**
  5662.      * @param {(Function|string)} type
  5663.      * @param {(Function|string)} data
  5664.      * @return {?}
  5665.      */
  5666.     queue : function(type, data) {
  5667.       /** @type {number} */
  5668.       var setter = 2;
  5669.       return "string" != typeof type && (data = type, type = "fx", setter--), arguments.length < setter ? jQuery.queue(this[0], type) : void 0 === data ? this : this.each(function() {
  5670.         var queue = jQuery.queue(this, type, data);
  5671.         jQuery._queueHooks(this, type);
  5672.         if ("fx" === type) {
  5673.           if ("inprogress" !== queue[0]) {
  5674.             jQuery.dequeue(this, type);
  5675.           }
  5676.         }
  5677.       });
  5678.     },
  5679.     /**
  5680.      * @param {string} type
  5681.      * @return {?}
  5682.      */
  5683.     dequeue : function(type) {
  5684.       return this.each(function() {
  5685.         jQuery.dequeue(this, type);
  5686.       });
  5687.     },
  5688.     /**
  5689.      * @param {string} type
  5690.      * @return {?}
  5691.      */
  5692.     clearQueue : function(type) {
  5693.       return this.queue(type || "fx", []);
  5694.     },
  5695.     /**
  5696.      * @param {string} type
  5697.      * @param {string} obj
  5698.      * @return {?}
  5699.      */
  5700.     promise : function(type, obj) {
  5701.       var body;
  5702.       /** @type {number} */
  5703.       var i = 1;
  5704.       var defer = jQuery.Deferred();
  5705.       var elements = this;
  5706.       var ii = this.length;
  5707.       /**
  5708.        * @return {undefined}
  5709.        */
  5710.       var resolve = function() {
  5711.         if (!--i) {
  5712.           defer.resolveWith(elements, [elements]);
  5713.         }
  5714.       };
  5715.       if ("string" != typeof type) {
  5716.         /** @type {string} */
  5717.         obj = type;
  5718.         type = void 0;
  5719.       }
  5720.       type = type || "fx";
  5721.       for (;ii--;) {
  5722.         body = data_priv.get(elements[ii], type + "queueHooks");
  5723.         if (body) {
  5724.           if (body.empty) {
  5725.             i++;
  5726.             body.empty.add(resolve);
  5727.           }
  5728.         }
  5729.       }
  5730.       return resolve(), defer.promise(obj);
  5731.     }
  5732.   });
  5733.   /** @type {string} */
  5734.   var core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
  5735.   /** @type {Array} */
  5736.   var cssExpand = ["Top", "Right", "Bottom", "Left"];
  5737.   /**
  5738.    * @param {Object} node
  5739.    * @param {Function} context
  5740.    * @return {?}
  5741.    */
  5742.   var isHidden = function(node, context) {
  5743.     return node = context || node, "none" === jQuery.css(node, "display") || !jQuery.contains(node.ownerDocument, node);
  5744.   };
  5745.   /** @type {RegExp} */
  5746.   var manipulation_rcheckableType = /^(?:checkbox|radio)$/i;
  5747.   !function() {
  5748.     var fragment = node.createDocumentFragment();
  5749.     var form = fragment.appendChild(node.createElement("div"));
  5750.     var input = node.createElement("input");
  5751.     input.setAttribute("type", "radio");
  5752.     input.setAttribute("checked", "checked");
  5753.     input.setAttribute("name", "t");
  5754.     form.appendChild(input);
  5755.     support.checkClone = form.cloneNode(true).cloneNode(true).lastChild.checked;
  5756.     /** @type {string} */
  5757.     form.innerHTML = "<textarea>x</textarea>";
  5758.     /** @type {boolean} */
  5759.     support.noCloneChecked = !!form.cloneNode(true).lastChild.defaultValue;
  5760.   }();
  5761.   /** @type {string} */
  5762.   var text = "undefined";
  5763.   /** @type {boolean} */
  5764.   support.focusinBubbles = "onfocusin" in win;
  5765.   /** @type {RegExp} */
  5766.   var rmouseEvent = /^key/;
  5767.   /** @type {RegExp} */
  5768.   var rkeyEvent = /^(?:mouse|pointer|contextmenu)|click/;
  5769.   /** @type {RegExp} */
  5770.   var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
  5771.   /** @type {RegExp} */
  5772.   var rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
  5773.   jQuery.event = {
  5774.     global : {},
  5775.     /**
  5776.      * @param {Object} elem
  5777.      * @param {Object} types
  5778.      * @param {Function} handler
  5779.      * @param {Object} e
  5780.      * @param {(Function|string)} selector
  5781.      * @return {undefined}
  5782.      */
  5783.     add : function(elem, types, handler, e, selector) {
  5784.       var handleObjIn;
  5785.       var eventHandle;
  5786.       var segmentMatch;
  5787.       var events;
  5788.       var t;
  5789.       var handleObj;
  5790.       var special;
  5791.       var handlers;
  5792.       var type;
  5793.       var namespaces;
  5794.       var origType;
  5795.       var elemData = data_priv.get(elem);
  5796.       if (elemData) {
  5797.         if (handler.handler) {
  5798.           /** @type {Function} */
  5799.           handleObjIn = handler;
  5800.           handler = handleObjIn.handler;
  5801.           selector = handleObjIn.selector;
  5802.         }
  5803.         if (!handler.guid) {
  5804.           /** @type {number} */
  5805.           handler.guid = jQuery.guid++;
  5806.         }
  5807.         if (!(events = elemData.events)) {
  5808.           events = elemData.events = {};
  5809.         }
  5810.         if (!(eventHandle = elemData.handle)) {
  5811.           /** @type {function (Event): ?} */
  5812.           eventHandle = elemData.handle = function(e) {
  5813.             return typeof jQuery !== text && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : void 0;
  5814.           };
  5815.         }
  5816.         types = (types || "").match(core_rnotwhite) || [""];
  5817.         t = types.length;
  5818.         for (;t--;) {
  5819.           /** @type {Array} */
  5820.           segmentMatch = rtypenamespace.exec(types[t]) || [];
  5821.           type = origType = segmentMatch[1];
  5822.           namespaces = (segmentMatch[2] || "").split(".").sort();
  5823.           if (type) {
  5824.             special = jQuery.event.special[type] || {};
  5825.             type = (selector ? special.delegateType : special.bindType) || type;
  5826.             special = jQuery.event.special[type] || {};
  5827.             handleObj = jQuery.extend({
  5828.               type : type,
  5829.               origType : origType,
  5830.               data : e,
  5831.               /** @type {Function} */
  5832.               handler : handler,
  5833.               guid : handler.guid,
  5834.               selector : selector,
  5835.               needsContext : selector && jQuery.expr.match.needsContext.test(selector),
  5836.               namespace : namespaces.join(".")
  5837.             }, handleObjIn);
  5838.             if (!(handlers = events[type])) {
  5839.               /** @type {Array} */
  5840.               handlers = events[type] = [];
  5841.               /** @type {number} */
  5842.               handlers.delegateCount = 0;
  5843.               if (!(special.setup && special.setup.call(elem, e, namespaces, eventHandle) !== false)) {
  5844.                 if (elem.addEventListener) {
  5845.                   elem.addEventListener(type, eventHandle, false);
  5846.                 }
  5847.               }
  5848.             }
  5849.             if (special.add) {
  5850.               special.add.call(elem, handleObj);
  5851.               if (!handleObj.handler.guid) {
  5852.                 handleObj.handler.guid = handler.guid;
  5853.               }
  5854.             }
  5855.             if (selector) {
  5856.               handlers.splice(handlers.delegateCount++, 0, handleObj);
  5857.             } else {
  5858.               handlers.push(handleObj);
  5859.             }
  5860.             /** @type {boolean} */
  5861.             jQuery.event.global[type] = true;
  5862.           }
  5863.         }
  5864.       }
  5865.     },
  5866.     /**
  5867.      * @param {Object} elem
  5868.      * @param {Object} types
  5869.      * @param {Function} handler
  5870.      * @param {boolean} selector
  5871.      * @param {boolean} keepData
  5872.      * @return {undefined}
  5873.      */
  5874.     remove : function(elem, types, handler, selector, keepData) {
  5875.       var j;
  5876.       var origCount;
  5877.       var tmp;
  5878.       var events;
  5879.       var t;
  5880.       var handleObj;
  5881.       var special;
  5882.       var handlers;
  5883.       var type;
  5884.       var namespaces;
  5885.       var origType;
  5886.       var elemData = data_priv.hasData(elem) && data_priv.get(elem);
  5887.       if (elemData && (events = elemData.events)) {
  5888.         types = (types || "").match(core_rnotwhite) || [""];
  5889.         t = types.length;
  5890.         for (;t--;) {
  5891.           if (tmp = rtypenamespace.exec(types[t]) || [], type = origType = tmp[1], namespaces = (tmp[2] || "").split(".").sort(), type) {
  5892.             special = jQuery.event.special[type] || {};
  5893.             type = (selector ? special.delegateType : special.bindType) || type;
  5894.             handlers = events[type] || [];
  5895.             tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
  5896.             origCount = j = handlers.length;
  5897.             for (;j--;) {
  5898.               handleObj = handlers[j];
  5899.               if (!(!keepData && origType !== handleObj.origType)) {
  5900.                 if (!(handler && handler.guid !== handleObj.guid)) {
  5901.                   if (!(tmp && !tmp.test(handleObj.namespace))) {
  5902.                     if (!(selector && (selector !== handleObj.selector && ("**" !== selector || !handleObj.selector)))) {
  5903.                       handlers.splice(j, 1);
  5904.                       if (handleObj.selector) {
  5905.                         handlers.delegateCount--;
  5906.                       }
  5907.                       if (special.remove) {
  5908.                         special.remove.call(elem, handleObj);
  5909.                       }
  5910.                     }
  5911.                   }
  5912.                 }
  5913.               }
  5914.             }
  5915.             if (origCount) {
  5916.               if (!handlers.length) {
  5917.                 if (!(special.teardown && special.teardown.call(elem, namespaces, elemData.handle) !== false)) {
  5918.                   jQuery.removeEvent(elem, type, elemData.handle);
  5919.                 }
  5920.                 delete events[type];
  5921.               }
  5922.             }
  5923.           } else {
  5924.             for (type in events) {
  5925.               jQuery.event.remove(elem, type + types[t], handler, selector, true);
  5926.             }
  5927.           }
  5928.         }
  5929.         if (jQuery.isEmptyObject(events)) {
  5930.           delete elemData.handle;
  5931.           data_priv.remove(elem, "events");
  5932.         }
  5933.       }
  5934.     },
  5935.     /**
  5936.      * @param {string} event
  5937.      * @param {?} args
  5938.      * @param {Object} elem
  5939.      * @param {boolean} onlyHandlers
  5940.      * @return {?}
  5941.      */
  5942.     trigger : function(event, args, elem, onlyHandlers) {
  5943.       var i;
  5944.       var cur;
  5945.       var tmp;
  5946.       var bubbleType;
  5947.       var ontype;
  5948.       var handle;
  5949.       var special;
  5950.       /** @type {Array} */
  5951.       var eventPath = [elem || node];
  5952.       var type = core_hasOwn.call(event, "type") ? event.type : event;
  5953.       var namespaces = core_hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
  5954.       if (cur = tmp = elem = elem || node, 3 !== elem.nodeType && (8 !== elem.nodeType && (!rfocusMorph.test(type + jQuery.event.triggered) && (type.indexOf(".") >= 0 && (namespaces = type.split("."), type = namespaces.shift(), namespaces.sort()), ontype = type.indexOf(":") < 0 && "on" + type, event = event[jQuery.expando] ? event : new jQuery.Event(type, "object" == typeof event && event), event.isTrigger = onlyHandlers ? 2 : 3, event.namespace = namespaces.join("."), event.namespace_re = event.namespace ?
  5955.       new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, event.result = void 0, event.target || (event.target = elem), args = null == args ? [event] : jQuery.makeArray(args, [event]), special = jQuery.event.special[type] || {}, onlyHandlers || (!special.trigger || special.trigger.apply(elem, args) !== false))))) {
  5956.         if (!onlyHandlers && (!special.noBubble && !jQuery.isWindow(elem))) {
  5957.           bubbleType = special.delegateType || type;
  5958.           if (!rfocusMorph.test(bubbleType + type)) {
  5959.             cur = cur.parentNode;
  5960.           }
  5961.           for (;cur;cur = cur.parentNode) {
  5962.             eventPath.push(cur);
  5963.             tmp = cur;
  5964.           }
  5965.           if (tmp === (elem.ownerDocument || node)) {
  5966.             eventPath.push(tmp.defaultView || (tmp.parentWindow || win));
  5967.           }
  5968.         }
  5969.         /** @type {number} */
  5970.         i = 0;
  5971.         for (;(cur = eventPath[i++]) && !event.isPropagationStopped();) {
  5972.           event.type = i > 1 ? bubbleType : special.bindType || type;
  5973.           handle = (data_priv.get(cur, "events") || {})[event.type] && data_priv.get(cur, "handle");
  5974.           if (handle) {
  5975.             handle.apply(cur, args);
  5976.           }
  5977.           handle = ontype && cur[ontype];
  5978.           if (handle) {
  5979.             if (handle.apply) {
  5980.               if (jQuery.acceptData(cur)) {
  5981.                 event.result = handle.apply(cur, args);
  5982.                 if (event.result === false) {
  5983.                   event.preventDefault();
  5984.                 }
  5985.               }
  5986.             }
  5987.           }
  5988.         }
  5989.         return event.type = type, onlyHandlers || (event.isDefaultPrevented() || (special._default && special._default.apply(eventPath.pop(), args) !== false || (!jQuery.acceptData(elem) || ontype && (jQuery.isFunction(elem[type]) && (!jQuery.isWindow(elem) && (tmp = elem[ontype], tmp && (elem[ontype] = null), jQuery.event.triggered = type, elem[type](), jQuery.event.triggered = void 0, tmp && (elem[ontype] = tmp))))))), event.result;
  5990.       }
  5991.     },
  5992.     /**
  5993.      * @param {Object} event
  5994.      * @return {?}
  5995.      */
  5996.     dispatch : function(event) {
  5997.       event = jQuery.event.fix(event);
  5998.       var i;
  5999.       var j;
  6000.       var ret;
  6001.       var matched;
  6002.       var handleObj;
  6003.       /** @type {Array} */
  6004.       var handlerQueue = [];
  6005.       /** @type {Array.<?>} */
  6006.       var args = core_slice.call(arguments);
  6007.       var handlers = (data_priv.get(this, "events") || {})[event.type] || [];
  6008.       var special = jQuery.event.special[event.type] || {};
  6009.       if (args[0] = event, event.delegateTarget = this, !special.preDispatch || special.preDispatch.call(this, event) !== false) {
  6010.         handlerQueue = jQuery.event.handlers.call(this, event, handlers);
  6011.         /** @type {number} */
  6012.         i = 0;
  6013.         for (;(matched = handlerQueue[i++]) && !event.isPropagationStopped();) {
  6014.           event.currentTarget = matched.elem;
  6015.           /** @type {number} */
  6016.           j = 0;
  6017.           for (;(handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped();) {
  6018.             if (!event.namespace_re || event.namespace_re.test(handleObj.namespace)) {
  6019.               event.handleObj = handleObj;
  6020.               event.data = handleObj.data;
  6021.               ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
  6022.               if (void 0 !== ret) {
  6023.                 if ((event.result = ret) === false) {
  6024.                   event.preventDefault();
  6025.                   event.stopPropagation();
  6026.                 }
  6027.               }
  6028.             }
  6029.           }
  6030.         }
  6031.         return special.postDispatch && special.postDispatch.call(this, event), event.result;
  6032.       }
  6033.     },
  6034.     /**
  6035.      * @param {Event} event
  6036.      * @param {Object} handlers
  6037.      * @return {?}
  6038.      */
  6039.     handlers : function(event, handlers) {
  6040.       var j;
  6041.       var matches;
  6042.       var sel;
  6043.       var handleObj;
  6044.       /** @type {Array} */
  6045.       var handlerQueue = [];
  6046.       var delegateCount = handlers.delegateCount;
  6047.       var cur = event.target;
  6048.       if (delegateCount && (cur.nodeType && (!event.button || "click" !== event.type))) {
  6049.         for (;cur !== this;cur = cur.parentNode || this) {
  6050.           if (cur.disabled !== true || "click" !== event.type) {
  6051.             /** @type {Array} */
  6052.             matches = [];
  6053.             /** @type {number} */
  6054.             j = 0;
  6055.             for (;delegateCount > j;j++) {
  6056.               handleObj = handlers[j];
  6057.               /** @type {string} */
  6058.               sel = handleObj.selector + " ";
  6059.               if (void 0 === matches[sel]) {
  6060.                 matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) >= 0 : jQuery.find(sel, this, null, [cur]).length;
  6061.               }
  6062.               if (matches[sel]) {
  6063.                 matches.push(handleObj);
  6064.               }
  6065.             }
  6066.             if (matches.length) {
  6067.               handlerQueue.push({
  6068.                 elem : cur,
  6069.                 handlers : matches
  6070.               });
  6071.             }
  6072.           }
  6073.         }
  6074.       }
  6075.       return delegateCount < handlers.length && handlerQueue.push({
  6076.         elem : this,
  6077.         handlers : handlers.slice(delegateCount)
  6078.       }), handlerQueue;
  6079.     },
  6080.     props : "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
  6081.     fixHooks : {},
  6082.     keyHooks : {
  6083.       props : "char charCode key keyCode".split(" "),
  6084.       /**
  6085.        * @param {Object} event
  6086.        * @param {Object} original
  6087.        * @return {?}
  6088.        */
  6089.       filter : function(event, original) {
  6090.         return null == event.which && (event.which = null != original.charCode ? original.charCode : original.keyCode), event;
  6091.       }
  6092.     },
  6093.     mouseHooks : {
  6094.       props : "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
  6095.       /**
  6096.        * @param {Object} event
  6097.        * @param {Object} original
  6098.        * @return {?}
  6099.        */
  6100.       filter : function(event, original) {
  6101.         var d;
  6102.         var de;
  6103.         var b;
  6104.         var button = original.button;
  6105.         return null == event.pageX && (null != original.clientX && (d = event.target.ownerDocument || node, de = d.documentElement, b = d.body, event.pageX = original.clientX + (de && de.scrollLeft || (b && b.scrollLeft || 0)) - (de && de.clientLeft || (b && b.clientLeft || 0)), event.pageY = original.clientY + (de && de.scrollTop || (b && b.scrollTop || 0)) - (de && de.clientTop || (b && b.clientTop || 0)))), event.which || (void 0 === button || (event.which = 1 & button ? 1 : 2 & button ? 3 : 4 &
  6106.         button ? 2 : 0)), event;
  6107.       }
  6108.     },
  6109.     /**
  6110.      * @param {Object} event
  6111.      * @return {?}
  6112.      */
  6113.     fix : function(event) {
  6114.       if (event[jQuery.expando]) {
  6115.         return event;
  6116.       }
  6117.       var i;
  6118.       var prop;
  6119.       var copy;
  6120.       var type = event.type;
  6121.       /** @type {Object} */
  6122.       var originalEvent = event;
  6123.       var fixHook = this.fixHooks[type];
  6124.       if (!fixHook) {
  6125.         this.fixHooks[type] = fixHook = rkeyEvent.test(type) ? this.mouseHooks : rmouseEvent.test(type) ? this.keyHooks : {};
  6126.       }
  6127.       copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
  6128.       event = new jQuery.Event(originalEvent);
  6129.       i = copy.length;
  6130.       for (;i--;) {
  6131.         prop = copy[i];
  6132.         event[prop] = originalEvent[prop];
  6133.       }
  6134.       return event.target || (event.target = node), 3 === event.target.nodeType && (event.target = event.target.parentNode), fixHook.filter ? fixHook.filter(event, originalEvent) : event;
  6135.     },
  6136.     special : {
  6137.       load : {
  6138.         noBubble : true
  6139.       },
  6140.       focus : {
  6141.         /**
  6142.          * @return {?}
  6143.          */
  6144.         trigger : function() {
  6145.           return this !== safeActiveElement() && this.focus ? (this.focus(), false) : void 0;
  6146.         },
  6147.         delegateType : "focusin"
  6148.       },
  6149.       blur : {
  6150.         /**
  6151.          * @return {?}
  6152.          */
  6153.         trigger : function() {
  6154.           return this === safeActiveElement() && this.blur ? (this.blur(), false) : void 0;
  6155.         },
  6156.         delegateType : "focusout"
  6157.       },
  6158.       click : {
  6159.         /**
  6160.          * @return {?}
  6161.          */
  6162.         trigger : function() {
  6163.           return "checkbox" === this.type && (this.click && jQuery.nodeName(this, "input")) ? (this.click(), false) : void 0;
  6164.         },
  6165.         /**
  6166.          * @param {Function} event
  6167.          * @return {?}
  6168.          */
  6169.         _default : function(event) {
  6170.           return jQuery.nodeName(event.target, "a");
  6171.         }
  6172.       },
  6173.       beforeunload : {
  6174.         /**
  6175.          * @param {Object} event
  6176.          * @return {undefined}
  6177.          */
  6178.         postDispatch : function(event) {
  6179.           if (void 0 !== event.result) {
  6180.             if (event.originalEvent) {
  6181.               event.originalEvent.returnValue = event.result;
  6182.             }
  6183.           }
  6184.         }
  6185.       }
  6186.     },
  6187.     /**
  6188.      * @param {string} type
  6189.      * @param {Object} elem
  6190.      * @param {?} event
  6191.      * @param {boolean} dataAndEvents
  6192.      * @return {undefined}
  6193.      */
  6194.     simulate : function(type, elem, event, dataAndEvents) {
  6195.       var cycle = jQuery.extend(new jQuery.Event, event, {
  6196.         type : type,
  6197.         isSimulated : true,
  6198.         originalEvent : {}
  6199.       });
  6200.       if (dataAndEvents) {
  6201.         jQuery.event.trigger(cycle, null, elem);
  6202.       } else {
  6203.         jQuery.event.dispatch.call(elem, cycle);
  6204.       }
  6205.       if (cycle.isDefaultPrevented()) {
  6206.         event.preventDefault();
  6207.       }
  6208.     }
  6209.   };
  6210.   /**
  6211.    * @param {Object} elem
  6212.    * @param {?} type
  6213.    * @param {?} handle
  6214.    * @return {undefined}
  6215.    */
  6216.   jQuery.removeEvent = function(elem, type, handle) {
  6217.     if (elem.removeEventListener) {
  6218.       elem.removeEventListener(type, handle, false);
  6219.     }
  6220.   };
  6221.   /**
  6222.    * @param {Object} src
  6223.    * @param {?} props
  6224.    * @return {?}
  6225.    */
  6226.   jQuery.Event = function(src, props) {
  6227.     return this instanceof jQuery.Event ? (src && src.type ? (this.originalEvent = src, this.type = src.type, this.isDefaultPrevented = src.defaultPrevented || void 0 === src.defaultPrevented && src.returnValue === false ? returnTrue : returnFalse) : this.type = src, props && jQuery.extend(this, props), this.timeStamp = src && src.timeStamp || jQuery.now(), void(this[jQuery.expando] = true)) : new jQuery.Event(src, props);
  6228.   };
  6229.   jQuery.Event.prototype = {
  6230.     /** @type {function (): ?} */
  6231.     isDefaultPrevented : returnFalse,
  6232.     /** @type {function (): ?} */
  6233.     isPropagationStopped : returnFalse,
  6234.     /** @type {function (): ?} */
  6235.     isImmediatePropagationStopped : returnFalse,
  6236.     /**
  6237.      * @return {undefined}
  6238.      */
  6239.     preventDefault : function() {
  6240.       var e = this.originalEvent;
  6241.       /** @type {function (): ?} */
  6242.       this.isDefaultPrevented = returnTrue;
  6243.       if (e) {
  6244.         if (e.preventDefault) {
  6245.           e.preventDefault();
  6246.         }
  6247.       }
  6248.     },
  6249.     /**
  6250.      * @return {undefined}
  6251.      */
  6252.     stopPropagation : function() {
  6253.       var e = this.originalEvent;
  6254.       /** @type {function (): ?} */
  6255.       this.isPropagationStopped = returnTrue;
  6256.       if (e) {
  6257.         if (e.stopPropagation) {
  6258.           e.stopPropagation();
  6259.         }
  6260.       }
  6261.     },
  6262.     /**
  6263.      * @return {undefined}
  6264.      */
  6265.     stopImmediatePropagation : function() {
  6266.       var e = this.originalEvent;
  6267.       /** @type {function (): ?} */
  6268.       this.isImmediatePropagationStopped = returnTrue;
  6269.       if (e) {
  6270.         if (e.stopImmediatePropagation) {
  6271.           e.stopImmediatePropagation();
  6272.         }
  6273.       }
  6274.       this.stopPropagation();
  6275.     }
  6276.   };
  6277.   jQuery.each({
  6278.     mouseenter : "mouseover",
  6279.     mouseleave : "mouseout",
  6280.     pointerenter : "pointerover",
  6281.     pointerleave : "pointerout"
  6282.   }, function(orig, fix) {
  6283.     jQuery.event.special[orig] = {
  6284.       delegateType : fix,
  6285.       bindType : fix,
  6286.       /**
  6287.        * @param {Object} event
  6288.        * @return {?}
  6289.        */
  6290.       handle : function(event) {
  6291.         var returnValue;
  6292.         var target = this;
  6293.         var related = event.relatedTarget;
  6294.         var handleObj = event.handleObj;
  6295.         return(!related || related !== target && !jQuery.contains(target, related)) && (event.type = handleObj.origType, returnValue = handleObj.handler.apply(this, arguments), event.type = fix), returnValue;
  6296.       }
  6297.     };
  6298.   });
  6299.   if (!support.focusinBubbles) {
  6300.     jQuery.each({
  6301.       focus : "focusin",
  6302.       blur : "focusout"
  6303.     }, function(event, name) {
  6304.       /**
  6305.        * @param {Object} event
  6306.        * @return {undefined}
  6307.        */
  6308.       var handler = function(event) {
  6309.         jQuery.event.simulate(name, event.target, jQuery.event.fix(event), true);
  6310.       };
  6311.       jQuery.event.special[name] = {
  6312.         /**
  6313.          * @return {undefined}
  6314.          */
  6315.         setup : function() {
  6316.           var node = this.ownerDocument || this;
  6317.           var descriptor = data_priv.access(node, name);
  6318.           if (!descriptor) {
  6319.             node.addEventListener(event, handler, true);
  6320.           }
  6321.           data_priv.access(node, name, (descriptor || 0) + 1);
  6322.         },
  6323.         /**
  6324.          * @return {undefined}
  6325.          */
  6326.         teardown : function() {
  6327.           var node = this.ownerDocument || this;
  6328.           /** @type {number} */
  6329.           var data = data_priv.access(node, name) - 1;
  6330.           if (data) {
  6331.             data_priv.access(node, name, data);
  6332.           } else {
  6333.             node.removeEventListener(event, handler, true);
  6334.             data_priv.remove(node, name);
  6335.           }
  6336.         }
  6337.       };
  6338.     });
  6339.   }
  6340.   jQuery.fn.extend({
  6341.     /**
  6342.      * @param {string} types
  6343.      * @param {Function} selector
  6344.      * @param {Function} data
  6345.      * @param {Function} fn
  6346.      * @param {(number|string)} one
  6347.      * @return {?}
  6348.      */
  6349.     on : function(types, selector, data, fn, one) {
  6350.       var origFn;
  6351.       var type;
  6352.       if ("object" == typeof types) {
  6353.         if ("string" != typeof selector) {
  6354.           data = data || selector;
  6355.           selector = void 0;
  6356.         }
  6357.         for (type in types) {
  6358.           this.on(type, selector, data, types[type], one);
  6359.         }
  6360.         return this;
  6361.       }
  6362.       if (null == data && null == fn ? (fn = selector, data = selector = void 0) : null == fn && ("string" == typeof selector ? (fn = data, data = void 0) : (fn = data, data = selector, selector = void 0)), fn === false) {
  6363.         /** @type {function (): ?} */
  6364.         fn = returnFalse;
  6365.       } else {
  6366.         if (!fn) {
  6367.           return this;
  6368.         }
  6369.       }
  6370.       return 1 === one && (origFn = fn, fn = function(event) {
  6371.         return jQuery().off(event), origFn.apply(this, arguments);
  6372.       }, fn.guid = origFn.guid || (origFn.guid = jQuery.guid++)), this.each(function() {
  6373.         jQuery.event.add(this, types, fn, data, selector);
  6374.       });
  6375.     },
  6376.     /**
  6377.      * @param {string} types
  6378.      * @param {Function} callback
  6379.      * @param {Function} data
  6380.      * @param {Function} fn
  6381.      * @return {?}
  6382.      */
  6383.     one : function(types, callback, data, fn) {
  6384.       return this.on(types, callback, data, fn, 1);
  6385.     },
  6386.     /**
  6387.      * @param {string} types
  6388.      * @param {Function} selector
  6389.      * @param {Function} fn
  6390.      * @return {?}
  6391.      */
  6392.     off : function(types, selector, fn) {
  6393.       var handleObj;
  6394.       var type;
  6395.       if (types && (types.preventDefault && types.handleObj)) {
  6396.         return handleObj = types.handleObj, jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler), this;
  6397.       }
  6398.       if ("object" == typeof types) {
  6399.         for (type in types) {
  6400.           this.off(type, selector, types[type]);
  6401.         }
  6402.         return this;
  6403.       }
  6404.       return(selector === false || "function" == typeof selector) && (fn = selector, selector = void 0), fn === false && (fn = returnFalse), this.each(function() {
  6405.         jQuery.event.remove(this, types, fn, selector);
  6406.       });
  6407.     },
  6408.     /**
  6409.      * @param {string} type
  6410.      * @param {?} args
  6411.      * @return {?}
  6412.      */
  6413.     trigger : function(type, args) {
  6414.       return this.each(function() {
  6415.         jQuery.event.trigger(type, args, this);
  6416.       });
  6417.     },
  6418.     /**
  6419.      * @param {string} type
  6420.      * @param {?} args
  6421.      * @return {?}
  6422.      */
  6423.     triggerHandler : function(type, args) {
  6424.       var parent = this[0];
  6425.       return parent ? jQuery.event.trigger(type, args, parent, true) : void 0;
  6426.     }
  6427.   });
  6428.   /** @type {RegExp} */
  6429.   var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi;
  6430.   /** @type {RegExp} */
  6431.   var rtagName = /<([\w:]+)/;
  6432.   /** @type {RegExp} */
  6433.   var rhtml = /<|&#?\w+;/;
  6434.   /** @type {RegExp} */
  6435.   var rchecked = /<(?:script|style|link)/i;
  6436.   /** @type {RegExp} */
  6437.   var exclude = /checked\s*(?:[^=]|=\s*.checked.)/i;
  6438.   /** @type {RegExp} */
  6439.   var stopParent = /^$|\/(?:java|ecma)script/i;
  6440.   /** @type {RegExp} */
  6441.   var re = /^true\/(.*)/;
  6442.   /** @type {RegExp} */
  6443.   var rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
  6444.   var wrapMap = {
  6445.     option : [1, "<select multiple='multiple'>", "</select>"],
  6446.     thead : [1, "<table>", "</table>"],
  6447.     col : [2, "<table><colgroup>", "</colgroup></table>"],
  6448.     tr : [2, "<table><tbody>", "</tbody></table>"],
  6449.     td : [3, "<table><tbody><tr>", "</tr></tbody></table>"],
  6450.     _default : [0, "", ""]
  6451.   };
  6452.   /** @type {Array} */
  6453.   wrapMap.optgroup = wrapMap.option;
  6454.   /** @type {Array} */
  6455.   wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  6456.   /** @type {Array} */
  6457.   wrapMap.th = wrapMap.td;
  6458.   jQuery.extend({
  6459.     /**
  6460.      * @param {Object} elem
  6461.      * @param {boolean} dataAndEvents
  6462.      * @param {boolean} deepDataAndEvents
  6463.      * @return {?}
  6464.      */
  6465.     clone : function(elem, dataAndEvents, deepDataAndEvents) {
  6466.       var i;
  6467.       var l;
  6468.       var srcElements;
  6469.       var destElements;
  6470.       var clone = elem.cloneNode(true);
  6471.       var inPage = jQuery.contains(elem.ownerDocument, elem);
  6472.       if (!(support.noCloneChecked || (1 !== elem.nodeType && 11 !== elem.nodeType || jQuery.isXMLDoc(elem)))) {
  6473.         destElements = getAll(clone);
  6474.         srcElements = getAll(elem);
  6475.         /** @type {number} */
  6476.         i = 0;
  6477.         l = srcElements.length;
  6478.         for (;l > i;i++) {
  6479.           fixInput(srcElements[i], destElements[i]);
  6480.         }
  6481.       }
  6482.       if (dataAndEvents) {
  6483.         if (deepDataAndEvents) {
  6484.           srcElements = srcElements || getAll(elem);
  6485.           destElements = destElements || getAll(clone);
  6486.           /** @type {number} */
  6487.           i = 0;
  6488.           l = srcElements.length;
  6489.           for (;l > i;i++) {
  6490.             cloneCopyEvent(srcElements[i], destElements[i]);
  6491.           }
  6492.         } else {
  6493.           cloneCopyEvent(elem, clone);
  6494.         }
  6495.       }
  6496.       return destElements = getAll(clone, "script"), destElements.length > 0 && setGlobalEval(destElements, !inPage && getAll(elem, "script")), clone;
  6497.     },
  6498.     /**
  6499.      * @param {Array} elems
  6500.      * @param {Document} context
  6501.      * @param {boolean} scripts
  6502.      * @param {?} selection
  6503.      * @return {?}
  6504.      */
  6505.     buildFragment : function(elems, context, scripts, selection) {
  6506.       var elem;
  6507.       var tmp;
  6508.       var tag;
  6509.       var wrap;
  6510.       var contains;
  6511.       var j;
  6512.       var fragment = context.createDocumentFragment();
  6513.       /** @type {Array} */
  6514.       var nodes = [];
  6515.       /** @type {number} */
  6516.       var i = 0;
  6517.       var l = elems.length;
  6518.       for (;l > i;i++) {
  6519.         if (elem = elems[i], elem || 0 === elem) {
  6520.           if ("object" === jQuery.type(elem)) {
  6521.             jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
  6522.           } else {
  6523.             if (rhtml.test(elem)) {
  6524.               tmp = tmp || fragment.appendChild(context.createElement("div"));
  6525.               tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
  6526.               wrap = wrapMap[tag] || wrapMap._default;
  6527.               tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1></$2>") + wrap[2];
  6528.               j = wrap[0];
  6529.               for (;j--;) {
  6530.                 tmp = tmp.lastChild;
  6531.               }
  6532.               jQuery.merge(nodes, tmp.childNodes);
  6533.               tmp = fragment.firstChild;
  6534.               /** @type {string} */
  6535.               tmp.textContent = "";
  6536.             } else {
  6537.               nodes.push(context.createTextNode(elem));
  6538.             }
  6539.           }
  6540.         }
  6541.       }
  6542.       /** @type {string} */
  6543.       fragment.textContent = "";
  6544.       /** @type {number} */
  6545.       i = 0;
  6546.       for (;elem = nodes[i++];) {
  6547.         if ((!selection || -1 === jQuery.inArray(elem, selection)) && (contains = jQuery.contains(elem.ownerDocument, elem), tmp = getAll(fragment.appendChild(elem), "script"), contains && setGlobalEval(tmp), scripts)) {
  6548.           /** @type {number} */
  6549.           j = 0;
  6550.           for (;elem = tmp[j++];) {
  6551.             if (stopParent.test(elem.type || "")) {
  6552.               scripts.push(elem);
  6553.             }
  6554.           }
  6555.         }
  6556.       }
  6557.       return fragment;
  6558.     },
  6559.     /**
  6560.      * @param {?} elems
  6561.      * @return {undefined}
  6562.      */
  6563.     cleanData : function(elems) {
  6564.       var data;
  6565.       var elem;
  6566.       var type;
  6567.       var key;
  6568.       var special = jQuery.event.special;
  6569.       /** @type {number} */
  6570.       var i = 0;
  6571.       for (;void 0 !== (elem = elems[i]);i++) {
  6572.         if (jQuery.acceptData(elem) && (key = elem[data_priv.expando], key && (data = data_priv.cache[key]))) {
  6573.           if (data.events) {
  6574.             for (type in data.events) {
  6575.               if (special[type]) {
  6576.                 jQuery.event.remove(elem, type);
  6577.               } else {
  6578.                 jQuery.removeEvent(elem, type, data.handle);
  6579.               }
  6580.             }
  6581.           }
  6582.           if (data_priv.cache[key]) {
  6583.             delete data_priv.cache[key];
  6584.           }
  6585.         }
  6586.         delete data_user.cache[elem[data_user.expando]];
  6587.       }
  6588.     }
  6589.   });
  6590.   jQuery.fn.extend({
  6591.     /**
  6592.      * @param {string} value
  6593.      * @return {?}
  6594.      */
  6595.     text : function(value) {
  6596.       return access(this, function(textString) {
  6597.         return void 0 === textString ? jQuery.text(this) : this.empty().each(function() {
  6598.           if (1 === this.nodeType || (11 === this.nodeType || 9 === this.nodeType)) {
  6599.             /** @type {string} */
  6600.             this.textContent = textString;
  6601.           }
  6602.         });
  6603.       }, null, value, arguments.length);
  6604.     },
  6605.     /**
  6606.      * @return {?}
  6607.      */
  6608.     append : function() {
  6609.       return this.domManip(arguments, function(elem) {
  6610.         if (1 === this.nodeType || (11 === this.nodeType || 9 === this.nodeType)) {
  6611.           var target = manipulationTarget(this, elem);
  6612.           target.appendChild(elem);
  6613.         }
  6614.       });
  6615.     },
  6616.     /**
  6617.      * @return {?}
  6618.      */
  6619.     prepend : function() {
  6620.       return this.domManip(arguments, function(elem) {
  6621.         if (1 === this.nodeType || (11 === this.nodeType || 9 === this.nodeType)) {
  6622.           var target = manipulationTarget(this, elem);
  6623.           target.insertBefore(elem, target.firstChild);
  6624.         }
  6625.       });
  6626.     },
  6627.     /**
  6628.      * @return {?}
  6629.      */
  6630.     before : function() {
  6631.       return this.domManip(arguments, function(elem) {
  6632.         if (this.parentNode) {
  6633.           this.parentNode.insertBefore(elem, this);
  6634.         }
  6635.       });
  6636.     },
  6637.     /**
  6638.      * @return {?}
  6639.      */
  6640.     after : function() {
  6641.       return this.domManip(arguments, function(elem) {
  6642.         if (this.parentNode) {
  6643.           this.parentNode.insertBefore(elem, this.nextSibling);
  6644.         }
  6645.       });
  6646.     },
  6647.     /**
  6648.      * @param {boolean} selector
  6649.      * @param {?} keepData
  6650.      * @return {?}
  6651.      */
  6652.     remove : function(selector, keepData) {
  6653.       var elem;
  6654.       var elems = selector ? jQuery.filter(selector, this) : this;
  6655.       /** @type {number} */
  6656.       var i = 0;
  6657.       for (;null != (elem = elems[i]);i++) {
  6658.         if (!keepData) {
  6659.           if (!(1 !== elem.nodeType)) {
  6660.             jQuery.cleanData(getAll(elem));
  6661.           }
  6662.         }
  6663.         if (elem.parentNode) {
  6664.           if (keepData) {
  6665.             if (jQuery.contains(elem.ownerDocument, elem)) {
  6666.               setGlobalEval(getAll(elem, "script"));
  6667.             }
  6668.           }
  6669.           elem.parentNode.removeChild(elem);
  6670.         }
  6671.       }
  6672.       return this;
  6673.     },
  6674.     /**
  6675.      * @return {?}
  6676.      */
  6677.     empty : function() {
  6678.       var elem;
  6679.       /** @type {number} */
  6680.       var unlock = 0;
  6681.       for (;null != (elem = this[unlock]);unlock++) {
  6682.         if (1 === elem.nodeType) {
  6683.           jQuery.cleanData(getAll(elem, false));
  6684.           /** @type {string} */
  6685.           elem.textContent = "";
  6686.         }
  6687.       }
  6688.       return this;
  6689.     },
  6690.     /**
  6691.      * @param {boolean} dataAndEvents
  6692.      * @param {boolean} deepDataAndEvents
  6693.      * @return {?}
  6694.      */
  6695.     clone : function(dataAndEvents, deepDataAndEvents) {
  6696.       return dataAndEvents = null == dataAndEvents ? false : dataAndEvents, deepDataAndEvents = null == deepDataAndEvents ? dataAndEvents : deepDataAndEvents, this.map(function() {
  6697.         return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
  6698.       });
  6699.     },
  6700.     /**
  6701.      * @param {string} value
  6702.      * @return {?}
  6703.      */
  6704.     html : function(value) {
  6705.       return access(this, function(value) {
  6706.         var elem = this[0] || {};
  6707.         /** @type {number} */
  6708.         var i = 0;
  6709.         var l = this.length;
  6710.         if (void 0 === value && 1 === elem.nodeType) {
  6711.           return elem.innerHTML;
  6712.         }
  6713.         if ("string" == typeof value && (!rchecked.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()])) {
  6714.           /** @type {string} */
  6715.           value = value.replace(rxhtmlTag, "<$1></$2>");
  6716.           try {
  6717.             for (;l > i;i++) {
  6718.               elem = this[i] || {};
  6719.               if (1 === elem.nodeType) {
  6720.                 jQuery.cleanData(getAll(elem, false));
  6721.                 /** @type {string} */
  6722.                 elem.innerHTML = value;
  6723.               }
  6724.             }
  6725.             /** @type {number} */
  6726.             elem = 0;
  6727.           } catch (o) {
  6728.           }
  6729.         }
  6730.         if (elem) {
  6731.           this.empty().append(value);
  6732.         }
  6733.       }, null, value, arguments.length);
  6734.     },
  6735.     /**
  6736.      * @return {?}
  6737.      */
  6738.     replaceWith : function() {
  6739.       var arg = arguments[0];
  6740.       return this.domManip(arguments, function(s) {
  6741.         arg = this.parentNode;
  6742.         jQuery.cleanData(getAll(this));
  6743.         if (arg) {
  6744.           arg.replaceChild(s, this);
  6745.         }
  6746.       }), arg && (arg.length || arg.nodeType) ? this : this.remove();
  6747.     },
  6748.     /**
  6749.      * @param {Object} selector
  6750.      * @return {?}
  6751.      */
  6752.     detach : function(selector) {
  6753.       return this.remove(selector, true);
  6754.     },
  6755.     /**
  6756.      * @param {Object} args
  6757.      * @param {Function} callback
  6758.      * @return {?}
  6759.      */
  6760.     domManip : function(args, callback) {
  6761.       /** @type {Array} */
  6762.       args = core_concat.apply([], args);
  6763.       var fragment;
  6764.       var first;
  6765.       var scripts;
  6766.       var _len;
  6767.       var node;
  6768.       var doc;
  6769.       /** @type {number} */
  6770.       var i = 0;
  6771.       var l = this.length;
  6772.       var set = this;
  6773.       /** @type {number} */
  6774.       var iNoClone = l - 1;
  6775.       var html = args[0];
  6776.       var isFunction = jQuery.isFunction(html);
  6777.       if (isFunction || l > 1 && ("string" == typeof html && (!support.checkClone && exclude.test(html)))) {
  6778.         return this.each(function(index) {
  6779.           var self = set.eq(index);
  6780.           if (isFunction) {
  6781.             args[0] = html.call(this, index, self.html());
  6782.           }
  6783.           self.domManip(args, callback);
  6784.         });
  6785.       }
  6786.       if (l && (fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, this), first = fragment.firstChild, 1 === fragment.childNodes.length && (fragment = first), first)) {
  6787.         scripts = jQuery.map(getAll(fragment, "script"), restoreScript);
  6788.         _len = scripts.length;
  6789.         for (;l > i;i++) {
  6790.           node = fragment;
  6791.           if (i !== iNoClone) {
  6792.             node = jQuery.clone(node, true, true);
  6793.             if (_len) {
  6794.               jQuery.merge(scripts, getAll(node, "script"));
  6795.             }
  6796.           }
  6797.           callback.call(this[i], node, i);
  6798.         }
  6799.         if (_len) {
  6800.           doc = scripts[scripts.length - 1].ownerDocument;
  6801.           jQuery.map(scripts, fn);
  6802.           /** @type {number} */
  6803.           i = 0;
  6804.           for (;_len > i;i++) {
  6805.             node = scripts[i];
  6806.             if (stopParent.test(node.type || "")) {
  6807.               if (!data_priv.access(node, "globalEval")) {
  6808.                 if (jQuery.contains(doc, node)) {
  6809.                   if (node.src) {
  6810.                     if (jQuery._evalUrl) {
  6811.                       jQuery._evalUrl(node.src);
  6812.                     }
  6813.                   } else {
  6814.                     jQuery.globalEval(node.textContent.replace(rcleanScript, ""));
  6815.                   }
  6816.                 }
  6817.               }
  6818.             }
  6819.           }
  6820.         }
  6821.       }
  6822.       return this;
  6823.     }
  6824.   });
  6825.   jQuery.each({
  6826.     appendTo : "append",
  6827.     prependTo : "prepend",
  6828.     insertBefore : "before",
  6829.     insertAfter : "after",
  6830.     replaceAll : "replaceWith"
  6831.   }, function(original, method) {
  6832.     /**
  6833.      * @param {string} scripts
  6834.      * @return {?}
  6835.      */
  6836.     jQuery.fn[original] = function(scripts) {
  6837.       var resp;
  6838.       /** @type {Array} */
  6839.       var ret = [];
  6840.       var insert = jQuery(scripts);
  6841.       /** @type {number} */
  6842.       var segments = insert.length - 1;
  6843.       /** @type {number} */
  6844.       var i = 0;
  6845.       for (;segments >= i;i++) {
  6846.         resp = i === segments ? this : this.clone(true);
  6847.         jQuery(insert[i])[method](resp);
  6848.         core_push.apply(ret, resp.get());
  6849.       }
  6850.       return this.pushStack(ret);
  6851.     };
  6852.   });
  6853.   var iframe;
  6854.   var elemdisplay = {};
  6855.   /** @type {RegExp} */
  6856.   var rbracket = /^margin/;
  6857.   /** @type {RegExp} */
  6858.   var regexp = new RegExp("^(" + core_pnum + ")(?!px)[a-z%]+$", "i");
  6859.   /**
  6860.    * @param {Object} elem
  6861.    * @return {?}
  6862.    */
  6863.   var getStyles = function(elem) {
  6864.     return elem.ownerDocument.defaultView.opener ? elem.ownerDocument.defaultView.getComputedStyle(elem, null) : win.getComputedStyle(elem, null);
  6865.   };
  6866.   !function() {
  6867.     /**
  6868.      * @return {undefined}
  6869.      */
  6870.     function computePixelPositionAndBoxSizingReliable() {
  6871.       /** @type {string} */
  6872.       div.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";
  6873.       /** @type {string} */
  6874.       div.innerHTML = "";
  6875.       root.appendChild(el);
  6876.       var divStyle = win.getComputedStyle(div, null);
  6877.       /** @type {boolean} */
  6878.       t = "1%" !== divStyle.top;
  6879.       /** @type {boolean} */
  6880.       r = "4px" === divStyle.width;
  6881.       root.removeChild(el);
  6882.     }
  6883.     var t;
  6884.     var r;
  6885.     var root = node.documentElement;
  6886.     var el = node.createElement("div");
  6887.     var div = node.createElement("div");
  6888.     if (div.style) {
  6889.       /** @type {string} */
  6890.       div.style.backgroundClip = "content-box";
  6891.       /** @type {string} */
  6892.       div.cloneNode(true).style.backgroundClip = "";
  6893.       /** @type {boolean} */
  6894.       support.clearCloneStyle = "content-box" === div.style.backgroundClip;
  6895.       /** @type {string} */
  6896.       el.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute";
  6897.       el.appendChild(div);
  6898.       if (win.getComputedStyle) {
  6899.         jQuery.extend(support, {
  6900.           /**
  6901.            * @return {?}
  6902.            */
  6903.           pixelPosition : function() {
  6904.             return computePixelPositionAndBoxSizingReliable(), t;
  6905.           },
  6906.           /**
  6907.            * @return {?}
  6908.            */
  6909.           boxSizingReliable : function() {
  6910.             return null == r && computePixelPositionAndBoxSizingReliable(), r;
  6911.           },
  6912.           /**
  6913.            * @return {?}
  6914.            */
  6915.           reliableMarginRight : function() {
  6916.             var e;
  6917.             var marginDiv = div.appendChild(node.createElement("div"));
  6918.             return marginDiv.style.cssText = div.style.cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0", marginDiv.style.marginRight = marginDiv.style.width = "0", div.style.width = "1px", root.appendChild(el), e = !parseFloat(win.getComputedStyle(marginDiv, null).marginRight), root.removeChild(el), div.removeChild(marginDiv), e;
  6919.           }
  6920.         });
  6921.       }
  6922.     }
  6923.   }();
  6924.   /**
  6925.    * @param {Object} elem
  6926.    * @param {Object} options
  6927.    * @param {Function} callback
  6928.    * @param {Array} args
  6929.    * @return {?}
  6930.    */
  6931.   jQuery.swap = function(elem, options, callback, args) {
  6932.     var ret;
  6933.     var name;
  6934.     var old = {};
  6935.     for (name in options) {
  6936.       old[name] = elem.style[name];
  6937.       elem.style[name] = options[name];
  6938.     }
  6939.     ret = callback.apply(elem, args || []);
  6940.     for (name in options) {
  6941.       elem.style[name] = old[name];
  6942.     }
  6943.     return ret;
  6944.   };
  6945.   /** @type {RegExp} */
  6946.   var rdisplayswap = /^(none|table(?!-c[ea]).+)/;
  6947.   /** @type {RegExp} */
  6948.   var rrelNum = new RegExp("^(" + core_pnum + ")(.*)$", "i");
  6949.   /** @type {RegExp} */
  6950.   var re2 = new RegExp("^([+-])=(" + core_pnum + ")", "i");
  6951.   var props = {
  6952.     position : "absolute",
  6953.     visibility : "hidden",
  6954.     display : "block"
  6955.   };
  6956.   var cssNormalTransform = {
  6957.     letterSpacing : "0",
  6958.     fontWeight : "400"
  6959.   };
  6960.   /** @type {Array} */
  6961.   var cssPrefixes = ["Webkit", "O", "Moz", "ms"];
  6962.   jQuery.extend({
  6963.     cssHooks : {
  6964.       opacity : {
  6965.         /**
  6966.          * @param {Object} elem
  6967.          * @param {string} value
  6968.          * @return {?}
  6969.          */
  6970.         get : function(elem, value) {
  6971.           if (value) {
  6972.             var data = get(elem, "opacity");
  6973.             return "" === data ? "1" : data;
  6974.           }
  6975.         }
  6976.       }
  6977.     },
  6978.     cssNumber : {
  6979.       columnCount : true,
  6980.       fillOpacity : true,
  6981.       flexGrow : true,
  6982.       flexShrink : true,
  6983.       fontWeight : true,
  6984.       lineHeight : true,
  6985.       opacity : true,
  6986.       order : true,
  6987.       orphans : true,
  6988.       widows : true,
  6989.       zIndex : true,
  6990.       zoom : true
  6991.     },
  6992.     cssProps : {
  6993.       "float" : "cssFloat"
  6994.     },
  6995.     /**
  6996.      * @param {Object} elem
  6997.      * @param {string} name
  6998.      * @param {(number|string)} val
  6999.      * @param {?} extra
  7000.      * @return {?}
  7001.      */
  7002.     style : function(elem, name, val, extra) {
  7003.       if (elem && (3 !== elem.nodeType && (8 !== elem.nodeType && elem.style))) {
  7004.         var ret;
  7005.         var type;
  7006.         var hooks;
  7007.         var origName = jQuery.camelCase(name);
  7008.         var style = elem.style;
  7009.         return name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(style, origName)), hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName], void 0 === val ? hooks && ("get" in hooks && void 0 !== (ret = hooks.get(elem, false, extra))) ? ret : style[name] : (type = typeof val, "string" === type && ((ret = re2.exec(val)) && (val = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name)), type = "number")), void(null != val && (val === val && ("number" !== type ||
  7010.         (jQuery.cssNumber[origName] || (val += "px")), support.clearCloneStyle || ("" !== val || (0 !== name.indexOf("background") || (style[name] = "inherit"))), hooks && ("set" in hooks && void 0 === (val = hooks.set(elem, val, extra))) || (style[name] = val)))));
  7011.       }
  7012.     },
  7013.     /**
  7014.      * @param {string} elem
  7015.      * @param {string} name
  7016.      * @param {boolean} recurring
  7017.      * @param {?} property
  7018.      * @return {?}
  7019.      */
  7020.     css : function(elem, name, recurring, property) {
  7021.       var value;
  7022.       var val;
  7023.       var result;
  7024.       var origName = jQuery.camelCase(name);
  7025.       return name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName)), result = jQuery.cssHooks[name] || jQuery.cssHooks[origName], result && ("get" in result && (value = result.get(elem, true, recurring))), void 0 === value && (value = get(elem, name, property)), "normal" === value && (name in cssNormalTransform && (value = cssNormalTransform[name])), "" === recurring || recurring ? (val = parseFloat(value), recurring === true || jQuery.isNumeric(val) ?
  7026.       val || 0 : value) : value;
  7027.     }
  7028.   });
  7029.   jQuery.each(["height", "width"], function(dataAndEvents, name) {
  7030.     jQuery.cssHooks[name] = {
  7031.       /**
  7032.        * @param {Object} elem
  7033.        * @param {string} value
  7034.        * @param {?} extra
  7035.        * @return {?}
  7036.        */
  7037.       get : function(elem, value, extra) {
  7038.         return value ? rdisplayswap.test(jQuery.css(elem, "display")) && 0 === elem.offsetWidth ? jQuery.swap(elem, props, function() {
  7039.           return getWidthOrHeight(elem, name, extra);
  7040.         }) : getWidthOrHeight(elem, name, extra) : void 0;
  7041.       },
  7042.       /**
  7043.        * @param {Object} elem
  7044.        * @param {string} value
  7045.        * @param {?} extra
  7046.        * @return {?}
  7047.        */
  7048.       set : function(elem, value, extra) {
  7049.         var styles = extra && getStyles(elem);
  7050.         return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, "border-box" === jQuery.css(elem, "boxSizing", false, styles), styles) : 0);
  7051.       }
  7052.     };
  7053.   });
  7054.   jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function(cur, value) {
  7055.     return value ? jQuery.swap(cur, {
  7056.       display : "inline-block"
  7057.     }, get, [cur, "marginRight"]) : void 0;
  7058.   });
  7059.   jQuery.each({
  7060.     margin : "",
  7061.     padding : "",
  7062.     border : "Width"
  7063.   }, function(prefix, suffix) {
  7064.     jQuery.cssHooks[prefix + suffix] = {
  7065.       /**
  7066.        * @param {string} line
  7067.        * @return {?}
  7068.        */
  7069.       expand : function(line) {
  7070.         /** @type {number} */
  7071.         var i = 0;
  7072.         var expanded = {};
  7073.         /** @type {Array} */
  7074.         var tokens = "string" == typeof line ? line.split(" ") : [line];
  7075.         for (;4 > i;i++) {
  7076.           expanded[prefix + cssExpand[i] + suffix] = tokens[i] || (tokens[i - 2] || tokens[0]);
  7077.         }
  7078.         return expanded;
  7079.       }
  7080.     };
  7081.     if (!rbracket.test(prefix)) {
  7082.       /** @type {function (Object, string, ?): ?} */
  7083.       jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
  7084.     }
  7085.   });
  7086.   jQuery.fn.extend({
  7087.     /**
  7088.      * @param {string} name
  7089.      * @param {string} value
  7090.      * @return {?}
  7091.      */
  7092.     css : function(name, value) {
  7093.       return access(this, function(elem, prop, value) {
  7094.         var styles;
  7095.         var _len;
  7096.         var map = {};
  7097.         /** @type {number} */
  7098.         var name = 0;
  7099.         if (jQuery.isArray(prop)) {
  7100.           styles = getStyles(elem);
  7101.           _len = prop.length;
  7102.           for (;_len > name;name++) {
  7103.             map[prop[name]] = jQuery.css(elem, prop[name], false, styles);
  7104.           }
  7105.           return map;
  7106.         }
  7107.         return void 0 !== value ? jQuery.style(elem, prop, value) : jQuery.css(elem, prop);
  7108.       }, name, value, arguments.length > 1);
  7109.     },
  7110.     /**
  7111.      * @return {?}
  7112.      */
  7113.     show : function() {
  7114.       return showHide(this, true);
  7115.     },
  7116.     /**
  7117.      * @return {?}
  7118.      */
  7119.     hide : function() {
  7120.       return showHide(this);
  7121.     },
  7122.     /**
  7123.      * @param {?} state
  7124.      * @return {?}
  7125.      */
  7126.     toggle : function(state) {
  7127.       return "boolean" == typeof state ? state ? this.show() : this.hide() : this.each(function() {
  7128.         if (isHidden(this)) {
  7129.           jQuery(this).show();
  7130.         } else {
  7131.           jQuery(this).hide();
  7132.         }
  7133.       });
  7134.     }
  7135.   });
  7136.   /** @type {function (string, string, string, string, string): ?} */
  7137.   jQuery.Tween = Tween;
  7138.   Tween.prototype = {
  7139.     /** @type {function (string, string, string, string, string): ?} */
  7140.     constructor : Tween,
  7141.     /**
  7142.      * @param {string} type
  7143.      * @param {Object} options
  7144.      * @param {string} prop
  7145.      * @param {?} to
  7146.      * @param {string} easing
  7147.      * @param {string} unit
  7148.      * @return {undefined}
  7149.      */
  7150.     init : function(type, options, prop, to, easing, unit) {
  7151.       /** @type {string} */
  7152.       this.elem = type;
  7153.       /** @type {string} */
  7154.       this.prop = prop;
  7155.       this.easing = easing || "swing";
  7156.       /** @type {Object} */
  7157.       this.options = options;
  7158.       this.start = this.now = this.cur();
  7159.       this.end = to;
  7160.       this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
  7161.     },
  7162.     /**
  7163.      * @return {?}
  7164.      */
  7165.     cur : function() {
  7166.       var hooks = Tween.propHooks[this.prop];
  7167.       return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
  7168.     },
  7169.     /**
  7170.      * @param {number} percent
  7171.      * @return {?}
  7172.      */
  7173.     run : function(percent) {
  7174.       var eased;
  7175.       var hooks = Tween.propHooks[this.prop];
  7176.       return this.pos = eased = this.options.duration ? jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration) : percent, this.now = (this.end - this.start) * eased + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), hooks && hooks.set ? hooks.set(this) : Tween.propHooks._default.set(this), this;
  7177.     }
  7178.   };
  7179.   Tween.prototype.init.prototype = Tween.prototype;
  7180.   Tween.propHooks = {
  7181.     _default : {
  7182.       /**
  7183.        * @param {Object} elem
  7184.        * @return {?}
  7185.        */
  7186.       get : function(elem) {
  7187.         var node;
  7188.         return null == elem.elem[elem.prop] || elem.elem.style && null != elem.elem.style[elem.prop] ? (node = jQuery.css(elem.elem, elem.prop, ""), node && "auto" !== node ? node : 0) : elem.elem[elem.prop];
  7189.       },
  7190.       /**
  7191.        * @param {Object} tween
  7192.        * @return {undefined}
  7193.        */
  7194.       set : function(tween) {
  7195.         if (jQuery.fx.step[tween.prop]) {
  7196.           jQuery.fx.step[tween.prop](tween);
  7197.         } else {
  7198.           if (tween.elem.style && (null != tween.elem.style[jQuery.cssProps[tween.prop]] || jQuery.cssHooks[tween.prop])) {
  7199.             jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
  7200.           } else {
  7201.             tween.elem[tween.prop] = tween.now;
  7202.           }
  7203.         }
  7204.       }
  7205.     }
  7206.   };
  7207.   Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
  7208.     /**
  7209.      * @param {Object} elem
  7210.      * @return {undefined}
  7211.      */
  7212.     set : function(elem) {
  7213.       if (elem.elem.nodeType) {
  7214.         if (elem.elem.parentNode) {
  7215.           elem.elem[elem.prop] = elem.now;
  7216.         }
  7217.       }
  7218.     }
  7219.   };
  7220.   jQuery.easing = {
  7221.     /**
  7222.      * @param {?} t
  7223.      * @return {?}
  7224.      */
  7225.     linear : function(t) {
  7226.       return t;
  7227.     },
  7228.     /**
  7229.      * @param {number} p
  7230.      * @return {?}
  7231.      */
  7232.     swing : function(p) {
  7233.       return 0.5 - Math.cos(p * Math.PI) / 2;
  7234.     }
  7235.   };
  7236.   /** @type {function (string, Object, string, ?, string, string): undefined} */
  7237.   jQuery.fx = Tween.prototype.init;
  7238.   jQuery.fx.step = {};
  7239.   var fxNow;
  7240.   var scrollIntervalId;
  7241.   /** @type {RegExp} */
  7242.   var rplusequals = /^(?:toggle|show|hide)$/;
  7243.   /** @type {RegExp} */
  7244.   var rfxnum = new RegExp("^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i");
  7245.   /** @type {RegExp} */
  7246.   var rrun = /queueHooks$/;
  7247.   /** @type {Array} */
  7248.   var animationPrefilters = [defaultPrefilter];
  7249.   var cache = {
  7250.     "*" : [function(prop, value) {
  7251.       var tween = this.createTween(prop, value);
  7252.       var l0 = tween.cur();
  7253.       /** @type {(Array.<string>|null)} */
  7254.       var parts = rfxnum.exec(value);
  7255.       /** @type {string} */
  7256.       var unit = parts && parts[3] || (jQuery.cssNumber[prop] ? "" : "px");
  7257.       var start = (jQuery.cssNumber[prop] || "px" !== unit && +l0) && rfxnum.exec(jQuery.css(tween.elem, prop));
  7258.       /** @type {number} */
  7259.       var scale = 1;
  7260.       /** @type {number} */
  7261.       var c = 20;
  7262.       if (start && start[3] !== unit) {
  7263.         unit = unit || start[3];
  7264.         /** @type {Array} */
  7265.         parts = parts || [];
  7266.         /** @type {number} */
  7267.         start = +l0 || 1;
  7268.         do {
  7269.           /** @type {(number|string)} */
  7270.           scale = scale || ".5";
  7271.           start /= scale;
  7272.           jQuery.style(tween.elem, prop, start + unit);
  7273.         } while (scale !== (scale = tween.cur() / l0) && (1 !== scale && --c));
  7274.       }
  7275.       return parts && (start = tween.start = +start || (+l0 || 0), tween.unit = unit, tween.end = parts[1] ? start + (parts[1] + 1) * parts[2] : +parts[2]), tween;
  7276.     }]
  7277.   };
  7278.   jQuery.Animation = jQuery.extend(Animation, {
  7279.     /**
  7280.      * @param {Object} props
  7281.      * @param {Function} callback
  7282.      * @return {undefined}
  7283.      */
  7284.     tweener : function(props, callback) {
  7285.       if (jQuery.isFunction(props)) {
  7286.         /** @type {Object} */
  7287.         callback = props;
  7288.         /** @type {Array} */
  7289.         props = ["*"];
  7290.       } else {
  7291.         props = props.split(" ");
  7292.       }
  7293.       var prop;
  7294.       /** @type {number} */
  7295.       var _i = 0;
  7296.       var l2 = props.length;
  7297.       for (;l2 > _i;_i++) {
  7298.         prop = props[_i];
  7299.         cache[prop] = cache[prop] || [];
  7300.         cache[prop].unshift(callback);
  7301.       }
  7302.     },
  7303.     /**
  7304.      * @param {?} callback
  7305.      * @param {?} prepend
  7306.      * @return {undefined}
  7307.      */
  7308.     prefilter : function(callback, prepend) {
  7309.       if (prepend) {
  7310.         animationPrefilters.unshift(callback);
  7311.       } else {
  7312.         animationPrefilters.push(callback);
  7313.       }
  7314.     }
  7315.   });
  7316.   /**
  7317.    * @param {string} speed
  7318.    * @param {boolean} easing
  7319.    * @param {string} fn
  7320.    * @return {?}
  7321.    */
  7322.   jQuery.speed = function(speed, easing, fn) {
  7323.     var opt = speed && "object" == typeof speed ? jQuery.extend({}, speed) : {
  7324.       complete : fn || (!fn && easing || jQuery.isFunction(speed) && speed),
  7325.       duration : speed,
  7326.       easing : fn && easing || easing && (!jQuery.isFunction(easing) && easing)
  7327.     };
  7328.     return opt.duration = jQuery.fx.off ? 0 : "number" == typeof opt.duration ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default, (null == opt.queue || opt.queue === true) && (opt.queue = "fx"), opt.old = opt.complete, opt.complete = function() {
  7329.       if (jQuery.isFunction(opt.old)) {
  7330.         opt.old.call(this);
  7331.       }
  7332.       if (opt.queue) {
  7333.         jQuery.dequeue(this, opt.queue);
  7334.       }
  7335.     }, opt;
  7336.   };
  7337.   jQuery.fn.extend({
  7338.     /**
  7339.      * @param {string} speed
  7340.      * @param {(number|string)} to
  7341.      * @param {boolean} callback
  7342.      * @param {string} _callback
  7343.      * @return {?}
  7344.      */
  7345.     fadeTo : function(speed, to, callback, _callback) {
  7346.       return this.filter(isHidden).css("opacity", 0).show().end().animate({
  7347.         opacity : to
  7348.       }, speed, callback, _callback);
  7349.     },
  7350.     /**
  7351.      * @param {?} prop
  7352.      * @param {string} speed
  7353.      * @param {boolean} easing
  7354.      * @param {string} callback
  7355.      * @return {?}
  7356.      */
  7357.     animate : function(prop, speed, easing, callback) {
  7358.       var empty = jQuery.isEmptyObject(prop);
  7359.       var optall = jQuery.speed(speed, easing, callback);
  7360.       /**
  7361.        * @return {undefined}
  7362.        */
  7363.       var doAnimation = function() {
  7364.         var anim = Animation(this, jQuery.extend({}, prop), optall);
  7365.         if (empty || data_priv.get(this, "finish")) {
  7366.           anim.stop(true);
  7367.         }
  7368.       };
  7369.       return doAnimation.finish = doAnimation, empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
  7370.     },
  7371.     /**
  7372.      * @param {string} type
  7373.      * @param {Object} clearQueue
  7374.      * @param {Object} gotoEnd
  7375.      * @return {?}
  7376.      */
  7377.     stop : function(type, clearQueue, gotoEnd) {
  7378.       /**
  7379.        * @param {Object} e
  7380.        * @return {undefined}
  7381.        */
  7382.       var stop = function(e) {
  7383.         var stop = e.stop;
  7384.         delete e.stop;
  7385.         stop(gotoEnd);
  7386.       };
  7387.       return "string" != typeof type && (gotoEnd = clearQueue, clearQueue = type, type = void 0), clearQueue && (type !== false && this.queue(type || "fx", [])), this.each(function() {
  7388.         /** @type {boolean} */
  7389.         var dequeue = true;
  7390.         var index = null != type && type + "queueHooks";
  7391.         /** @type {Array} */
  7392.         var timers = jQuery.timers;
  7393.         var iteratee = data_priv.get(this);
  7394.         if (index) {
  7395.           if (iteratee[index]) {
  7396.             if (iteratee[index].stop) {
  7397.               stop(iteratee[index]);
  7398.             }
  7399.           }
  7400.         } else {
  7401.           for (index in iteratee) {
  7402.             if (iteratee[index]) {
  7403.               if (iteratee[index].stop) {
  7404.                 if (rrun.test(index)) {
  7405.                   stop(iteratee[index]);
  7406.                 }
  7407.               }
  7408.             }
  7409.           }
  7410.         }
  7411.         /** @type {number} */
  7412.         index = timers.length;
  7413.         for (;index--;) {
  7414.           if (!(timers[index].elem !== this)) {
  7415.             if (!(null != type && timers[index].queue !== type)) {
  7416.               timers[index].anim.stop(gotoEnd);
  7417.               /** @type {boolean} */
  7418.               dequeue = false;
  7419.               timers.splice(index, 1);
  7420.             }
  7421.           }
  7422.         }
  7423.         if (dequeue || !gotoEnd) {
  7424.           jQuery.dequeue(this, type);
  7425.         }
  7426.       });
  7427.     },
  7428.     /**
  7429.      * @param {string} type
  7430.      * @return {?}
  7431.      */
  7432.     finish : function(type) {
  7433.       return type !== false && (type = type || "fx"), this.each(function() {
  7434.         var index;
  7435.         var data = data_priv.get(this);
  7436.         var array = data[type + "queue"];
  7437.         var event = data[type + "queueHooks"];
  7438.         /** @type {Array} */
  7439.         var timers = jQuery.timers;
  7440.         var length = array ? array.length : 0;
  7441.         /** @type {boolean} */
  7442.         data.finish = true;
  7443.         jQuery.queue(this, type, []);
  7444.         if (event) {
  7445.           if (event.stop) {
  7446.             event.stop.call(this, true);
  7447.           }
  7448.         }
  7449.         /** @type {number} */
  7450.         index = timers.length;
  7451.         for (;index--;) {
  7452.           if (timers[index].elem === this) {
  7453.             if (timers[index].queue === type) {
  7454.               timers[index].anim.stop(true);
  7455.               timers.splice(index, 1);
  7456.             }
  7457.           }
  7458.         }
  7459.         /** @type {number} */
  7460.         index = 0;
  7461.         for (;length > index;index++) {
  7462.           if (array[index]) {
  7463.             if (array[index].finish) {
  7464.               array[index].finish.call(this);
  7465.             }
  7466.           }
  7467.         }
  7468.         delete data.finish;
  7469.       });
  7470.     }
  7471.   });
  7472.   jQuery.each(["toggle", "show", "hide"], function(dataAndEvents, name) {
  7473.     var matcherFunction = jQuery.fn[name];
  7474.     /**
  7475.      * @param {string} speed
  7476.      * @param {boolean} callback
  7477.      * @param {string} next_callback
  7478.      * @return {?}
  7479.      */
  7480.     jQuery.fn[name] = function(speed, callback, next_callback) {
  7481.       return null == speed || "boolean" == typeof speed ? matcherFunction.apply(this, arguments) : this.animate(genFx(name, true), speed, callback, next_callback);
  7482.     };
  7483.   });
  7484.   jQuery.each({
  7485.     slideDown : genFx("show"),
  7486.     slideUp : genFx("hide"),
  7487.     slideToggle : genFx("toggle"),
  7488.     fadeIn : {
  7489.       opacity : "show"
  7490.     },
  7491.     fadeOut : {
  7492.       opacity : "hide"
  7493.     },
  7494.     fadeToggle : {
  7495.       opacity : "toggle"
  7496.     }
  7497.   }, function(original, props) {
  7498.     /**
  7499.      * @param {string} speed
  7500.      * @param {boolean} callback
  7501.      * @param {string} next_callback
  7502.      * @return {?}
  7503.      */
  7504.     jQuery.fn[original] = function(speed, callback, next_callback) {
  7505.       return this.animate(props, speed, callback, next_callback);
  7506.     };
  7507.   });
  7508.   /** @type {Array} */
  7509.   jQuery.timers = [];
  7510.   /**
  7511.    * @return {undefined}
  7512.    */
  7513.   jQuery.fx.tick = function() {
  7514.     var last;
  7515.     /** @type {number} */
  7516.     var i = 0;
  7517.     /** @type {Array} */
  7518.     var timers = jQuery.timers;
  7519.     fxNow = jQuery.now();
  7520.     for (;i < timers.length;i++) {
  7521.       last = timers[i];
  7522.       if (!last()) {
  7523.         if (!(timers[i] !== last)) {
  7524.           timers.splice(i--, 1);
  7525.         }
  7526.       }
  7527.     }
  7528.     if (!timers.length) {
  7529.       jQuery.fx.stop();
  7530.     }
  7531.     fxNow = void 0;
  7532.   };
  7533.   /**
  7534.    * @param {?} timer
  7535.    * @return {undefined}
  7536.    */
  7537.   jQuery.fx.timer = function(timer) {
  7538.     jQuery.timers.push(timer);
  7539.     if (timer()) {
  7540.       jQuery.fx.start();
  7541.     } else {
  7542.       jQuery.timers.pop();
  7543.     }
  7544.   };
  7545.   /** @type {number} */
  7546.   jQuery.fx.interval = 13;
  7547.   /**
  7548.    * @return {undefined}
  7549.    */
  7550.   jQuery.fx.start = function() {
  7551.     if (!scrollIntervalId) {
  7552.       /** @type {number} */
  7553.       scrollIntervalId = setInterval(jQuery.fx.tick, jQuery.fx.interval);
  7554.     }
  7555.   };
  7556.   /**
  7557.    * @return {undefined}
  7558.    */
  7559.   jQuery.fx.stop = function() {
  7560.     clearInterval(scrollIntervalId);
  7561.     /** @type {null} */
  7562.     scrollIntervalId = null;
  7563.   };
  7564.   jQuery.fx.speeds = {
  7565.     slow : 600,
  7566.     fast : 200,
  7567.     _default : 400
  7568.   };
  7569.   /**
  7570.    * @param {Function} time
  7571.    * @param {string} type
  7572.    * @return {?}
  7573.    */
  7574.   jQuery.fn.delay = function(time, type) {
  7575.     return time = jQuery.fx ? jQuery.fx.speeds[time] || time : time, type = type || "fx", this.queue(type, function(next, event) {
  7576.       /** @type {number} */
  7577.       var timeout = setTimeout(next, time);
  7578.       /**
  7579.        * @return {undefined}
  7580.        */
  7581.       event.stop = function() {
  7582.         clearTimeout(timeout);
  7583.       };
  7584.     });
  7585.   };
  7586.   (function() {
  7587.     var input = node.createElement("input");
  7588.     var select = node.createElement("select");
  7589.     var opt = select.appendChild(node.createElement("option"));
  7590.     /** @type {string} */
  7591.     input.type = "checkbox";
  7592.     /** @type {boolean} */
  7593.     support.checkOn = "" !== input.value;
  7594.     support.optSelected = opt.selected;
  7595.     /** @type {boolean} */
  7596.     select.disabled = true;
  7597.     /** @type {boolean} */
  7598.     support.optDisabled = !opt.disabled;
  7599.     input = node.createElement("input");
  7600.     /** @type {string} */
  7601.     input.value = "t";
  7602.     /** @type {string} */
  7603.     input.type = "radio";
  7604.     /** @type {boolean} */
  7605.     support.radioValue = "t" === input.value;
  7606.   })();
  7607.   var nodeHook;
  7608.   var boolHook;
  7609.   var files = jQuery.expr.attrHandle;
  7610.   jQuery.fn.extend({
  7611.     /**
  7612.      * @param {string} name
  7613.      * @param {boolean} value
  7614.      * @return {?}
  7615.      */
  7616.     attr : function(name, value) {
  7617.       return access(this, jQuery.attr, name, value, arguments.length > 1);
  7618.     },
  7619.     /**
  7620.      * @param {string} name
  7621.      * @return {?}
  7622.      */
  7623.     removeAttr : function(name) {
  7624.       return this.each(function() {
  7625.         jQuery.removeAttr(this, name);
  7626.       });
  7627.     }
  7628.   });
  7629.   jQuery.extend({
  7630.     /**
  7631.      * @param {Object} elem
  7632.      * @param {Object} name
  7633.      * @param {Object} value
  7634.      * @return {?}
  7635.      */
  7636.     attr : function(elem, name, value) {
  7637.       var hooks;
  7638.       var ret;
  7639.       var nodeType = elem.nodeType;
  7640.       return elem && (3 !== nodeType && (8 !== nodeType && 2 !== nodeType)) ? typeof elem.getAttribute === text ? jQuery.prop(elem, name, value) : (1 === nodeType && jQuery.isXMLDoc(elem) || (name = name.toLowerCase(), hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook)), void 0 === value ? hooks && ("get" in hooks && null !== (ret = hooks.get(elem, name))) ? ret : (ret = jQuery.find.attr(elem, name), null == ret ? void 0 : ret) : null !== value ? hooks &&
  7641.       ("set" in hooks && void 0 !== (ret = hooks.set(elem, value, name))) ? ret : (elem.setAttribute(name, value + ""), value) : void jQuery.removeAttr(elem, name)) : void 0;
  7642.     },
  7643.     /**
  7644.      * @param {Object} elem
  7645.      * @param {string} value
  7646.      * @return {undefined}
  7647.      */
  7648.     removeAttr : function(elem, value) {
  7649.       var name;
  7650.       var propName;
  7651.       /** @type {number} */
  7652.       var i = 0;
  7653.       var attrNames = value && value.match(core_rnotwhite);
  7654.       if (attrNames && 1 === elem.nodeType) {
  7655.         for (;name = attrNames[i++];) {
  7656.           propName = jQuery.propFix[name] || name;
  7657.           if (jQuery.expr.match.bool.test(name)) {
  7658.             /** @type {boolean} */
  7659.             elem[propName] = false;
  7660.           }
  7661.           elem.removeAttribute(name);
  7662.         }
  7663.       }
  7664.     },
  7665.     attrHooks : {
  7666.       type : {
  7667.         /**
  7668.          * @param {Object} elem
  7669.          * @param {string} value
  7670.          * @return {?}
  7671.          */
  7672.         set : function(elem, value) {
  7673.           if (!support.radioValue && ("radio" === value && jQuery.nodeName(elem, "input"))) {
  7674.             var val = elem.value;
  7675.             return elem.setAttribute("type", value), val && (elem.value = val), value;
  7676.           }
  7677.         }
  7678.       }
  7679.     }
  7680.   });
  7681.   boolHook = {
  7682.     /**
  7683.      * @param {Object} elem
  7684.      * @param {string} value
  7685.      * @param {?} name
  7686.      * @return {?}
  7687.      */
  7688.     set : function(elem, value, name) {
  7689.       return value === false ? jQuery.removeAttr(elem, name) : elem.setAttribute(name, name), name;
  7690.     }
  7691.   };
  7692.   jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(dataAndEvents, name) {
  7693.     var getter = files[name] || jQuery.find.attr;
  7694.     /**
  7695.      * @param {string} elem
  7696.      * @param {Object} name
  7697.      * @param {Object} isXML
  7698.      * @return {?}
  7699.      */
  7700.     files[name] = function(elem, name, isXML) {
  7701.       var str;
  7702.       var file;
  7703.       return isXML || (file = files[name], files[name] = str, str = null != getter(elem, name, isXML) ? name.toLowerCase() : null, files[name] = file), str;
  7704.     };
  7705.   });
  7706.   /** @type {RegExp} */
  7707.   var rinputs = /^(?:input|select|textarea|button)$/i;
  7708.   jQuery.fn.extend({
  7709.     /**
  7710.      * @param {string} type
  7711.      * @param {string} value
  7712.      * @return {?}
  7713.      */
  7714.     prop : function(type, value) {
  7715.       return access(this, jQuery.prop, type, value, arguments.length > 1);
  7716.     },
  7717.     /**
  7718.      * @param {?} name
  7719.      * @return {?}
  7720.      */
  7721.     removeProp : function(name) {
  7722.       return this.each(function() {
  7723.         delete this[jQuery.propFix[name] || name];
  7724.       });
  7725.     }
  7726.   });
  7727.   jQuery.extend({
  7728.     propFix : {
  7729.       "for" : "htmlFor",
  7730.       "class" : "className"
  7731.     },
  7732.     /**
  7733.      * @param {Object} elem
  7734.      * @param {string} name
  7735.      * @param {string} value
  7736.      * @return {?}
  7737.      */
  7738.     prop : function(elem, name, value) {
  7739.       var ret;
  7740.       var hooks;
  7741.       var n;
  7742.       var nodeType = elem.nodeType;
  7743.       return elem && (3 !== nodeType && (8 !== nodeType && 2 !== nodeType)) ? (n = 1 !== nodeType || !jQuery.isXMLDoc(elem), n && (name = jQuery.propFix[name] || name, hooks = jQuery.propHooks[name]), void 0 !== value ? hooks && ("set" in hooks && void 0 !== (ret = hooks.set(elem, value, name))) ? ret : elem[name] = value : hooks && ("get" in hooks && null !== (ret = hooks.get(elem, name))) ? ret : elem[name]) : void 0;
  7744.     },
  7745.     propHooks : {
  7746.       tabIndex : {
  7747.         /**
  7748.          * @param {Object} elem
  7749.          * @return {?}
  7750.          */
  7751.         get : function(elem) {
  7752.           return elem.hasAttribute("tabindex") || (rinputs.test(elem.nodeName) || elem.href) ? elem.tabIndex : -1;
  7753.         }
  7754.       }
  7755.     }
  7756.   });
  7757.   if (!support.optSelected) {
  7758.     jQuery.propHooks.selected = {
  7759.       /**
  7760.        * @param {Object} elem
  7761.        * @return {?}
  7762.        */
  7763.       get : function(elem) {
  7764.         var parent = elem.parentNode;
  7765.         return parent && (parent.parentNode && parent.parentNode.selectedIndex), null;
  7766.       }
  7767.     };
  7768.   }
  7769.   jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() {
  7770.     jQuery.propFix[this.toLowerCase()] = this;
  7771.   });
  7772.   /** @type {RegExp} */
  7773.   var rclass = /[\t\r\n\f]/g;
  7774.   jQuery.fn.extend({
  7775.     /**
  7776.      * @param {string} value
  7777.      * @return {?}
  7778.      */
  7779.     addClass : function(value) {
  7780.       var classes;
  7781.       var elem;
  7782.       var cur;
  7783.       var clazz;
  7784.       var j;
  7785.       var finalValue;
  7786.       /** @type {(boolean|string)} */
  7787.       var proceed = "string" == typeof value && value;
  7788.       /** @type {number} */
  7789.       var i = 0;
  7790.       var l = this.length;
  7791.       if (jQuery.isFunction(value)) {
  7792.         return this.each(function(j) {
  7793.           jQuery(this).addClass(value.call(this, j, this.className));
  7794.         });
  7795.       }
  7796.       if (proceed) {
  7797.         classes = (value || "").match(core_rnotwhite) || [];
  7798.         for (;l > i;i++) {
  7799.           if (elem = this[i], cur = 1 === elem.nodeType && (elem.className ? (" " + elem.className + " ").replace(rclass, " ") : " ")) {
  7800.             /** @type {number} */
  7801.             j = 0;
  7802.             for (;clazz = classes[j++];) {
  7803.               if (cur.indexOf(" " + clazz + " ") < 0) {
  7804.                 cur += clazz + " ";
  7805.               }
  7806.             }
  7807.             finalValue = jQuery.trim(cur);
  7808.             if (elem.className !== finalValue) {
  7809.               elem.className = finalValue;
  7810.             }
  7811.           }
  7812.         }
  7813.       }
  7814.       return this;
  7815.     },
  7816.     /**
  7817.      * @param {string} value
  7818.      * @return {?}
  7819.      */
  7820.     removeClass : function(value) {
  7821.       var res;
  7822.       var elem;
  7823.       var cur;
  7824.       var apn;
  7825.       var resLength;
  7826.       var finalValue;
  7827.       /** @type {(boolean|string)} */
  7828.       var u = 0 === arguments.length || "string" == typeof value && value;
  7829.       /** @type {number} */
  7830.       var i = 0;
  7831.       var l = this.length;
  7832.       if (jQuery.isFunction(value)) {
  7833.         return this.each(function(j) {
  7834.           jQuery(this).removeClass(value.call(this, j, this.className));
  7835.         });
  7836.       }
  7837.       if (u) {
  7838.         res = (value || "").match(core_rnotwhite) || [];
  7839.         for (;l > i;i++) {
  7840.           if (elem = this[i], cur = 1 === elem.nodeType && (elem.className ? (" " + elem.className + " ").replace(rclass, " ") : "")) {
  7841.             /** @type {number} */
  7842.             resLength = 0;
  7843.             for (;apn = res[resLength++];) {
  7844.               for (;cur.indexOf(" " + apn + " ") >= 0;) {
  7845.                 /** @type {string} */
  7846.                 cur = cur.replace(" " + apn + " ", " ");
  7847.               }
  7848.             }
  7849.             finalValue = value ? jQuery.trim(cur) : "";
  7850.             if (elem.className !== finalValue) {
  7851.               elem.className = finalValue;
  7852.             }
  7853.           }
  7854.         }
  7855.       }
  7856.       return this;
  7857.     },
  7858.     /**
  7859.      * @param {string} value
  7860.      * @param {boolean} stateVal
  7861.      * @return {?}
  7862.      */
  7863.     toggleClass : function(value, stateVal) {
  7864.       /** @type {string} */
  7865.       var type = typeof value;
  7866.       return "boolean" == typeof stateVal && "string" === type ? stateVal ? this.addClass(value) : this.removeClass(value) : this.each(jQuery.isFunction(value) ? function(i) {
  7867.         jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal);
  7868.       } : function() {
  7869.         if ("string" === type) {
  7870.           var className;
  7871.           /** @type {number} */
  7872.           var i = 0;
  7873.           var self = jQuery(this);
  7874.           var classNames = value.match(core_rnotwhite) || [];
  7875.           for (;className = classNames[i++];) {
  7876.             if (self.hasClass(className)) {
  7877.               self.removeClass(className);
  7878.             } else {
  7879.               self.addClass(className);
  7880.             }
  7881.           }
  7882.         } else {
  7883.           if (type === text || "boolean" === type) {
  7884.             if (this.className) {
  7885.               data_priv.set(this, "__className__", this.className);
  7886.             }
  7887.             this.className = this.className || value === false ? "" : data_priv.get(this, "__className__") || "";
  7888.           }
  7889.         }
  7890.       });
  7891.     },
  7892.     /**
  7893.      * @param {string} type
  7894.      * @return {?}
  7895.      */
  7896.     hasClass : function(type) {
  7897.       /** @type {string} */
  7898.       var tval = " " + type + " ";
  7899.       /** @type {number} */
  7900.       var i = 0;
  7901.       var l = this.length;
  7902.       for (;l > i;i++) {
  7903.         if (1 === this[i].nodeType && (" " + this[i].className + " ").replace(rclass, " ").indexOf(tval) >= 0) {
  7904.           return true;
  7905.         }
  7906.       }
  7907.       return false;
  7908.     }
  7909.   });
  7910.   /** @type {RegExp} */
  7911.   var rreturn = /\r/g;
  7912.   jQuery.fn.extend({
  7913.     /**
  7914.      * @param {Function} value
  7915.      * @return {?}
  7916.      */
  7917.     val : function(value) {
  7918.       var hooks;
  7919.       var ret;
  7920.       var isFunction;
  7921.       var elem = this[0];
  7922.       return arguments.length ? (isFunction = jQuery.isFunction(value), this.each(function(i) {
  7923.         var val;
  7924.         if (1 === this.nodeType) {
  7925.           val = isFunction ? value.call(this, i, jQuery(this).val()) : value;
  7926.           if (null == val) {
  7927.             /** @type {string} */
  7928.             val = "";
  7929.           } else {
  7930.             if ("number" == typeof val) {
  7931.               val += "";
  7932.             } else {
  7933.               if (jQuery.isArray(val)) {
  7934.                 val = jQuery.map(val, function(month) {
  7935.                   return null == month ? "" : month + "";
  7936.                 });
  7937.               }
  7938.             }
  7939.           }
  7940.           hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
  7941.           if (!(hooks && ("set" in hooks && void 0 !== hooks.set(this, val, "value")))) {
  7942.             this.value = val;
  7943.           }
  7944.         }
  7945.       })) : elem ? (hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()], hooks && ("get" in hooks && void 0 !== (ret = hooks.get(elem, "value"))) ? ret : (ret = elem.value, "string" == typeof ret ? ret.replace(rreturn, "") : null == ret ? "" : ret)) : void 0;
  7946.     }
  7947.   });
  7948.   jQuery.extend({
  7949.     valHooks : {
  7950.       option : {
  7951.         /**
  7952.          * @param {Object} elem
  7953.          * @return {?}
  7954.          */
  7955.         get : function(elem) {
  7956.           var handle = jQuery.find.attr(elem, "value");
  7957.           return null != handle ? handle : jQuery.trim(jQuery.text(elem));
  7958.         }
  7959.       },
  7960.       select : {
  7961.         /**
  7962.          * @param {Object} elem
  7963.          * @return {?}
  7964.          */
  7965.         get : function(elem) {
  7966.           var copies;
  7967.           var option;
  7968.           var options = elem.options;
  7969.           var index = elem.selectedIndex;
  7970.           /** @type {boolean} */
  7971.           var one = "select-one" === elem.type || 0 > index;
  7972.           /** @type {(Array|null)} */
  7973.           var out = one ? null : [];
  7974.           var max = one ? index + 1 : options.length;
  7975.           var i = 0 > index ? max : one ? index : 0;
  7976.           for (;max > i;i++) {
  7977.             if (option = options[i], !(!option.selected && i !== index || ((support.optDisabled ? option.disabled : null !== option.getAttribute("disabled")) || option.parentNode.disabled && jQuery.nodeName(option.parentNode, "optgroup")))) {
  7978.               if (copies = jQuery(option).val(), one) {
  7979.                 return copies;
  7980.               }
  7981.               out.push(copies);
  7982.             }
  7983.           }
  7984.           return out;
  7985.         },
  7986.         /**
  7987.          * @param {Object} elem
  7988.          * @param {string} value
  7989.          * @return {?}
  7990.          */
  7991.         set : function(elem, value) {
  7992.           var r;
  7993.           var option;
  7994.           var options = elem.options;
  7995.           var values = jQuery.makeArray(value);
  7996.           var i = options.length;
  7997.           for (;i--;) {
  7998.             option = options[i];
  7999.             if (option.selected = jQuery.inArray(option.value, values) >= 0) {
  8000.               /** @type {boolean} */
  8001.               r = true;
  8002.             }
  8003.           }
  8004.           return r || (elem.selectedIndex = -1), values;
  8005.         }
  8006.       }
  8007.     }
  8008.   });
  8009.   jQuery.each(["radio", "checkbox"], function() {
  8010.     jQuery.valHooks[this] = {
  8011.       /**
  8012.        * @param {string} elem
  8013.        * @param {string} value
  8014.        * @return {?}
  8015.        */
  8016.       set : function(elem, value) {
  8017.         return jQuery.isArray(value) ? elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0 : void 0;
  8018.       }
  8019.     };
  8020.     if (!support.checkOn) {
  8021.       /**
  8022.        * @param {Object} elem
  8023.        * @return {?}
  8024.        */
  8025.       jQuery.valHooks[this].get = function(elem) {
  8026.         return null === elem.getAttribute("value") ? "on" : elem.value;
  8027.       };
  8028.     }
  8029.   });
  8030.   jQuery.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(dataAndEvents, fix) {
  8031.     /**
  8032.      * @param {Function} data
  8033.      * @param {Function} fn
  8034.      * @return {?}
  8035.      */
  8036.     jQuery.fn[fix] = function(data, fn) {
  8037.       return arguments.length > 0 ? this.on(fix, null, data, fn) : this.trigger(fix);
  8038.     };
  8039.   });
  8040.   jQuery.fn.extend({
  8041.     /**
  8042.      * @param {undefined} fnOver
  8043.      * @param {Object} fnOut
  8044.      * @return {?}
  8045.      */
  8046.     hover : function(fnOver, fnOut) {
  8047.       return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
  8048.     },
  8049.     /**
  8050.      * @param {string} name
  8051.      * @param {Function} data
  8052.      * @param {Function} fn
  8053.      * @return {?}
  8054.      */
  8055.     bind : function(name, data, fn) {
  8056.       return this.on(name, null, data, fn);
  8057.     },
  8058.     /**
  8059.      * @param {string} types
  8060.      * @param {Function} fn
  8061.      * @return {?}
  8062.      */
  8063.     unbind : function(types, fn) {
  8064.       return this.off(types, null, fn);
  8065.     },
  8066.     /**
  8067.      * @param {Function} selector
  8068.      * @param {string} types
  8069.      * @param {Function} data
  8070.      * @param {Function} fn
  8071.      * @return {?}
  8072.      */
  8073.     delegate : function(selector, types, data, fn) {
  8074.       return this.on(types, selector, data, fn);
  8075.     },
  8076.     /**
  8077.      * @param {string} selector
  8078.      * @param {string} types
  8079.      * @param {Function} fn
  8080.      * @return {?}
  8081.      */
  8082.     undelegate : function(selector, types, fn) {
  8083.       return 1 === arguments.length ? this.off(selector, "**") : this.off(types, selector || "**", fn);
  8084.     }
  8085.   });
  8086.   var iIdCounter = jQuery.now();
  8087.   /** @type {RegExp} */
  8088.   var rquery = /\?/;
  8089.   /**
  8090.    * @param {Object} data
  8091.    * @return {?}
  8092.    */
  8093.   jQuery.parseJSON = function(data) {
  8094.     return JSON.parse(data + "");
  8095.   };
  8096.   /**
  8097.    * @param {string} data
  8098.    * @return {?}
  8099.    */
  8100.   jQuery.parseXML = function(data) {
  8101.     var xml;
  8102.     var tmp;
  8103.     if (!data || "string" != typeof data) {
  8104.       return null;
  8105.     }
  8106.     try {
  8107.       /** @type {DOMParser} */
  8108.       tmp = new DOMParser;
  8109.       /** @type {(Document|null)} */
  8110.       xml = tmp.parseFromString(data, "text/xml");
  8111.     } catch (i) {
  8112.       xml = void 0;
  8113.     }
  8114.     return(!xml || xml.getElementsByTagName("parsererror").length) && jQuery.error("Invalid XML: " + data), xml;
  8115.   };
  8116.   /** @type {RegExp} */
  8117.   var trimLeft = /#.*$/;
  8118.   /** @type {RegExp} */
  8119.   var rts = /([?&])_=[^&]*/;
  8120.   /** @type {RegExp} */
  8121.   var r = /^(.*?):[ \t]*([^\r\n]*)$/gm;
  8122.   /** @type {RegExp} */
  8123.   var matches = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/;
  8124.   /** @type {RegExp} */
  8125.   var rnoContent = /^(?:GET|HEAD)$/;
  8126.   /** @type {RegExp} */
  8127.   var rprotocol = /^\/\//;
  8128.   /** @type {RegExp} */
  8129.   var quickExpr = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/;
  8130.   var prefilters = {};
  8131.   var transports = {};
  8132.   /** @type {string} */
  8133.   var nc = "*/".concat("*");
  8134.   var url = win.location.href;
  8135.   /** @type {Array} */
  8136.   var match = quickExpr.exec(url.toLowerCase()) || [];
  8137.   jQuery.extend({
  8138.     active : 0,
  8139.     lastModified : {},
  8140.     etag : {},
  8141.     ajaxSettings : {
  8142.       url : url,
  8143.       type : "GET",
  8144.       isLocal : matches.test(match[1]),
  8145.       global : true,
  8146.       processData : true,
  8147.       async : true,
  8148.       contentType : "application/x-www-form-urlencoded; charset=UTF-8",
  8149.       accepts : {
  8150.         "*" : nc,
  8151.         text : "text/plain",
  8152.         html : "text/html",
  8153.         xml : "application/xml, text/xml",
  8154.         json : "application/json, text/javascript"
  8155.       },
  8156.       contents : {
  8157.         xml : /xml/,
  8158.         html : /html/,
  8159.         json : /json/
  8160.       },
  8161.       responseFields : {
  8162.         xml : "responseXML",
  8163.         text : "responseText",
  8164.         json : "responseJSON"
  8165.       },
  8166.       converters : {
  8167.         /** @type {function (new:String, *=): string} */
  8168.         "* text" : String,
  8169.         "text html" : true,
  8170.         /** @type {function (Object): ?} */
  8171.         "text json" : jQuery.parseJSON,
  8172.         /** @type {function (string): ?} */
  8173.         "text xml" : jQuery.parseXML
  8174.       },
  8175.       flatOptions : {
  8176.         url : true,
  8177.         context : true
  8178.       }
  8179.     },
  8180.     /**
  8181.      * @param {(Object|string)} target
  8182.      * @param {Object} settings
  8183.      * @return {?}
  8184.      */
  8185.     ajaxSetup : function(target, settings) {
  8186.       return settings ? ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : ajaxExtend(jQuery.ajaxSettings, target);
  8187.     },
  8188.     ajaxPrefilter : addToPrefiltersOrTransports(prefilters),
  8189.     ajaxTransport : addToPrefiltersOrTransports(transports),
  8190.     /**
  8191.      * @param {Object} arg
  8192.      * @param {Object} options
  8193.      * @return {?}
  8194.      */
  8195.     ajax : function(arg, options) {
  8196.       /**
  8197.        * @param {number} status
  8198.        * @param {(number|string)} nativeStatusText
  8199.        * @param {Object} responses
  8200.        * @param {string} total
  8201.        * @return {undefined}
  8202.        */
  8203.       function done(status, nativeStatusText, responses, total) {
  8204.         var isSuccess;
  8205.         var success;
  8206.         var error;
  8207.         var response;
  8208.         var modified;
  8209.         /** @type {(number|string)} */
  8210.         var statusText = nativeStatusText;
  8211.         if (2 !== number) {
  8212.           /** @type {number} */
  8213.           number = 2;
  8214.           if (tref) {
  8215.             clearTimeout(tref);
  8216.           }
  8217.           transport = void 0;
  8218.           value = total || "";
  8219.           /** @type {number} */
  8220.           jqXHR.readyState = status > 0 ? 4 : 0;
  8221.           /** @type {boolean} */
  8222.           isSuccess = status >= 200 && 300 > status || 304 === status;
  8223.           if (responses) {
  8224.             response = ajaxHandleResponses(s, jqXHR, responses);
  8225.           }
  8226.           response = ajaxConvert(s, response, jqXHR, isSuccess);
  8227.           if (isSuccess) {
  8228.             if (s.ifModified) {
  8229.               modified = jqXHR.getResponseHeader("Last-Modified");
  8230.               if (modified) {
  8231.                 jQuery.lastModified[cacheURL] = modified;
  8232.               }
  8233.               modified = jqXHR.getResponseHeader("etag");
  8234.               if (modified) {
  8235.                 jQuery.etag[cacheURL] = modified;
  8236.               }
  8237.             }
  8238.             if (204 === status || "HEAD" === s.type) {
  8239.               /** @type {string} */
  8240.               statusText = "nocontent";
  8241.             } else {
  8242.               if (304 === status) {
  8243.                 /** @type {string} */
  8244.                 statusText = "notmodified";
  8245.               } else {
  8246.                 statusText = response.state;
  8247.                 success = response.data;
  8248.                 error = response.error;
  8249.                 /** @type {boolean} */
  8250.                 isSuccess = !error;
  8251.               }
  8252.             }
  8253.           } else {
  8254.             error = statusText;
  8255.             if (status || !statusText) {
  8256.               /** @type {string} */
  8257.               statusText = "error";
  8258.               if (0 > status) {
  8259.                 /** @type {number} */
  8260.                 status = 0;
  8261.               }
  8262.             }
  8263.           }
  8264.           /** @type {number} */
  8265.           jqXHR.status = status;
  8266.           /** @type {string} */
  8267.           jqXHR.statusText = (nativeStatusText || statusText) + "";
  8268.           if (isSuccess) {
  8269.             deferred.resolveWith(scripts, [success, statusText, jqXHR]);
  8270.           } else {
  8271.             deferred.rejectWith(scripts, [jqXHR, statusText, error]);
  8272.           }
  8273.           jqXHR.statusCode(statusCode);
  8274.           statusCode = void 0;
  8275.           if (l) {
  8276.             globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
  8277.           }
  8278.           completeDeferred.fireWith(scripts, [jqXHR, statusText]);
  8279.           if (l) {
  8280.             globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
  8281.             if (!--jQuery.active) {
  8282.               jQuery.event.trigger("ajaxStop");
  8283.             }
  8284.           }
  8285.         }
  8286.       }
  8287.       if ("object" == typeof arg) {
  8288.         /** @type {Object} */
  8289.         options = arg;
  8290.         arg = void 0;
  8291.       }
  8292.       options = options || {};
  8293.       var transport;
  8294.       var cacheURL;
  8295.       var value;
  8296.       var target;
  8297.       var tref;
  8298.       var t;
  8299.       var l;
  8300.       var i;
  8301.       var s = jQuery.ajaxSetup({}, options);
  8302.       var scripts = s.context || s;
  8303.       var globalEventContext = s.context && (scripts.nodeType || scripts.jquery) ? jQuery(scripts) : jQuery.event;
  8304.       var deferred = jQuery.Deferred();
  8305.       var completeDeferred = jQuery.Callbacks("once memory");
  8306.       var statusCode = s.statusCode || {};
  8307.       var requestHeaders = {};
  8308.       var requestHeadersNames = {};
  8309.       /** @type {number} */
  8310.       var number = 0;
  8311.       /** @type {string} */
  8312.       var strAbort = "canceled";
  8313.       var jqXHR = {
  8314.         readyState : 0,
  8315.         /**
  8316.          * @param {string} key
  8317.          * @return {?}
  8318.          */
  8319.         getResponseHeader : function(key) {
  8320.           var src;
  8321.           if (2 === number) {
  8322.             if (!target) {
  8323.               target = {};
  8324.               for (;src = r.exec(value);) {
  8325.                 /** @type {string} */
  8326.                 target[src[1].toLowerCase()] = src[2];
  8327.               }
  8328.             }
  8329.             src = target[key.toLowerCase()];
  8330.           }
  8331.           return null == src ? null : src;
  8332.         },
  8333.         /**
  8334.          * @return {?}
  8335.          */
  8336.         getAllResponseHeaders : function() {
  8337.           return 2 === number ? value : null;
  8338.         },
  8339.         /**
  8340.          * @param {string} name
  8341.          * @param {?} value
  8342.          * @return {?}
  8343.          */
  8344.         setRequestHeader : function(name, value) {
  8345.           var lname = name.toLowerCase();
  8346.           return number || (name = requestHeadersNames[lname] = requestHeadersNames[lname] || name, requestHeaders[name] = value), this;
  8347.         },
  8348.         /**
  8349.          * @param {(Object|number)} type
  8350.          * @return {?}
  8351.          */
  8352.         overrideMimeType : function(type) {
  8353.           return number || (s.mimeType = type), this;
  8354.         },
  8355.         /**
  8356.          * @param {Object} map
  8357.          * @return {?}
  8358.          */
  8359.         statusCode : function(map) {
  8360.           var letter;
  8361.           if (map) {
  8362.             if (2 > number) {
  8363.               for (letter in map) {
  8364.                 /** @type {Array} */
  8365.                 statusCode[letter] = [statusCode[letter], map[letter]];
  8366.               }
  8367.             } else {
  8368.               jqXHR.always(map[jqXHR.status]);
  8369.             }
  8370.           }
  8371.           return this;
  8372.         },
  8373.         /**
  8374.          * @param {string} statusText
  8375.          * @return {?}
  8376.          */
  8377.         abort : function(statusText) {
  8378.           var finalText = statusText || strAbort;
  8379.           return transport && transport.abort(finalText), done(0, finalText), this;
  8380.         }
  8381.       };
  8382.       if (deferred.promise(jqXHR).complete = completeDeferred.add, jqXHR.success = jqXHR.done, jqXHR.error = jqXHR.fail, s.url = ((arg || (s.url || url)) + "").replace(trimLeft, "").replace(rprotocol, match[1] + "//"), s.type = options.method || (options.type || (s.method || s.type)), s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(core_rnotwhite) || [""], null == s.crossDomain && (t = quickExpr.exec(s.url.toLowerCase()), s.crossDomain = !(!t || t[1] === match[1] && (t[2] === match[2] &&
  8383.       (t[3] || ("http:" === t[1] ? "80" : "443")) === (match[3] || ("http:" === match[1] ? "80" : "443"))))), s.data && (s.processData && ("string" != typeof s.data && (s.data = jQuery.param(s.data, s.traditional)))), inspectPrefiltersOrTransports(prefilters, s, options, jqXHR), 2 === number) {
  8384.         return jqXHR;
  8385.       }
  8386.       l = jQuery.event && s.global;
  8387.       if (l) {
  8388.         if (0 === jQuery.active++) {
  8389.           jQuery.event.trigger("ajaxStart");
  8390.         }
  8391.       }
  8392.       s.type = s.type.toUpperCase();
  8393.       /** @type {boolean} */
  8394.       s.hasContent = !rnoContent.test(s.type);
  8395.       /** @type {string} */
  8396.       cacheURL = s.url;
  8397.       if (!s.hasContent) {
  8398.         if (s.data) {
  8399.           /** @type {string} */
  8400.           cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data;
  8401.           delete s.data;
  8402.         }
  8403.         if (s.cache === false) {
  8404.           /** @type {string} */
  8405.           s.url = rts.test(cacheURL) ? cacheURL.replace(rts, "$1_=" + iIdCounter++) : cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + iIdCounter++;
  8406.         }
  8407.       }
  8408.       if (s.ifModified) {
  8409.         if (jQuery.lastModified[cacheURL]) {
  8410.           jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
  8411.         }
  8412.         if (jQuery.etag[cacheURL]) {
  8413.           jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
  8414.         }
  8415.       }
  8416.       if (s.data && (s.hasContent && s.contentType !== false) || options.contentType) {
  8417.         jqXHR.setRequestHeader("Content-Type", s.contentType);
  8418.       }
  8419.       jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + ("*" !== s.dataTypes[0] ? ", " + nc + "; q=0.01" : "") : s.accepts["*"]);
  8420.       for (i in s.headers) {
  8421.         jqXHR.setRequestHeader(i, s.headers[i]);
  8422.       }
  8423.       if (s.beforeSend && (s.beforeSend.call(scripts, jqXHR, s) === false || 2 === number)) {
  8424.         return jqXHR.abort();
  8425.       }
  8426.       /** @type {string} */
  8427.       strAbort = "abort";
  8428.       for (i in{
  8429.         success : 1,
  8430.         error : 1,
  8431.         complete : 1
  8432.       }) {
  8433.         jqXHR[i](s[i]);
  8434.       }
  8435.       if (transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR)) {
  8436.         /** @type {number} */
  8437.         jqXHR.readyState = 1;
  8438.         if (l) {
  8439.           globalEventContext.trigger("ajaxSend", [jqXHR, s]);
  8440.         }
  8441.         if (s.async) {
  8442.           if (s.timeout > 0) {
  8443.             /** @type {number} */
  8444.             tref = setTimeout(function() {
  8445.               jqXHR.abort("timeout");
  8446.             }, s.timeout);
  8447.           }
  8448.         }
  8449.         try {
  8450.           /** @type {number} */
  8451.           number = 1;
  8452.           transport.send(requestHeaders, done);
  8453.         } catch (e) {
  8454.           if (!(2 > number)) {
  8455.             throw e;
  8456.           }
  8457.           done(-1, e);
  8458.         }
  8459.       } else {
  8460.         done(-1, "No Transport");
  8461.       }
  8462.       return jqXHR;
  8463.     },
  8464.     /**
  8465.      * @param {Object} cur
  8466.      * @param {string} data
  8467.      * @param {?} callback
  8468.      * @return {?}
  8469.      */
  8470.     getJSON : function(cur, data, callback) {
  8471.       return jQuery.get(cur, data, callback, "json");
  8472.     },
  8473.     /**
  8474.      * @param {Object} cur
  8475.      * @param {?} callback
  8476.      * @return {?}
  8477.      */
  8478.     getScript : function(cur, callback) {
  8479.       return jQuery.get(cur, void 0, callback, "script");
  8480.     }
  8481.   });
  8482.   jQuery.each(["get", "post"], function(dataAndEvents, method) {
  8483.     /**
  8484.      * @param {string} requestUrl
  8485.      * @param {Object} qualifier
  8486.      * @param {Function} success
  8487.      * @param {(Object|string)} dataType
  8488.      * @return {?}
  8489.      */
  8490.     jQuery[method] = function(requestUrl, qualifier, success, dataType) {
  8491.       return jQuery.isFunction(qualifier) && (dataType = dataType || success, success = qualifier, qualifier = void 0), jQuery.ajax({
  8492.         url : requestUrl,
  8493.         type : method,
  8494.         dataType : dataType,
  8495.         data : qualifier,
  8496.         /** @type {Function} */
  8497.         success : success
  8498.       });
  8499.     };
  8500.   });
  8501.   /**
  8502.    * @param {string} url
  8503.    * @return {?}
  8504.    */
  8505.   jQuery._evalUrl = function(url) {
  8506.     return jQuery.ajax({
  8507.       url : url,
  8508.       type : "GET",
  8509.       dataType : "script",
  8510.       async : false,
  8511.       global : false,
  8512.       "throws" : true
  8513.     });
  8514.   };
  8515.   jQuery.fn.extend({
  8516.     /**
  8517.      * @param {string} qualifier
  8518.      * @return {?}
  8519.      */
  8520.     wrapAll : function(qualifier) {
  8521.       var wrap;
  8522.       return jQuery.isFunction(qualifier) ? this.each(function(i) {
  8523.         jQuery(this).wrapAll(qualifier.call(this, i));
  8524.       }) : (this[0] && (wrap = jQuery(qualifier, this[0].ownerDocument).eq(0).clone(true), this[0].parentNode && wrap.insertBefore(this[0]), wrap.map(function() {
  8525.         var elem = this;
  8526.         for (;elem.firstElementChild;) {
  8527.           elem = elem.firstElementChild;
  8528.         }
  8529.         return elem;
  8530.       }).append(this)), this);
  8531.     },
  8532.     /**
  8533.      * @param {Function} html
  8534.      * @return {?}
  8535.      */
  8536.     wrapInner : function(html) {
  8537.       return this.each(jQuery.isFunction(html) ? function(i) {
  8538.         jQuery(this).wrapInner(html.call(this, i));
  8539.       } : function() {
  8540.         var self = jQuery(this);
  8541.         var contents = self.contents();
  8542.         if (contents.length) {
  8543.           contents.wrapAll(html);
  8544.         } else {
  8545.           self.append(html);
  8546.         }
  8547.       });
  8548.     },
  8549.     /**
  8550.      * @param {Function} html
  8551.      * @return {?}
  8552.      */
  8553.     wrap : function(html) {
  8554.       var isFunction = jQuery.isFunction(html);
  8555.       return this.each(function(i) {
  8556.         jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
  8557.       });
  8558.     },
  8559.     /**
  8560.      * @return {?}
  8561.      */
  8562.     unwrap : function() {
  8563.       return this.parent().each(function() {
  8564.         if (!jQuery.nodeName(this, "body")) {
  8565.           jQuery(this).replaceWith(this.childNodes);
  8566.         }
  8567.       }).end();
  8568.     }
  8569.   });
  8570.   /**
  8571.    * @param {string} type
  8572.    * @return {?}
  8573.    */
  8574.   jQuery.expr.filters.hidden = function(type) {
  8575.     return type.offsetWidth <= 0 && type.offsetHeight <= 0;
  8576.   };
  8577.   /**
  8578.    * @param {string} cycle
  8579.    * @return {?}
  8580.    */
  8581.   jQuery.expr.filters.visible = function(cycle) {
  8582.     return!jQuery.expr.filters.hidden(cycle);
  8583.   };
  8584.   /** @type {RegExp} */
  8585.   var rQuot = /%20/g;
  8586.   /** @type {RegExp} */
  8587.   var rmargin = /\[\]$/;
  8588.   /** @type {RegExp} */
  8589.   var rCRLF = /\r?\n/g;
  8590.   /** @type {RegExp} */
  8591.   var mouseTypeRegex = /^(?:submit|button|image|reset|file)$/i;
  8592.   /** @type {RegExp} */
  8593.   var rsubmittable = /^(?:input|select|textarea|keygen)/i;
  8594.   /**
  8595.    * @param {Object} a
  8596.    * @param {Object} traditional
  8597.    * @return {?}
  8598.    */
  8599.   jQuery.param = function(a, traditional) {
  8600.     var prefix;
  8601.     /** @type {Array} */
  8602.     var klass = [];
  8603.     /**
  8604.      * @param {?} key
  8605.      * @param {string} value
  8606.      * @return {undefined}
  8607.      */
  8608.     var add = function(key, value) {
  8609.       value = jQuery.isFunction(value) ? value() : null == value ? "" : value;
  8610.       /** @type {string} */
  8611.       klass[klass.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
  8612.     };
  8613.     if (void 0 === traditional && (traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional), jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
  8614.       jQuery.each(a, function() {
  8615.         add(this.name, this.value);
  8616.       });
  8617.     } else {
  8618.       for (prefix in a) {
  8619.         buildParams(prefix, a[prefix], traditional, add);
  8620.       }
  8621.     }
  8622.     return klass.join("&").replace(rQuot, "+");
  8623.   };
  8624.   jQuery.fn.extend({
  8625.     /**
  8626.      * @return {?}
  8627.      */
  8628.     serialize : function() {
  8629.       return jQuery.param(this.serializeArray());
  8630.     },
  8631.     /**
  8632.      * @return {?}
  8633.      */
  8634.     serializeArray : function() {
  8635.       return this.map(function() {
  8636.         var elements = jQuery.prop(this, "elements");
  8637.         return elements ? jQuery.makeArray(elements) : this;
  8638.       }).filter(function() {
  8639.         var type = this.type;
  8640.         return this.name && (!jQuery(this).is(":disabled") && (rsubmittable.test(this.nodeName) && (!mouseTypeRegex.test(type) && (this.checked || !manipulation_rcheckableType.test(type)))));
  8641.       }).map(function(dataAndEvents, elem) {
  8642.         var val = jQuery(this).val();
  8643.         return null == val ? null : jQuery.isArray(val) ? jQuery.map(val, function(val) {
  8644.           return{
  8645.             name : elem.name,
  8646.             value : val.replace(rCRLF, "\r\n")
  8647.           };
  8648.         }) : {
  8649.           name : elem.name,
  8650.           value : val.replace(rCRLF, "\r\n")
  8651.         };
  8652.       }).get();
  8653.     }
  8654.   });
  8655.   /**
  8656.    * @return {?}
  8657.    */
  8658.   jQuery.ajaxSettings.xhr = function() {
  8659.     try {
  8660.       return new XMLHttpRequest;
  8661.     } catch (e) {
  8662.     }
  8663.   };
  8664.   /** @type {number} */
  8665.   var rightId = 0;
  8666.   var map = {};
  8667.   var xhrSuccessStatus = {
  8668.     0 : 200,
  8669.     1223 : 204
  8670.   };
  8671.   var xhrSupported = jQuery.ajaxSettings.xhr();
  8672.   if (win.attachEvent) {
  8673.     win.attachEvent("onunload", function() {
  8674.       var letter;
  8675.       for (letter in map) {
  8676.         map[letter]();
  8677.       }
  8678.     });
  8679.   }
  8680.   /** @type {boolean} */
  8681.   support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
  8682.   /** @type {boolean} */
  8683.   support.ajax = xhrSupported = !!xhrSupported;
  8684.   jQuery.ajaxTransport(function(options) {
  8685.     var callback;
  8686.     return support.cors || xhrSupported && !options.crossDomain ? {
  8687.       /**
  8688.        * @param {Object} headers
  8689.        * @param {Function} complete
  8690.        * @return {undefined}
  8691.        */
  8692.       send : function(headers, complete) {
  8693.         var i;
  8694.         var xhr = options.xhr();
  8695.         /** @type {number} */
  8696.         var id = ++rightId;
  8697.         if (xhr.open(options.type, options.url, options.async, options.username, options.password), options.xhrFields) {
  8698.           for (i in options.xhrFields) {
  8699.             xhr[i] = options.xhrFields[i];
  8700.           }
  8701.         }
  8702.         if (options.mimeType) {
  8703.           if (xhr.overrideMimeType) {
  8704.             xhr.overrideMimeType(options.mimeType);
  8705.           }
  8706.         }
  8707.         if (!options.crossDomain) {
  8708.           if (!headers["X-Requested-With"]) {
  8709.             /** @type {string} */
  8710.             headers["X-Requested-With"] = "XMLHttpRequest";
  8711.           }
  8712.         }
  8713.         for (i in headers) {
  8714.           xhr.setRequestHeader(i, headers[i]);
  8715.         }
  8716.         /**
  8717.          * @param {string} status
  8718.          * @return {?}
  8719.          */
  8720.         callback = function(status) {
  8721.           return function() {
  8722.             if (callback) {
  8723.               delete map[id];
  8724.               /** @type {null} */
  8725.               callback = xhr.onload = xhr.onerror = null;
  8726.               if ("abort" === status) {
  8727.                 xhr.abort();
  8728.               } else {
  8729.                 if ("error" === status) {
  8730.                   complete(xhr.status, xhr.statusText);
  8731.                 } else {
  8732.                   complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText, "string" == typeof xhr.responseText ? {
  8733.                     text : xhr.responseText
  8734.                   } : void 0, xhr.getAllResponseHeaders());
  8735.                 }
  8736.               }
  8737.             }
  8738.           };
  8739.         };
  8740.         xhr.onload = callback();
  8741.         xhr.onerror = callback("error");
  8742.         callback = map[id] = callback("abort");
  8743.         try {
  8744.           xhr.send(options.hasContent && options.data || null);
  8745.         } catch (a) {
  8746.           if (callback) {
  8747.             throw a;
  8748.           }
  8749.         }
  8750.       },
  8751.       /**
  8752.        * @return {undefined}
  8753.        */
  8754.       abort : function() {
  8755.         if (callback) {
  8756.           callback();
  8757.         }
  8758.       }
  8759.     } : void 0;
  8760.   });
  8761.   jQuery.ajaxSetup({
  8762.     accepts : {
  8763.       script : "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
  8764.     },
  8765.     contents : {
  8766.       script : /(?:java|ecma)script/
  8767.     },
  8768.     converters : {
  8769.       /**
  8770.        * @param {string} value
  8771.        * @return {?}
  8772.        */
  8773.       "text script" : function(value) {
  8774.         return jQuery.globalEval(value), value;
  8775.       }
  8776.     }
  8777.   });
  8778.   jQuery.ajaxPrefilter("script", function(s) {
  8779.     if (void 0 === s.cache) {
  8780.       /** @type {boolean} */
  8781.       s.cache = false;
  8782.     }
  8783.     if (s.crossDomain) {
  8784.       /** @type {string} */
  8785.       s.type = "GET";
  8786.     }
  8787.   });
  8788.   jQuery.ajaxTransport("script", function(s) {
  8789.     if (s.crossDomain) {
  8790.       var script;
  8791.       var callback;
  8792.       return{
  8793.         /**
  8794.          * @param {?} _
  8795.          * @param {Function} complete
  8796.          * @return {undefined}
  8797.          */
  8798.         send : function(_, complete) {
  8799.           script = jQuery("<script>").prop({
  8800.             async : true,
  8801.             charset : s.scriptCharset,
  8802.             src : s.url
  8803.           }).on("load error", callback = function(evt) {
  8804.             script.remove();
  8805.             /** @type {null} */
  8806.             callback = null;
  8807.             if (evt) {
  8808.               complete("error" === evt.type ? 404 : 200, evt.type);
  8809.             }
  8810.           });
  8811.           node.head.appendChild(script[0]);
  8812.         },
  8813.         /**
  8814.          * @return {undefined}
  8815.          */
  8816.         abort : function() {
  8817.           if (callback) {
  8818.             callback();
  8819.           }
  8820.         }
  8821.       };
  8822.     }
  8823.   });
  8824.   /** @type {Array} */
  8825.   var eventPath = [];
  8826.   /** @type {RegExp} */
  8827.   var rjsonp = /(=)\?(?=&|$)|\?\?/;
  8828.   jQuery.ajaxSetup({
  8829.     jsonp : "callback",
  8830.     /**
  8831.      * @return {?}
  8832.      */
  8833.     jsonpCallback : function() {
  8834.       var unlock = eventPath.pop() || jQuery.expando + "_" + iIdCounter++;
  8835.       return this[unlock] = true, unlock;
  8836.     }
  8837.   });
  8838.   jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {
  8839.     var name;
  8840.     var copy;
  8841.     var a;
  8842.     /** @type {(boolean|string)} */
  8843.     var jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : "string" == typeof s.data && (!(s.contentType || "").indexOf("application/x-www-form-urlencoded") && (rjsonp.test(s.data) && "data")));
  8844.     return jsonProp || "jsonp" === s.dataTypes[0] ? (name = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback, jsonProp ? s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + name) : s.jsonp !== false && (s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + name), s.converters["script json"] = function() {
  8845.       return a || jQuery.error(name + " was not called"), a[0];
  8846.     }, s.dataTypes[0] = "json", copy = win[name], win[name] = function() {
  8847.       /** @type {Arguments} */
  8848.       a = arguments;
  8849.     }, jqXHR.always(function() {
  8850.       win[name] = copy;
  8851.       if (s[name]) {
  8852.         s.jsonpCallback = originalSettings.jsonpCallback;
  8853.         eventPath.push(name);
  8854.       }
  8855.       if (a) {
  8856.         if (jQuery.isFunction(copy)) {
  8857.           copy(a[0]);
  8858.         }
  8859.       }
  8860.       a = copy = void 0;
  8861.     }), "script") : void 0;
  8862.   });
  8863.   /**
  8864.    * @param {?} data
  8865.    * @param {Object} context
  8866.    * @param {(Function|string)} keepScripts
  8867.    * @return {?}
  8868.    */
  8869.   jQuery.parseHTML = function(data, context, keepScripts) {
  8870.     if (!data || "string" != typeof data) {
  8871.       return null;
  8872.     }
  8873.     if ("boolean" == typeof context) {
  8874.       /** @type {Object} */
  8875.       keepScripts = context;
  8876.       /** @type {boolean} */
  8877.       context = false;
  8878.     }
  8879.     context = context || node;
  8880.     /** @type {(Array.<string>|null)} */
  8881.     var parsed = rsingleTag.exec(data);
  8882.     /** @type {(Array|boolean)} */
  8883.     var scripts = !keepScripts && [];
  8884.     return parsed ? [context.createElement(parsed[1])] : (parsed = jQuery.buildFragment([data], context, scripts), scripts && (scripts.length && jQuery(scripts).remove()), jQuery.merge([], parsed.childNodes));
  8885.   };
  8886.   /** @type {function ((Function|string), Object, Object): ?} */
  8887.   var matcherFunction = jQuery.fn.load;
  8888.   /**
  8889.    * @param {(Function|string)} url
  8890.    * @param {Object} data
  8891.    * @param {Object} attributes
  8892.    * @return {?}
  8893.    */
  8894.   jQuery.fn.load = function(url, data, attributes) {
  8895.     if ("string" != typeof url && matcherFunction) {
  8896.       return matcherFunction.apply(this, arguments);
  8897.     }
  8898.     var selector;
  8899.     var type;
  8900.     var response;
  8901.     var self = this;
  8902.     var off = url.indexOf(" ");
  8903.     return off >= 0 && (selector = jQuery.trim(url.slice(off)), url = url.slice(0, off)), jQuery.isFunction(data) ? (attributes = data, data = void 0) : data && ("object" == typeof data && (type = "POST")), self.length > 0 && jQuery.ajax({
  8904.       url : url,
  8905.       type : type,
  8906.       dataType : "html",
  8907.       data : data
  8908.     }).done(function(responseText) {
  8909.       /** @type {Arguments} */
  8910.       response = arguments;
  8911.       self.html(selector ? jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : responseText);
  8912.     }).complete(attributes && function(type, elems) {
  8913.       self.each(attributes, response || [type.responseText, elems, type]);
  8914.     }), this;
  8915.   };
  8916.   jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(dataAndEvents, name) {
  8917.     /**
  8918.      * @param {Function} selector
  8919.      * @return {?}
  8920.      */
  8921.     jQuery.fn[name] = function(selector) {
  8922.       return this.on(name, selector);
  8923.     };
  8924.   });
  8925.   /**
  8926.    * @param {undefined} elem
  8927.    * @return {?}
  8928.    */
  8929.   jQuery.expr.filters.animated = function(elem) {
  8930.     return jQuery.grep(jQuery.timers, function(fn) {
  8931.       return elem === fn.elem;
  8932.     }).length;
  8933.   };
  8934.   var docElem = win.document.documentElement;
  8935.   jQuery.offset = {
  8936.     /**
  8937.      * @param {string} elem
  8938.      * @param {Object} options
  8939.      * @param {number} i
  8940.      * @return {undefined}
  8941.      */
  8942.     setOffset : function(elem, options, i) {
  8943.       var curPosition;
  8944.       var curLeft;
  8945.       var curCSSTop;
  8946.       var curTop;
  8947.       var curOffset;
  8948.       var curCSSLeft;
  8949.       var l;
  8950.       var position = jQuery.css(elem, "position");
  8951.       var curElem = jQuery(elem);
  8952.       var props = {};
  8953.       if ("static" === position) {
  8954.         /** @type {string} */
  8955.         elem.style.position = "relative";
  8956.       }
  8957.       curOffset = curElem.offset();
  8958.       curCSSTop = jQuery.css(elem, "top");
  8959.       curCSSLeft = jQuery.css(elem, "left");
  8960.       /** @type {boolean} */
  8961.       l = ("absolute" === position || "fixed" === position) && (curCSSTop + curCSSLeft).indexOf("auto") > -1;
  8962.       if (l) {
  8963.         curPosition = curElem.position();
  8964.         curTop = curPosition.top;
  8965.         curLeft = curPosition.left;
  8966.       } else {
  8967.         /** @type {number} */
  8968.         curTop = parseFloat(curCSSTop) || 0;
  8969.         /** @type {number} */
  8970.         curLeft = parseFloat(curCSSLeft) || 0;
  8971.       }
  8972.       if (jQuery.isFunction(options)) {
  8973.         options = options.call(elem, i, curOffset);
  8974.       }
  8975.       if (null != options.top) {
  8976.         /** @type {number} */
  8977.         props.top = options.top - curOffset.top + curTop;
  8978.       }
  8979.       if (null != options.left) {
  8980.         /** @type {number} */
  8981.         props.left = options.left - curOffset.left + curLeft;
  8982.       }
  8983.       if ("using" in options) {
  8984.         options.using.call(elem, props);
  8985.       } else {
  8986.         curElem.css(props);
  8987.       }
  8988.     }
  8989.   };
  8990.   jQuery.fn.extend({
  8991.     /**
  8992.      * @param {number} x
  8993.      * @return {?}
  8994.      */
  8995.     offset : function(x) {
  8996.       if (arguments.length) {
  8997.         return void 0 === x ? this : this.each(function(dataName) {
  8998.           jQuery.offset.setOffset(this, x, dataName);
  8999.         });
  9000.       }
  9001.       var doc;
  9002.       var win;
  9003.       var b = this[0];
  9004.       var box = {
  9005.         top : 0,
  9006.         left : 0
  9007.       };
  9008.       var element = b && b.ownerDocument;
  9009.       return element ? (doc = element.documentElement, jQuery.contains(doc, b) ? (typeof b.getBoundingClientRect !== text && (box = b.getBoundingClientRect()), win = getWindow(element), {
  9010.         top : box.top + win.pageYOffset - doc.clientTop,
  9011.         left : box.left + win.pageXOffset - doc.clientLeft
  9012.       }) : box) : void 0;
  9013.     },
  9014.     /**
  9015.      * @return {?}
  9016.      */
  9017.     position : function() {
  9018.       if (this[0]) {
  9019.         var offsetParent;
  9020.         var offset;
  9021.         var body = this[0];
  9022.         var parentOffset = {
  9023.           top : 0,
  9024.           left : 0
  9025.         };
  9026.         return "fixed" === jQuery.css(body, "position") ? offset = body.getBoundingClientRect() : (offsetParent = this.offsetParent(), offset = this.offset(), jQuery.nodeName(offsetParent[0], "html") || (parentOffset = offsetParent.offset()), parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true), parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true)), {
  9027.           top : offset.top - parentOffset.top - jQuery.css(body, "marginTop", true),
  9028.           left : offset.left - parentOffset.left - jQuery.css(body, "marginLeft", true)
  9029.         };
  9030.       }
  9031.     },
  9032.     /**
  9033.      * @return {?}
  9034.      */
  9035.     offsetParent : function() {
  9036.       return this.map(function() {
  9037.         var offsetParent = this.offsetParent || docElem;
  9038.         for (;offsetParent && (!jQuery.nodeName(offsetParent, "html") && "static" === jQuery.css(offsetParent, "position"));) {
  9039.           offsetParent = offsetParent.offsetParent;
  9040.         }
  9041.         return offsetParent || docElem;
  9042.       });
  9043.     }
  9044.   });
  9045.   jQuery.each({
  9046.     scrollLeft : "pageXOffset",
  9047.     scrollTop : "pageYOffset"
  9048.   }, function(name, prop) {
  9049.     /** @type {boolean} */
  9050.     var top = "pageYOffset" === prop;
  9051.     /**
  9052.      * @param {string} isXML
  9053.      * @return {?}
  9054.      */
  9055.     jQuery.fn[name] = function(isXML) {
  9056.       return access(this, function(element, k, val) {
  9057.         var obj = getWindow(element);
  9058.         return void 0 === val ? obj ? obj[prop] : element[k] : void(obj ? obj.scrollTo(top ? win.pageXOffset : val, top ? val : win.pageYOffset) : element[k] = val);
  9059.       }, name, isXML, arguments.length, null);
  9060.     };
  9061.   });
  9062.   jQuery.each(["top", "left"], function(dataAndEvents, prop) {
  9063.     jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function(scripts, val) {
  9064.       return val ? (val = get(scripts, prop), regexp.test(val) ? jQuery(scripts).position()[prop] + "px" : val) : void 0;
  9065.     });
  9066.   });
  9067.   jQuery.each({
  9068.     Height : "height",
  9069.     Width : "width"
  9070.   }, function(name, type) {
  9071.     jQuery.each({
  9072.       padding : "inner" + name,
  9073.       content : type,
  9074.       "" : "outer" + name
  9075.     }, function(defaultExtra, original) {
  9076.       /**
  9077.        * @param {?} margin
  9078.        * @param {boolean} value
  9079.        * @return {?}
  9080.        */
  9081.       jQuery.fn[original] = function(margin, value) {
  9082.         var chainable = arguments.length && (defaultExtra || "boolean" != typeof margin);
  9083.         var extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
  9084.         return access(this, function(elem, prop, value) {
  9085.           var doc;
  9086.           return jQuery.isWindow(elem) ? elem.document.documentElement["client" + name] : 9 === elem.nodeType ? (doc = elem.documentElement, Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name])) : void 0 === value ? jQuery.css(elem, prop, extra) : jQuery.style(elem, prop, value, extra);
  9087.         }, type, chainable ? margin : void 0, chainable, null);
  9088.       };
  9089.     });
  9090.   });
  9091.   /**
  9092.    * @return {?}
  9093.    */
  9094.   jQuery.fn.size = function() {
  9095.     return this.length;
  9096.   };
  9097.   jQuery.fn.andSelf = jQuery.fn.addBack;
  9098.   if ("function" == typeof define) {
  9099.     if (define.amd) {
  9100.       define("jquery", [], function() {
  9101.         return jQuery;
  9102.       });
  9103.     }
  9104.   }
  9105.   var $ = win.jQuery;
  9106.   var _$ = win.$;
  9107.   return jQuery.noConflict = function(deep) {
  9108.     return win.$ === jQuery && (win.$ = _$), deep && (win.jQuery === jQuery && (win.jQuery = $)), jQuery;
  9109.   }, typeof dataAndEvents === text && (win.jQuery = win.$ = jQuery), jQuery;
  9110. });
  9111. if ("undefined" == typeof jQuery) {
  9112.   throw new Error("Bootstrap's JavaScript requires jQuery");
  9113. }
  9114. +function($) {
  9115.   var b = $.fn.jquery.split(" ")[0].split(".");
  9116.   if (b[0] < 2 && b[1] < 9 || 1 == b[0] && (9 == b[1] && b[2] < 1)) {
  9117.     throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher");
  9118.   }
  9119. }(jQuery), +function($) {
  9120.   /**
  9121.    * @return {?}
  9122.    */
  9123.   function transitionEnd() {
  9124.     /** @type {Element} */
  9125.     var el = document.createElement("bootstrap");
  9126.     var transEndEventNames = {
  9127.       WebkitTransition : "webkitTransitionEnd",
  9128.       MozTransition : "transitionend",
  9129.       OTransition : "oTransitionEnd otransitionend",
  9130.       transition : "transitionend"
  9131.     };
  9132.     var name;
  9133.     for (name in transEndEventNames) {
  9134.       if (void 0 !== el.style[name]) {
  9135.         return{
  9136.           end : transEndEventNames[name]
  9137.         };
  9138.       }
  9139.     }
  9140.     return false;
  9141.   }
  9142.   /**
  9143.    * @param {number} duration
  9144.    * @return {?}
  9145.    */
  9146.   $.fn.emulateTransitionEnd = function(duration) {
  9147.     /** @type {boolean} */
  9148.     var c = false;
  9149.     var $el = this;
  9150.     $(this).one("bsTransitionEnd", function() {
  9151.       /** @type {boolean} */
  9152.       c = true;
  9153.     });
  9154.     /**
  9155.      * @return {undefined}
  9156.      */
  9157.     var callback = function() {
  9158.       if (!c) {
  9159.         $($el).trigger($.support.transition.end);
  9160.       }
  9161.     };
  9162.     return setTimeout(callback, duration), this;
  9163.   };
  9164.   $(function() {
  9165.     $.support.transition = transitionEnd();
  9166.     if ($.support.transition) {
  9167.       $.event.special.bsTransitionEnd = {
  9168.         bindType : $.support.transition.end,
  9169.         delegateType : $.support.transition.end,
  9170.         /**
  9171.          * @param {Event} event
  9172.          * @return {?}
  9173.          */
  9174.         handle : function(event) {
  9175.           return $(event.target).is(this) ? event.handleObj.handler.apply(this, arguments) : void 0;
  9176.         }
  9177.       };
  9178.     }
  9179.   });
  9180. }(jQuery), +function($) {
  9181.   /**
  9182.    * @param {?} type
  9183.    * @return {?}
  9184.    */
  9185.   function setValue(type) {
  9186.     return this.each(function() {
  9187.       var $this = $(this);
  9188.       var data = $this.data("bs.alert");
  9189.       if (!data) {
  9190.         $this.data("bs.alert", data = new Alert(this));
  9191.       }
  9192.       if ("string" == typeof type) {
  9193.         data[type].call($this);
  9194.       }
  9195.     });
  9196.   }
  9197.   /** @type {string} */
  9198.   var className = '[data-dismiss="alert"]';
  9199.   /**
  9200.    * @param {string} selector
  9201.    * @return {undefined}
  9202.    */
  9203.   var Alert = function(selector) {
  9204.     $(selector).on("click", className, this.close);
  9205.   };
  9206.   /** @type {string} */
  9207.   Alert.VERSION = "3.3.0";
  9208.   /** @type {number} */
  9209.   Alert.TRANSITION_DURATION = 150;
  9210.   /**
  9211.    * @param {Object} e
  9212.    * @return {undefined}
  9213.    */
  9214.   Alert.prototype.close = function(e) {
  9215.     /**
  9216.      * @return {undefined}
  9217.      */
  9218.     function removeElement() {
  9219.       $parent.detach().trigger("closed.bs.alert").remove();
  9220.     }
  9221.     var $this = $(this);
  9222.     var selector = $this.attr("data-target");
  9223.     if (!selector) {
  9224.       selector = $this.attr("href");
  9225.       selector = selector && selector.replace(/.*(?=#[^\s]*$)/, "");
  9226.     }
  9227.     var $parent = $(selector);
  9228.     if (e) {
  9229.       e.preventDefault();
  9230.     }
  9231.     if (!$parent.length) {
  9232.       $parent = $this.closest(".alert");
  9233.     }
  9234.     $parent.trigger(e = $.Event("close.bs.alert"));
  9235.     if (!e.isDefaultPrevented()) {
  9236.       $parent.removeClass("in");
  9237.       if ($.support.transition && $parent.hasClass("fade")) {
  9238.         $parent.one("bsTransitionEnd", removeElement).emulateTransitionEnd(Alert.TRANSITION_DURATION);
  9239.       } else {
  9240.         removeElement();
  9241.       }
  9242.     }
  9243.   };
  9244.   var old = $.fn.alert;
  9245.   /** @type {function (?): ?} */
  9246.   $.fn.alert = setValue;
  9247.   /** @type {function (string): undefined} */
  9248.   $.fn.alert.Constructor = Alert;
  9249.   /**
  9250.    * @return {?}
  9251.    */
  9252.   $.fn.alert.noConflict = function() {
  9253.     return $.fn.alert = old, this;
  9254.   };
  9255.   $(document).on("click.bs.alert.data-api", className, Alert.prototype.close);
  9256. }(jQuery), +function($) {
  9257.   /**
  9258.    * @param {string} option
  9259.    * @return {?}
  9260.    */
  9261.   function init(option) {
  9262.     return this.each(function() {
  9263.       var $this = $(this);
  9264.       var data = $this.data("bs.button");
  9265.       var options = "object" == typeof option && option;
  9266.       if (!data) {
  9267.         $this.data("bs.button", data = new Button(this, options));
  9268.       }
  9269.       if ("toggle" == option) {
  9270.         data.toggle();
  9271.       } else {
  9272.         if (option) {
  9273.           data.setState(option);
  9274.         }
  9275.       }
  9276.     });
  9277.   }
  9278.   /**
  9279.    * @param {string} selector
  9280.    * @param {?} options
  9281.    * @return {undefined}
  9282.    */
  9283.   var Button = function(selector, options) {
  9284.     this.$element = $(selector);
  9285.     this.options = $.extend({}, Button.DEFAULTS, options);
  9286.     /** @type {boolean} */
  9287.     this.isLoading = false;
  9288.   };
  9289.   /** @type {string} */
  9290.   Button.VERSION = "3.3.0";
  9291.   Button.DEFAULTS = {
  9292.     loadingText : "loading..."
  9293.   };
  9294.   /**
  9295.    * @param {string} state
  9296.    * @return {undefined}
  9297.    */
  9298.   Button.prototype.setState = function(state) {
  9299.     /** @type {string} */
  9300.     var elem = "disabled";
  9301.     var $el = this.$element;
  9302.     /** @type {string} */
  9303.     var val = $el.is("input") ? "val" : "html";
  9304.     var data = $el.data();
  9305.     state += "Text";
  9306.     if (null == data.resetText) {
  9307.       $el.data("resetText", $el[val]());
  9308.     }
  9309.     setTimeout($.proxy(function() {
  9310.       $el[val](null == data[state] ? this.options[state] : data[state]);
  9311.       if ("loadingText" == state) {
  9312.         /** @type {boolean} */
  9313.         this.isLoading = true;
  9314.         $el.addClass(elem).attr(elem, elem);
  9315.       } else {
  9316.         if (this.isLoading) {
  9317.           /** @type {boolean} */
  9318.           this.isLoading = false;
  9319.           $el.removeClass(elem).removeAttr(elem);
  9320.         }
  9321.       }
  9322.     }, this), 0);
  9323.   };
  9324.   /**
  9325.    * @return {undefined}
  9326.    */
  9327.   Button.prototype.toggle = function() {
  9328.     /** @type {boolean} */
  9329.     var a = true;
  9330.     var $shcell = this.$element.closest('[data-toggle="buttons"]');
  9331.     if ($shcell.length) {
  9332.       var $input = this.$element.find("input");
  9333.       if ("radio" == $input.prop("type")) {
  9334.         if ($input.prop("checked") && this.$element.hasClass("active")) {
  9335.           /** @type {boolean} */
  9336.           a = false;
  9337.         } else {
  9338.           $shcell.find(".active").removeClass("active");
  9339.         }
  9340.       }
  9341.       if (a) {
  9342.         $input.prop("checked", !this.$element.hasClass("active")).trigger("change");
  9343.       }
  9344.     } else {
  9345.       this.$element.attr("aria-pressed", !this.$element.hasClass("active"));
  9346.     }
  9347.     if (a) {
  9348.       this.$element.toggleClass("active");
  9349.     }
  9350.   };
  9351.   var old = $.fn.button;
  9352.   /** @type {function (string): ?} */
  9353.   $.fn.button = init;
  9354.   /** @type {function (string, ?): undefined} */
  9355.   $.fn.button.Constructor = Button;
  9356.   /**
  9357.    * @return {?}
  9358.    */
  9359.   $.fn.button.noConflict = function() {
  9360.     return $.fn.button = old, this;
  9361.   };
  9362.   $(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function(evt) {
  9363.     var self = $(evt.target);
  9364.     if (!self.hasClass("btn")) {
  9365.       self = self.closest(".btn");
  9366.     }
  9367.     init.call(self, "toggle");
  9368.     evt.preventDefault();
  9369.   }).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function(ev) {
  9370.     $(ev.target).closest(".btn").toggleClass("focus", "focus" == ev.type);
  9371.   });
  9372. }(jQuery), +function($) {
  9373.   /**
  9374.    * @param {number} option
  9375.    * @return {?}
  9376.    */
  9377.   function init(option) {
  9378.     return this.each(function() {
  9379.       var $this = $(this);
  9380.       var data = $this.data("bs.carousel");
  9381.       var options = $.extend({}, Carousel.DEFAULTS, $this.data(), "object" == typeof option && option);
  9382.       var action = "string" == typeof option ? option : options.slide;
  9383.       if (!data) {
  9384.         $this.data("bs.carousel", data = new Carousel(this, options));
  9385.       }
  9386.       if ("number" == typeof option) {
  9387.         data.to(option);
  9388.       } else {
  9389.         if (action) {
  9390.           data[action]();
  9391.         } else {
  9392.           if (options.interval) {
  9393.             data.pause().cycle();
  9394.           }
  9395.         }
  9396.       }
  9397.     });
  9398.   }
  9399.   /**
  9400.    * @param {string} selector
  9401.    * @param {Object} options
  9402.    * @return {undefined}
  9403.    */
  9404.   var Carousel = function(selector, options) {
  9405.     this.$element = $(selector);
  9406.     this.$indicators = this.$element.find(".carousel-indicators");
  9407.     /** @type {Object} */
  9408.     this.options = options;
  9409.     /** @type {null} */
  9410.     this.paused = this.sliding = this.interval = this.$active = this.$items = null;
  9411.     if (this.options.keyboard) {
  9412.       this.$element.on("keydown.bs.carousel", $.proxy(this.keydown, this));
  9413.     }
  9414.     if ("hover" == this.options.pause) {
  9415.       if (!("ontouchstart" in document.documentElement)) {
  9416.         this.$element.on("mouseenter.bs.carousel", $.proxy(this.pause, this)).on("mouseleave.bs.carousel", $.proxy(this.cycle, this));
  9417.       }
  9418.     }
  9419.   };
  9420.   /** @type {string} */
  9421.   Carousel.VERSION = "3.3.0";
  9422.   /** @type {number} */
  9423.   Carousel.TRANSITION_DURATION = 600;
  9424.   Carousel.DEFAULTS = {
  9425.     interval : 5E3,
  9426.     pause : "hover",
  9427.     wrap : true,
  9428.     keyboard : true
  9429.   };
  9430.   /**
  9431.    * @param {Event} e
  9432.    * @return {undefined}
  9433.    */
  9434.   Carousel.prototype.keydown = function(e) {
  9435.     switch(e.which) {
  9436.       case 37:
  9437.         this.prev();
  9438.         break;
  9439.       case 39:
  9440.         this.next();
  9441.         break;
  9442.       default:
  9443.         return;
  9444.     }
  9445.     e.preventDefault();
  9446.   };
  9447.   /**
  9448.    * @param {boolean} dataAndEvents
  9449.    * @return {?}
  9450.    */
  9451.   Carousel.prototype.cycle = function(dataAndEvents) {
  9452.     return dataAndEvents || (this.paused = false), this.interval && clearInterval(this.interval), this.options.interval && (!this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))), this;
  9453.   };
  9454.   /**
  9455.    * @param {?} $item
  9456.    * @return {?}
  9457.    */
  9458.   Carousel.prototype.getItemIndex = function($item) {
  9459.     return this.$items = $item.parent().children(".item"), this.$items.index($item || this.$active);
  9460.   };
  9461.   /**
  9462.    * @param {string} a
  9463.    * @param {?} item
  9464.    * @return {?}
  9465.    */
  9466.   Carousel.prototype.getItemForDirection = function(a, item) {
  9467.     /** @type {number} */
  9468.     var count = "prev" == a ? -1 : 1;
  9469.     var index = this.getItemIndex(item);
  9470.     /** @type {number} */
  9471.     var idx = (index + count) % this.$items.length;
  9472.     return this.$items.eq(idx);
  9473.   };
  9474.   /**
  9475.    * @param {number} pos
  9476.    * @return {?}
  9477.    */
  9478.   Carousel.prototype.to = function(pos) {
  9479.     var that = this;
  9480.     var activePos = this.getItemIndex(this.$active = this.$element.find(".item.active"));
  9481.     return pos > this.$items.length - 1 || 0 > pos ? void 0 : this.sliding ? this.$element.one("slid.bs.carousel", function() {
  9482.       that.to(pos);
  9483.     }) : activePos == pos ? this.pause().cycle() : this.slide(pos > activePos ? "next" : "prev", this.$items.eq(pos));
  9484.   };
  9485.   /**
  9486.    * @param {boolean} $vid
  9487.    * @return {?}
  9488.    */
  9489.   Carousel.prototype.pause = function($vid) {
  9490.     return $vid || (this.paused = true), this.$element.find(".next, .prev").length && ($.support.transition && (this.$element.trigger($.support.transition.end), this.cycle(true))), this.interval = clearInterval(this.interval), this;
  9491.   };
  9492.   /**
  9493.    * @return {?}
  9494.    */
  9495.   Carousel.prototype.next = function() {
  9496.     return this.sliding ? void 0 : this.slide("next");
  9497.   };
  9498.   /**
  9499.    * @return {?}
  9500.    */
  9501.   Carousel.prototype.prev = function() {
  9502.     return this.sliding ? void 0 : this.slide("prev");
  9503.   };
  9504.   /**
  9505.    * @param {string} a
  9506.    * @param {string} next
  9507.    * @return {?}
  9508.    */
  9509.   Carousel.prototype.slide = function(a, next) {
  9510.     var self = this.$element.find(".item.active");
  9511.     var $next = next || this.getItemForDirection(a, self);
  9512.     var isCycling = this.interval;
  9513.     /** @type {string} */
  9514.     var direction = "next" == a ? "left" : "right";
  9515.     /** @type {string} */
  9516.     var fallback = "next" == a ? "first" : "last";
  9517.     var that = this;
  9518.     if (!$next.length) {
  9519.       if (!this.options.wrap) {
  9520.         return;
  9521.       }
  9522.       $next = this.$element.find(".item")[fallback]();
  9523.     }
  9524.     if ($next.hasClass("active")) {
  9525.       return this.sliding = false;
  9526.     }
  9527.     var previous = $next[0];
  9528.     var cycle = $.Event("slide.bs.carousel", {
  9529.       relatedTarget : previous,
  9530.       direction : direction
  9531.     });
  9532.     if (this.$element.trigger(cycle), !cycle.isDefaultPrevented()) {
  9533.       if (this.sliding = true, isCycling && this.pause(), this.$indicators.length) {
  9534.         this.$indicators.find(".active").removeClass("active");
  9535.         var $listing = $(this.$indicators.children()[this.getItemIndex($next)]);
  9536.         if ($listing) {
  9537.           $listing.addClass("active");
  9538.         }
  9539.       }
  9540.       var fix = $.Event("slid.bs.carousel", {
  9541.         relatedTarget : previous,
  9542.         direction : direction
  9543.       });
  9544.       return $.support.transition && this.$element.hasClass("slide") ? ($next.addClass(a), $next[0].offsetWidth, self.addClass(direction), $next.addClass(direction), self.one("bsTransitionEnd", function() {
  9545.         $next.removeClass([a, direction].join(" ")).addClass("active");
  9546.         self.removeClass(["active", direction].join(" "));
  9547.         /** @type {boolean} */
  9548.         that.sliding = false;
  9549.         setTimeout(function() {
  9550.           that.$element.trigger(fix);
  9551.         }, 0);
  9552.       }).emulateTransitionEnd(Carousel.TRANSITION_DURATION)) : (self.removeClass("active"), $next.addClass("active"), this.sliding = false, this.$element.trigger(fix)), isCycling && this.cycle(), this;
  9553.     }
  9554.   };
  9555.   var old = $.fn.carousel;
  9556.   /** @type {function (number): ?} */
  9557.   $.fn.carousel = init;
  9558.   /** @type {function (string, Object): undefined} */
  9559.   $.fn.carousel.Constructor = Carousel;
  9560.   /**
  9561.    * @return {?}
  9562.    */
  9563.   $.fn.carousel.noConflict = function() {
  9564.     return $.fn.carousel = old, this;
  9565.   };
  9566.   /**
  9567.    * @param {?} event
  9568.    * @return {undefined}
  9569.    */
  9570.   var start = function(event) {
  9571.     var href;
  9572.     var $this = $(this);
  9573.     var panel = $($this.attr("data-target") || (href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, ""));
  9574.     if (panel.hasClass("carousel")) {
  9575.       var next = $.extend({}, panel.data(), $this.data());
  9576.       var slideIndex = $this.attr("data-slide-to");
  9577.       if (slideIndex) {
  9578.         /** @type {boolean} */
  9579.         next.interval = false;
  9580.       }
  9581.       init.call(panel, next);
  9582.       if (slideIndex) {
  9583.         panel.data("bs.carousel").to(slideIndex);
  9584.       }
  9585.       event.preventDefault();
  9586.     }
  9587.   };
  9588.   $(document).on("click.bs.carousel.data-api", "[data-slide]", start).on("click.bs.carousel.data-api", "[data-slide-to]", start);
  9589.   $(window).on("load", function() {
  9590.     $('[data-ride="carousel"]').each(function() {
  9591.       var self = $(this);
  9592.       init.call(self, self.data());
  9593.     });
  9594.   });
  9595. }(jQuery), +function($) {
  9596.   /**
  9597.    * @param {HTMLElement} $this
  9598.    * @return {?}
  9599.    */
  9600.   function getParent($this) {
  9601.     var href;
  9602.     var statsTemplate = $this.attr("data-target") || (href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "");
  9603.     return $(statsTemplate);
  9604.   }
  9605.   /**
  9606.    * @param {Function} options
  9607.    * @return {?}
  9608.    */
  9609.   function build(options) {
  9610.     return this.each(function() {
  9611.       var $this = $(this);
  9612.       var data = $this.data("bs.collapse");
  9613.       var settings = $.extend({}, Collapse.DEFAULTS, $this.data(), "object" == typeof options && options);
  9614.       if (!data) {
  9615.         if (settings.toggle) {
  9616.           if ("show" == options) {
  9617.             /** @type {boolean} */
  9618.             settings.toggle = false;
  9619.           }
  9620.         }
  9621.       }
  9622.       if (!data) {
  9623.         $this.data("bs.collapse", data = new Collapse(this, settings));
  9624.       }
  9625.       if ("string" == typeof options) {
  9626.         data[options]();
  9627.       }
  9628.     });
  9629.   }
  9630.   /**
  9631.    * @param {string} selector
  9632.    * @param {?} options
  9633.    * @return {undefined}
  9634.    */
  9635.   var Collapse = function(selector, options) {
  9636.     this.$element = $(selector);
  9637.     this.options = $.extend({}, Collapse.DEFAULTS, options);
  9638.     this.$trigger = $(this.options.trigger).filter('[href="#' + selector.id + '"], [data-target="#' + selector.id + '"]');
  9639.     /** @type {null} */
  9640.     this.transitioning = null;
  9641.     if (this.options.parent) {
  9642.       this.$parent = this.getParent();
  9643.     } else {
  9644.       this.addAriaAndCollapsedClass(this.$element, this.$trigger);
  9645.     }
  9646.     if (this.options.toggle) {
  9647.       this.toggle();
  9648.     }
  9649.   };
  9650.   /** @type {string} */
  9651.   Collapse.VERSION = "3.3.0";
  9652.   /** @type {number} */
  9653.   Collapse.TRANSITION_DURATION = 350;
  9654.   Collapse.DEFAULTS = {
  9655.     toggle : true,
  9656.     trigger : '[data-toggle="collapse"]'
  9657.   };
  9658.   /**
  9659.    * @return {?}
  9660.    */
  9661.   Collapse.prototype.dimension = function() {
  9662.     var hasWidth = this.$element.hasClass("width");
  9663.     return hasWidth ? "width" : "height";
  9664.   };
  9665.   /**
  9666.    * @return {?}
  9667.    */
  9668.   Collapse.prototype.show = function() {
  9669.     if (!this.transitioning && !this.$element.hasClass("in")) {
  9670.       var hasData;
  9671.       var self = this.$parent && this.$parent.find("> .panel").children(".in, .collapsing");
  9672.       if (!(self && (self.length && (hasData = self.data("bs.collapse"), hasData && hasData.transitioning)))) {
  9673.         var cycle = $.Event("show.bs.collapse");
  9674.         if (this.$element.trigger(cycle), !cycle.isDefaultPrevented()) {
  9675.           if (self) {
  9676.             if (self.length) {
  9677.               build.call(self, "hide");
  9678.               if (!hasData) {
  9679.                 self.data("bs.collapse", null);
  9680.               }
  9681.             }
  9682.           }
  9683.           var dimension = this.dimension();
  9684.           this.$element.removeClass("collapse").addClass("collapsing")[dimension](0).attr("aria-expanded", true);
  9685.           this.$trigger.removeClass("collapsed").attr("aria-expanded", true);
  9686.           /** @type {number} */
  9687.           this.transitioning = 1;
  9688.           /**
  9689.            * @return {undefined}
  9690.            */
  9691.           var complete = function() {
  9692.             this.$element.removeClass("collapsing").addClass("collapse in")[dimension]("");
  9693.             /** @type {number} */
  9694.             this.transitioning = 0;
  9695.             this.$element.trigger("shown.bs.collapse");
  9696.           };
  9697.           if (!$.support.transition) {
  9698.             return complete.call(this);
  9699.           }
  9700.           var scrollSize = $.camelCase(["scroll", dimension].join("-"));
  9701.           this.$element.one("bsTransitionEnd", $.proxy(complete, this)).emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]);
  9702.         }
  9703.       }
  9704.     }
  9705.   };
  9706.   /**
  9707.    * @return {?}
  9708.    */
  9709.   Collapse.prototype.hide = function() {
  9710.     if (!this.transitioning && this.$element.hasClass("in")) {
  9711.       var cycle = $.Event("hide.bs.collapse");
  9712.       if (this.$element.trigger(cycle), !cycle.isDefaultPrevented()) {
  9713.         var dimension = this.dimension();
  9714.         this.$element[dimension](this.$element[dimension]())[0].offsetHeight;
  9715.         this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", false);
  9716.         this.$trigger.addClass("collapsed").attr("aria-expanded", false);
  9717.         /** @type {number} */
  9718.         this.transitioning = 1;
  9719.         /**
  9720.          * @return {undefined}
  9721.          */
  9722.         var complete = function() {
  9723.           /** @type {number} */
  9724.           this.transitioning = 0;
  9725.           this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse");
  9726.         };
  9727.         return $.support.transition ? void this.$element[dimension](0).one("bsTransitionEnd", $.proxy(complete, this)).emulateTransitionEnd(Collapse.TRANSITION_DURATION) : complete.call(this);
  9728.       }
  9729.     }
  9730.   };
  9731.   /**
  9732.    * @return {undefined}
  9733.    */
  9734.   Collapse.prototype.toggle = function() {
  9735.     this[this.$element.hasClass("in") ? "hide" : "show"]();
  9736.   };
  9737.   /**
  9738.    * @return {?}
  9739.    */
  9740.   Collapse.prototype.getParent = function() {
  9741.     return $(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each($.proxy(function(dataAndEvents, thisObject) {
  9742.       var $this = $(thisObject);
  9743.       this.addAriaAndCollapsedClass(getParent($this), $this);
  9744.     }, this)).end();
  9745.   };
  9746.   /**
  9747.    * @param {HTMLElement} element
  9748.    * @param {?} el
  9749.    * @return {undefined}
  9750.    */
  9751.   Collapse.prototype.addAriaAndCollapsedClass = function(element, el) {
  9752.     var show = element.hasClass("in");
  9753.     element.attr("aria-expanded", show);
  9754.     el.toggleClass("collapsed", !show).attr("aria-expanded", show);
  9755.   };
  9756.   var old = $.fn.collapse;
  9757.   /** @type {function (Function): ?} */
  9758.   $.fn.collapse = build;
  9759.   /** @type {function (string, ?): undefined} */
  9760.   $.fn.collapse.Constructor = Collapse;
  9761.   /**
  9762.    * @return {?}
  9763.    */
  9764.   $.fn.collapse.noConflict = function() {
  9765.     return $.fn.collapse = old, this;
  9766.   };
  9767.   $(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function(types) {
  9768.     var $this = $(this);
  9769.     if (!$this.attr("data-target")) {
  9770.       types.preventDefault();
  9771.     }
  9772.     var value = getParent($this);
  9773.     var data = value.data("bs.collapse");
  9774.     var option = data ? "toggle" : $.extend({}, $this.data(), {
  9775.       trigger : this
  9776.     });
  9777.     build.call(value, option);
  9778.   });
  9779. }(jQuery), +function($) {
  9780.   /**
  9781.    * @param {Object} e
  9782.    * @return {undefined}
  9783.    */
  9784.   function clearMenus(e) {
  9785.     if (!(e && 3 === e.which)) {
  9786.       $(backdrop).remove();
  9787.       $(selector).each(function() {
  9788.         var $this = $(this);
  9789.         var $parent = getParent($this);
  9790.         var args = {
  9791.           relatedTarget : this
  9792.         };
  9793.         if ($parent.hasClass("open")) {
  9794.           $parent.trigger(e = $.Event("hide.bs.dropdown", args));
  9795.           if (!e.isDefaultPrevented()) {
  9796.             $this.attr("aria-expanded", "false");
  9797.             $parent.removeClass("open").trigger("hidden.bs.dropdown", args);
  9798.           }
  9799.         }
  9800.       });
  9801.     }
  9802.   }
  9803.   /**
  9804.    * @param {Element} $this
  9805.    * @return {?}
  9806.    */
  9807.   function getParent($this) {
  9808.     var selector = $this.attr("data-target");
  9809.     if (!selector) {
  9810.       selector = $this.attr("href");
  9811.       selector = selector && (/#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ""));
  9812.     }
  9813.     var $parent = selector && $(selector);
  9814.     return $parent && $parent.length ? $parent : $this.parent();
  9815.   }
  9816.   /**
  9817.    * @param {?} type
  9818.    * @return {?}
  9819.    */
  9820.   function setValue(type) {
  9821.     return this.each(function() {
  9822.       var $this = $(this);
  9823.       var data = $this.data("bs.dropdown");
  9824.       if (!data) {
  9825.         $this.data("bs.dropdown", data = new Dropdown(this));
  9826.       }
  9827.       if ("string" == typeof type) {
  9828.         data[type].call($this);
  9829.       }
  9830.     });
  9831.   }
  9832.   /** @type {string} */
  9833.   var backdrop = ".dropdown-backdrop";
  9834.   /** @type {string} */
  9835.   var selector = '[data-toggle="dropdown"]';
  9836.   /**
  9837.    * @param {string} selector
  9838.    * @return {undefined}
  9839.    */
  9840.   var Dropdown = function(selector) {
  9841.     $(selector).on("click.bs.dropdown", this.toggle);
  9842.   };
  9843.   /** @type {string} */
  9844.   Dropdown.VERSION = "3.3.0";
  9845.   /**
  9846.    * @param {Object} e
  9847.    * @return {?}
  9848.    */
  9849.   Dropdown.prototype.toggle = function(e) {
  9850.     var $this = $(this);
  9851.     if (!$this.is(".disabled, :disabled")) {
  9852.       var $parent = getParent($this);
  9853.       var isActive = $parent.hasClass("open");
  9854.       if (clearMenus(), !isActive) {
  9855.         if ("ontouchstart" in document.documentElement) {
  9856.           if (!$parent.closest(".navbar-nav").length) {
  9857.             $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on("click", clearMenus);
  9858.           }
  9859.         }
  9860.         var args = {
  9861.           relatedTarget : this
  9862.         };
  9863.         if ($parent.trigger(e = $.Event("show.bs.dropdown", args)), e.isDefaultPrevented()) {
  9864.           return;
  9865.         }
  9866.         $this.trigger("focus").attr("aria-expanded", "true");
  9867.         $parent.toggleClass("open").trigger("shown.bs.dropdown", args);
  9868.       }
  9869.       return false;
  9870.     }
  9871.   };
  9872.   /**
  9873.    * @param {Event} event
  9874.    * @return {?}
  9875.    */
  9876.   Dropdown.prototype.keydown = function(event) {
  9877.     if (/(38|40|27|32)/.test(event.which)) {
  9878.       var $this = $(this);
  9879.       if (event.preventDefault(), event.stopPropagation(), !$this.is(".disabled, :disabled")) {
  9880.         var $parent = getParent($this);
  9881.         var isActive = $parent.hasClass("open");
  9882.         if (!isActive && 27 != event.which || isActive && 27 == event.which) {
  9883.           return 27 == event.which && $parent.find(selector).trigger("focus"), $this.trigger("click");
  9884.         }
  9885.         /** @type {string} */
  9886.         var desc = " li:not(.divider):visible a";
  9887.         var $row = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc);
  9888.         if ($row.length) {
  9889.           var url = $row.index(event.target);
  9890.           if (38 == event.which) {
  9891.             if (url > 0) {
  9892.               url--;
  9893.             }
  9894.           }
  9895.           if (40 == event.which) {
  9896.             if (url < $row.length - 1) {
  9897.               url++;
  9898.             }
  9899.           }
  9900.           if (!~url) {
  9901.             /** @type {number} */
  9902.             url = 0;
  9903.           }
  9904.           $row.eq(url).trigger("focus");
  9905.         }
  9906.       }
  9907.     }
  9908.   };
  9909.   var old = $.fn.dropdown;
  9910.   /** @type {function (?): ?} */
  9911.   $.fn.dropdown = setValue;
  9912.   /** @type {function (string): undefined} */
  9913.   $.fn.dropdown.Constructor = Dropdown;
  9914.   /**
  9915.    * @return {?}
  9916.    */
  9917.   $.fn.dropdown.noConflict = function() {
  9918.     return $.fn.dropdown = old, this;
  9919.   };
  9920.   $(document).on("click.bs.dropdown.data-api", clearMenus).on("click.bs.dropdown.data-api", ".dropdown form", function(event) {
  9921.     event.stopPropagation();
  9922.   }).on("click.bs.dropdown.data-api", selector, Dropdown.prototype.toggle).on("keydown.bs.dropdown.data-api", selector, Dropdown.prototype.keydown).on("keydown.bs.dropdown.data-api", '[role="menu"]', Dropdown.prototype.keydown).on("keydown.bs.dropdown.data-api", '[role="listbox"]', Dropdown.prototype.keydown);
  9923. }(jQuery), +function($) {
  9924.   /**
  9925.    * @param {boolean} options
  9926.    * @param {Function} value
  9927.    * @return {?}
  9928.    */
  9929.   function init(options, value) {
  9930.     return this.each(function() {
  9931.       var $this = $(this);
  9932.       var data = $this.data("bs.modal");
  9933.       var about = $.extend({}, Modal.DEFAULTS, $this.data(), "object" == typeof options && options);
  9934.       if (!data) {
  9935.         $this.data("bs.modal", data = new Modal(this, about));
  9936.       }
  9937.       if ("string" == typeof options) {
  9938.         data[options](value);
  9939.       } else {
  9940.         if (about.show) {
  9941.           data.show(value);
  9942.         }
  9943.       }
  9944.     });
  9945.   }
  9946.   /**
  9947.    * @param {string} selector
  9948.    * @param {Object} options
  9949.    * @return {undefined}
  9950.    */
  9951.   var Modal = function(selector, options) {
  9952.     /** @type {Object} */
  9953.     this.options = options;
  9954.     this.$body = $(document.body);
  9955.     this.$element = $(selector);
  9956.     /** @type {null} */
  9957.     this.$backdrop = this.isShown = null;
  9958.     /** @type {number} */
  9959.     this.scrollbarWidth = 0;
  9960.     if (this.options.remote) {
  9961.       this.$element.find(".modal-content").load(this.options.remote, $.proxy(function() {
  9962.         this.$element.trigger("loaded.bs.modal");
  9963.       }, this));
  9964.     }
  9965.   };
  9966.   /** @type {string} */
  9967.   Modal.VERSION = "3.3.0";
  9968.   /** @type {number} */
  9969.   Modal.TRANSITION_DURATION = 300;
  9970.   /** @type {number} */
  9971.   Modal.BACKDROP_TRANSITION_DURATION = 150;
  9972.   Modal.DEFAULTS = {
  9973.     backdrop : true,
  9974.     keyboard : true,
  9975.     show : true
  9976.   };
  9977.   /**
  9978.    * @param {Function} callback
  9979.    * @return {?}
  9980.    */
  9981.   Modal.prototype.toggle = function(callback) {
  9982.     return this.isShown ? this.hide() : this.show(callback);
  9983.   };
  9984.   /**
  9985.    * @param {Function} callback
  9986.    * @return {undefined}
  9987.    */
  9988.   Modal.prototype.show = function(callback) {
  9989.     var that = this;
  9990.     var cycle = $.Event("show.bs.modal", {
  9991.       /** @type {Function} */
  9992.       relatedTarget : callback
  9993.     });
  9994.     this.$element.trigger(cycle);
  9995.     if (!this.isShown) {
  9996.       if (!cycle.isDefaultPrevented()) {
  9997.         /** @type {boolean} */
  9998.         this.isShown = true;
  9999.         this.checkScrollbar();
  10000.         this.$body.addClass("modal-open");
  10001.         this.setScrollbar();
  10002.         this.escape();
  10003.         this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', $.proxy(this.hide, this));
  10004.         this.backdrop(function() {
  10005.           var e = $.support.transition && that.$element.hasClass("fade");
  10006.           if (!that.$element.parent().length) {
  10007.             that.$element.appendTo(that.$body);
  10008.           }
  10009.           that.$element.show().scrollTop(0);
  10010.           if (e) {
  10011.             that.$element[0].offsetWidth;
  10012.           }
  10013.           that.$element.addClass("in").attr("aria-hidden", false);
  10014.           that.enforceFocus();
  10015.           var cycle = $.Event("shown.bs.modal", {
  10016.             /** @type {Function} */
  10017.             relatedTarget : callback
  10018.           });
  10019.           if (e) {
  10020.             that.$element.find(".modal-dialog").one("bsTransitionEnd", function() {
  10021.               that.$element.trigger("focus").trigger(cycle);
  10022.             }).emulateTransitionEnd(Modal.TRANSITION_DURATION);
  10023.           } else {
  10024.             that.$element.trigger("focus").trigger(cycle);
  10025.           }
  10026.         });
  10027.       }
  10028.     }
  10029.   };
  10030.   /**
  10031.    * @param {string} cycle
  10032.    * @return {undefined}
  10033.    */
  10034.   Modal.prototype.hide = function(cycle) {
  10035.     if (cycle) {
  10036.       cycle.preventDefault();
  10037.     }
  10038.     cycle = $.Event("hide.bs.modal");
  10039.     this.$element.trigger(cycle);
  10040.     if (this.isShown) {
  10041.       if (!cycle.isDefaultPrevented()) {
  10042.         /** @type {boolean} */
  10043.         this.isShown = false;
  10044.         this.escape();
  10045.         $(document).off("focusin.bs.modal");
  10046.         this.$element.removeClass("in").attr("aria-hidden", true).off("click.dismiss.bs.modal");
  10047.         if ($.support.transition && this.$element.hasClass("fade")) {
  10048.           this.$element.one("bsTransitionEnd", $.proxy(this.hideModal, this)).emulateTransitionEnd(Modal.TRANSITION_DURATION);
  10049.         } else {
  10050.           this.hideModal();
  10051.         }
  10052.       }
  10053.     }
  10054.   };
  10055.   /**
  10056.    * @return {undefined}
  10057.    */
  10058.   Modal.prototype.enforceFocus = function() {
  10059.     $(document).off("focusin.bs.modal").on("focusin.bs.modal", $.proxy(function(e) {
  10060.       if (!(this.$element[0] === e.target)) {
  10061.         if (!this.$element.has(e.target).length) {
  10062.           this.$element.trigger("focus");
  10063.         }
  10064.       }
  10065.     }, this));
  10066.   };
  10067.   /**
  10068.    * @return {undefined}
  10069.    */
  10070.   Modal.prototype.escape = function() {
  10071.     if (this.isShown && this.options.keyboard) {
  10072.       this.$element.on("keydown.dismiss.bs.modal", $.proxy(function(event) {
  10073.         if (27 == event.which) {
  10074.           this.hide();
  10075.         }
  10076.       }, this));
  10077.     } else {
  10078.       if (!this.isShown) {
  10079.         this.$element.off("keydown.dismiss.bs.modal");
  10080.       }
  10081.     }
  10082.   };
  10083.   /**
  10084.    * @return {undefined}
  10085.    */
  10086.   Modal.prototype.hideModal = function() {
  10087.     var data = this;
  10088.     this.$element.hide();
  10089.     this.backdrop(function() {
  10090.       data.$body.removeClass("modal-open");
  10091.       data.resetScrollbar();
  10092.       data.$element.trigger("hidden.bs.modal");
  10093.     });
  10094.   };
  10095.   /**
  10096.    * @return {undefined}
  10097.    */
  10098.   Modal.prototype.removeBackdrop = function() {
  10099.     if (this.$backdrop) {
  10100.       this.$backdrop.remove();
  10101.     }
  10102.     /** @type {null} */
  10103.     this.$backdrop = null;
  10104.   };
  10105.   /**
  10106.    * @param {Function} callback
  10107.    * @return {undefined}
  10108.    */
  10109.   Modal.prototype.backdrop = function(callback) {
  10110.     var that = this;
  10111.     /** @type {string} */
  10112.     var animate = this.$element.hasClass("fade") ? "fade" : "";
  10113.     if (this.isShown && this.options.backdrop) {
  10114.       var doAnimate = $.support.transition && animate;
  10115.       if (this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />').prependTo(this.$element).on("click.dismiss.bs.modal", $.proxy(function(e) {
  10116.         if (e.target === e.currentTarget) {
  10117.           if ("static" == this.options.backdrop) {
  10118.             this.$element[0].focus.call(this.$element[0]);
  10119.           } else {
  10120.             this.hide.call(this);
  10121.           }
  10122.         }
  10123.       }, this)), doAnimate && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !callback) {
  10124.         return;
  10125.       }
  10126.       if (doAnimate) {
  10127.         this.$backdrop.one("bsTransitionEnd", callback).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION);
  10128.       } else {
  10129.         callback();
  10130.       }
  10131.     } else {
  10132.       if (!this.isShown && this.$backdrop) {
  10133.         this.$backdrop.removeClass("in");
  10134.         /**
  10135.          * @return {undefined}
  10136.          */
  10137.         var removeElement = function() {
  10138.           that.removeBackdrop();
  10139.           if (callback) {
  10140.             callback();
  10141.           }
  10142.         };
  10143.         if ($.support.transition && this.$element.hasClass("fade")) {
  10144.           this.$backdrop.one("bsTransitionEnd", removeElement).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION);
  10145.         } else {
  10146.           removeElement();
  10147.         }
  10148.       } else {
  10149.         if (callback) {
  10150.           callback();
  10151.         }
  10152.       }
  10153.     }
  10154.   };
  10155.   /**
  10156.    * @return {undefined}
  10157.    */
  10158.   Modal.prototype.checkScrollbar = function() {
  10159.     this.scrollbarWidth = this.measureScrollbar();
  10160.   };
  10161.   /**
  10162.    * @return {undefined}
  10163.    */
  10164.   Modal.prototype.setScrollbar = function() {
  10165.     /** @type {number} */
  10166.     var top = parseInt(this.$body.css("padding-right") || 0, 10);
  10167.     if (this.scrollbarWidth) {
  10168.       this.$body.css("padding-right", top + this.scrollbarWidth);
  10169.     }
  10170.   };
  10171.   /**
  10172.    * @return {undefined}
  10173.    */
  10174.   Modal.prototype.resetScrollbar = function() {
  10175.     this.$body.css("padding-right", "");
  10176.   };
  10177.   /**
  10178.    * @return {?}
  10179.    */
  10180.   Modal.prototype.measureScrollbar = function() {
  10181.     if (document.body.clientWidth >= window.innerWidth) {
  10182.       return 0;
  10183.     }
  10184.     /** @type {Element} */
  10185.     var n = document.createElement("div");
  10186.     /** @type {string} */
  10187.     n.className = "modal-scrollbar-measure";
  10188.     this.$body.append(n);
  10189.     /** @type {number} */
  10190.     var e = n.offsetWidth - n.clientWidth;
  10191.     return this.$body[0].removeChild(n), e;
  10192.   };
  10193.   var old = $.fn.modal;
  10194.   /** @type {function (boolean, Function): ?} */
  10195.   $.fn.modal = init;
  10196.   /** @type {function (string, Object): undefined} */
  10197.   $.fn.modal.Constructor = Modal;
  10198.   /**
  10199.    * @return {?}
  10200.    */
  10201.   $.fn.modal.noConflict = function() {
  10202.     return $.fn.modal = old, this;
  10203.   };
  10204.   $(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function(types) {
  10205.     var $this = $(this);
  10206.     var href = $this.attr("href");
  10207.     var self = $($this.attr("data-target") || href && href.replace(/.*(?=#[^\s]+$)/, ""));
  10208.     var entityType = self.data("bs.modal") ? "toggle" : $.extend({
  10209.       remote : !/#/.test(href) && href
  10210.     }, self.data(), $this.data());
  10211.     if ($this.is("a")) {
  10212.       types.preventDefault();
  10213.     }
  10214.     self.one("show.bs.modal", function(event) {
  10215.       if (!event.isDefaultPrevented()) {
  10216.         self.one("hidden.bs.modal", function() {
  10217.           if ($this.is(":visible")) {
  10218.             $this.trigger("focus");
  10219.           }
  10220.         });
  10221.       }
  10222.     });
  10223.     init.call(self, entityType, this);
  10224.   });
  10225. }(jQuery), +function($) {
  10226.   /**
  10227.    * @param {string} arg
  10228.    * @return {?}
  10229.    */
  10230.   function initialize(arg) {
  10231.     return this.each(function() {
  10232.       var $this = $(this);
  10233.       var data = $this.data("bs.tooltip");
  10234.       var options = "object" == typeof arg && arg;
  10235.       var name = options && options.selector;
  10236.       if (data || "destroy" != arg) {
  10237.         if (name) {
  10238.           if (!data) {
  10239.             $this.data("bs.tooltip", data = {});
  10240.           }
  10241.           if (!data[name]) {
  10242.             data[name] = new Tooltip(this, options);
  10243.           }
  10244.         } else {
  10245.           if (!data) {
  10246.             $this.data("bs.tooltip", data = new Tooltip(this, options));
  10247.           }
  10248.         }
  10249.         if ("string" == typeof arg) {
  10250.           data[arg]();
  10251.         }
  10252.       }
  10253.     });
  10254.   }
  10255.   /**
  10256.    * @param {string} selector
  10257.    * @param {Object} options
  10258.    * @return {undefined}
  10259.    */
  10260.   var Tooltip = function(selector, options) {
  10261.     /** @type {null} */
  10262.     this.type = this.options = this.enabled = this.timeout = this.hoverState = this.$element = null;
  10263.     this.init("tooltip", selector, options);
  10264.   };
  10265.   /** @type {string} */
  10266.   Tooltip.VERSION = "3.3.0";
  10267.   /** @type {number} */
  10268.   Tooltip.TRANSITION_DURATION = 150;
  10269.   Tooltip.DEFAULTS = {
  10270.     animation : true,
  10271.     placement : "top",
  10272.     selector : false,
  10273.     template : '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
  10274.     trigger : "hover focus",
  10275.     title : "",
  10276.     delay : 0,
  10277.     html : false,
  10278.     container : false,
  10279.     viewport : {
  10280.       selector : "body",
  10281.       padding : 0
  10282.     }
  10283.   };
  10284.   /**
  10285.    * @param {string} type
  10286.    * @param {string} element
  10287.    * @param {boolean} options
  10288.    * @return {undefined}
  10289.    */
  10290.   Tooltip.prototype.init = function(type, element, options) {
  10291.     /** @type {boolean} */
  10292.     this.enabled = true;
  10293.     /** @type {string} */
  10294.     this.type = type;
  10295.     this.$element = $(element);
  10296.     this.options = this.getOptions(options);
  10297.     this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport);
  10298.     var params = this.options.trigger.split(" ");
  10299.     var l = params.length;
  10300.     for (;l--;) {
  10301.       var param = params[l];
  10302.       if ("click" == param) {
  10303.         this.$element.on("click." + this.type, this.options.selector, $.proxy(this.toggle, this));
  10304.       } else {
  10305.         if ("manual" != param) {
  10306.           /** @type {string} */
  10307.           var eventIn = "hover" == param ? "mouseenter" : "focusin";
  10308.           /** @type {string} */
  10309.           var eventOut = "hover" == param ? "mouseleave" : "focusout";
  10310.           this.$element.on(eventIn + "." + this.type, this.options.selector, $.proxy(this.enter, this));
  10311.           this.$element.on(eventOut + "." + this.type, this.options.selector, $.proxy(this.leave, this));
  10312.         }
  10313.       }
  10314.     }
  10315.     if (this.options.selector) {
  10316.       this._options = $.extend({}, this.options, {
  10317.         trigger : "manual",
  10318.         selector : ""
  10319.       });
  10320.     } else {
  10321.       this.fixTitle();
  10322.     }
  10323.   };
  10324.   /**
  10325.    * @return {?}
  10326.    */
  10327.   Tooltip.prototype.getDefaults = function() {
  10328.     return Tooltip.DEFAULTS;
  10329.   };
  10330.   /**
  10331.    * @param {boolean} options
  10332.    * @return {?}
  10333.    */
  10334.   Tooltip.prototype.getOptions = function(options) {
  10335.     return options = $.extend({}, this.getDefaults(), this.$element.data(), options), options.delay && ("number" == typeof options.delay && (options.delay = {
  10336.       show : options.delay,
  10337.       hide : options.delay
  10338.     })), options;
  10339.   };
  10340.   /**
  10341.    * @return {?}
  10342.    */
  10343.   Tooltip.prototype.getDelegateOptions = function() {
  10344.     var flags = {};
  10345.     var defaults = this.getDefaults();
  10346.     return this._options && $.each(this._options, function(key, value) {
  10347.       if (defaults[key] != value) {
  10348.         flags[key] = value;
  10349.       }
  10350.     }), flags;
  10351.   };
  10352.   /**
  10353.    * @param {Object} obj
  10354.    * @return {?}
  10355.    */
  10356.   Tooltip.prototype.enter = function(obj) {
  10357.     var options = obj instanceof this.constructor ? obj : $(obj.currentTarget).data("bs." + this.type);
  10358.     return options && (options.$tip && options.$tip.is(":visible")) ? void(options.hoverState = "in") : (options || (options = new this.constructor(obj.currentTarget, this.getDelegateOptions()), $(obj.currentTarget).data("bs." + this.type, options)), clearTimeout(options.timeout), options.hoverState = "in", options.options.delay && options.options.delay.show ? void(options.timeout = setTimeout(function() {
  10359.       if ("in" == options.hoverState) {
  10360.         options.show();
  10361.       }
  10362.     }, options.options.delay.show)) : options.show());
  10363.   };
  10364.   /**
  10365.    * @param {Object} obj
  10366.    * @return {?}
  10367.    */
  10368.   Tooltip.prototype.leave = function(obj) {
  10369.     var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data("bs." + this.type);
  10370.     return self || (self = new this.constructor(obj.currentTarget, this.getDelegateOptions()), $(obj.currentTarget).data("bs." + this.type, self)), clearTimeout(self.timeout), self.hoverState = "out", self.options.delay && self.options.delay.hide ? void(self.timeout = setTimeout(function() {
  10371.       if ("out" == self.hoverState) {
  10372.         self.hide();
  10373.       }
  10374.     }, self.options.delay.hide)) : self.hide();
  10375.   };
  10376.   /**
  10377.    * @return {undefined}
  10378.    */
  10379.   Tooltip.prototype.show = function() {
  10380.     var cycle = $.Event("show.bs." + this.type);
  10381.     if (this.hasContent() && this.enabled) {
  10382.       this.$element.trigger(cycle);
  10383.       var d = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]);
  10384.       if (cycle.isDefaultPrevented() || !d) {
  10385.         return;
  10386.       }
  10387.       var self = this;
  10388.       var $tip = this.tip();
  10389.       var tag = this.getUID(this.type);
  10390.       this.setContent();
  10391.       $tip.attr("id", tag);
  10392.       this.$element.attr("aria-describedby", tag);
  10393.       if (this.options.animation) {
  10394.         $tip.addClass("fade");
  10395.       }
  10396.       var placement = "function" == typeof this.options.placement ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement;
  10397.       /** @type {RegExp} */
  10398.       var autoToken = /\s?auto?\s?/i;
  10399.       /** @type {boolean} */
  10400.       var autoPlace = autoToken.test(placement);
  10401.       if (autoPlace) {
  10402.         placement = placement.replace(autoToken, "") || "top";
  10403.       }
  10404.       $tip.detach().css({
  10405.         top : 0,
  10406.         left : 0,
  10407.         display : "block"
  10408.       }).addClass(placement).data("bs." + this.type, this);
  10409.       if (this.options.container) {
  10410.         $tip.appendTo(this.options.container);
  10411.       } else {
  10412.         $tip.insertAfter(this.$element);
  10413.       }
  10414.       var pos = this.getPosition();
  10415.       var actualWidth = $tip[0].offsetWidth;
  10416.       var actualHeight = $tip[0].offsetHeight;
  10417.       if (autoPlace) {
  10418.         var orgPlacement = placement;
  10419.         var element = this.options.container ? $(this.options.container) : this.$element.parent();
  10420.         var position = this.getPosition(element);
  10421.         placement = "bottom" == placement && pos.bottom + actualHeight > position.bottom ? "top" : "top" == placement && pos.top - actualHeight < position.top ? "bottom" : "right" == placement && pos.right + actualWidth > position.width ? "left" : "left" == placement && pos.left - actualWidth < position.left ? "right" : placement;
  10422.         $tip.removeClass(orgPlacement).addClass(placement);
  10423.       }
  10424.       var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);
  10425.       this.applyPlacement(calculatedOffset, placement);
  10426.       /**
  10427.        * @return {undefined}
  10428.        */
  10429.       var complete = function() {
  10430.         var text = self.hoverState;
  10431.         self.$element.trigger("shown.bs." + self.type);
  10432.         /** @type {null} */
  10433.         self.hoverState = null;
  10434.         if ("out" == text) {
  10435.           self.leave(self);
  10436.         }
  10437.       };
  10438.       if ($.support.transition && this.$tip.hasClass("fade")) {
  10439.         $tip.one("bsTransitionEnd", complete).emulateTransitionEnd(Tooltip.TRANSITION_DURATION);
  10440.       } else {
  10441.         complete();
  10442.       }
  10443.     }
  10444.   };
  10445.   /**
  10446.    * @param {?} offset
  10447.    * @param {string} placement
  10448.    * @return {undefined}
  10449.    */
  10450.   Tooltip.prototype.applyPlacement = function(offset, placement) {
  10451.     var $tip = this.tip();
  10452.     var w = $tip[0].offsetWidth;
  10453.     var height = $tip[0].offsetHeight;
  10454.     /** @type {number} */
  10455.     var marginTop = parseInt($tip.css("margin-top"), 10);
  10456.     /** @type {number} */
  10457.     var marginLeft = parseInt($tip.css("margin-left"), 10);
  10458.     if (isNaN(marginTop)) {
  10459.       /** @type {number} */
  10460.       marginTop = 0;
  10461.     }
  10462.     if (isNaN(marginLeft)) {
  10463.       /** @type {number} */
  10464.       marginLeft = 0;
  10465.     }
  10466.     offset.top = offset.top + marginTop;
  10467.     offset.left = offset.left + marginLeft;
  10468.     $.offset.setOffset($tip[0], $.extend({
  10469.       /**
  10470.        * @param {?} props
  10471.        * @return {undefined}
  10472.        */
  10473.       using : function(props) {
  10474.         $tip.css({
  10475.           top : Math.round(props.top),
  10476.           left : Math.round(props.left)
  10477.         });
  10478.       }
  10479.     }, offset), 0);
  10480.     $tip.addClass("in");
  10481.     var x = $tip[0].offsetWidth;
  10482.     var actualHeight = $tip[0].offsetHeight;
  10483.     if ("top" == placement) {
  10484.       if (actualHeight != height) {
  10485.         /** @type {number} */
  10486.         offset.top = offset.top + height - actualHeight;
  10487.       }
  10488.     }
  10489.     var pos = this.getViewportAdjustedDelta(placement, offset, x, actualHeight);
  10490.     if (pos.left) {
  10491.       offset.left += pos.left;
  10492.     } else {
  10493.       offset.top += pos.top;
  10494.     }
  10495.     /** @type {boolean} */
  10496.     var isHorizontal = /top|bottom/.test(placement);
  10497.     var _position = isHorizontal ? 2 * pos.left - w + x : 2 * pos.top - height + actualHeight;
  10498.     /** @type {string} */
  10499.     var sizingDomProperty = isHorizontal ? "offsetWidth" : "offsetHeight";
  10500.     $tip.offset(offset);
  10501.     this.replaceArrow(_position, $tip[0][sizingDomProperty], isHorizontal);
  10502.   };
  10503.   /**
  10504.    * @param {number} position
  10505.    * @param {number} dimension
  10506.    * @param {boolean} horizontal
  10507.    * @return {undefined}
  10508.    */
  10509.   Tooltip.prototype.replaceArrow = function(position, dimension, horizontal) {
  10510.     this.arrow().css(horizontal ? "left" : "top", 50 * (1 - position / dimension) + "%").css(horizontal ? "top" : "left", "");
  10511.   };
  10512.   /**
  10513.    * @return {undefined}
  10514.    */
  10515.   Tooltip.prototype.setContent = function() {
  10516.     var $tip = this.tip();
  10517.     var title = this.getTitle();
  10518.     $tip.find(".tooltip-inner")[this.options.html ? "html" : "text"](title);
  10519.     $tip.removeClass("fade in top bottom left right");
  10520.   };
  10521.   /**
  10522.    * @param {Function} success
  10523.    * @return {?}
  10524.    */
  10525.   Tooltip.prototype.hide = function(success) {
  10526.     /**
  10527.      * @return {undefined}
  10528.      */
  10529.     function complete() {
  10530.       if ("in" != self.hoverState) {
  10531.         $tip.detach();
  10532.       }
  10533.       self.$element.removeAttr("aria-describedby").trigger("hidden.bs." + self.type);
  10534.       if (success) {
  10535.         success();
  10536.       }
  10537.     }
  10538.     var self = this;
  10539.     var $tip = this.tip();
  10540.     var cycle = $.Event("hide.bs." + this.type);
  10541.     return this.$element.trigger(cycle), cycle.isDefaultPrevented() ? void 0 : ($tip.removeClass("in"), $.support.transition && this.$tip.hasClass("fade") ? $tip.one("bsTransitionEnd", complete).emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete(), this.hoverState = null, this);
  10542.   };
  10543.   /**
  10544.    * @return {undefined}
  10545.    */
  10546.   Tooltip.prototype.fixTitle = function() {
  10547.     var $e = this.$element;
  10548.     if ($e.attr("title") || "string" != typeof $e.attr("data-original-title")) {
  10549.       $e.attr("data-original-title", $e.attr("title") || "").attr("title", "");
  10550.     }
  10551.   };
  10552.   /**
  10553.    * @return {?}
  10554.    */
  10555.   Tooltip.prototype.hasContent = function() {
  10556.     return this.getTitle();
  10557.   };
  10558.   /**
  10559.    * @param {Object} $element
  10560.    * @return {?}
  10561.    */
  10562.   Tooltip.prototype.getPosition = function($element) {
  10563.     $element = $element || this.$element;
  10564.     var el = $element[0];
  10565.     /** @type {boolean} */
  10566.     var bShow = "BODY" == el.tagName;
  10567.     var rect = el.getBoundingClientRect();
  10568.     if (null == rect.width) {
  10569.       rect = $.extend({}, rect, {
  10570.         width : rect.right - rect.left,
  10571.         height : rect.bottom - rect.top
  10572.       });
  10573.     }
  10574.     var platformVersions = bShow ? {
  10575.       top : 0,
  10576.       left : 0
  10577.     } : $element.offset();
  10578.     var copy = {
  10579.       scroll : bShow ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop()
  10580.     };
  10581.     /** @type {(null|{height: ?, width: ?})} */
  10582.     var newOpts = bShow ? {
  10583.       width : $(window).width(),
  10584.       height : $(window).height()
  10585.     } : null;
  10586.     return $.extend({}, rect, copy, newOpts, platformVersions);
  10587.   };
  10588.   /**
  10589.    * @param {string} str
  10590.    * @param {?} pos
  10591.    * @param {number} actualWidth
  10592.    * @param {number} actualHeight
  10593.    * @return {?}
  10594.    */
  10595.   Tooltip.prototype.getCalculatedOffset = function(str, pos, actualWidth, actualHeight) {
  10596.     return "bottom" == str ? {
  10597.       top : pos.top + pos.height,
  10598.       left : pos.left + pos.width / 2 - actualWidth / 2
  10599.     } : "top" == str ? {
  10600.       top : pos.top - actualHeight,
  10601.       left : pos.left + pos.width / 2 - actualWidth / 2
  10602.     } : "left" == str ? {
  10603.       top : pos.top + pos.height / 2 - actualHeight / 2,
  10604.       left : pos.left - actualWidth
  10605.     } : {
  10606.       top : pos.top + pos.height / 2 - actualHeight / 2,
  10607.       left : pos.left + pos.width
  10608.     };
  10609.   };
  10610.   /**
  10611.    * @param {string} placement
  10612.    * @param {?} layout
  10613.    * @param {?} v00
  10614.    * @param {number} value
  10615.    * @return {?}
  10616.    */
  10617.   Tooltip.prototype.getViewportAdjustedDelta = function(placement, layout, v00, value) {
  10618.     var result = {
  10619.       top : 0,
  10620.       left : 0
  10621.     };
  10622.     if (!this.$viewport) {
  10623.       return result;
  10624.     }
  10625.     var bounce = this.options.viewport && this.options.viewport.padding || 0;
  10626.     var p = this.getPosition(this.$viewport);
  10627.     if (/right|left/.test(placement)) {
  10628.       /** @type {number} */
  10629.       var y = layout.top - bounce - p.scroll;
  10630.       var tval = layout.top + bounce - p.scroll + value;
  10631.       if (y < p.top) {
  10632.         /** @type {number} */
  10633.         result.top = p.top - y;
  10634.       } else {
  10635.         if (tval > p.top + p.height) {
  10636.           /** @type {number} */
  10637.           result.top = p.top + p.height - tval;
  10638.         }
  10639.       }
  10640.     } else {
  10641.       /** @type {number} */
  10642.       var x = layout.left - bounce;
  10643.       var imageWidth = layout.left + bounce + v00;
  10644.       if (x < p.left) {
  10645.         /** @type {number} */
  10646.         result.left = p.left - x;
  10647.       } else {
  10648.         if (imageWidth > p.width) {
  10649.           /** @type {number} */
  10650.           result.left = p.left + p.width - imageWidth;
  10651.         }
  10652.       }
  10653.     }
  10654.     return result;
  10655.   };
  10656.   /**
  10657.    * @return {?}
  10658.    */
  10659.   Tooltip.prototype.getTitle = function() {
  10660.     var a;
  10661.     var $e = this.$element;
  10662.     var o = this.options;
  10663.     return a = $e.attr("data-original-title") || ("function" == typeof o.title ? o.title.call($e[0]) : o.title);
  10664.   };
  10665.   /**
  10666.    * @param {number} id
  10667.    * @return {?}
  10668.    */
  10669.   Tooltip.prototype.getUID = function(id) {
  10670.     do {
  10671.       id += ~~(1E6 * Math.random());
  10672.     } while (document.getElementById(id));
  10673.     return id;
  10674.   };
  10675.   /**
  10676.    * @return {?}
  10677.    */
  10678.   Tooltip.prototype.tip = function() {
  10679.     return this.$tip = this.$tip || $(this.options.template);
  10680.   };
  10681.   /**
  10682.    * @return {?}
  10683.    */
  10684.   Tooltip.prototype.arrow = function() {
  10685.     return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow");
  10686.   };
  10687.   /**
  10688.    * @return {undefined}
  10689.    */
  10690.   Tooltip.prototype.enable = function() {
  10691.     /** @type {boolean} */
  10692.     this.enabled = true;
  10693.   };
  10694.   /**
  10695.    * @return {undefined}
  10696.    */
  10697.   Tooltip.prototype.disable = function() {
  10698.     /** @type {boolean} */
  10699.     this.enabled = false;
  10700.   };
  10701.   /**
  10702.    * @return {undefined}
  10703.    */
  10704.   Tooltip.prototype.toggleEnabled = function() {
  10705.     /** @type {boolean} */
  10706.     this.enabled = !this.enabled;
  10707.   };
  10708.   /**
  10709.    * @param {Event} e
  10710.    * @return {undefined}
  10711.    */
  10712.   Tooltip.prototype.toggle = function(e) {
  10713.     var node = this;
  10714.     if (e) {
  10715.       node = $(e.currentTarget).data("bs." + this.type);
  10716.       if (!node) {
  10717.         node = new this.constructor(e.currentTarget, this.getDelegateOptions());
  10718.         $(e.currentTarget).data("bs." + this.type, node);
  10719.       }
  10720.     }
  10721.     if (node.tip().hasClass("in")) {
  10722.       node.leave(node);
  10723.     } else {
  10724.       node.enter(node);
  10725.     }
  10726.   };
  10727.   /**
  10728.    * @return {undefined}
  10729.    */
  10730.   Tooltip.prototype.destroy = function() {
  10731.     var that = this;
  10732.     clearTimeout(this.timeout);
  10733.     this.hide(function() {
  10734.       that.$element.off("." + that.type).removeData("bs." + that.type);
  10735.     });
  10736.   };
  10737.   var old = $.fn.tooltip;
  10738.   /** @type {function (string): ?} */
  10739.   $.fn.tooltip = initialize;
  10740.   /** @type {function (string, Object): undefined} */
  10741.   $.fn.tooltip.Constructor = Tooltip;
  10742.   /**
  10743.    * @return {?}
  10744.    */
  10745.   $.fn.tooltip.noConflict = function() {
  10746.     return $.fn.tooltip = old, this;
  10747.   };
  10748. }(jQuery), +function($) {
  10749.   /**
  10750.    * @param {string} arg
  10751.    * @return {?}
  10752.    */
  10753.   function initialize(arg) {
  10754.     return this.each(function() {
  10755.       var $this = $(this);
  10756.       var data = $this.data("bs.popover");
  10757.       var options = "object" == typeof arg && arg;
  10758.       var name = options && options.selector;
  10759.       if (data || "destroy" != arg) {
  10760.         if (name) {
  10761.           if (!data) {
  10762.             $this.data("bs.popover", data = {});
  10763.           }
  10764.           if (!data[name]) {
  10765.             data[name] = new Popover(this, options);
  10766.           }
  10767.         } else {
  10768.           if (!data) {
  10769.             $this.data("bs.popover", data = new Popover(this, options));
  10770.           }
  10771.         }
  10772.         if ("string" == typeof arg) {
  10773.           data[arg]();
  10774.         }
  10775.       }
  10776.     });
  10777.   }
  10778.   /**
  10779.    * @param {string} selector
  10780.    * @param {Object} options
  10781.    * @return {undefined}
  10782.    */
  10783.   var Popover = function(selector, options) {
  10784.     this.init("popover", selector, options);
  10785.   };
  10786.   if (!$.fn.tooltip) {
  10787.     throw new Error("Popover requires tooltip.js");
  10788.   }
  10789.   /** @type {string} */
  10790.   Popover.VERSION = "3.3.0";
  10791.   Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
  10792.     placement : "right",
  10793.     trigger : "click",
  10794.     content : "",
  10795.     template : '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
  10796.   });
  10797.   Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype);
  10798.   /** @type {function (string, Object): undefined} */
  10799.   Popover.prototype.constructor = Popover;
  10800.   /**
  10801.    * @return {?}
  10802.    */
  10803.   Popover.prototype.getDefaults = function() {
  10804.     return Popover.DEFAULTS;
  10805.   };
  10806.   /**
  10807.    * @return {undefined}
  10808.    */
  10809.   Popover.prototype.setContent = function() {
  10810.     var $tip = this.tip();
  10811.     var title = this.getTitle();
  10812.     var err = this.getContent();
  10813.     $tip.find(".popover-title")[this.options.html ? "html" : "text"](title);
  10814.     $tip.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof err ? "html" : "append" : "text"](err);
  10815.     $tip.removeClass("fade top bottom left right in");
  10816.     if (!$tip.find(".popover-title").html()) {
  10817.       $tip.find(".popover-title").hide();
  10818.     }
  10819.   };
  10820.   /**
  10821.    * @return {?}
  10822.    */
  10823.   Popover.prototype.hasContent = function() {
  10824.     return this.getTitle() || this.getContent();
  10825.   };
  10826.   /**
  10827.    * @return {?}
  10828.    */
  10829.   Popover.prototype.getContent = function() {
  10830.     var $e = this.$element;
  10831.     var o = this.options;
  10832.     return $e.attr("data-content") || ("function" == typeof o.content ? o.content.call($e[0]) : o.content);
  10833.   };
  10834.   /**
  10835.    * @return {?}
  10836.    */
  10837.   Popover.prototype.arrow = function() {
  10838.     return this.$arrow = this.$arrow || this.tip().find(".arrow");
  10839.   };
  10840.   /**
  10841.    * @return {?}
  10842.    */
  10843.   Popover.prototype.tip = function() {
  10844.     return this.$tip || (this.$tip = $(this.options.template)), this.$tip;
  10845.   };
  10846.   var old = $.fn.popover;
  10847.   /** @type {function (string): ?} */
  10848.   $.fn.popover = initialize;
  10849.   /** @type {function (string, Object): undefined} */
  10850.   $.fn.popover.Constructor = Popover;
  10851.   /**
  10852.    * @return {?}
  10853.    */
  10854.   $.fn.popover.noConflict = function() {
  10855.     return $.fn.popover = old, this;
  10856.   };
  10857. }(jQuery), +function($) {
  10858.   /**
  10859.    * @param {string} selector
  10860.    * @param {?} options
  10861.    * @return {undefined}
  10862.    */
  10863.   function ScrollSpy(selector, options) {
  10864.     var className = $.proxy(this.process, this);
  10865.     this.$body = $("body");
  10866.     this.$scrollElement = $($(selector).is("body") ? window : selector);
  10867.     this.options = $.extend({}, ScrollSpy.DEFAULTS, options);
  10868.     /** @type {string} */
  10869.     this.selector = (this.options.target || "") + " .nav li > a";
  10870.     /** @type {Array} */
  10871.     this.offsets = [];
  10872.     /** @type {Array} */
  10873.     this.targets = [];
  10874.     /** @type {null} */
  10875.     this.activeTarget = null;
  10876.     /** @type {number} */
  10877.     this.scrollHeight = 0;
  10878.     this.$scrollElement.on("scroll.bs.scrollspy", className);
  10879.     this.refresh();
  10880.     this.process();
  10881.   }
  10882.   /**
  10883.    * @param {number} arg
  10884.    * @return {?}
  10885.    */
  10886.   function init(arg) {
  10887.     return this.each(function() {
  10888.       var $this = $(this);
  10889.       var data = $this.data("bs.scrollspy");
  10890.       var options = "object" == typeof arg && arg;
  10891.       if (!data) {
  10892.         $this.data("bs.scrollspy", data = new ScrollSpy(this, options));
  10893.       }
  10894.       if ("string" == typeof arg) {
  10895.         data[arg]();
  10896.       }
  10897.     });
  10898.   }
  10899.   /** @type {string} */
  10900.   ScrollSpy.VERSION = "3.3.0";
  10901.   ScrollSpy.DEFAULTS = {
  10902.     offset : 10
  10903.   };
  10904.   /**
  10905.    * @return {?}
  10906.    */
  10907.   ScrollSpy.prototype.getScrollHeight = function() {
  10908.     return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight);
  10909.   };
  10910.   /**
  10911.    * @return {undefined}
  10912.    */
  10913.   ScrollSpy.prototype.refresh = function() {
  10914.     /** @type {string} */
  10915.     var i = "offset";
  10916.     /** @type {number} */
  10917.     var nub_height = 0;
  10918.     if (!$.isWindow(this.$scrollElement[0])) {
  10919.       /** @type {string} */
  10920.       i = "position";
  10921.       nub_height = this.$scrollElement.scrollTop();
  10922.     }
  10923.     /** @type {Array} */
  10924.     this.offsets = [];
  10925.     /** @type {Array} */
  10926.     this.targets = [];
  10927.     this.scrollHeight = this.getScrollHeight();
  10928.     var self = this;
  10929.     this.$body.find(this.selector).map(function() {
  10930.       var $el = $(this);
  10931.       var href = $el.data("target") || $el.attr("href");
  10932.       var codeSegments = /^#./.test(href) && $(href);
  10933.       return codeSegments && (codeSegments.length && (codeSegments.is(":visible") && [[codeSegments[i]().top + nub_height, href]])) || null;
  10934.     }).sort(function(mat0, mat1) {
  10935.       return mat0[0] - mat1[0];
  10936.     }).each(function() {
  10937.       self.offsets.push(this[0]);
  10938.       self.targets.push(this[1]);
  10939.     });
  10940.   };
  10941.   /**
  10942.    * @return {?}
  10943.    */
  10944.   ScrollSpy.prototype.process = function() {
  10945.     var i;
  10946.     var scrollTop = this.$scrollElement.scrollTop() + this.options.offset;
  10947.     var offset = this.getScrollHeight();
  10948.     /** @type {number} */
  10949.     var maxScroll = this.options.offset + offset - this.$scrollElement.height();
  10950.     var offsets = this.offsets;
  10951.     var targets = this.targets;
  10952.     var activeTarget = this.activeTarget;
  10953.     if (this.scrollHeight != offset && this.refresh(), scrollTop >= maxScroll) {
  10954.       return activeTarget != (i = targets[targets.length - 1]) && this.activate(i);
  10955.     }
  10956.     if (activeTarget && scrollTop < offsets[0]) {
  10957.       return this.activeTarget = null, this.clear();
  10958.     }
  10959.     i = offsets.length;
  10960.     for (;i--;) {
  10961.       if (activeTarget != targets[i]) {
  10962.         if (scrollTop >= offsets[i]) {
  10963.           if (!offsets[i + 1] || scrollTop <= offsets[i + 1]) {
  10964.             this.activate(targets[i]);
  10965.           }
  10966.         }
  10967.       }
  10968.     }
  10969.   };
  10970.   /**
  10971.    * @param {Error} target
  10972.    * @return {undefined}
  10973.    */
  10974.   ScrollSpy.prototype.activate = function(target) {
  10975.     /** @type {Error} */
  10976.     this.activeTarget = target;
  10977.     this.clear();
  10978.     /** @type {string} */
  10979.     var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]';
  10980.     var active = $(selector).parents("li").addClass("active");
  10981.     if (active.parent(".dropdown-menu").length) {
  10982.       active = active.closest("li.dropdown").addClass("active");
  10983.     }
  10984.     active.trigger("activate.bs.scrollspy");
  10985.   };
  10986.   /**
  10987.    * @return {undefined}
  10988.    */
  10989.   ScrollSpy.prototype.clear = function() {
  10990.     $(this.selector).parentsUntil(this.options.target, ".active").removeClass("active");
  10991.   };
  10992.   var old = $.fn.scrollspy;
  10993.   /** @type {function (number): ?} */
  10994.   $.fn.scrollspy = init;
  10995.   /** @type {function (string, ?): undefined} */
  10996.   $.fn.scrollspy.Constructor = ScrollSpy;
  10997.   /**
  10998.    * @return {?}
  10999.    */
  11000.   $.fn.scrollspy.noConflict = function() {
  11001.     return $.fn.scrollspy = old, this;
  11002.   };
  11003.   $(window).on("load.bs.scrollspy.data-api", function() {
  11004.     $('[data-spy="scroll"]').each(function() {
  11005.       var self = $(this);
  11006.       init.call(self, self.data());
  11007.     });
  11008.   });
  11009. }(jQuery), +function($) {
  11010.   /**
  11011.    * @param {?} selector
  11012.    * @return {?}
  11013.    */
  11014.   function init(selector) {
  11015.     return this.each(function() {
  11016.       var $this = $(this);
  11017.       var data = $this.data("bs.tab");
  11018.       if (!data) {
  11019.         $this.data("bs.tab", data = new Tab(this));
  11020.       }
  11021.       if ("string" == typeof selector) {
  11022.         data[selector]();
  11023.       }
  11024.     });
  11025.   }
  11026.   /**
  11027.    * @param {string} selector
  11028.    * @return {undefined}
  11029.    */
  11030.   var Tab = function(selector) {
  11031.     this.element = $(selector);
  11032.   };
  11033.   /** @type {string} */
  11034.   Tab.VERSION = "3.3.0";
  11035.   /** @type {number} */
  11036.   Tab.TRANSITION_DURATION = 150;
  11037.   /**
  11038.    * @return {undefined}
  11039.    */
  11040.   Tab.prototype.show = function() {
  11041.     var $this = this.element;
  11042.     var $ul = $this.closest("ul:not(.dropdown-menu)");
  11043.     var selector = $this.data("target");
  11044.     if (selector || (selector = $this.attr("href"), selector = selector && selector.replace(/.*(?=#[^\s]*$)/, "")), !$this.parent("li").hasClass("active")) {
  11045.       var elm = $ul.find(".active:last a");
  11046.       var cycle = $.Event("hide.bs.tab", {
  11047.         relatedTarget : $this[0]
  11048.       });
  11049.       var fix = $.Event("show.bs.tab", {
  11050.         relatedTarget : elm[0]
  11051.       });
  11052.       if (elm.trigger(cycle), $this.trigger(fix), !fix.isDefaultPrevented() && !cycle.isDefaultPrevented()) {
  11053.         var $target = $(selector);
  11054.         this.activate($this.closest("li"), $ul);
  11055.         this.activate($target, $target.parent(), function() {
  11056.           elm.trigger({
  11057.             type : "hidden.bs.tab",
  11058.             relatedTarget : $this[0]
  11059.           });
  11060.           $this.trigger({
  11061.             type : "shown.bs.tab",
  11062.             relatedTarget : elm[0]
  11063.           });
  11064.         });
  11065.       }
  11066.     }
  11067.   };
  11068.   /**
  11069.    * @param {Object} element
  11070.    * @param {Object} container
  11071.    * @param {Object} callback
  11072.    * @return {undefined}
  11073.    */
  11074.   Tab.prototype.activate = function(element, container, callback) {
  11075.     /**
  11076.      * @return {undefined}
  11077.      */
  11078.     function next() {
  11079.       $active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", false);
  11080.       element.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", true);
  11081.       if (showAddButton) {
  11082.         element[0].offsetWidth;
  11083.         element.addClass("in");
  11084.       } else {
  11085.         element.removeClass("fade");
  11086.       }
  11087.       if (element.parent(".dropdown-menu")) {
  11088.         element.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", true);
  11089.       }
  11090.       if (callback) {
  11091.         callback();
  11092.       }
  11093.     }
  11094.     var $active = container.find("> .active");
  11095.     var showAddButton = callback && ($.support.transition && ($active.length && $active.hasClass("fade") || !!container.find("> .fade").length));
  11096.     if ($active.length && showAddButton) {
  11097.       $active.one("bsTransitionEnd", next).emulateTransitionEnd(Tab.TRANSITION_DURATION);
  11098.     } else {
  11099.       next();
  11100.     }
  11101.     $active.removeClass("in");
  11102.   };
  11103.   var old = $.fn.tab;
  11104.   /** @type {function (?): ?} */
  11105.   $.fn.tab = init;
  11106.   /** @type {function (string): undefined} */
  11107.   $.fn.tab.Constructor = Tab;
  11108.   /**
  11109.    * @return {?}
  11110.    */
  11111.   $.fn.tab.noConflict = function() {
  11112.     return $.fn.tab = old, this;
  11113.   };
  11114.   /**
  11115.    * @param {?} event
  11116.    * @return {undefined}
  11117.    */
  11118.   var stop = function(event) {
  11119.     event.preventDefault();
  11120.     init.call($(this), "show");
  11121.   };
  11122.   $(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', stop).on("click.bs.tab.data-api", '[data-toggle="pill"]', stop);
  11123. }(jQuery), +function($) {
  11124.   /**
  11125.    * @param {number} arg
  11126.    * @return {?}
  11127.    */
  11128.   function init(arg) {
  11129.     return this.each(function() {
  11130.       var $this = $(this);
  11131.       var data = $this.data("bs.affix");
  11132.       var options = "object" == typeof arg && arg;
  11133.       if (!data) {
  11134.         $this.data("bs.affix", data = new Affix(this, options));
  11135.       }
  11136.       if ("string" == typeof arg) {
  11137.         data[arg]();
  11138.       }
  11139.     });
  11140.   }
  11141.   /**
  11142.    * @param {string} selector
  11143.    * @param {?} options
  11144.    * @return {undefined}
  11145.    */
  11146.   var Affix = function(selector, options) {
  11147.     this.options = $.extend({}, Affix.DEFAULTS, options);
  11148.     this.$target = $(this.options.target).on("scroll.bs.affix.data-api", $.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", $.proxy(this.checkPositionWithEventLoop, this));
  11149.     this.$element = $(selector);
  11150.     /** @type {null} */
  11151.     this.affixed = this.unpin = this.pinnedOffset = null;
  11152.     this.checkPosition();
  11153.   };
  11154.   /** @type {string} */
  11155.   Affix.VERSION = "3.3.0";
  11156.   /** @type {string} */
  11157.   Affix.RESET = "affix affix-top affix-bottom";
  11158.   Affix.DEFAULTS = {
  11159.     offset : 0,
  11160.     target : window
  11161.   };
  11162.   /**
  11163.    * @param {number} el
  11164.    * @param {?} value
  11165.    * @param {string} element
  11166.    * @param {number} v12
  11167.    * @return {?}
  11168.    */
  11169.   Affix.prototype.getState = function(el, value, element, v12) {
  11170.     var scrollTop = this.$target.scrollTop();
  11171.     var position = this.$element.offset();
  11172.     var wiewHeight = this.$target.height();
  11173.     if (null != element && "top" == this.affixed) {
  11174.       return element > scrollTop ? "top" : false;
  11175.     }
  11176.     if ("bottom" == this.affixed) {
  11177.       return null != element ? scrollTop + this.unpin <= position.top ? false : "bottom" : el - v12 >= scrollTop + wiewHeight ? false : "bottom";
  11178.     }
  11179.     /** @type {boolean} */
  11180.     var iterator = null == this.affixed;
  11181.     var initial = iterator ? scrollTop : position.top;
  11182.     var computed = iterator ? wiewHeight : value;
  11183.     return null != element && element >= initial ? "top" : null != v12 && initial + computed >= el - v12 ? "bottom" : false;
  11184.   };
  11185.   /**
  11186.    * @return {?}
  11187.    */
  11188.   Affix.prototype.getPinnedOffset = function() {
  11189.     if (this.pinnedOffset) {
  11190.       return this.pinnedOffset;
  11191.     }
  11192.     this.$element.removeClass(Affix.RESET).addClass("affix");
  11193.     var scrollTop = this.$target.scrollTop();
  11194.     var position = this.$element.offset();
  11195.     return this.pinnedOffset = position.top - scrollTop;
  11196.   };
  11197.   /**
  11198.    * @return {undefined}
  11199.    */
  11200.   Affix.prototype.checkPositionWithEventLoop = function() {
  11201.     setTimeout($.proxy(this.checkPosition, this), 1);
  11202.   };
  11203.   /**
  11204.    * @return {undefined}
  11205.    */
  11206.   Affix.prototype.checkPosition = function() {
  11207.     if (this.$element.is(":visible")) {
  11208.       var udataCur = this.$element.height();
  11209.       var n = this.options.offset;
  11210.       var a = n.top;
  11211.       var b = n.bottom;
  11212.       var failuresLink = $("body").height();
  11213.       if ("object" != typeof n) {
  11214.         b = a = n;
  11215.       }
  11216.       if ("function" == typeof a) {
  11217.         a = n.top(this.$element);
  11218.       }
  11219.       if ("function" == typeof b) {
  11220.         b = n.bottom(this.$element);
  11221.       }
  11222.       var affix = this.getState(failuresLink, udataCur, a, b);
  11223.       if (this.affixed != affix) {
  11224.         if (null != this.unpin) {
  11225.           this.$element.css("top", "");
  11226.         }
  11227.         /** @type {string} */
  11228.         var affixType = "affix" + (affix ? "-" + affix : "");
  11229.         var cycle = $.Event(affixType + ".bs.affix");
  11230.         if (this.$element.trigger(cycle), cycle.isDefaultPrevented()) {
  11231.           return;
  11232.         }
  11233.         this.affixed = affix;
  11234.         this.unpin = "bottom" == affix ? this.getPinnedOffset() : null;
  11235.         this.$element.removeClass(Affix.RESET).addClass(affixType).trigger(affixType.replace("affix", "affixed") + ".bs.affix");
  11236.       }
  11237.       if ("bottom" == affix) {
  11238.         this.$element.offset({
  11239.           top : failuresLink - udataCur - b
  11240.         });
  11241.       }
  11242.     }
  11243.   };
  11244.   var old = $.fn.affix;
  11245.   /** @type {function (number): ?} */
  11246.   $.fn.affix = init;
  11247.   /** @type {function (string, ?): undefined} */
  11248.   $.fn.affix.Constructor = Affix;
  11249.   /**
  11250.    * @return {?}
  11251.    */
  11252.   $.fn.affix.noConflict = function() {
  11253.     return $.fn.affix = old, this;
  11254.   };
  11255.   $(window).on("load", function() {
  11256.     $('[data-spy="affix"]').each(function() {
  11257.       var self = $(this);
  11258.       var options = self.data();
  11259.       options.offset = options.offset || {};
  11260.       if (null != options.offsetBottom) {
  11261.         options.offset.bottom = options.offsetBottom;
  11262.       }
  11263.       if (null != options.offsetTop) {
  11264.         options.offset.top = options.offsetTop;
  11265.       }
  11266.       init.call(self, options);
  11267.     });
  11268.   });
  11269. }(jQuery);
  11270. (function(factory) {
  11271.   if ("function" == typeof define && define.amd) {
  11272.     define(["jquery"], factory);
  11273.   } else {
  11274.     if ("object" == typeof exports) {
  11275.       factory(require("jquery"));
  11276.     } else {
  11277.       factory(window.jQuery || window.Zepto);
  11278.     }
  11279.   }
  11280. })(function($) {
  11281.   var mfp;
  11282.   var _prevStatus;
  11283.   var _body;
  11284.   var _document;
  11285.   var _prevContentType;
  11286.   var cls;
  11287.   var openElement;
  11288.   /** @type {string} */
  11289.   var CLOSE_EVENT = "Close";
  11290.   /** @type {string} */
  11291.   var BEFORE_CLOSE_EVENT = "BeforeClose";
  11292.   /** @type {string} */
  11293.   var AFTER_CLOSE_EVENT = "AfterClose";
  11294.   /** @type {string} */
  11295.   var BEFORE_APPEND_EVENT = "BeforeAppend";
  11296.   /** @type {string} */
  11297.   var MARKUP_PARSE_EVENT = "MarkupParse";
  11298.   /** @type {string} */
  11299.   var OPEN_EVENT = "Open";
  11300.   /** @type {string} */
  11301.   var CHANGE_EVENT = "Change";
  11302.   /** @type {string} */
  11303.   var NS = "mfp";
  11304.   /** @type {string} */
  11305.   var EVENT_NS = "." + NS;
  11306.   /** @type {string} */
  11307.   var READY_CLASS = "mfp-ready";
  11308.   /** @type {string} */
  11309.   var REMOVING_CLASS = "mfp-removing";
  11310.   /** @type {string} */
  11311.   var PREVENT_CLOSE_CLASS = "mfp-prevent-close";
  11312.   /**
  11313.    * @return {undefined}
  11314.    */
  11315.   var MagnificPopup = function() {
  11316.   };
  11317.   /** @type {boolean} */
  11318.   var _isJQ = !!window.jQuery;
  11319.   var _window = $(window);
  11320.   /**
  11321.    * @param {string} name
  11322.    * @param {Function} f
  11323.    * @return {undefined}
  11324.    */
  11325.   var _mfpOn = function(name, f) {
  11326.     mfp.ev.on(NS + name + EVENT_NS, f);
  11327.   };
  11328.   /**
  11329.    * @param {string} className
  11330.    * @param {string} cycle
  11331.    * @param {Object} recurring
  11332.    * @param {boolean} dataAndEvents
  11333.    * @return {?}
  11334.    */
  11335.   var _getEl = function(className, cycle, recurring, dataAndEvents) {
  11336.     /** @type {Element} */
  11337.     var el = document.createElement("div");
  11338.     return el.className = "mfp-" + className, recurring && (el.innerHTML = recurring), dataAndEvents ? cycle && cycle.appendChild(el) : (el = $(el), cycle && el.appendTo(cycle)), el;
  11339.   };
  11340.   /**
  11341.    * @param {string} e
  11342.    * @param {?} data
  11343.    * @return {undefined}
  11344.    */
  11345.   var _mfpTrigger = function(e, data) {
  11346.     mfp.ev.triggerHandler(NS + e, data);
  11347.     if (mfp.st.callbacks) {
  11348.       e = e.charAt(0).toLowerCase() + e.slice(1);
  11349.       if (mfp.st.callbacks[e]) {
  11350.         mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
  11351.       }
  11352.     }
  11353.   };
  11354.   /**
  11355.    * @param {?} element
  11356.    * @return {?}
  11357.    */
  11358.   var _getCloseBtn = function(element) {
  11359.     return element === openElement && mfp.currTemplate.closeBtn || (mfp.currTemplate.closeBtn = $(mfp.st.closeMarkup.replace("%title%", mfp.st.tClose)), openElement = element), mfp.currTemplate.closeBtn;
  11360.   };
  11361.   /**
  11362.    * @return {undefined}
  11363.    */
  11364.   var _checkInstance = function() {
  11365.     if (!$.magnificPopup.instance) {
  11366.       mfp = new MagnificPopup;
  11367.       mfp.init();
  11368.       $.magnificPopup.instance = mfp;
  11369.     }
  11370.   };
  11371.   /**
  11372.    * @return {?}
  11373.    */
  11374.   var supportsTransitions = function() {
  11375.     /** @type {(CSSStyleDeclaration|null)} */
  11376.     var s = document.createElement("p").style;
  11377.     /** @type {Array} */
  11378.     var v = ["ms", "O", "Moz", "Webkit"];
  11379.     if (void 0 !== s.transition) {
  11380.       return true;
  11381.     }
  11382.     for (;v.length;) {
  11383.       if (v.pop() + "Transition" in s) {
  11384.         return true;
  11385.       }
  11386.     }
  11387.     return false;
  11388.   };
  11389.   MagnificPopup.prototype = {
  11390.     /** @type {function (): undefined} */
  11391.     constructor : MagnificPopup,
  11392.     /**
  11393.      * @return {undefined}
  11394.      */
  11395.     init : function() {
  11396.       /** @type {string} */
  11397.       var appVersion = navigator.appVersion;
  11398.       /** @type {boolean} */
  11399.       mfp.isIE7 = -1 !== appVersion.indexOf("MSIE 7.");
  11400.       /** @type {boolean} */
  11401.       mfp.isIE8 = -1 !== appVersion.indexOf("MSIE 8.");
  11402.       /** @type {boolean} */
  11403.       mfp.isLowIE = mfp.isIE7 || mfp.isIE8;
  11404.       /** @type {boolean} */
  11405.       mfp.isAndroid = /android/gi.test(appVersion);
  11406.       /** @type {boolean} */
  11407.       mfp.isIOS = /iphone|ipad|ipod/gi.test(appVersion);
  11408.       mfp.supportsTransition = supportsTransitions();
  11409.       /** @type {boolean} */
  11410.       mfp.probablyMobile = mfp.isAndroid || (mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent));
  11411.       _document = $(document);
  11412.       mfp.popupsCache = {};
  11413.     },
  11414.     /**
  11415.      * @param {Object} data
  11416.      * @return {?}
  11417.      */
  11418.     open : function(data) {
  11419.       if (!_body) {
  11420.         _body = $(document.body);
  11421.       }
  11422.       var i;
  11423.       if (data.isObj === false) {
  11424.         mfp.items = data.items.toArray();
  11425.         /** @type {number} */
  11426.         mfp.index = 0;
  11427.         var item;
  11428.         var items = data.items;
  11429.         /** @type {number} */
  11430.         i = 0;
  11431.         for (;items.length > i;i++) {
  11432.           if (item = items[i], item.parsed && (item = item.el[0]), item === data.el[0]) {
  11433.             /** @type {number} */
  11434.             mfp.index = i;
  11435.             break;
  11436.           }
  11437.         }
  11438.       } else {
  11439.         mfp.items = $.isArray(data.items) ? data.items : [data.items];
  11440.         mfp.index = data.index || 0;
  11441.       }
  11442.       if (mfp.isOpen) {
  11443.         return mfp.updateItemHTML(), void 0;
  11444.       }
  11445.       /** @type {Array} */
  11446.       mfp.types = [];
  11447.       /** @type {string} */
  11448.       cls = "";
  11449.       mfp.ev = data.mainEl && data.mainEl.length ? data.mainEl.eq(0) : _document;
  11450.       if (data.key) {
  11451.         if (!mfp.popupsCache[data.key]) {
  11452.           mfp.popupsCache[data.key] = {};
  11453.         }
  11454.         mfp.currTemplate = mfp.popupsCache[data.key];
  11455.       } else {
  11456.         mfp.currTemplate = {};
  11457.       }
  11458.       mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data);
  11459.       mfp.fixedContentPos = "auto" === mfp.st.fixedContentPos ? !mfp.probablyMobile : mfp.st.fixedContentPos;
  11460.       if (mfp.st.modal) {
  11461.         /** @type {boolean} */
  11462.         mfp.st.closeOnContentClick = false;
  11463.         /** @type {boolean} */
  11464.         mfp.st.closeOnBgClick = false;
  11465.         /** @type {boolean} */
  11466.         mfp.st.showCloseBtn = false;
  11467.         /** @type {boolean} */
  11468.         mfp.st.enableEscapeKey = false;
  11469.       }
  11470.       if (!mfp.bgOverlay) {
  11471.         mfp.bgOverlay = _getEl("bg").on("click" + EVENT_NS, function() {
  11472.           mfp.close();
  11473.         });
  11474.         mfp.wrap = _getEl("wrap").attr("tabindex", -1).on("click" + EVENT_NS, function(e) {
  11475.           if (mfp._checkIfClose(e.target)) {
  11476.             mfp.close();
  11477.           }
  11478.         });
  11479.         mfp.container = _getEl("container", mfp.wrap);
  11480.       }
  11481.       mfp.contentContainer = _getEl("content");
  11482.       if (mfp.st.preloader) {
  11483.         mfp.preloader = _getEl("preloader", mfp.container, mfp.st.tLoading);
  11484.       }
  11485.       var comparisons = $.magnificPopup.modules;
  11486.       /** @type {number} */
  11487.       i = 0;
  11488.       for (;comparisons.length > i;i++) {
  11489.         var t = comparisons[i];
  11490.         t = t.charAt(0).toUpperCase() + t.slice(1);
  11491.         mfp["init" + t].call(mfp);
  11492.       }
  11493.       _mfpTrigger("BeforeOpen");
  11494.       if (mfp.st.showCloseBtn) {
  11495.         if (mfp.st.closeBtnInside) {
  11496.           _mfpOn(MARKUP_PARSE_EVENT, function(dataAndEvents, deepDataAndEvents, values, item) {
  11497.             values.close_replaceWith = _getCloseBtn(item.type);
  11498.           });
  11499.           cls += " mfp-close-btn-in";
  11500.         } else {
  11501.           mfp.wrap.append(_getCloseBtn());
  11502.         }
  11503.       }
  11504.       if (mfp.st.alignTop) {
  11505.         cls += " mfp-align-top";
  11506.       }
  11507.       if (mfp.fixedContentPos) {
  11508.         mfp.wrap.css({
  11509.           overflow : mfp.st.overflowY,
  11510.           overflowX : "hidden",
  11511.           overflowY : mfp.st.overflowY
  11512.         });
  11513.       } else {
  11514.         mfp.wrap.css({
  11515.           top : _window.scrollTop(),
  11516.           position : "absolute"
  11517.         });
  11518.       }
  11519.       if (mfp.st.fixedBgPos === false || "auto" === mfp.st.fixedBgPos && !mfp.fixedContentPos) {
  11520.         mfp.bgOverlay.css({
  11521.           height : _document.height(),
  11522.           position : "absolute"
  11523.         });
  11524.       }
  11525.       if (mfp.st.enableEscapeKey) {
  11526.         _document.on("keyup" + EVENT_NS, function(event) {
  11527.           if (27 === event.keyCode) {
  11528.             mfp.close();
  11529.           }
  11530.         });
  11531.       }
  11532.       _window.on("resize" + EVENT_NS, function() {
  11533.         mfp.updateSize();
  11534.       });
  11535.       if (!mfp.st.closeOnContentClick) {
  11536.         cls += " mfp-auto-cursor";
  11537.       }
  11538.       if (cls) {
  11539.         mfp.wrap.addClass(cls);
  11540.       }
  11541.       var windowHeight = mfp.wH = _window.height();
  11542.       var style = {};
  11543.       if (mfp.fixedContentPos && mfp._hasScrollBar(windowHeight)) {
  11544.         var marginSize = mfp._getScrollbarSize();
  11545.         if (marginSize) {
  11546.           style.marginRight = marginSize;
  11547.         }
  11548.       }
  11549.       if (mfp.fixedContentPos) {
  11550.         if (mfp.isIE7) {
  11551.           $("body, html").css("overflow", "hidden");
  11552.         } else {
  11553.           /** @type {string} */
  11554.           style.overflow = "hidden";
  11555.         }
  11556.       }
  11557.       var classesToadd = mfp.st.mainClass;
  11558.       return mfp.isIE7 && (classesToadd += " mfp-ie7"), classesToadd && mfp._addClassToMFP(classesToadd), mfp.updateItemHTML(), _mfpTrigger("BuildControls"), $("html").css(style), mfp.bgOverlay.add(mfp.wrap).prependTo(mfp.st.prependTo || _body), mfp._lastFocusedEl = document.activeElement, setTimeout(function() {
  11559.         if (mfp.content) {
  11560.           mfp._addClassToMFP(READY_CLASS);
  11561.           mfp._setFocus();
  11562.         } else {
  11563.           mfp.bgOverlay.addClass(READY_CLASS);
  11564.         }
  11565.         _document.on("focusin" + EVENT_NS, mfp._onFocusIn);
  11566.       }, 16), mfp.isOpen = true, mfp.updateSize(windowHeight), _mfpTrigger(OPEN_EVENT), data;
  11567.     },
  11568.     /**
  11569.      * @return {undefined}
  11570.      */
  11571.     close : function() {
  11572.       if (mfp.isOpen) {
  11573.         _mfpTrigger(BEFORE_CLOSE_EVENT);
  11574.         /** @type {boolean} */
  11575.         mfp.isOpen = false;
  11576.         if (mfp.st.removalDelay && (!mfp.isLowIE && mfp.supportsTransition)) {
  11577.           mfp._addClassToMFP(REMOVING_CLASS);
  11578.           setTimeout(function() {
  11579.             mfp._close();
  11580.           }, mfp.st.removalDelay);
  11581.         } else {
  11582.           mfp._close();
  11583.         }
  11584.       }
  11585.     },
  11586.     /**
  11587.      * @return {undefined}
  11588.      */
  11589.     _close : function() {
  11590.       _mfpTrigger(CLOSE_EVENT);
  11591.       /** @type {string} */
  11592.       var classesToRemove = REMOVING_CLASS + " " + READY_CLASS + " ";
  11593.       if (mfp.bgOverlay.detach(), mfp.wrap.detach(), mfp.container.empty(), mfp.st.mainClass && (classesToRemove += mfp.st.mainClass + " "), mfp._removeClassFromMFP(classesToRemove), mfp.fixedContentPos) {
  11594.         var elem = {
  11595.           marginRight : ""
  11596.         };
  11597.         if (mfp.isIE7) {
  11598.           $("body, html").css("overflow", "");
  11599.         } else {
  11600.           /** @type {string} */
  11601.           elem.overflow = "";
  11602.         }
  11603.         $("html").css(elem);
  11604.       }
  11605.       _document.off("keyup" + EVENT_NS + " focusin" + EVENT_NS);
  11606.       mfp.ev.off(EVENT_NS);
  11607.       mfp.wrap.attr("class", "mfp-wrap").removeAttr("style");
  11608.       mfp.bgOverlay.attr("class", "mfp-bg");
  11609.       mfp.container.attr("class", "mfp-container");
  11610.       if (!!mfp.st.showCloseBtn) {
  11611.         if (!(mfp.st.closeBtnInside && mfp.currTemplate[mfp.currItem.type] !== true)) {
  11612.           if (mfp.currTemplate.closeBtn) {
  11613.             mfp.currTemplate.closeBtn.detach();
  11614.           }
  11615.         }
  11616.       }
  11617.       if (mfp._lastFocusedEl) {
  11618.         $(mfp._lastFocusedEl).focus();
  11619.       }
  11620.       /** @type {null} */
  11621.       mfp.currItem = null;
  11622.       /** @type {null} */
  11623.       mfp.content = null;
  11624.       /** @type {null} */
  11625.       mfp.currTemplate = null;
  11626.       /** @type {number} */
  11627.       mfp.prevHeight = 0;
  11628.       _mfpTrigger(AFTER_CLOSE_EVENT);
  11629.     },
  11630.     /**
  11631.      * @param {(Object|number)} winHeight
  11632.      * @return {undefined}
  11633.      */
  11634.     updateSize : function(winHeight) {
  11635.       if (mfp.isIOS) {
  11636.         /** @type {number} */
  11637.         var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
  11638.         /** @type {number} */
  11639.         var height = window.innerHeight * zoomLevel;
  11640.         mfp.wrap.css("height", height);
  11641.         /** @type {number} */
  11642.         mfp.wH = height;
  11643.       } else {
  11644.         mfp.wH = winHeight || _window.height();
  11645.       }
  11646.       if (!mfp.fixedContentPos) {
  11647.         mfp.wrap.css("height", mfp.wH);
  11648.       }
  11649.       _mfpTrigger("Resize");
  11650.     },
  11651.     /**
  11652.      * @return {undefined}
  11653.      */
  11654.     updateItemHTML : function() {
  11655.       var item = mfp.items[mfp.index];
  11656.       mfp.contentContainer.detach();
  11657.       if (mfp.content) {
  11658.         mfp.content.detach();
  11659.       }
  11660.       if (!item.parsed) {
  11661.         item = mfp.parseEl(mfp.index);
  11662.       }
  11663.       var type = item.type;
  11664.       if (_mfpTrigger("BeforeChange", [mfp.currItem ? mfp.currItem.type : "", type]), mfp.currItem = item, !mfp.currTemplate[type]) {
  11665.         var page = mfp.st[type] ? mfp.st[type].markup : false;
  11666.         _mfpTrigger("FirstMarkupParse", page);
  11667.         mfp.currTemplate[type] = page ? $(page) : true;
  11668.       }
  11669.       if (_prevContentType) {
  11670.         if (_prevContentType !== item.type) {
  11671.           mfp.container.removeClass("mfp-" + _prevContentType + "-holder");
  11672.         }
  11673.       }
  11674.       var newContent = mfp["get" + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
  11675.       mfp.appendContent(newContent, type);
  11676.       /** @type {boolean} */
  11677.       item.preloaded = true;
  11678.       _mfpTrigger(CHANGE_EVENT, item);
  11679.       _prevContentType = item.type;
  11680.       mfp.container.prepend(mfp.contentContainer);
  11681.       _mfpTrigger("AfterChange");
  11682.     },
  11683.     /**
  11684.      * @param {?} newContent
  11685.      * @param {string} type
  11686.      * @return {undefined}
  11687.      */
  11688.     appendContent : function(newContent, type) {
  11689.       mfp.content = newContent;
  11690.       if (newContent) {
  11691.         if (mfp.st.showCloseBtn && (mfp.st.closeBtnInside && mfp.currTemplate[type] === true)) {
  11692.           if (!mfp.content.find(".mfp-close").length) {
  11693.             mfp.content.append(_getCloseBtn());
  11694.           }
  11695.         } else {
  11696.           mfp.content = newContent;
  11697.         }
  11698.       } else {
  11699.         /** @type {string} */
  11700.         mfp.content = "";
  11701.       }
  11702.       _mfpTrigger(BEFORE_APPEND_EVENT);
  11703.       mfp.container.addClass("mfp-" + type + "-holder");
  11704.       mfp.contentContainer.append(mfp.content);
  11705.     },
  11706.     /**
  11707.      * @param {number} index
  11708.      * @return {?}
  11709.      */
  11710.     parseEl : function(index) {
  11711.       var type;
  11712.       var item = mfp.items[index];
  11713.       if (item.tagName ? item = {
  11714.         el : $(item)
  11715.       } : (type = item.type, item = {
  11716.         data : item,
  11717.         src : item.src
  11718.       }), item.el) {
  11719.         var types = mfp.types;
  11720.         /** @type {number} */
  11721.         var i = 0;
  11722.         for (;types.length > i;i++) {
  11723.           if (item.el.hasClass("mfp-" + types[i])) {
  11724.             type = types[i];
  11725.             break;
  11726.           }
  11727.         }
  11728.         item.src = item.el.attr("data-mfp-src");
  11729.         if (!item.src) {
  11730.           item.src = item.el.attr("href");
  11731.         }
  11732.       }
  11733.       return item.type = type || (mfp.st.type || "inline"), item.index = index, item.parsed = true, mfp.items[index] = item, _mfpTrigger("ElementParse", item), mfp.items[index];
  11734.     },
  11735.     /**
  11736.      * @param {?} el
  11737.      * @param {Object} options
  11738.      * @return {undefined}
  11739.      */
  11740.     addGroup : function(el, options) {
  11741.       /**
  11742.        * @param {Event} e
  11743.        * @return {undefined}
  11744.        */
  11745.       var eHandler = function(e) {
  11746.         e.mfpEl = this;
  11747.         mfp._openClick(e, el, options);
  11748.       };
  11749.       if (!options) {
  11750.         options = {};
  11751.       }
  11752.       /** @type {string} */
  11753.       var type = "click.magnificPopup";
  11754.       options.mainEl = el;
  11755.       if (options.items) {
  11756.         /** @type {boolean} */
  11757.         options.isObj = true;
  11758.         el.off(type).on(type, eHandler);
  11759.       } else {
  11760.         /** @type {boolean} */
  11761.         options.isObj = false;
  11762.         if (options.delegate) {
  11763.           el.off(type).on(type, options.delegate, eHandler);
  11764.         } else {
  11765.           options.items = el;
  11766.           el.off(type).on(type, eHandler);
  11767.         }
  11768.       }
  11769.     },
  11770.     /**
  11771.      * @param {Event} e
  11772.      * @param {?} el
  11773.      * @param {Object} options
  11774.      * @return {?}
  11775.      */
  11776.     _openClick : function(e, el, options) {
  11777.       var r = void 0 !== options.midClick ? options.midClick : $.magnificPopup.defaults.midClick;
  11778.       if (r || 2 !== e.which && (!e.ctrlKey && !e.metaKey)) {
  11779.         var html = void 0 !== options.disableOn ? options.disableOn : $.magnificPopup.defaults.disableOn;
  11780.         if (html) {
  11781.           if ($.isFunction(html)) {
  11782.             if (!html.call(mfp)) {
  11783.               return true;
  11784.             }
  11785.           } else {
  11786.             if (html > _window.width()) {
  11787.               return true;
  11788.             }
  11789.           }
  11790.         }
  11791.         if (e.type) {
  11792.           e.preventDefault();
  11793.           if (mfp.isOpen) {
  11794.             e.stopPropagation();
  11795.           }
  11796.         }
  11797.         options.el = $(e.mfpEl);
  11798.         if (options.delegate) {
  11799.           options.items = el.find(options.delegate);
  11800.         }
  11801.         mfp.open(options);
  11802.       }
  11803.     },
  11804.     /**
  11805.      * @param {number} status
  11806.      * @param {string} text
  11807.      * @return {undefined}
  11808.      */
  11809.     updateStatus : function(status, text) {
  11810.       if (mfp.preloader) {
  11811.         if (_prevStatus !== status) {
  11812.           mfp.container.removeClass("mfp-s-" + _prevStatus);
  11813.         }
  11814.         if (!text) {
  11815.           if (!("loading" !== status)) {
  11816.             text = mfp.st.tLoading;
  11817.           }
  11818.         }
  11819.         var data = {
  11820.           status : status,
  11821.           text : text
  11822.         };
  11823.         _mfpTrigger("UpdateStatus", data);
  11824.         status = data.status;
  11825.         text = data.text;
  11826.         mfp.preloader.html(text);
  11827.         mfp.preloader.find("a").on("click", function(e) {
  11828.           e.stopImmediatePropagation();
  11829.         });
  11830.         mfp.container.addClass("mfp-s-" + status);
  11831.         /** @type {number} */
  11832.         _prevStatus = status;
  11833.       }
  11834.     },
  11835.     /**
  11836.      * @param {string} target
  11837.      * @return {?}
  11838.      */
  11839.     _checkIfClose : function(target) {
  11840.       if (!$(target).hasClass(PREVENT_CLOSE_CLASS)) {
  11841.         var dw = mfp.st.closeOnContentClick;
  11842.         var dh = mfp.st.closeOnBgClick;
  11843.         if (dw && dh) {
  11844.           return true;
  11845.         }
  11846.         if (!mfp.content || ($(target).hasClass("mfp-close") || mfp.preloader && target === mfp.preloader[0])) {
  11847.           return true;
  11848.         }
  11849.         if (target === mfp.content[0] || $.contains(mfp.content[0], target)) {
  11850.           if (dw) {
  11851.             return true;
  11852.           }
  11853.         } else {
  11854.           if (dh && $.contains(document, target)) {
  11855.             return true;
  11856.           }
  11857.         }
  11858.         return false;
  11859.       }
  11860.     },
  11861.     /**
  11862.      * @param {string} cName
  11863.      * @return {undefined}
  11864.      */
  11865.     _addClassToMFP : function(cName) {
  11866.       mfp.bgOverlay.addClass(cName);
  11867.       mfp.wrap.addClass(cName);
  11868.     },
  11869.     /**
  11870.      * @param {string} cName
  11871.      * @return {undefined}
  11872.      */
  11873.     _removeClassFromMFP : function(cName) {
  11874.       this.bgOverlay.removeClass(cName);
  11875.       mfp.wrap.removeClass(cName);
  11876.     },
  11877.     /**
  11878.      * @param {(Object|boolean|number|string)} winHeight
  11879.      * @return {?}
  11880.      */
  11881.     _hasScrollBar : function(winHeight) {
  11882.       return(mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height());
  11883.     },
  11884.     /**
  11885.      * @return {undefined}
  11886.      */
  11887.     _setFocus : function() {
  11888.       (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
  11889.     },
  11890.     /**
  11891.      * @param {Event} e
  11892.      * @return {?}
  11893.      */
  11894.     _onFocusIn : function(e) {
  11895.       return e.target === mfp.wrap[0] || $.contains(mfp.wrap[0], e.target) ? void 0 : (mfp._setFocus(), false);
  11896.     },
  11897.     /**
  11898.      * @param {Object} template
  11899.      * @param {Function} values
  11900.      * @param {Object} item
  11901.      * @return {undefined}
  11902.      */
  11903.     _parseMarkup : function(template, values, item) {
  11904.       var arr;
  11905.       if (item.data) {
  11906.         values = $.extend(item.data, values);
  11907.       }
  11908.       _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item]);
  11909.       $.each(values, function(key, value) {
  11910.         if (void 0 === value || value === false) {
  11911.           return true;
  11912.         }
  11913.         if (arr = key.split("_"), arr.length > 1) {
  11914.           var el = template.find(EVENT_NS + "-" + arr[0]);
  11915.           if (el.length > 0) {
  11916.             var val = arr[1];
  11917.             if ("replaceWith" === val) {
  11918.               if (el[0] !== value[0]) {
  11919.                 el.replaceWith(value);
  11920.               }
  11921.             } else {
  11922.               if ("img" === val) {
  11923.                 if (el.is("img")) {
  11924.                   el.attr("src", value);
  11925.                 } else {
  11926.                   el.replaceWith('<img src="' + value + '" class="' + el.attr("class") + '" />');
  11927.                 }
  11928.               } else {
  11929.                 el.attr(arr[1], value);
  11930.               }
  11931.             }
  11932.           }
  11933.         } else {
  11934.           template.find(EVENT_NS + "-" + key).html(value);
  11935.         }
  11936.       });
  11937.     },
  11938.     /**
  11939.      * @return {?}
  11940.      */
  11941.     _getScrollbarSize : function() {
  11942.       if (void 0 === mfp.scrollbarSize) {
  11943.         /** @type {Element} */
  11944.         var div = document.createElement("div");
  11945.         /** @type {string} */
  11946.         div.style.cssText = "width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;";
  11947.         document.body.appendChild(div);
  11948.         /** @type {number} */
  11949.         mfp.scrollbarSize = div.offsetWidth - div.clientWidth;
  11950.         document.body.removeChild(div);
  11951.       }
  11952.       return mfp.scrollbarSize;
  11953.     }
  11954.   };
  11955.   $.magnificPopup = {
  11956.     instance : null,
  11957.     proto : MagnificPopup.prototype,
  11958.     modules : [],
  11959.     /**
  11960.      * @param {Object} options
  11961.      * @param {number} index
  11962.      * @return {?}
  11963.      */
  11964.     open : function(options, index) {
  11965.       return _checkInstance(), options = options ? $.extend(true, {}, options) : {}, options.isObj = true, options.index = index || 0, this.instance.open(options);
  11966.     },
  11967.     /**
  11968.      * @return {?}
  11969.      */
  11970.     close : function() {
  11971.       return $.magnificPopup.instance && $.magnificPopup.instance.close();
  11972.     },
  11973.     /**
  11974.      * @param {string} name
  11975.      * @param {?} opt_attributes
  11976.      * @return {undefined}
  11977.      */
  11978.     registerModule : function(name, opt_attributes) {
  11979.       if (opt_attributes.options) {
  11980.         $.magnificPopup.defaults[name] = opt_attributes.options;
  11981.       }
  11982.       $.extend(this.proto, opt_attributes.proto);
  11983.       this.modules.push(name);
  11984.     },
  11985.     defaults : {
  11986.       disableOn : 0,
  11987.       key : null,
  11988.       midClick : false,
  11989.       mainClass : "",
  11990.       preloader : true,
  11991.       focus : "",
  11992.       closeOnContentClick : false,
  11993.       closeOnBgClick : true,
  11994.       closeBtnInside : true,
  11995.       showCloseBtn : true,
  11996.       enableEscapeKey : true,
  11997.       modal : false,
  11998.       alignTop : false,
  11999.       removalDelay : 0,
  12000.       prependTo : null,
  12001.       fixedContentPos : "auto",
  12002.       fixedBgPos : "auto",
  12003.       overflowY : "auto",
  12004.       closeMarkup : '<button title="%title%" type="button" class="mfp-close">&times;</button>',
  12005.       tClose : "Close (Esc)",
  12006.       tLoading : "Loading..."
  12007.     }
  12008.   };
  12009.   /**
  12010.    * @param {Object} options
  12011.    * @return {?}
  12012.    */
  12013.   $.fn.magnificPopup = function(options) {
  12014.     _checkInstance();
  12015.     var jqEl = $(this);
  12016.     if ("string" == typeof options) {
  12017.       if ("open" === options) {
  12018.         var items;
  12019.         var itemOpts = _isJQ ? jqEl.data("magnificPopup") : jqEl[0].magnificPopup;
  12020.         /** @type {number} */
  12021.         var index = parseInt(arguments[1], 10) || 0;
  12022.         if (itemOpts.items) {
  12023.           items = itemOpts.items[index];
  12024.         } else {
  12025.           items = jqEl;
  12026.           if (itemOpts.delegate) {
  12027.             items = items.find(itemOpts.delegate);
  12028.           }
  12029.           items = items.eq(index);
  12030.         }
  12031.         mfp._openClick({
  12032.           mfpEl : items
  12033.         }, jqEl, itemOpts);
  12034.       } else {
  12035.         if (mfp.isOpen) {
  12036.           mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
  12037.         }
  12038.       }
  12039.     } else {
  12040.       options = $.extend(true, {}, options);
  12041.       if (_isJQ) {
  12042.         jqEl.data("magnificPopup", options);
  12043.       } else {
  12044.         /** @type {Object} */
  12045.         jqEl[0].magnificPopup = options;
  12046.       }
  12047.       mfp.addGroup(jqEl, options);
  12048.     }
  12049.     return jqEl;
  12050.   };
  12051.   var _hiddenClass;
  12052.   var _inlinePlaceholder;
  12053.   var _lastInlineElement;
  12054.   /** @type {string} */
  12055.   var INLINE_NS = "inline";
  12056.   /**
  12057.    * @return {undefined}
  12058.    */
  12059.   var _putInlineElementsBack = function() {
  12060.     if (_lastInlineElement) {
  12061.       _inlinePlaceholder.after(_lastInlineElement.addClass(_hiddenClass)).detach();
  12062.       /** @type {null} */
  12063.       _lastInlineElement = null;
  12064.     }
  12065.   };
  12066.   $.magnificPopup.registerModule(INLINE_NS, {
  12067.     options : {
  12068.       hiddenClass : "hide",
  12069.       markup : "",
  12070.       tNotFound : "Content not found"
  12071.     },
  12072.     proto : {
  12073.       /**
  12074.        * @return {undefined}
  12075.        */
  12076.       initInline : function() {
  12077.         mfp.types.push(INLINE_NS);
  12078.         _mfpOn(CLOSE_EVENT + "." + INLINE_NS, function() {
  12079.           _putInlineElementsBack();
  12080.         });
  12081.       },
  12082.       /**
  12083.        * @param {Object} item
  12084.        * @param {Object} template
  12085.        * @return {?}
  12086.        */
  12087.       getInline : function(item, template) {
  12088.         if (_putInlineElementsBack(), item.src) {
  12089.           var inlineSt = mfp.st.inline;
  12090.           var el = $(item.src);
  12091.           if (el.length) {
  12092.             var tbody = el[0].parentNode;
  12093.             if (tbody) {
  12094.               if (tbody.tagName) {
  12095.                 if (!_inlinePlaceholder) {
  12096.                   _hiddenClass = inlineSt.hiddenClass;
  12097.                   _inlinePlaceholder = _getEl(_hiddenClass);
  12098.                   /** @type {string} */
  12099.                   _hiddenClass = "mfp-" + _hiddenClass;
  12100.                 }
  12101.                 _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
  12102.               }
  12103.             }
  12104.             mfp.updateStatus("ready");
  12105.           } else {
  12106.             mfp.updateStatus("error", inlineSt.tNotFound);
  12107.             el = $("<div>");
  12108.           }
  12109.           return item.inlineElement = el, el;
  12110.         }
  12111.         return mfp.updateStatus("ready"), mfp._parseMarkup(template, {}, item), template;
  12112.       }
  12113.     }
  12114.   });
  12115.   var className;
  12116.   /** @type {string} */
  12117.   var AJAX_NS = "ajax";
  12118.   /**
  12119.    * @return {undefined}
  12120.    */
  12121.   var _removeAjaxCursor = function() {
  12122.     if (className) {
  12123.       _body.removeClass(className);
  12124.     }
  12125.   };
  12126.   /**
  12127.    * @return {undefined}
  12128.    */
  12129.   var _destroyAjaxRequest = function() {
  12130.     _removeAjaxCursor();
  12131.     if (mfp.req) {
  12132.       mfp.req.abort();
  12133.     }
  12134.   };
  12135.   $.magnificPopup.registerModule(AJAX_NS, {
  12136.     options : {
  12137.       settings : null,
  12138.       cursor : "mfp-ajax-cur",
  12139.       tError : '<a href="%url%">The content</a> could not be loaded.'
  12140.     },
  12141.     proto : {
  12142.       /**
  12143.        * @return {undefined}
  12144.        */
  12145.       initAjax : function() {
  12146.         mfp.types.push(AJAX_NS);
  12147.         className = mfp.st.ajax.cursor;
  12148.         _mfpOn(CLOSE_EVENT + "." + AJAX_NS, _destroyAjaxRequest);
  12149.         _mfpOn("BeforeChange." + AJAX_NS, _destroyAjaxRequest);
  12150.       },
  12151.       /**
  12152.        * @param {Object} item
  12153.        * @return {?}
  12154.        */
  12155.       getAjax : function(item) {
  12156.         if (className) {
  12157.           _body.addClass(className);
  12158.         }
  12159.         mfp.updateStatus("loading");
  12160.         var opts = $.extend({
  12161.           url : item.src,
  12162.           /**
  12163.            * @param {string} type
  12164.            * @param {?} elems
  12165.            * @param {Object} elem
  12166.            * @return {undefined}
  12167.            */
  12168.           success : function(type, elems, elem) {
  12169.             var temp = {
  12170.               data : type,
  12171.               xhr : elem
  12172.             };
  12173.             _mfpTrigger("ParseAjax", temp);
  12174.             mfp.appendContent($(temp.data), AJAX_NS);
  12175.             /** @type {boolean} */
  12176.             item.finished = true;
  12177.             _removeAjaxCursor();
  12178.             mfp._setFocus();
  12179.             setTimeout(function() {
  12180.               mfp.wrap.addClass(READY_CLASS);
  12181.             }, 16);
  12182.             mfp.updateStatus("ready");
  12183.             _mfpTrigger("AjaxContentAdded");
  12184.           },
  12185.           /**
  12186.            * @return {undefined}
  12187.            */
  12188.           error : function() {
  12189.             _removeAjaxCursor();
  12190.             /** @type {boolean} */
  12191.             item.finished = item.loadError = true;
  12192.             mfp.updateStatus("error", mfp.st.ajax.tError.replace("%url%", item.src));
  12193.           }
  12194.         }, mfp.st.ajax.settings);
  12195.         return mfp.req = $.ajax(opts), "";
  12196.       }
  12197.     }
  12198.   });
  12199.   var id;
  12200.   /**
  12201.    * @param {Object} item
  12202.    * @return {?}
  12203.    */
  12204.   var _getTitle = function(item) {
  12205.     if (item.data && void 0 !== item.data.title) {
  12206.       return item.data.title;
  12207.     }
  12208.     var src = mfp.st.image.titleSrc;
  12209.     if (src) {
  12210.       if ($.isFunction(src)) {
  12211.         return src.call(mfp, item);
  12212.       }
  12213.       if (item.el) {
  12214.         return item.el.attr(src) || "";
  12215.       }
  12216.     }
  12217.     return "";
  12218.   };
  12219.   $.magnificPopup.registerModule("image", {
  12220.     options : {
  12221.       markup : '<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',
  12222.       cursor : "mfp-zoom-out-cur",
  12223.       titleSrc : "title",
  12224.       verticalFit : true,
  12225.       tError : '<a href="%url%">The image</a> could not be loaded.'
  12226.     },
  12227.     proto : {
  12228.       /**
  12229.        * @return {undefined}
  12230.        */
  12231.       initImage : function() {
  12232.         var imgSt = mfp.st.image;
  12233.         /** @type {string} */
  12234.         var ns = ".image";
  12235.         mfp.types.push("image");
  12236.         _mfpOn(OPEN_EVENT + ns, function() {
  12237.           if ("image" === mfp.currItem.type) {
  12238.             if (imgSt.cursor) {
  12239.               _body.addClass(imgSt.cursor);
  12240.             }
  12241.           }
  12242.         });
  12243.         _mfpOn(CLOSE_EVENT + ns, function() {
  12244.           if (imgSt.cursor) {
  12245.             _body.removeClass(imgSt.cursor);
  12246.           }
  12247.           _window.off("resize" + EVENT_NS);
  12248.         });
  12249.         _mfpOn("Resize" + ns, mfp.resizeImage);
  12250.         if (mfp.isLowIE) {
  12251.           _mfpOn("AfterChange", mfp.resizeImage);
  12252.         }
  12253.       },
  12254.       /**
  12255.        * @return {undefined}
  12256.        */
  12257.       resizeImage : function() {
  12258.         var item = mfp.currItem;
  12259.         if (item && (item.img && mfp.st.image.verticalFit)) {
  12260.           /** @type {number} */
  12261.           var decr = 0;
  12262.           if (mfp.isLowIE) {
  12263.             /** @type {number} */
  12264.             decr = parseInt(item.img.css("padding-top"), 10) + parseInt(item.img.css("padding-bottom"), 10);
  12265.           }
  12266.           item.img.css("max-height", mfp.wH - decr);
  12267.         }
  12268.       },
  12269.       /**
  12270.        * @param {Object} item
  12271.        * @return {undefined}
  12272.        */
  12273.       _onImageHasSize : function(item) {
  12274.         if (item.img) {
  12275.           /** @type {boolean} */
  12276.           item.hasSize = true;
  12277.           if (id) {
  12278.             clearInterval(id);
  12279.           }
  12280.           /** @type {boolean} */
  12281.           item.isCheckingImgSize = false;
  12282.           _mfpTrigger("ImageHasSize", item);
  12283.           if (item.imgHidden) {
  12284.             if (mfp.content) {
  12285.               mfp.content.removeClass("mfp-loading");
  12286.             }
  12287.             /** @type {boolean} */
  12288.             item.imgHidden = false;
  12289.           }
  12290.         }
  12291.       },
  12292.       /**
  12293.        * @param {Object} item
  12294.        * @return {undefined}
  12295.        */
  12296.       findImageSize : function(item) {
  12297.         /** @type {number} */
  12298.         var n = 0;
  12299.         var img = item.img[0];
  12300.         /**
  12301.          * @param {number} delay
  12302.          * @return {undefined}
  12303.          */
  12304.         var mfpSetInterval = function(delay) {
  12305.           if (id) {
  12306.             clearInterval(id);
  12307.           }
  12308.           /** @type {number} */
  12309.           id = setInterval(function() {
  12310.             return img.naturalWidth > 0 ? (mfp._onImageHasSize(item), void 0) : (n > 200 && clearInterval(id), n++, 3 === n ? mfpSetInterval(10) : 40 === n ? mfpSetInterval(50) : 100 === n && mfpSetInterval(500), void 0);
  12311.           }, delay);
  12312.         };
  12313.         mfpSetInterval(1);
  12314.       },
  12315.       /**
  12316.        * @param {Object} item
  12317.        * @param {Object} template
  12318.        * @return {?}
  12319.        */
  12320.       getImage : function(item, template) {
  12321.         /** @type {number} */
  12322.         var o = 0;
  12323.         /**
  12324.          * @return {undefined}
  12325.          */
  12326.         var onLoadComplete = function() {
  12327.           if (item) {
  12328.             if (item.img[0].complete) {
  12329.               item.img.off(".mfploader");
  12330.               if (item === mfp.currItem) {
  12331.                 mfp._onImageHasSize(item);
  12332.                 mfp.updateStatus("ready");
  12333.               }
  12334.               /** @type {boolean} */
  12335.               item.hasSize = true;
  12336.               /** @type {boolean} */
  12337.               item.loaded = true;
  12338.               _mfpTrigger("ImageLoadComplete");
  12339.             } else {
  12340.               o++;
  12341.               if (200 > o) {
  12342.                 setTimeout(onLoadComplete, 100);
  12343.               } else {
  12344.                 onLoadError();
  12345.               }
  12346.             }
  12347.           }
  12348.         };
  12349.         /**
  12350.          * @return {undefined}
  12351.          */
  12352.         var onLoadError = function() {
  12353.           if (item) {
  12354.             item.img.off(".mfploader");
  12355.             if (item === mfp.currItem) {
  12356.               mfp._onImageHasSize(item);
  12357.               mfp.updateStatus("error", imgSt.tError.replace("%url%", item.src));
  12358.             }
  12359.             /** @type {boolean} */
  12360.             item.hasSize = true;
  12361.             /** @type {boolean} */
  12362.             item.loaded = true;
  12363.             /** @type {boolean} */
  12364.             item.loadError = true;
  12365.           }
  12366.         };
  12367.         var imgSt = mfp.st.image;
  12368.         var $el = template.find(".mfp-img");
  12369.         if ($el.length) {
  12370.           /** @type {Element} */
  12371.           var img = document.createElement("img");
  12372.           /** @type {string} */
  12373.           img.className = "mfp-img";
  12374.           if (item.el) {
  12375.             if (item.el.find("img").length) {
  12376.               img.alt = item.el.find("img").attr("alt");
  12377.             }
  12378.           }
  12379.           item.img = $(img).on("load.mfploader", onLoadComplete).on("error.mfploader", onLoadError);
  12380.           img.src = item.src;
  12381.           if ($el.is("img")) {
  12382.             item.img = item.img.clone();
  12383.           }
  12384.           img = item.img[0];
  12385.           if (img.naturalWidth > 0) {
  12386.             /** @type {boolean} */
  12387.             item.hasSize = true;
  12388.           } else {
  12389.             if (!img.width) {
  12390.               /** @type {boolean} */
  12391.               item.hasSize = false;
  12392.             }
  12393.           }
  12394.         }
  12395.         return mfp._parseMarkup(template, {
  12396.           title : _getTitle(item),
  12397.           img_replaceWith : item.img
  12398.         }, item), mfp.resizeImage(), item.hasSize ? (id && clearInterval(id), item.loadError ? (template.addClass("mfp-loading"), mfp.updateStatus("error", imgSt.tError.replace("%url%", item.src))) : (template.removeClass("mfp-loading"), mfp.updateStatus("ready")), template) : (mfp.updateStatus("loading"), item.loading = true, item.hasSize || (item.imgHidden = true, template.addClass("mfp-loading"), mfp.findImageSize(item)), template);
  12399.       }
  12400.     }
  12401.   });
  12402.   var W;
  12403.   /**
  12404.    * @return {?}
  12405.    */
  12406.   var getHasMozTransform = function() {
  12407.     return void 0 === W && (W = void 0 !== document.createElement("p").style.MozTransform), W;
  12408.   };
  12409.   $.magnificPopup.registerModule("zoom", {
  12410.     options : {
  12411.       enabled : false,
  12412.       easing : "ease-in-out",
  12413.       duration : 300,
  12414.       /**
  12415.        * @param {Object} element
  12416.        * @return {?}
  12417.        */
  12418.       opener : function(element) {
  12419.         return element.is("img") ? element : element.find("img");
  12420.       }
  12421.     },
  12422.     proto : {
  12423.       /**
  12424.        * @return {undefined}
  12425.        */
  12426.       initZoom : function() {
  12427.         var tmp;
  12428.         var zoomSt = mfp.st.zoom;
  12429.         /** @type {string} */
  12430.         var ns = ".zoom";
  12431.         if (zoomSt.enabled && mfp.supportsTransition) {
  12432.           var timer;
  12433.           var elem;
  12434.           var duration = zoomSt.duration;
  12435.           /**
  12436.            * @param {?} a
  12437.            * @return {?}
  12438.            */
  12439.           var getElToAnimate = function(a) {
  12440.             var newImg = a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image");
  12441.             /** @type {string} */
  12442.             var transition = "all " + zoomSt.duration / 1E3 + "s " + zoomSt.easing;
  12443.             var cssObj = {
  12444.               position : "fixed",
  12445.               zIndex : 9999,
  12446.               left : 0,
  12447.               top : 0,
  12448.               "-webkit-backface-visibility" : "hidden"
  12449.             };
  12450.             /** @type {string} */
  12451.             var t = "transition";
  12452.             return cssObj["-webkit-" + t] = cssObj["-moz-" + t] = cssObj["-o-" + t] = cssObj[t] = transition, newImg.css(cssObj), newImg;
  12453.           };
  12454.           /**
  12455.            * @return {undefined}
  12456.            */
  12457.           var showMainContent = function() {
  12458.             mfp.content.css("visibility", "visible");
  12459.           };
  12460.           _mfpOn("BuildControls" + ns, function() {
  12461.             if (mfp._allowZoom()) {
  12462.               if (clearTimeout(timer), mfp.content.css("visibility", "hidden"), tmp = mfp._getItemToZoom(), !tmp) {
  12463.                 return showMainContent(), void 0;
  12464.               }
  12465.               elem = getElToAnimate(tmp);
  12466.               elem.css(mfp._getOffset());
  12467.               mfp.wrap.append(elem);
  12468.               /** @type {number} */
  12469.               timer = setTimeout(function() {
  12470.                 elem.css(mfp._getOffset(true));
  12471.                 /** @type {number} */
  12472.                 timer = setTimeout(function() {
  12473.                   showMainContent();
  12474.                   setTimeout(function() {
  12475.                     elem.remove();
  12476.                     /** @type {null} */
  12477.                     tmp = elem = null;
  12478.                     _mfpTrigger("ZoomAnimationEnded");
  12479.                   }, 16);
  12480.                 }, duration);
  12481.               }, 16);
  12482.             }
  12483.           });
  12484.           _mfpOn(BEFORE_CLOSE_EVENT + ns, function() {
  12485.             if (mfp._allowZoom()) {
  12486.               if (clearTimeout(timer), mfp.st.removalDelay = duration, !tmp) {
  12487.                 if (tmp = mfp._getItemToZoom(), !tmp) {
  12488.                   return;
  12489.                 }
  12490.                 elem = getElToAnimate(tmp);
  12491.               }
  12492.               elem.css(mfp._getOffset(true));
  12493.               mfp.wrap.append(elem);
  12494.               mfp.content.css("visibility", "hidden");
  12495.               setTimeout(function() {
  12496.                 elem.css(mfp._getOffset());
  12497.               }, 16);
  12498.             }
  12499.           });
  12500.           _mfpOn(CLOSE_EVENT + ns, function() {
  12501.             if (mfp._allowZoom()) {
  12502.               showMainContent();
  12503.               if (elem) {
  12504.                 elem.remove();
  12505.               }
  12506.               /** @type {null} */
  12507.               tmp = null;
  12508.             }
  12509.           });
  12510.         }
  12511.       },
  12512.       /**
  12513.        * @return {?}
  12514.        */
  12515.       _allowZoom : function() {
  12516.         return "image" === mfp.currItem.type;
  12517.       },
  12518.       /**
  12519.        * @return {?}
  12520.        */
  12521.       _getItemToZoom : function() {
  12522.         return mfp.currItem.hasSize ? mfp.currItem.img : false;
  12523.       },
  12524.       /**
  12525.        * @param {boolean} dataAndEvents
  12526.        * @return {?}
  12527.        */
  12528.       _getOffset : function(dataAndEvents) {
  12529.         var parent;
  12530.         parent = dataAndEvents ? mfp.currItem.img : mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
  12531.         var offset = parent.offset();
  12532.         /** @type {number} */
  12533.         var paddingTop = parseInt(parent.css("padding-top"), 10);
  12534.         /** @type {number} */
  12535.         var paddingBottom = parseInt(parent.css("padding-bottom"), 10);
  12536.         offset.top -= $(window).scrollTop() - paddingTop;
  12537.         var obj = {
  12538.           width : parent.width(),
  12539.           height : (_isJQ ? parent.innerHeight() : parent[0].offsetHeight) - paddingBottom - paddingTop
  12540.         };
  12541.         return getHasMozTransform() ? obj["-moz-transform"] = obj.transform = "translate(" + offset.left + "px," + offset.top + "px)" : (obj.left = offset.left, obj.top = offset.top), obj;
  12542.       }
  12543.     }
  12544.   });
  12545.   /** @type {string} */
  12546.   var IFRAME_NS = "iframe";
  12547.   /** @type {string} */
  12548.   var path = "//about:blank";
  12549.   /**
  12550.    * @param {boolean} isShowing
  12551.    * @return {undefined}
  12552.    */
  12553.   var _fixIframeBugs = function(isShowing) {
  12554.     if (mfp.currTemplate[IFRAME_NS]) {
  12555.       var el = mfp.currTemplate[IFRAME_NS].find("iframe");
  12556.       if (el.length) {
  12557.         if (!isShowing) {
  12558.           /** @type {string} */
  12559.           el[0].src = path;
  12560.         }
  12561.         if (mfp.isIE8) {
  12562.           el.css("display", isShowing ? "block" : "none");
  12563.         }
  12564.       }
  12565.     }
  12566.   };
  12567.   $.magnificPopup.registerModule(IFRAME_NS, {
  12568.     options : {
  12569.       markup : '<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',
  12570.       srcAction : "iframe_src",
  12571.       patterns : {
  12572.         youtube : {
  12573.           index : "youtube.com",
  12574.           id : "v=",
  12575.           src : "//www.youtube.com/embed/%id%?autoplay=1"
  12576.         },
  12577.         vimeo : {
  12578.           index : "vimeo.com/",
  12579.           id : "/",
  12580.           src : "//player.vimeo.com/video/%id%?autoplay=1"
  12581.         },
  12582.         gmaps : {
  12583.           index : "//maps.google.",
  12584.           src : "%id%&output=embed"
  12585.         }
  12586.       }
  12587.     },
  12588.     proto : {
  12589.       /**
  12590.        * @return {undefined}
  12591.        */
  12592.       initIframe : function() {
  12593.         mfp.types.push(IFRAME_NS);
  12594.         _mfpOn("BeforeChange", function(dataAndEvents, prevType, newType) {
  12595.           if (prevType !== newType) {
  12596.             if (prevType === IFRAME_NS) {
  12597.               _fixIframeBugs();
  12598.             } else {
  12599.               if (newType === IFRAME_NS) {
  12600.                 _fixIframeBugs(true);
  12601.               }
  12602.             }
  12603.           }
  12604.         });
  12605.         _mfpOn(CLOSE_EVENT + "." + IFRAME_NS, function() {
  12606.           _fixIframeBugs();
  12607.         });
  12608.       },
  12609.       /**
  12610.        * @param {Object} item
  12611.        * @param {Object} template
  12612.        * @return {?}
  12613.        */
  12614.       getIframe : function(item, template) {
  12615.         var embedSrc = item.src;
  12616.         var iframeSt = mfp.st.iframe;
  12617.         $.each(iframeSt.patterns, function() {
  12618.           return embedSrc.indexOf(this.index) > -1 ? (this.id && (embedSrc = "string" == typeof this.id ? embedSrc.substr(embedSrc.lastIndexOf(this.id) + this.id.length, embedSrc.length) : this.id.call(this, embedSrc)), embedSrc = this.src.replace("%id%", embedSrc), false) : void 0;
  12619.         });
  12620.         var dataObj = {};
  12621.         return iframeSt.srcAction && (dataObj[iframeSt.srcAction] = embedSrc), mfp._parseMarkup(template, dataObj, item), mfp.updateStatus("ready"), template;
  12622.       }
  12623.     }
  12624.   });
  12625.   /**
  12626.    * @param {number} index
  12627.    * @return {?}
  12628.    */
  12629.   var _getLoopedId = function(index) {
  12630.     var numSlides = mfp.items.length;
  12631.     return index > numSlides - 1 ? index - numSlides : 0 > index ? numSlides + index : index;
  12632.   };
  12633.   /**
  12634.    * @param {string} text
  12635.    * @param {number} curr
  12636.    * @param {?} total
  12637.    * @return {?}
  12638.    */
  12639.   var _replaceCurrTotal = function(text, curr, total) {
  12640.     return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);
  12641.   };
  12642.   $.magnificPopup.registerModule("gallery", {
  12643.     options : {
  12644.       enabled : false,
  12645.       arrowMarkup : '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',
  12646.       preload : [0, 2],
  12647.       navigateByImgClick : true,
  12648.       arrows : true,
  12649.       tPrev : "Previous (Left arrow key)",
  12650.       tNext : "Next (Right arrow key)",
  12651.       tCounter : "%curr% of %total%"
  12652.     },
  12653.     proto : {
  12654.       /**
  12655.        * @return {?}
  12656.        */
  12657.       initGallery : function() {
  12658.         var gSt = mfp.st.gallery;
  12659.         /** @type {string} */
  12660.         var ns = ".mfp-gallery";
  12661.         /** @type {boolean} */
  12662.         var supportsFastClick = Boolean($.fn.mfpFastClick);
  12663.         return mfp.direction = true, gSt && gSt.enabled ? (cls += " mfp-gallery", _mfpOn(OPEN_EVENT + ns, function() {
  12664.           if (gSt.navigateByImgClick) {
  12665.             mfp.wrap.on("click" + ns, ".mfp-img", function() {
  12666.               return mfp.items.length > 1 ? (mfp.next(), false) : void 0;
  12667.             });
  12668.           }
  12669.           _document.on("keydown" + ns, function(event) {
  12670.             if (37 === event.keyCode) {
  12671.               mfp.prev();
  12672.             } else {
  12673.               if (39 === event.keyCode) {
  12674.                 mfp.next();
  12675.               }
  12676.             }
  12677.           });
  12678.         }), _mfpOn("UpdateStatus" + ns, function(dataAndEvents, data) {
  12679.           if (data.text) {
  12680.             data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);
  12681.           }
  12682.         }), _mfpOn(MARKUP_PARSE_EVENT + ns, function(dataAndEvents, deepDataAndEvents, $scope, item) {
  12683.           var l = mfp.items.length;
  12684.           $scope.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : "";
  12685.         }), _mfpOn("BuildControls" + ns, function() {
  12686.           if (mfp.items.length > 1 && (gSt.arrows && !mfp.arrowLeft)) {
  12687.             var markup = gSt.arrowMarkup;
  12688.             var arrowLeft = mfp.arrowLeft = $(markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, "left")).addClass(PREVENT_CLOSE_CLASS);
  12689.             var arg = mfp.arrowRight = $(markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, "right")).addClass(PREVENT_CLOSE_CLASS);
  12690.             /** @type {string} */
  12691.             var eName = supportsFastClick ? "mfpFastClick" : "click";
  12692.             arrowLeft[eName](function() {
  12693.               mfp.prev();
  12694.             });
  12695.             arg[eName](function() {
  12696.               mfp.next();
  12697.             });
  12698.             if (mfp.isIE7) {
  12699.               _getEl("b", arrowLeft[0], false, true);
  12700.               _getEl("a", arrowLeft[0], false, true);
  12701.               _getEl("b", arg[0], false, true);
  12702.               _getEl("a", arg[0], false, true);
  12703.             }
  12704.             mfp.container.append(arrowLeft.add(arg));
  12705.           }
  12706.         }), _mfpOn(CHANGE_EVENT + ns, function() {
  12707.           if (mfp._preloadTimeout) {
  12708.             clearTimeout(mfp._preloadTimeout);
  12709.           }
  12710.           /** @type {number} */
  12711.           mfp._preloadTimeout = setTimeout(function() {
  12712.             mfp.preloadNearbyImages();
  12713.             /** @type {null} */
  12714.             mfp._preloadTimeout = null;
  12715.           }, 16);
  12716.         }), _mfpOn(CLOSE_EVENT + ns, function() {
  12717.           _document.off(ns);
  12718.           mfp.wrap.off("click" + ns);
  12719.           if (mfp.arrowLeft) {
  12720.             if (supportsFastClick) {
  12721.               mfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();
  12722.             }
  12723.           }
  12724.           /** @type {null} */
  12725.           mfp.arrowRight = mfp.arrowLeft = null;
  12726.         }), void 0) : false;
  12727.       },
  12728.       /**
  12729.        * @return {undefined}
  12730.        */
  12731.       next : function() {
  12732.         /** @type {boolean} */
  12733.         mfp.direction = true;
  12734.         mfp.index = _getLoopedId(mfp.index + 1);
  12735.         mfp.updateItemHTML();
  12736.       },
  12737.       /**
  12738.        * @return {undefined}
  12739.        */
  12740.       prev : function() {
  12741.         /** @type {boolean} */
  12742.         mfp.direction = false;
  12743.         mfp.index = _getLoopedId(mfp.index - 1);
  12744.         mfp.updateItemHTML();
  12745.       },
  12746.       /**
  12747.        * @param {number} newIndex
  12748.        * @return {undefined}
  12749.        */
  12750.       goTo : function(newIndex) {
  12751.         /** @type {boolean} */
  12752.         mfp.direction = newIndex >= mfp.index;
  12753.         /** @type {number} */
  12754.         mfp.index = newIndex;
  12755.         mfp.updateItemHTML();
  12756.       },
  12757.       /**
  12758.        * @return {undefined}
  12759.        */
  12760.       preloadNearbyImages : function() {
  12761.         var i;
  12762.         var p = mfp.st.gallery.preload;
  12763.         /** @type {number} */
  12764.         var preloadBefore = Math.min(p[0], mfp.items.length);
  12765.         /** @type {number} */
  12766.         var preloadAfter = Math.min(p[1], mfp.items.length);
  12767.         /** @type {number} */
  12768.         i = 1;
  12769.         for (;(mfp.direction ? preloadAfter : preloadBefore) >= i;i++) {
  12770.           mfp._preloadItem(mfp.index + i);
  12771.         }
  12772.         /** @type {number} */
  12773.         i = 1;
  12774.         for (;(mfp.direction ? preloadBefore : preloadAfter) >= i;i++) {
  12775.           mfp._preloadItem(mfp.index - i);
  12776.         }
  12777.       },
  12778.       /**
  12779.        * @param {number} index
  12780.        * @return {undefined}
  12781.        */
  12782.       _preloadItem : function(index) {
  12783.         if (index = _getLoopedId(index), !mfp.items[index].preloaded) {
  12784.           var item = mfp.items[index];
  12785.           if (!item.parsed) {
  12786.             item = mfp.parseEl(index);
  12787.           }
  12788.           _mfpTrigger("LazyLoad", item);
  12789.           if ("image" === item.type) {
  12790.             item.img = $('<img class="mfp-img" />').on("load.mfploader", function() {
  12791.               /** @type {boolean} */
  12792.               item.hasSize = true;
  12793.             }).on("error.mfploader", function() {
  12794.               /** @type {boolean} */
  12795.               item.hasSize = true;
  12796.               /** @type {boolean} */
  12797.               item.loadError = true;
  12798.               _mfpTrigger("LazyLoadError", item);
  12799.             }).attr("src", item.src);
  12800.           }
  12801.           /** @type {boolean} */
  12802.           item.preloaded = true;
  12803.         }
  12804.       }
  12805.     }
  12806.   });
  12807.   /** @type {string} */
  12808.   var RETINA_NS = "retina";
  12809.   $.magnificPopup.registerModule(RETINA_NS, {
  12810.     options : {
  12811.       /**
  12812.        * @param {Element} item
  12813.        * @return {?}
  12814.        */
  12815.       replaceSrc : function(item) {
  12816.         return item.src.replace(/\.\w+$/, function(dataAndEvents) {
  12817.           return "@2x" + dataAndEvents;
  12818.         });
  12819.       },
  12820.       ratio : 1
  12821.     },
  12822.     proto : {
  12823.       /**
  12824.        * @return {undefined}
  12825.        */
  12826.       initRetina : function() {
  12827.         if (window.devicePixelRatio > 1) {
  12828.           var st = mfp.st.retina;
  12829.           var ratio = st.ratio;
  12830.           ratio = isNaN(ratio) ? ratio() : ratio;
  12831.           if (ratio > 1) {
  12832.             _mfpOn("ImageHasSize." + RETINA_NS, function(dataAndEvents, item) {
  12833.               item.img.css({
  12834.                 "max-width" : item.img[0].naturalWidth / ratio,
  12835.                 width : "100%"
  12836.               });
  12837.             });
  12838.             _mfpOn("ElementParse." + RETINA_NS, function(dataAndEvents, item) {
  12839.               item.src = st.replaceSrc(item, ratio);
  12840.             });
  12841.           }
  12842.         }
  12843.       }
  12844.     }
  12845.   });
  12846.   (function() {
  12847.     /** @type {number} */
  12848.     var backoff = 1E3;
  12849.     /** @type {boolean} */
  12850.     var hasTouch = "ontouchstart" in window;
  12851.     /**
  12852.      * @return {undefined}
  12853.      */
  12854.     var unbindTouchMove = function() {
  12855.       _window.off("touchmove" + ns + " touchend" + ns);
  12856.     };
  12857.     /** @type {string} */
  12858.     var eName = "mfpFastClick";
  12859.     /** @type {string} */
  12860.     var ns = "." + eName;
  12861.     /**
  12862.      * @param {?} callback
  12863.      * @return {?}
  12864.      */
  12865.     $.fn.mfpFastClick = function(callback) {
  12866.       return $(this).each(function() {
  12867.         var a;
  12868.         var elem = $(this);
  12869.         if (hasTouch) {
  12870.           var tref;
  12871.           var x;
  12872.           var y;
  12873.           var u;
  12874.           var touch;
  12875.           var position;
  12876.           elem.on("touchstart" + ns, function(e) {
  12877.             /** @type {boolean} */
  12878.             u = false;
  12879.             /** @type {number} */
  12880.             position = 1;
  12881.             touch = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];
  12882.             x = touch.clientX;
  12883.             y = touch.clientY;
  12884.             _window.on("touchmove" + ns, function(e) {
  12885.               touch = e.originalEvent ? e.originalEvent.touches : e.touches;
  12886.               position = touch.length;
  12887.               touch = touch[0];
  12888.               if (Math.abs(touch.clientX - x) > 10 || Math.abs(touch.clientY - y) > 10) {
  12889.                 /** @type {boolean} */
  12890.                 u = true;
  12891.                 unbindTouchMove();
  12892.               }
  12893.             }).on("touchend" + ns, function(types) {
  12894.               unbindTouchMove();
  12895.               if (!u) {
  12896.                 if (!(position > 1)) {
  12897.                   /** @type {boolean} */
  12898.                   a = true;
  12899.                   types.preventDefault();
  12900.                   clearTimeout(tref);
  12901.                   /** @type {number} */
  12902.                   tref = setTimeout(function() {
  12903.                     /** @type {boolean} */
  12904.                     a = false;
  12905.                   }, backoff);
  12906.                   callback();
  12907.                 }
  12908.               }
  12909.             });
  12910.           });
  12911.         }
  12912.         elem.on("click" + ns, function() {
  12913.           if (!a) {
  12914.             callback();
  12915.           }
  12916.         });
  12917.       });
  12918.     };
  12919.     /**
  12920.      * @return {undefined}
  12921.      */
  12922.     $.fn.destroyMfpFastClick = function() {
  12923.       $(this).off("touchstart" + ns + " click" + ns);
  12924.       if (hasTouch) {
  12925.         _window.off("touchmove" + ns + " touchend" + ns);
  12926.       }
  12927.     };
  12928.   })();
  12929.   _checkInstance();
  12930. });
  12931. (function(global, $) {
  12932.   /**
  12933.    * @param {string} i
  12934.    * @return {?}
  12935.    */
  12936.   function action(i) {
  12937.     return i in instance ? +instance[i] : null != global.localStorage ? (null == global.localStorage[i] && (global.localStorage[i] = 0 + ~~(100 * Math.random())), +global.localStorage[i]) : 0;
  12938.   }
  12939.   /**
  12940.    * @param {Array} d
  12941.    * @return {undefined}
  12942.    */
  12943.   function run(d) {
  12944.     if (reply) {
  12945.       /** @type {Array} */
  12946.       var records = [];
  12947.       /** @type {number} */
  12948.       var j = 0;
  12949.       for (;j < d.length;j++) {
  12950.         if ("type" in d[j] && "dfpads" != d[j].type) {
  12951.           console.log("trying to refresh a non dfp ad. continue");
  12952.         } else {
  12953.           if (debugads) {
  12954.             console.log("DFP: refreshing:" + d[j].data.A);
  12955.           }
  12956.           records.push(d[j].data);
  12957.         }
  12958.       }
  12959.       if (!(0 >= records.length)) {
  12960.         if (!!global.googletag) {
  12961.           global.googletag.cmd.push(function() {
  12962.             if (w) {
  12963.               /** @type {boolean} */
  12964.               w = false;
  12965.               setTimeout(function() {
  12966.                 /** @type {boolean} */
  12967.                 w = true;
  12968.               }, 0);
  12969.               if (global.googletag) {
  12970.                 if (global.googletag.pubads) {
  12971.                   if (global.googletag.pubads().refresh) {
  12972.                     global.googletag.pubads().refresh(records);
  12973.                   }
  12974.                 }
  12975.               }
  12976.             }
  12977.           });
  12978.         }
  12979.       }
  12980.     } else {
  12981.       console.log("dfpInitialized=" + reply);
  12982.       console.log("queuing refresh");
  12983.       /** @type {Array} */
  12984.       dir = d;
  12985.     }
  12986.   }
  12987.   /**
  12988.    * @return {undefined}
  12989.    */
  12990.   function clearMenus() {
  12991.     $("#videoContainer").fadeOut(800);
  12992.     global.MC.onVideoClose();
  12993.   }
  12994.   /**
  12995.    * @return {?}
  12996.    */
  12997.   function _isFunction() {
  12998.     return!(5 > Sprite("ABGroupRubicon"));
  12999.   }
  13000.   /**
  13001.    * @param {string} w
  13002.    * @return {?}
  13003.    */
  13004.   function Sprite(w) {
  13005.     return w in wellKnownWords ? wellKnownWords[w] : 0;
  13006.   }
  13007.   var instance = {};
  13008.   (function() {
  13009.     /** @type {string} */
  13010.     var params = global.location.search;
  13011.     if ("?" == params.charAt(0)) {
  13012.       /** @type {string} */
  13013.       params = params.slice(1);
  13014.     }
  13015.     /** @type {Array.<string>} */
  13016.     params = params.split("&");
  13017.     /** @type {number} */
  13018.     var i = 0;
  13019.     for (;i < params.length;i++) {
  13020.       /** @type {Array.<string>} */
  13021.       var e = params[i].split("=");
  13022.       /** @type {string} */
  13023.       instance[e[0]] = e[1];
  13024.     }
  13025.   })();
  13026.   /** @type {boolean} */
  13027.   var debugads = "debugads" in instance;
  13028.   var wellKnownWords = {};
  13029.   /** @type {boolean} */
  13030.   var w = true;
  13031.   var data = {
  13032.     aa : [],
  13033.     ab : [],
  13034.     ac : []
  13035.   };
  13036.   global.adSlots = data;
  13037.   /** @type {boolean} */
  13038.   var reply = false;
  13039.   /** @type {null} */
  13040.   var dir = null;
  13041.   var model = function(opt_attributes) {
  13042.     /**
  13043.      * @param {Object} id
  13044.      * @param {?} opt_attributes
  13045.      * @param {string} deepDataAndEvents
  13046.      * @return {?}
  13047.      */
  13048.     opt_attributes.defineSlot = function(id, opt_attributes, deepDataAndEvents) {
  13049.       var jQuery = global.googletag;
  13050.       return{
  13051.         type : "dfpads",
  13052.         data : jQuery.defineSlot(id, opt_attributes, deepDataAndEvents).addService(jQuery.pubads())
  13053.       };
  13054.     };
  13055.     return opt_attributes;
  13056.   }({});
  13057.   global.googleAdsModule = model;
  13058.   var self = function(exports) {
  13059.     /**
  13060.      * @param {string} d
  13061.      * @param {string} key
  13062.      * @param {Object} data
  13063.      * @return {undefined}
  13064.      */
  13065.     exports.b = function(d, key, data) {
  13066.       /** @type {string} */
  13067.       var g = "https:" == document.location.protocol ? "https:" : "http:";
  13068.       key = key.split("x");
  13069.       /** @type {string} */
  13070.       var id = d + "-fif";
  13071.       /** @type {Element} */
  13072.       var frame = document.createElement("iframe");
  13073.       /** @type {string} */
  13074.       frame.style.cssText = "width: " + key[0] + "px; height: " + key[1] + "px; border: 0; margin: 0; padding: 0; overflow: hidden;";
  13075.       frame.setAttribute("scrolling", "no");
  13076.       /** @type {string} */
  13077.       frame.src = "about:blank";
  13078.       /** @type {string} */
  13079.       frame.id = id;
  13080.       document.getElementById(d).appendChild(frame);
  13081.       d = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument.document;
  13082.       d.open().write("<html>\n<head>\n<script type='text/javascript'>inDapIF=true;\n\x3c/script>\n</head>\n<body style='margin : 0; padding: 0;'>\n\x3c!-- Rubicon Project Smart Tag --\x3e\n<script type='text/javascript'>\nrp_account = '" + data.acct + "';\nrp_site = '" + data.site + "';\nrp_zonesize  = '" + data.zone + "-" + data.size + "';\nrp_adtype = 'js';\nrp_kw = '" + data.kw + "';\nrp_visitor = " + data.visitor + ";\nrp_inventory = " + data.inventory + ";\n\x3c/script>\n<script type='text/javascript' src=\"" +
  13083.       g + "//ads.rubiconproject.com/ad/" + data.acct + '.js">\x3c/script>\n</body>\n</html>');
  13084.       d.close();
  13085.     };
  13086.     /**
  13087.      * @param {Object} id
  13088.      * @param {Object} opt_attributes
  13089.      * @param {string} data
  13090.      * @return {?}
  13091.      */
  13092.     exports.defineSlot = function(id, opt_attributes, data) {
  13093.       opt_attributes = {
  13094.         type : "rubicon",
  13095.         data : {
  13096.           id : data,
  13097.           size : opt_attributes
  13098.         }
  13099.       };
  13100.       data = {};
  13101.       var key;
  13102.       for (key in id) {
  13103.         if (id.hasOwnProperty(key)) {
  13104.           data[key] = id[key];
  13105.         }
  13106.       }
  13107.       data.kw = global.rpx_params.kw;
  13108.       /** @type {string} */
  13109.       data.visitor = JSON.stringify(global.rpx_params.visitor);
  13110.       /** @type {string} */
  13111.       data.inventory = JSON.stringify(global.rpx_params.inventory);
  13112.       /** @type {string} */
  13113.       opt_attributes.data.json = data;
  13114.       return opt_attributes;
  13115.     };
  13116.     /**
  13117.      * @param {string} value
  13118.      * @param {string} n
  13119.      * @param {Object} k
  13120.      * @return {undefined}
  13121.      */
  13122.     exports.f = function(value, n, k) {
  13123.       /** @type {string} */
  13124.       var total = value + "-fif";
  13125.       var matches = global.jQuery("#" + total);
  13126.       if (null != matches) {
  13127.         matches.remove();
  13128.       } else {
  13129.         console.log("couldn't find element", matches, total);
  13130.       }
  13131.       this.b(value, n, k);
  13132.     };
  13133.     /**
  13134.      * @param {string} msg
  13135.      * @return {undefined}
  13136.      */
  13137.     exports.c = function(msg) {
  13138.       /** @type {string} */
  13139.       msg = msg + "-fif";
  13140.       var matches = global.jQuery("#" + msg);
  13141.       if (null != matches) {
  13142.         matches.remove();
  13143.       } else {
  13144.         console.log("couldn't find element", matches, msg);
  13145.       }
  13146.     };
  13147.     /**
  13148.      * @param {string} a
  13149.      * @param {string} mod
  13150.      * @param {Object} k
  13151.      * @return {undefined}
  13152.      */
  13153.     exports.g = function(a, mod, k) {
  13154.       this.b(a, mod, k);
  13155.     };
  13156.     return exports;
  13157.   }({});
  13158.   global.rubiconAds = self;
  13159.   /** @type {boolean} */
  13160.   var previousKey = false;
  13161.   global.supersonicAds = function(opt_attributes) {
  13162.     /**
  13163.      * @return {undefined}
  13164.      */
  13165.     opt_attributes.BrandConnectDoneEvent = function() {
  13166.       /** @type {boolean} */
  13167.       global.hasEngagement = false;
  13168.       global.MC.checkVideoAds();
  13169.     };
  13170.     /**
  13171.      * @return {undefined}
  13172.      */
  13173.     opt_attributes.BrandConnectOpenEvent = function() {
  13174.     };
  13175.     /**
  13176.      * @return {undefined}
  13177.      */
  13178.     opt_attributes.BrandConnectCloseEvent = function() {
  13179.       clearMenus();
  13180.       SSA_CORE.BrandConnect.close();
  13181.     };
  13182.     /**
  13183.      * @return {undefined}
  13184.      */
  13185.     opt_attributes.BrandConnectCompletedEvent = function() {
  13186.     };
  13187.     /**
  13188.      * @param {Array} value
  13189.      * @return {undefined}
  13190.      */
  13191.     opt_attributes.BrandConnectReadyEvent = function(value) {
  13192.       /** @type {boolean} */
  13193.       previousKey = "undefined" !== typeof value && value.length ? true : false;
  13194.       /** @type {boolean} */
  13195.       global.hasEngagement = previousKey;
  13196.     };
  13197.     return opt_attributes;
  13198.   }({});
  13199.   /**
  13200.    * @return {undefined}
  13201.    */
  13202.   global.openOfferwall = function() {
  13203.     if (null != SSA_CORE) {
  13204.       $("#offerwallIframe").attr("src", "http://www.supersonicads.com/delivery/panel.php?applicationKey=" + EnvConfig.supersonic_app_key + "&applicationUserId=" + global.ssa_json.custom_user_id + "&custom_user_id=" + global.ssa_json.custom_user_id + "&applicationUserIdSignature=optional");
  13205.       $("#oferwallContainer").fadeIn(400);
  13206.     }
  13207.   };
  13208.   /**
  13209.    * @return {undefined}
  13210.    */
  13211.   global.closeOfferwall = function() {
  13212.     $("#oferwallContainer").fadeOut(400);
  13213.     global.MC.onOffwerwallClose();
  13214.   };
  13215.   /**
  13216.    * @return {undefined}
  13217.    */
  13218.   global.openVideoAd = function() {
  13219.     if (null != SSA_CORE) {
  13220.       if (previousKey) {
  13221.         SSA_CORE.BrandConnect.engage();
  13222.       }
  13223.     }
  13224.   };
  13225.   /** @type {function (): undefined} */
  13226.   global.closeVideoContainer = clearMenus;
  13227.   /** @type {function (string): ?} */
  13228.   global.getABGroup = Sprite;
  13229.   /**
  13230.    * @param {Array} d
  13231.    * @return {undefined}
  13232.    */
  13233.   global.refreshAd = function(d) {
  13234.     run(d);
  13235.     /** @type {number} */
  13236.     var j = 0;
  13237.     for (;j < d.length;j++) {
  13238.       if (!("type" in d[j] && "rubicon" != d[j].type)) {
  13239.         var data = d[j].data;
  13240.         if (debugads) {
  13241.           console.log("Rubicon: refreshing:" + data.id);
  13242.         }
  13243.         self.b(data.id, data.size, data.json);
  13244.       }
  13245.     }
  13246.   };
  13247.   /**
  13248.    * @param {Array} d
  13249.    * @return {undefined}
  13250.    */
  13251.   global.destroyAd = function(d) {
  13252.     /** @type {Array} */
  13253.     var i = [];
  13254.     /** @type {number} */
  13255.     var j = 0;
  13256.     for (;j < d.length;j++) {
  13257.       if (!("type" in d[j] && "dfpads" != d[j].type)) {
  13258.         if (debugads) {
  13259.           console.log("DFP: destroying:" + d[j].data.A);
  13260.         }
  13261.         i.push(d[j].data);
  13262.       }
  13263.     }
  13264.     if (global.googletag) {
  13265.       if (global.googletag.pubads) {
  13266.         if (global.googletag.pubads().clear) {
  13267.           global.googletag.pubads().clear(i);
  13268.         }
  13269.       }
  13270.     }
  13271.     /** @type {number} */
  13272.     i = 0;
  13273.     for (;i < d.length;i++) {
  13274.       if (!("type" in d[i] && "rubicon" != d[i].type)) {
  13275.         if (debugads) {
  13276.           console.log("Rubicon: destroying:" + d[i].data.id, d[i]);
  13277.         }
  13278.         self.c(d[i].data.id);
  13279.       }
  13280.     }
  13281.   };
  13282.   var props = {
  13283.     a : false
  13284.   };
  13285.   global.agarAdModule = props;
  13286.   wellKnownWords.ABGroupDFP = action("AB9");
  13287.   wellKnownWords.ABGroupRubicon = action("AB12_Rubicon");
  13288.   global.location.search.indexOf("fb");
  13289.   props.a = global.hasBottomAd;
  13290.   if (debugads) {
  13291.     console.log("Init ads");
  13292.   }
  13293.   (function() {
  13294.     var attr = {};
  13295.     /** @type {null} */
  13296.     var opts = null;
  13297.     /** @type {null} */
  13298.     var template = null;
  13299.     /** @type {null} */
  13300.     var id = null;
  13301.     /** @type {null} */
  13302.     var email = null;
  13303.     /** @type {boolean} */
  13304.     var data = -1 != global.location.search.indexOf("fb");
  13305.     var k = _isFunction() && !data;
  13306.     var length = props.a;
  13307.     if (data) {
  13308.       /** @type {string} */
  13309.       attr = "/53945695/agar_facebook/agar/300x250";
  13310.       /** @type {string} */
  13311.       id = "/53945695/agar_facebook/agar/300x250_Stats";
  13312.       /** @type {string} */
  13313.       email = "/53945695/agar_facebook/agar/300x250";
  13314.     } else {
  13315.       /** @type {string} */
  13316.       email = "/116850162/300x250_init";
  13317.       /** @type {string} */
  13318.       opts = "/116850162/728x90_init";
  13319.       /** @type {string} */
  13320.       attr = "/116850162/300x250_login";
  13321.       /** @type {string} */
  13322.       id = "/116850162/300x250_stats";
  13323.       /** @type {string} */
  13324.       template = "/116850162/728x90_login";
  13325.     }
  13326.     var player = global.googletag;
  13327.     player.cmd.push(function() {
  13328.       player.pubads().setTargeting("abtest", Sprite("ABGroupDFP") + "");
  13329.       data.ac.push(model.defineSlot(email, [300, 250], "g300x250"));
  13330.       if (length) {
  13331.         data.ac.push(model.defineSlot(opts, [728, 90], "g728x90"));
  13332.       }
  13333.       if (!k) {
  13334.         data.ab.push(model.defineSlot(id, [300, 250], "s300x250"));
  13335.         data.aa.push(model.defineSlot(attr, [300, 250], "a300x250"));
  13336.         if (length) {
  13337.           data.aa.push(model.defineSlot(template, [728, 90], "a728x90"));
  13338.         }
  13339.       }
  13340.       player.pubads().enableSingleRequest();
  13341.       player.pubads().disableInitialLoad();
  13342.       player.enableServices();
  13343.       /** @type {boolean} */
  13344.       reply = true;
  13345.       if (null != dir) {
  13346.         console.log("refreshing from queue");
  13347.         run(dir);
  13348.       }
  13349.     });
  13350.   })();
  13351.   (function() {
  13352.     if (_isFunction()) {
  13353.       var info = {
  13354.         acct : 13694,
  13355.         site : 73068,
  13356.         zone : 346604,
  13357.         size : 15
  13358.       };
  13359.       var layout = {
  13360.         acct : 13694,
  13361.         site : 73068,
  13362.         zone : 363786,
  13363.         size : 2
  13364.       };
  13365.       if (-1 == global.location.search.indexOf("fb")) {
  13366.         var length = props.a;
  13367.         data.ab.push(self.defineSlot(info, "300x250", "s300x250"));
  13368.         data.aa.push(self.defineSlot(info, "300x250", "a300x250"));
  13369.         if (length) {
  13370.           data.aa.push(self.defineSlot(layout, "728x90", "a728x90"));
  13371.         }
  13372.       }
  13373.     }
  13374.   })();
  13375.   if (debugads) {
  13376.     console.log("Ads initted");
  13377.   }
  13378.   if (debugads) {
  13379.     console.log("Your group: ", _isFunction() ? "rubicon" : "dfp");
  13380.   }
  13381.   (function() {
  13382.     /** @type {boolean} */
  13383.     var data = -1 != global.location.search.indexOf("fb");
  13384.     data = _isFunction() && !data;
  13385.     googletag.cmd.push(function() {
  13386.       googletag.display("g300x250");
  13387.     });
  13388.     if (!data) {
  13389.       googletag.cmd.push(function() {
  13390.         googletag.display("s300x250");
  13391.       });
  13392.       googletag.cmd.push(function() {
  13393.         googletag.display("a300x250");
  13394.       });
  13395.     }
  13396.   })();
  13397. })(window, window.jQuery);
  13398. (function(exports) {
  13399.   /**
  13400.    * @param {?} options
  13401.    * @return {undefined}
  13402.    */
  13403.   function TimeSeries(options) {
  13404.     this.options = Util.extend({}, TimeSeries.defaultOptions, options);
  13405.     this.clear();
  13406.   }
  13407.   /**
  13408.    * @param {?} options
  13409.    * @return {undefined}
  13410.    */
  13411.   function SmoothieChart(options) {
  13412.     this.options = Util.extend({}, SmoothieChart.defaultChartOptions, options);
  13413.     /** @type {Array} */
  13414.     this.seriesSet = [];
  13415.     /** @type {number} */
  13416.     this.currentValueRange = 1;
  13417.     /** @type {number} */
  13418.     this.currentVisMinValue = 0;
  13419.     /** @type {number} */
  13420.     this.lastRenderTimeMillis = 0;
  13421.   }
  13422.   var Util = {
  13423.     /**
  13424.      * @return {?}
  13425.      */
  13426.     extend : function() {
  13427.       arguments[0] = arguments[0] || {};
  13428.       /** @type {number} */
  13429.       var i = 1;
  13430.       for (;i < arguments.length;i++) {
  13431.         var key;
  13432.         for (key in arguments[i]) {
  13433.           if (arguments[i].hasOwnProperty(key)) {
  13434.             if (typeof arguments[i][key] === "object") {
  13435.               if (arguments[i][key] instanceof Array) {
  13436.                 arguments[0][key] = arguments[i][key];
  13437.               } else {
  13438.                 arguments[0][key] = Util.extend(arguments[0][key], arguments[i][key]);
  13439.               }
  13440.             } else {
  13441.               arguments[0][key] = arguments[i][key];
  13442.             }
  13443.           }
  13444.         }
  13445.       }
  13446.       return arguments[0];
  13447.     }
  13448.   };
  13449.   TimeSeries.defaultOptions = {
  13450.     resetBoundsInterval : 3E3,
  13451.     resetBounds : true
  13452.   };
  13453.   /**
  13454.    * @return {undefined}
  13455.    */
  13456.   TimeSeries.prototype.clear = function() {
  13457.     /** @type {Array} */
  13458.     this.data = [];
  13459.     /** @type {number} */
  13460.     this.maxValue = Number.NaN;
  13461.     /** @type {number} */
  13462.     this.minValue = Number.NaN;
  13463.   };
  13464.   /**
  13465.    * @return {undefined}
  13466.    */
  13467.   TimeSeries.prototype.resetBounds = function() {
  13468.     if (this.data.length) {
  13469.       this.maxValue = this.data[0][1];
  13470.       this.minValue = this.data[0][1];
  13471.       /** @type {number} */
  13472.       var dataIndex = 1;
  13473.       for (;dataIndex < this.data.length;dataIndex++) {
  13474.         var value = this.data[dataIndex][1];
  13475.         if (value > this.maxValue) {
  13476.           this.maxValue = value;
  13477.         }
  13478.         if (value < this.minValue) {
  13479.           this.minValue = value;
  13480.         }
  13481.       }
  13482.     } else {
  13483.       /** @type {number} */
  13484.       this.maxValue = Number.NaN;
  13485.       /** @type {number} */
  13486.       this.minValue = Number.NaN;
  13487.     }
  13488.   };
  13489.   /**
  13490.    * @param {?} key
  13491.    * @param {number} value
  13492.    * @param {?} opt_a2
  13493.    * @return {undefined}
  13494.    */
  13495.   TimeSeries.prototype.append = function(key, value, opt_a2) {
  13496.     /** @type {number} */
  13497.     var i = this.data.length - 1;
  13498.     for (;i >= 0 && this.data[i][0] > key;) {
  13499.       i--;
  13500.     }
  13501.     if (i === -1) {
  13502.       this.data.splice(0, 0, [key, value]);
  13503.     } else {
  13504.       if (this.data.length > 0 && this.data[i][0] === key) {
  13505.         if (opt_a2) {
  13506.           this.data[i][1] += value;
  13507.           value = this.data[i][1];
  13508.         } else {
  13509.           /** @type {number} */
  13510.           this.data[i][1] = value;
  13511.         }
  13512.       } else {
  13513.         if (i < this.data.length - 1) {
  13514.           this.data.splice(i + 1, 0, [key, value]);
  13515.         } else {
  13516.           this.data.push([key, value]);
  13517.         }
  13518.       }
  13519.     }
  13520.     this.maxValue = isNaN(this.maxValue) ? value : Math.max(this.maxValue, value);
  13521.     this.minValue = isNaN(this.minValue) ? value : Math.min(this.minValue, value);
  13522.   };
  13523.   /**
  13524.    * @param {number} oldestValidTime
  13525.    * @param {number} maxDataSetLength
  13526.    * @return {undefined}
  13527.    */
  13528.   TimeSeries.prototype.dropOldData = function(oldestValidTime, maxDataSetLength) {
  13529.     /** @type {number} */
  13530.     var removeCount = 0;
  13531.     for (;this.data.length - removeCount >= maxDataSetLength && this.data[removeCount + 1][0] < oldestValidTime;) {
  13532.       removeCount++;
  13533.     }
  13534.     if (removeCount !== 0) {
  13535.       this.data.splice(0, removeCount);
  13536.     }
  13537.   };
  13538.   SmoothieChart.defaultChartOptions = {
  13539.     name : "",
  13540.     millisPerPixel : 20,
  13541.     enableDpiScaling : true,
  13542.     /**
  13543.      * @param {?} str
  13544.      * @param {?} nDecimalDigits
  13545.      * @return {?}
  13546.      */
  13547.     yMinFormatter : function(str, nDecimalDigits) {
  13548.       return parseFloat(str).toFixed(nDecimalDigits);
  13549.     },
  13550.     /**
  13551.      * @param {?} str
  13552.      * @param {?} nDecimalDigits
  13553.      * @return {?}
  13554.      */
  13555.     yMaxFormatter : function(str, nDecimalDigits) {
  13556.       return parseFloat(str).toFixed(nDecimalDigits);
  13557.     },
  13558.     maxValueScale : 1,
  13559.     minValueScale : 1,
  13560.     interpolation : "bezier",
  13561.     scaleSmoothing : 0.125,
  13562.     maxDataSetLength : 2,
  13563.     scrollBackwards : false,
  13564.     grid : {
  13565.       fillStyle : "#000000",
  13566.       strokeStyle : "#777777",
  13567.       lineWidth : 1,
  13568.       sharpLines : false,
  13569.       millisPerLine : 1E3,
  13570.       verticalSections : 2,
  13571.       borderVisible : true
  13572.     },
  13573.     labels : {
  13574.       fillStyle : "#ffffff",
  13575.       disabled : false,
  13576.       fontSize : 10,
  13577.       fontFamily : "monospace",
  13578.       precision : 2
  13579.     },
  13580.     horizontalLines : []
  13581.   };
  13582.   SmoothieChart.AnimateCompatibility = function() {
  13583.     /**
  13584.      * @param {Function} callback
  13585.      * @param {?} element
  13586.      * @return {?}
  13587.      */
  13588.     var requestAnimationFrame = function(callback, element) {
  13589.       /** @type {function (this:Window, function (number): ?, (Element|null)=): number} */
  13590.       var requestAnimationFrame = window.requestAnimationFrame || (window.webkitRequestAnimationFrame || (window.mozRequestAnimationFrame || (window.oRequestAnimationFrame || (window.msRequestAnimationFrame || function($sanitize) {
  13591.         return window.setTimeout(function() {
  13592.           $sanitize((new Date).getTime());
  13593.         }, 16);
  13594.       }))));
  13595.       return requestAnimationFrame.call(window, callback, element);
  13596.     };
  13597.     /**
  13598.      * @param {?} id
  13599.      * @return {?}
  13600.      */
  13601.     var cancelAnimationFrame = function(id) {
  13602.       /** @type {function (this:Window, number): ?} */
  13603.       var cancel = window.cancelAnimationFrame || function(to) {
  13604.         clearTimeout(to);
  13605.       };
  13606.       return cancel.call(window, id);
  13607.     };
  13608.     return{
  13609.       /** @type {function (Function, ?): ?} */
  13610.       requestAnimationFrame : requestAnimationFrame,
  13611.       /** @type {function (?): ?} */
  13612.       cancelAnimationFrame : cancelAnimationFrame
  13613.     };
  13614.   }();
  13615.   SmoothieChart.defaultSeriesPresentationOptions = {
  13616.     lineWidth : 1,
  13617.     strokeStyle : "#ffffff"
  13618.   };
  13619.   /**
  13620.    * @param {Array} timeSeries
  13621.    * @param {?} options
  13622.    * @return {undefined}
  13623.    */
  13624.   SmoothieChart.prototype.addTimeSeries = function(timeSeries, options) {
  13625.     this.seriesSet.push({
  13626.       timeSeries : timeSeries,
  13627.       options : Util.extend({}, SmoothieChart.defaultSeriesPresentationOptions, options)
  13628.     });
  13629.     if (timeSeries.options.resetBounds && timeSeries.options.resetBoundsInterval > 0) {
  13630.       /** @type {number} */
  13631.       timeSeries.resetBoundsTimerId = setInterval(function() {
  13632.         timeSeries.resetBounds();
  13633.       }, timeSeries.options.resetBoundsInterval);
  13634.     }
  13635.   };
  13636.   /**
  13637.    * @param {?} timeSeries
  13638.    * @return {undefined}
  13639.    */
  13640.   SmoothieChart.prototype.removeTimeSeries = function(timeSeries) {
  13641.     var valuesLen = this.seriesSet.length;
  13642.     /** @type {number} */
  13643.     var i = 0;
  13644.     for (;i < valuesLen;i++) {
  13645.       if (this.seriesSet[i].timeSeries === timeSeries) {
  13646.         this.seriesSet.splice(i, 1);
  13647.         break;
  13648.       }
  13649.     }
  13650.     if (timeSeries.resetBoundsTimerId) {
  13651.       clearInterval(timeSeries.resetBoundsTimerId);
  13652.     }
  13653.   };
  13654.   /**
  13655.    * @param {?} timeSeries
  13656.    * @return {?}
  13657.    */
  13658.   SmoothieChart.prototype.getTimeSeriesOptions = function(timeSeries) {
  13659.     var valuesLen = this.seriesSet.length;
  13660.     /** @type {number} */
  13661.     var i = 0;
  13662.     for (;i < valuesLen;i++) {
  13663.       if (this.seriesSet[i].timeSeries === timeSeries) {
  13664.         return this.seriesSet[i].options;
  13665.       }
  13666.     }
  13667.   };
  13668.   /**
  13669.    * @param {?} timeSeries
  13670.    * @return {undefined}
  13671.    */
  13672.   SmoothieChart.prototype.bringToFront = function(timeSeries) {
  13673.     var valuesLen = this.seriesSet.length;
  13674.     /** @type {number} */
  13675.     var i = 0;
  13676.     for (;i < valuesLen;i++) {
  13677.       if (this.seriesSet[i].timeSeries === timeSeries) {
  13678.         var code = this.seriesSet.splice(i, 1);
  13679.         this.seriesSet.push(code[0]);
  13680.         break;
  13681.       }
  13682.     }
  13683.   };
  13684.   /**
  13685.    * @param {HTMLElement} canvas
  13686.    * @param {number} delayMillis
  13687.    * @return {undefined}
  13688.    */
  13689.   SmoothieChart.prototype.streamTo = function(canvas, delayMillis) {
  13690.     /** @type {HTMLElement} */
  13691.     this.canvas = canvas;
  13692.     /** @type {number} */
  13693.     this.delay = delayMillis;
  13694.     this.start();
  13695.   };
  13696.   /**
  13697.    * @return {undefined}
  13698.    */
  13699.   SmoothieChart.prototype.resize = function() {
  13700.     if (!this.options.enableDpiScaling || (!window || window.devicePixelRatio === 1)) {
  13701.       return;
  13702.     }
  13703.     /** @type {number} */
  13704.     var ratio = window.devicePixelRatio;
  13705.     /** @type {number} */
  13706.     var width = parseInt(this.canvas.getAttribute("width"));
  13707.     /** @type {number} */
  13708.     var height = parseInt(this.canvas.getAttribute("height"));
  13709.     if (!this.originalWidth || Math.floor(this.originalWidth * ratio) !== width) {
  13710.       /** @type {number} */
  13711.       this.originalWidth = width;
  13712.       this.canvas.setAttribute("width", Math.floor(width * ratio).toString());
  13713.       /** @type {string} */
  13714.       this.canvas.style.width = width + "px";
  13715.       this.canvas.getContext("2d").scale(ratio, ratio);
  13716.     }
  13717.     if (!this.originalHeight || Math.floor(this.originalHeight * ratio) !== height) {
  13718.       /** @type {number} */
  13719.       this.originalHeight = height;
  13720.       this.canvas.setAttribute("height", Math.floor(height * ratio).toString());
  13721.       /** @type {string} */
  13722.       this.canvas.style.height = height + "px";
  13723.       this.canvas.getContext("2d").scale(ratio, ratio);
  13724.     }
  13725.   };
  13726.   /**
  13727.    * @return {undefined}
  13728.    */
  13729.   SmoothieChart.prototype.start = function() {
  13730.     if (this.frame) {
  13731.       return;
  13732.     }
  13733.     var observableToAsync = function() {
  13734.       this.frame = SmoothieChart.AnimateCompatibility.requestAnimationFrame(function() {
  13735.         this.render();
  13736.         observableToAsync();
  13737.       }.bind(this));
  13738.     }.bind(this);
  13739.     observableToAsync();
  13740.   };
  13741.   /**
  13742.    * @return {undefined}
  13743.    */
  13744.   SmoothieChart.prototype.stop = function() {
  13745.     if (this.frame) {
  13746.       SmoothieChart.AnimateCompatibility.cancelAnimationFrame(this.frame);
  13747.       delete this.frame;
  13748.     }
  13749.   };
  13750.   /**
  13751.    * @return {undefined}
  13752.    */
  13753.   SmoothieChart.prototype.updateValueRange = function() {
  13754.     var chartOptions = this.options;
  13755.     /** @type {number} */
  13756.     var chartMaxValue = Number.NaN;
  13757.     /** @type {number} */
  13758.     var chartMinValue = Number.NaN;
  13759.     /** @type {number} */
  13760.     var d = 0;
  13761.     for (;d < this.seriesSet.length;d++) {
  13762.       var timeSeries = this.seriesSet[d].timeSeries;
  13763.       if (!isNaN(timeSeries.maxValue)) {
  13764.         chartMaxValue = !isNaN(chartMaxValue) ? Math.max(chartMaxValue, timeSeries.maxValue) : timeSeries.maxValue;
  13765.       }
  13766.       if (!isNaN(timeSeries.minValue)) {
  13767.         chartMinValue = !isNaN(chartMinValue) ? Math.min(chartMinValue, timeSeries.minValue) : timeSeries.minValue;
  13768.       }
  13769.     }
  13770.     if (chartOptions.maxValue != null) {
  13771.       chartMaxValue = chartOptions.maxValue;
  13772.     } else {
  13773.       chartMaxValue *= chartOptions.maxValueScale;
  13774.     }
  13775.     if (chartOptions.minValue != null) {
  13776.       chartMinValue = chartOptions.minValue;
  13777.     } else {
  13778.       chartMinValue -= Math.abs(chartMinValue * chartOptions.minValueScale - chartMinValue);
  13779.     }
  13780.     if (this.options.yRangeFunction) {
  13781.       var range = this.options.yRangeFunction({
  13782.         min : chartMinValue,
  13783.         max : chartMaxValue
  13784.       });
  13785.       chartMinValue = range.min;
  13786.       chartMaxValue = range.max;
  13787.     }
  13788.     if (!isNaN(chartMaxValue) && !isNaN(chartMinValue)) {
  13789.       /** @type {number} */
  13790.       var targetValueRange = chartMaxValue - chartMinValue;
  13791.       /** @type {number} */
  13792.       var valueRangeDiff = targetValueRange - this.currentValueRange;
  13793.       /** @type {number} */
  13794.       var minValueDiff = chartMinValue - this.currentVisMinValue;
  13795.       /** @type {boolean} */
  13796.       this.isAnimatingScale = Math.abs(valueRangeDiff) > 0.1 || Math.abs(minValueDiff) > 0.1;
  13797.       this.currentValueRange += chartOptions.scaleSmoothing * valueRangeDiff;
  13798.       this.currentVisMinValue += chartOptions.scaleSmoothing * minValueDiff;
  13799.     }
  13800.     this.valueRange = {
  13801.       min : chartMinValue,
  13802.       max : chartMaxValue
  13803.     };
  13804.   };
  13805.   /**
  13806.    * @param {HTMLElement} canvas
  13807.    * @param {number} time
  13808.    * @return {undefined}
  13809.    */
  13810.   SmoothieChart.prototype.render = function(canvas, time) {
  13811.     /** @type {number} */
  13812.     var nowMillis = (new Date).getTime();
  13813.     if (!this.isAnimatingScale) {
  13814.       /** @type {number} */
  13815.       var maxIdleMillis = Math.min(1E3 / 6, this.options.millisPerPixel);
  13816.       if (nowMillis - this.lastRenderTimeMillis < maxIdleMillis) {
  13817.         return;
  13818.       }
  13819.     }
  13820.     this.resize();
  13821.     /** @type {number} */
  13822.     this.lastRenderTimeMillis = nowMillis;
  13823.     canvas = canvas || this.canvas;
  13824.     time = time || nowMillis - (this.delay || 0);
  13825.     time -= time % this.options.millisPerPixel;
  13826.     var context = canvas.getContext("2d");
  13827.     var chartOptions = this.options;
  13828.     var dimensions = {
  13829.       top : 0,
  13830.       left : 0,
  13831.       width : canvas.clientWidth,
  13832.       height : canvas.clientHeight
  13833.     };
  13834.     /** @type {number} */
  13835.     var oldestValidTime = time - dimensions.width * chartOptions.millisPerPixel;
  13836.     var valueToYPixel = function(value) {
  13837.       /** @type {number} */
  13838.       var offset = value - this.currentVisMinValue;
  13839.       return this.currentValueRange === 0 ? dimensions.height : dimensions.height - Math.round(offset / this.currentValueRange * dimensions.height);
  13840.     }.bind(this);
  13841.     /**
  13842.      * @param {number} t
  13843.      * @return {?}
  13844.      */
  13845.     var timeToXPixel = function(t) {
  13846.       if (chartOptions.scrollBackwards) {
  13847.         return Math.round((time - t) / chartOptions.millisPerPixel);
  13848.       }
  13849.       return Math.round(dimensions.width - (time - t) / chartOptions.millisPerPixel);
  13850.     };
  13851.     this.updateValueRange();
  13852.     /** @type {string} */
  13853.     context.font = chartOptions.labels.fontSize + "px " + chartOptions.labels.fontFamily;
  13854.     context.save();
  13855.     context.translate(dimensions.left, dimensions.top);
  13856.     context.beginPath();
  13857.     context.rect(0, 0, dimensions.width, dimensions.height);
  13858.     context.clip();
  13859.     context.save();
  13860.     context.fillStyle = chartOptions.grid.fillStyle;
  13861.     context.clearRect(0, 0, dimensions.width, dimensions.height);
  13862.     context.fillRect(0, 0, dimensions.width, dimensions.height);
  13863.     context.restore();
  13864.     context.save();
  13865.     context.lineWidth = chartOptions.grid.lineWidth;
  13866.     context.strokeStyle = chartOptions.grid.strokeStyle;
  13867.     if (chartOptions.grid.millisPerLine > 0) {
  13868.       context.beginPath();
  13869.       /** @type {number} */
  13870.       var t = time - time % chartOptions.grid.millisPerLine;
  13871.       for (;t >= oldestValidTime;t -= chartOptions.grid.millisPerLine) {
  13872.         var gx = timeToXPixel(t);
  13873.         if (chartOptions.grid.sharpLines) {
  13874.           gx -= 0.5;
  13875.         }
  13876.         context.moveTo(gx, 0);
  13877.         context.lineTo(gx, dimensions.height);
  13878.       }
  13879.       context.stroke();
  13880.       context.closePath();
  13881.     }
  13882.     /** @type {number} */
  13883.     var v = 1;
  13884.     for (;v < chartOptions.grid.verticalSections;v++) {
  13885.       /** @type {number} */
  13886.       var gy = Math.round(v * dimensions.height / chartOptions.grid.verticalSections);
  13887.       if (chartOptions.grid.sharpLines) {
  13888.         gy -= 0.5;
  13889.       }
  13890.       context.beginPath();
  13891.       context.moveTo(0, gy);
  13892.       context.lineTo(dimensions.width, gy);
  13893.       context.stroke();
  13894.       context.closePath();
  13895.     }
  13896.     if (chartOptions.grid.borderVisible) {
  13897.       context.beginPath();
  13898.       context.strokeRect(0, 0, dimensions.width, dimensions.height);
  13899.       context.closePath();
  13900.     }
  13901.     context.restore();
  13902.     if (chartOptions.horizontalLines && chartOptions.horizontalLines.length) {
  13903.       /** @type {number} */
  13904.       var hl = 0;
  13905.       for (;hl < chartOptions.horizontalLines.length;hl++) {
  13906.         var line = chartOptions.horizontalLines[hl];
  13907.         /** @type {number} */
  13908.         var hly = Math.round(valueToYPixel(line.value)) - 0.5;
  13909.         context.strokeStyle = line.color || "#ffffff";
  13910.         context.lineWidth = line.lineWidth || 1;
  13911.         context.beginPath();
  13912.         context.moveTo(0, hly);
  13913.         context.lineTo(dimensions.width, hly);
  13914.         context.stroke();
  13915.         context.closePath();
  13916.       }
  13917.     }
  13918.     /** @type {number} */
  13919.     var d = 0;
  13920.     for (;d < this.seriesSet.length;d++) {
  13921.       context.save();
  13922.       var timeSeries = this.seriesSet[d].timeSeries;
  13923.       var codeSegments = timeSeries.data;
  13924.       var seriesOptions = this.seriesSet[d].options;
  13925.       timeSeries.dropOldData(oldestValidTime, chartOptions.maxDataSetLength);
  13926.       context.lineWidth = seriesOptions.lineWidth;
  13927.       context.strokeStyle = seriesOptions.strokeStyle;
  13928.       context.beginPath();
  13929.       /** @type {number} */
  13930.       var firstX = 0;
  13931.       /** @type {number} */
  13932.       var lastX = 0;
  13933.       /** @type {number} */
  13934.       var lastY = 0;
  13935.       /** @type {number} */
  13936.       var i = 0;
  13937.       for (;i < codeSegments.length && codeSegments.length !== 1;i++) {
  13938.         var x = timeToXPixel(codeSegments[i][0]);
  13939.         var y = valueToYPixel(codeSegments[i][1]);
  13940.         if (i === 0) {
  13941.           firstX = x;
  13942.           context.moveTo(x, y);
  13943.         } else {
  13944.           switch(chartOptions.interpolation) {
  13945.             case "linear":
  13946.             ;
  13947.             case "line":
  13948.               context.lineTo(x, y);
  13949.               break;
  13950.             case "bezier":
  13951.             ;
  13952.             default:
  13953.               context.bezierCurveTo(Math.round((lastX + x) / 2), lastY, Math.round(lastX + x) / 2, y, x, y);
  13954.               break;
  13955.             case "step":
  13956.               context.lineTo(x, lastY);
  13957.               context.lineTo(x, y);
  13958.               break;
  13959.           }
  13960.         }
  13961.         lastX = x;
  13962.         lastY = y;
  13963.       }
  13964.       if (codeSegments.length > 1) {
  13965.         if (seriesOptions.fillStyle) {
  13966.           context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, lastY);
  13967.           context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, dimensions.height + seriesOptions.lineWidth + 1);
  13968.           context.lineTo(firstX, dimensions.height + seriesOptions.lineWidth);
  13969.           context.fillStyle = seriesOptions.fillStyle;
  13970.           context.fill();
  13971.         }
  13972.         if (seriesOptions.strokeStyle && seriesOptions.strokeStyle !== "none") {
  13973.           context.stroke();
  13974.         }
  13975.         context.closePath();
  13976.       }
  13977.       context.restore();
  13978.     }
  13979.     if (!chartOptions.labels.disabled && (!isNaN(this.valueRange.min) && !isNaN(this.valueRange.max))) {
  13980.       var maxValueString = chartOptions.yMaxFormatter(this.valueRange.max, chartOptions.labels.precision);
  13981.       var minValueString = chartOptions.yMinFormatter(this.valueRange.min, chartOptions.labels.precision);
  13982.       /** @type {number} */
  13983.       var offsetX = chartOptions.scrollBackwards ? 0 : dimensions.width - context.measureText(maxValueString).width - 2;
  13984.       context.fillStyle = chartOptions.labels.fillStyle;
  13985.       context.fillText(maxValueString, offsetX, chartOptions.labels.fontSize);
  13986.       context.fillText(minValueString, offsetX, dimensions.height - 2);
  13987.       if (chartOptions.name != "") {
  13988.         context.fillText(chartOptions.name, 2, chartOptions.labels.fontSize);
  13989.       }
  13990.     }
  13991.     if (chartOptions.timestampFormatter && chartOptions.grid.millisPerLine > 0) {
  13992.       var textUntilX = chartOptions.scrollBackwards ? context.measureText(minValueString).width : dimensions.width - context.measureText(minValueString).width + 4;
  13993.       /** @type {number} */
  13994.       t = time - time % chartOptions.grid.millisPerLine;
  13995.       for (;t >= oldestValidTime;t -= chartOptions.grid.millisPerLine) {
  13996.         gx = timeToXPixel(t);
  13997.         if (!chartOptions.scrollBackwards && gx < textUntilX || chartOptions.scrollBackwards && gx > textUntilX) {
  13998.           /** @type {Date} */
  13999.           var tx = new Date(t);
  14000.           var ts = chartOptions.timestampFormatter(tx);
  14001.           var tsWidth = context.measureText(ts).width;
  14002.           textUntilX = chartOptions.scrollBackwards ? gx + tsWidth + 2 : gx - tsWidth - 2;
  14003.           context.fillStyle = chartOptions.labels.fillStyle;
  14004.           if (chartOptions.scrollBackwards) {
  14005.             context.fillText(ts, gx, dimensions.height - 2);
  14006.           } else {
  14007.             context.fillText(ts, gx - tsWidth, dimensions.height - 2);
  14008.           }
  14009.         }
  14010.       }
  14011.     }
  14012.     context.restore();
  14013.   };
  14014.   /**
  14015.    * @param {Date} date
  14016.    * @return {?}
  14017.    */
  14018.   SmoothieChart.timeFormatter = function(date) {
  14019.     /**
  14020.      * @param {number} number
  14021.      * @return {?}
  14022.      */
  14023.     function pad2(number) {
  14024.       return(number < 10 ? "0" : "") + number;
  14025.     }
  14026.     return pad2(date.getHours()) + ":" + pad2(date.getMinutes()) + ":" + pad2(date.getSeconds());
  14027.   };
  14028.   /** @type {function (?): undefined} */
  14029.   exports.TimeSeries = TimeSeries;
  14030.   /** @type {function (?): undefined} */
  14031.   exports.SmoothieChart = SmoothieChart;
  14032. })(typeof exports === "undefined" ? this : exports);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement