/*!
 * jQuery Cookie Plugin v1.4.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2006, 2014 Klaus Hartl
 * Released under the MIT license
 */
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD (Register as an anonymous module)
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // Node/CommonJS
        module.exports = factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {

    var pluses = /\+/g;

    function encode(s) {
        return config.raw ? s : encodeURIComponent(s);
    }

    function decode(s) {
        return config.raw ? s : decodeURIComponent(s);
    }

    function stringifyCookieValue(value) {
        return encode(config.json ? JSON.stringify(value) : String(value));
    }

    function parseCookieValue(s) {
        if (s.indexOf('"') === 0) {
            // This is a quoted cookie as according to RFC2068, unescape...
            s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
        }

        try {
            // Replace server-side written pluses with spaces.
            // If we can't decode the cookie, ignore it, it's unusable.
            // If we can't parse the cookie, ignore it, it's unusable.
            s = decodeURIComponent(s.replace(pluses, ' '));
            return config.json ? JSON.parse(s) : s;
        } catch (e) { }
    }

    function read(s, converter) {
        var value = config.raw ? s : parseCookieValue(s);
        return $.isFunction(converter) ? converter(value) : value;
    }

    var config = $.cookie = function (key, value, options) {

        // Write

        if (arguments.length > 1 && !$.isFunction(value)) {
            options = $.extend({}, config.defaults, options);

            if (typeof options.expires === 'number') {
                var days = options.expires, t = options.expires = new Date();
                t.setMilliseconds(t.getMilliseconds() + days * 864e+5);
            }

            return (document.cookie = [
				encode(key), '=', stringifyCookieValue(value),
				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
				options.path ? '; path=' + options.path : '',
				options.domain ? '; domain=' + options.domain : '',
				options.secure ? '; secure' : ''
            ].join(''));
        }

        // Read

        var result = key ? undefined : {},
			// To prevent the for loop in the first place assign an empty array
			// in case there are no cookies at all. Also prevents odd result when
			// calling $.cookie().
			cookies = document.cookie ? document.cookie.split('; ') : [],
			i = 0,
			l = cookies.length;

        for (; i < l; i++) {
            var parts = cookies[i].split('='),
				name = decode(parts.shift()),
				cookie = parts.join('=');

            if (key === name) {
                // If second argument (value) is a function it's a converter...
                result = read(cookie, value);
                break;
            }

            // Prevent storing a cookie that we couldn't decode.
            if (!key && (cookie = read(cookie)) !== undefined) {
                result[name] = cookie;
            }
        }

        return result;
    };

    config.defaults = {};

    $.removeCookie = function (key, options) {
        // Must not alter options, thus extending a fresh object...
        $.cookie(key, '', $.extend({}, options, { expires: -1 }));
        return !$.cookie(key);
    };

}));

var DateFormat = {};

(function ($) {
    var daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var shortDaysInWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var shortMonthsInYear = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var longMonthsInYear = ['January', 'February', 'March', 'April', 'May', 'June',
                                'July', 'August', 'September', 'October', 'November', 'December'];
    var shortMonthsToNumber = {
        'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06',
        'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12'
    };

    var YYYYMMDD_MATCHER = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[Z\-+]?(\d{2}:?\d{2})?/;

    $.format = (function () {
        function numberToLongDay(value) {
            // 0 to Sunday
            // 1 to Monday
            return daysInWeek[parseInt(value, 10)] || value;
        }

        function numberToShortDay(value) {
            // 0 to Sun
            // 1 to Mon
            return shortDaysInWeek[parseInt(value, 10)] || value;
        }

        function numberToShortMonth(value) {
            // 1 to Jan
            // 2 to Feb
            var monthArrayIndex = parseInt(value, 10) - 1;
            return shortMonthsInYear[monthArrayIndex] || value;
        }

        function numberToLongMonth(value) {
            // 1 to January
            // 2 to February
            var monthArrayIndex = parseInt(value, 10) - 1;
            return longMonthsInYear[monthArrayIndex] || value;
        }

        function shortMonthToNumber(value) {
            // Jan to 01
            // Feb to 02
            return shortMonthsToNumber[value] || value;
        }

        function parseTime(value) {
            // 10:54:50.546
            // => hour: 10, minute: 54, second: 50, millis: 546
            // 10:54:50
            // => hour: 10, minute: 54, second: 50, millis: ''
            var time = value,
                hour,
                minute,
                second,
                millis = '',
                delimited,
                timeArray;

            if (time.indexOf('.') !== -1) {
                delimited = time.split('.');
                // split time and milliseconds
                time = delimited[0];
                millis = delimited[delimited.length - 1];
            }

            timeArray = time.split(':');

            if (timeArray.length === 3) {
                hour = timeArray[0];
                minute = timeArray[1];
                // '20 GMT-0200 (BRST)'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
                // => 20
                // '20Z'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
                // => 20
                second = timeArray[2].replace(/\s.+/, '').replace(/[a-z]/gi, '');
                // '01:10:20 GMT-0200 (BRST)'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
                // => 01:10:20
                // '01:10:20Z'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
                // => 01:10:20
                time = time.replace(/\s.+/, '').replace(/[a-z]/gi, '');
                return {
                    time: time,
                    hour: hour,
                    minute: minute,
                    second: second,
                    millis: millis
                };
            }

            return { time: '', hour: '', minute: '', second: '', millis: '' };
        }


        function padding(value, length) {
            var paddingCount = length - String(value).length;
            for (var i = 0; i < paddingCount; i++) {
                value = '0' + value;
            }
            return value;
        }

        return {

            parseDate: function (value) {
                var values,
                    subValues;

                var parsedDate = {
                    date: null,
                    year: null,
                    month: null,
                    dayOfMonth: null,
                    dayOfWeek: null,
                    time: null
                };

                if (typeof value == 'number') {
                    return this.parseDate(new Date(value));
                } else if (typeof value.getFullYear == 'function') {
                    parsedDate.year = String(value.getFullYear());
                    // d = new Date(1900, 1, 1) // 1 for Feb instead of Jan.
                    // => Thu Feb 01 1900 00:00:00
                    parsedDate.month = String(value.getMonth() + 1);
                    parsedDate.dayOfMonth = String(value.getDate());
                    parsedDate.time = parseTime(value.toTimeString() + "." + value.getMilliseconds());
                } else if (value.search(YYYYMMDD_MATCHER) != -1) {
                    /* 2009-04-19T16:11:05+02:00 || 2009-04-19T16:11:05Z */
                    values = value.split(/[T\+-]/);
                    parsedDate.year = values[0];
                    parsedDate.month = values[1];
                    parsedDate.dayOfMonth = values[2];
                    parsedDate.time = parseTime(values[3].split('.')[0]);
                } else {
                    values = value.split(' ');
                    if (values.length === 6 && isNaN(values[5])) {
                        // values[5] == year
                        /*
                         * This change is necessary to make `Mon Apr 28 2014 05:30:00 GMT-0300` work
                         * like `case 7`
                         * otherwise it will be considered like `Wed Jan 13 10:43:41 CET 2010
                         * Fixes: https://github.com/phstc/jquery-dateFormat/issues/64
                         */
                        values[values.length] = '()';
                    }
                    switch (values.length) {
                        case 6:
                            /* Wed Jan 13 10:43:41 CET 2010 */
                            parsedDate.year = values[5];
                            parsedDate.month = shortMonthToNumber(values[1]);
                            parsedDate.dayOfMonth = values[2];
                            parsedDate.time = parseTime(values[3]);
                            break;
                        case 2:
                            /* 2009-12-18 10:54:50.546 */
                            subValues = values[0].split('-');
                            parsedDate.year = subValues[0];
                            parsedDate.month = subValues[1];
                            parsedDate.dayOfMonth = subValues[2];
                            parsedDate.time = parseTime(values[1]);
                            break;
                        case 7:
                            /* Tue Mar 01 2011 12:01:42 GMT-0800 (PST) */
                        case 9:
                            /* added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0800 (China Standard Time) */
                        case 10:
                            /* added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0200 (W. Europe Daylight Time) */
                            parsedDate.year = values[3];
                            parsedDate.month = shortMonthToNumber(values[1]);
                            parsedDate.dayOfMonth = values[2];
                            parsedDate.time = parseTime(values[4]);
                            break;
                        case 1:
                            /* added by Jonny, for 2012-02-07CET00:00:00 (Doctrine Entity -> Json Serializer) */
                            subValues = values[0].split('');
                            parsedDate.year = subValues[0] + subValues[1] + subValues[2] + subValues[3];
                            parsedDate.month = subValues[5] + subValues[6];
                            parsedDate.dayOfMonth = subValues[8] + subValues[9];
                            parsedDate.time = parseTime(subValues[13] + subValues[14] + subValues[15] + subValues[16] + subValues[17] + subValues[18] + subValues[19] + subValues[20]);
                            break;
                        default:
                            return null;
                    }
                }

                if (parsedDate.time) {
                    parsedDate.date = new Date(parsedDate.year, parsedDate.month - 1, parsedDate.dayOfMonth, parsedDate.time.hour, parsedDate.time.minute, parsedDate.time.second, parsedDate.time.millis);
                } else {
                    parsedDate.date = new Date(parsedDate.year, parsedDate.month - 1, parsedDate.dayOfMonth);
                }

                parsedDate.dayOfWeek = String(parsedDate.date.getDay());

                return parsedDate;
            },

            date: function (value, format) {
                try {
                    var parsedDate = this.parseDate(value);

                    if (parsedDate === null) {
                        return value;
                    }

                    var year = parsedDate.year,
                        month = parsedDate.month,
                        dayOfMonth = parsedDate.dayOfMonth,
                        dayOfWeek = parsedDate.dayOfWeek,
                        time = parsedDate.time;
                    var hour;

                    var pattern = '',
                        retValue = '',
                        unparsedRest = '',
                        inQuote = false;

                    /* Issue 1 - variable scope issue in format.date (Thanks jakemonO) */
                    for (var i = 0; i < format.length; i++) {
                        var currentPattern = format.charAt(i);
                        // Look-Ahead Right (LALR)
                        var nextRight = format.charAt(i + 1);

                        if (inQuote) {
                            if (currentPattern == "'") {
                                retValue += (pattern === '') ? "'" : pattern;
                                pattern = '';
                                inQuote = false;
                            } else {
                                pattern += currentPattern;
                            }
                            continue;
                        }
                        pattern += currentPattern;
                        unparsedRest = '';
                        switch (pattern) {
                            case 'ddd':
                                retValue += numberToLongDay(dayOfWeek);
                                pattern = '';
                                break;
                            case 'dd':
                                if (nextRight === 'd') {
                                    break;
                                }
                                retValue += padding(dayOfMonth, 2);
                                pattern = '';
                                break;
                            case 'd':
                                if (nextRight === 'd') {
                                    break;
                                }
                                retValue += parseInt(dayOfMonth, 10);
                                pattern = '';
                                break;
                            case 'D':
                                if (dayOfMonth == 1 || dayOfMonth == 21 || dayOfMonth == 31) {
                                    dayOfMonth = parseInt(dayOfMonth, 10) + 'st';
                                } else if (dayOfMonth == 2 || dayOfMonth == 22) {
                                    dayOfMonth = parseInt(dayOfMonth, 10) + 'nd';
                                } else if (dayOfMonth == 3 || dayOfMonth == 23) {
                                    dayOfMonth = parseInt(dayOfMonth, 10) + 'rd';
                                } else {
                                    dayOfMonth = parseInt(dayOfMonth, 10) + 'th';
                                }
                                retValue += dayOfMonth;
                                pattern = '';
                                break;
                            case 'MMMM':
                                retValue += numberToLongMonth(month);
                                pattern = '';
                                break;
                            case 'MMM':
                                if (nextRight === 'M') {
                                    break;
                                }
                                retValue += numberToShortMonth(month);
                                pattern = '';
                                break;
                            case 'MM':
                                if (nextRight === 'M') {
                                    break;
                                }
                                retValue += padding(month, 2);
                                pattern = '';
                                break;
                            case 'M':
                                if (nextRight === 'M') {
                                    break;
                                }
                                retValue += parseInt(month, 10);
                                pattern = '';
                                break;
                            case 'y':
                            case 'yyy':
                                if (nextRight === 'y') {
                                    break;
                                }
                                retValue += pattern;
                                pattern = '';
                                break;
                            case 'yy':
                                if (nextRight === 'y') {
                                    break;
                                }
                                retValue += String(year).slice(-2);
                                pattern = '';
                                break;
                            case 'yyyy':
                                retValue += year;
                                pattern = '';
                                break;
                            case 'HH':
                                retValue += padding(time.hour, 2);
                                pattern = '';
                                break;
                            case 'H':
                                if (nextRight === 'H') {
                                    break;
                                }
                                retValue += parseInt(time.hour, 10);
                                pattern = '';
                                break;
                            case 'hh':
                                /* time.hour is '00' as string == is used instead of === */
                                hour = (parseInt(time.hour, 10) === 0 ? 12 : time.hour < 13 ? time.hour
                                    : time.hour - 12);
                                retValue += padding(hour, 2);
                                pattern = '';
                                break;
                            case 'h':
                                if (nextRight === 'h') {
                                    break;
                                }
                                hour = (parseInt(time.hour, 10) === 0 ? 12 : time.hour < 13 ? time.hour
                                    : time.hour - 12);
                                retValue += parseInt(hour, 10);
                                // Fixing issue https://github.com/phstc/jquery-dateFormat/issues/21
                                // retValue = parseInt(retValue, 10);
                                pattern = '';
                                break;
                            case 'mm':
                                retValue += padding(time.minute, 2);
                                pattern = '';
                                break;
                            case 'm':
                                if (nextRight === 'm') {
                                    break;
                                }
                                retValue += time.minute;
                                pattern = '';
                                break;
                            case 'ss':
                                /* ensure only seconds are added to the return string */
                                retValue += padding(time.second.substring(0, 2), 2);
                                pattern = '';
                                break;
                            case 's':
                                if (nextRight === 's') {
                                    break;
                                }
                                retValue += time.second;
                                pattern = '';
                                break;
                            case 'S':
                            case 'SS':
                                if (nextRight === 'S') {
                                    break;
                                }
                                retValue += pattern;
                                pattern = '';
                                break;
                            case 'SSS':
                                var sss = '000' + time.millis.substring(0, 3);
                                retValue += sss.substring(sss.length - 3);
                                pattern = '';
                                break;
                            case 'a':
                                retValue += time.hour >= 12 ? 'PM' : 'AM';
                                pattern = '';
                                break;
                            case 'p':
                                retValue += time.hour >= 12 ? 'p.m.' : 'a.m.';
                                pattern = '';
                                break;
                            case 'E':
                                retValue += numberToShortDay(dayOfWeek);
                                pattern = '';
                                break;
                            case "'":
                                pattern = '';
                                inQuote = true;
                                break;
                            default:
                                retValue += currentPattern;
                                pattern = '';
                                break;
                        }
                    }
                    retValue += unparsedRest;
                    return retValue;
                } catch (e) {
                    if (console && console.log) {
                        console.log(e);
                    }
                    return value;
                }
            },
            /*
             * JavaScript Pretty Date
             * Copyright (c) 2011 John Resig (ejohn.org)
             * Licensed under the MIT and GPL licenses.
             *
             * Takes an ISO time and returns a string representing how long ago the date
             * represents
             *
             * ('2008-01-28T20:24:17Z') // => '2 hours ago'
             * ('2008-01-27T22:24:17Z') // => 'Yesterday'
             * ('2008-01-26T22:24:17Z') // => '2 days ago'
             * ('2008-01-14T22:24:17Z') // => '2 weeks ago'
             * ('2007-12-15T22:24:17Z') // => 'more than 5 weeks ago'
             *
             */
            prettyDate: function (time) {
                var date;
                var diff;
                var day_diff;

                if (typeof time === 'string' || typeof time === 'number') {
                    date = new Date(time);
                }

                if (typeof time === 'object') {
                    date = new Date(time.toString());
                }

                diff = (((new Date()).getTime() - date.getTime()) / 1000);

                day_diff = Math.floor(diff / 86400);

                if (isNaN(day_diff) || day_diff < 0) {
                    return;
                }

                if (diff < 60) {
                    return 'just now';
                } else if (diff < 120) {
                    return '1 minute ago';
                } else if (diff < 3600) {
                    return Math.floor(diff / 60) + ' minutes ago';
                } else if (diff < 7200) {
                    return '1 hour ago';
                } else if (diff < 86400) {
                    return Math.floor(diff / 3600) + ' hours ago';
                } else if (day_diff === 1) {
                    return 'Yesterday';
                } else if (day_diff < 7) {
                    return day_diff + ' days ago';
                } else if (day_diff < 31) {
                    return Math.ceil(day_diff / 7) + ' weeks ago';
                } else if (day_diff >= 31) {
                    return 'more than 5 weeks ago';
                }
            },
            toBrowserTimeZone: function (value, format) {
                return this.date(new Date(value), format || 'MM/dd/yyyy HH:mm:ss');
            }
        };
    }());
}(DateFormat));
;// require dateFormat.js
// please check `dist/jquery.dateFormat.js` for a complete version
(function ($) {
    $.format = DateFormat.format;
}(jQuery));

/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 */
// Inspired by base2 and Prototype
(function () {
    var initializing = false;

    // The base JQClass implementation (does nothing)
    window.JQClass = function () { };

    // Collection of derived classes
    JQClass.classes = {};

    // Create a new JQClass that inherits from this class
    JQClass.extend = function extender(prop) {
        var base = this.prototype;

        // Instantiate a base class (but only create the instance,
        // don't run the init constructor)
        initializing = true;
        var prototype = new this();
        initializing = false;

        // Copy the properties over onto the new prototype
        for (var name in prop) {
            // Check if we're overwriting an existing function
            prototype[name] = typeof prop[name] == 'function' &&
				typeof base[name] == 'function' ?
				(function (name, fn) {
				    return function () {
				        var __super = this._super;

				        // Add a new ._super() method that is the same method
				        // but on the super-class
				        this._super = function (args) {
				            return base[name].apply(this, args || []);
				        };

				        var ret = fn.apply(this, arguments);

				        // The method only need to be bound temporarily, so we
				        // remove it when we're done executing
				        this._super = __super;

				        return ret;
				    };
				})(name, prop[name]) :
				prop[name];
        }

        // The dummy class constructor
        function JQClass() {
            // All construction is actually done in the init method
            if (!initializing && this._init) {
                this._init.apply(this, arguments);
            }
        }

        // Populate our constructed prototype object
        JQClass.prototype = prototype;

        // Enforce the constructor to be what we expect
        JQClass.prototype.constructor = JQClass;

        // And make this class extendable
        JQClass.extend = extender;

        return JQClass;
    };
})();

(function ($) { // Ensure $, encapsulate

    /** Abstract base class for collection plugins v1.0.1.
		Written by Keith Wood (kbwood{at}iinet.com.au) December 2013.
		Licensed under the MIT (http://keith-wood.name/licence.html) license.
		@module $.JQPlugin
		@abstract */
    JQClass.classes.JQPlugin = JQClass.extend({

        /** Name to identify this plugin.
			@example name: 'tabs' */
        name: 'plugin',

        /** Default options for instances of this plugin (default: {}).
			@example defaultOptions: {
 	selectedClass: 'selected',
 	triggers: 'click'
 } */
        defaultOptions: {},

        /** Options dependent on the locale.
			Indexed by language and (optional) country code, with '' denoting the default language (English/US).
			@example regionalOptions: {
	'': {
		greeting: 'Hi'
	}
 } */
        regionalOptions: {},

        /** Names of getter methods - those that can't be chained (default: []).
			@example _getters: ['activeTab'] */
        _getters: [],

        /** Retrieve a marker class for affected elements.
			@private
			@return {string} The marker class. */
        _getMarker: function () {
            return 'is-' + this.name;
        },

        /** Initialise the plugin.
			Create the jQuery bridge - plugin name <code>xyz</code>
			produces <code>$.xyz</code> and <code>$.fn.xyz</code>. */
        _init: function () {
            // Apply default localisations
            $.extend(this.defaultOptions, (this.regionalOptions && this.regionalOptions['']) || {});
            // Camel-case the name
            var jqName = camelCase(this.name);
            // Expose jQuery singleton manager
            $[jqName] = this;
            // Expose jQuery collection plugin
            $.fn[jqName] = function (options) {
                var otherArgs = Array.prototype.slice.call(arguments, 1);
                if ($[jqName]._isNotChained(options, otherArgs)) {
                    return $[jqName][options].apply($[jqName], [this[0]].concat(otherArgs));
                }
                return this.each(function () {
                    if (typeof options === 'string') {
                        if (options[0] === '_' || !$[jqName][options]) {
                            throw 'Unknown method: ' + options;
                        }
                        $[jqName][options].apply($[jqName], [this].concat(otherArgs));
                    }
                    else {
                        $[jqName]._attach(this, options);
                    }
                });
            };
        },

        /** Set default values for all subsequent instances.
			@param options {object} The new default options.
			@example $.plugin.setDefauls({name: value}) */
        setDefaults: function (options) {
            $.extend(this.defaultOptions, options || {});
        },

        /** Determine whether a method is a getter and doesn't permit chaining.
			@private
			@param name {string} The method name.
			@param otherArgs {any[]} Any other arguments for the method.
			@return {boolean} True if this method is a getter, false otherwise. */
        _isNotChained: function (name, otherArgs) {
            if (name === 'option' && (otherArgs.length === 0 ||
					(otherArgs.length === 1 && typeof otherArgs[0] === 'string'))) {
                return true;
            }
            return $.inArray(name, this._getters) > -1;
        },

        /** Initialise an element. Called internally only.
			Adds an instance object as data named for the plugin.
			@param elem {Element} The element to enhance.
			@param options {object} Overriding settings. */
        _attach: function (elem, options) {
            elem = $(elem);
            if (elem.hasClass(this._getMarker())) {
                return;
            }
            elem.addClass(this._getMarker());
            options = $.extend({}, this.defaultOptions, this._getMetadata(elem), options || {});
            var inst = $.extend({ name: this.name, elem: elem, options: options },
				this._instSettings(elem, options));
            elem.data(this.name, inst); // Save instance against element
            this._postAttach(elem, inst);
            this.option(elem, options);
        },

        /** Retrieve additional instance settings.
			Override this in a sub-class to provide extra settings.
			@param elem {jQuery} The current jQuery element.
			@param options {object} The instance options.
			@return {object} Any extra instance values.
			@example _instSettings: function(elem, options) {
 	return {nav: elem.find(options.navSelector)};
 } */
        _instSettings: function (elem, options) {
            return {};
        },

        /** Plugin specific post initialisation.
			Override this in a sub-class to perform extra activities.
			@param elem {jQuery} The current jQuery element.
			@param inst {object} The instance settings.
			@example _postAttach: function(elem, inst) {
 	elem.on('click.' + this.name, function() {
 		...
 	});
 } */
        _postAttach: function (elem, inst) {
        },

        /** Retrieve metadata configuration from the element.
			Metadata is specified as an attribute:
			<code>data-&lt;plugin name>="&lt;setting name>: '&lt;value>', ..."</code>.
			Dates should be specified as strings in this format: 'new Date(y, m-1, d)'.
			@private
			@param elem {jQuery} The source element.
			@return {object} The inline configuration or {}. */
        _getMetadata: function (elem) {
            try {
                var data = elem.data(this.name.toLowerCase()) || '';
                data = data.replace(/'/g, '"');
                data = data.replace(/([a-zA-Z0-9]+):/g, function (match, group, i) {
                    var count = data.substring(0, i).match(/"/g); // Handle embedded ':'
                    return (!count || count.length % 2 === 0 ? '"' + group + '":' : group + ':');
                });
                data = $.parseJSON('{' + data + '}');
                for (var name in data) { // Convert dates
                    var value = data[name];
                    if (typeof value === 'string' && value.match(/^new Date\((.*)\)$/)) {
                        data[name] = eval(value);
                    }
                }
                return data;
            }
            catch (e) {
                return {};
            }
        },

        /** Retrieve the instance data for element.
			@param elem {Element} The source element.
			@return {object} The instance data or {}. */
        _getInst: function (elem) {
            return $(elem).data(this.name) || {};
        },

        /** Retrieve or reconfigure the settings for a plugin.
			@param elem {Element} The source element.
			@param name {object|string} The collection of new option values or the name of a single option.
			@param [value] {any} The value for a single named option.
			@return {any|object} If retrieving a single value or all options.
			@example $(selector).plugin('option', 'name', value)
 $(selector).plugin('option', {name: value, ...})
 var value = $(selector).plugin('option', 'name')
 var options = $(selector).plugin('option') */
        option: function (elem, name, value) {
            elem = $(elem);
            var inst = elem.data(this.name);
            if (!name || (typeof name === 'string' && value == null)) {
                var options = (inst || {}).options;
                return (options && name ? options[name] : options);
            }
            if (!elem.hasClass(this._getMarker())) {
                return;
            }
            var options = name || {};
            if (typeof name === 'string') {
                options = {};
                options[name] = value;
            }
            this._optionsChanged(elem, inst, options);
            $.extend(inst.options, options);
        },

        /** Plugin specific options processing.
			Old value available in <code>inst.options[name]</code>, new value in <code>options[name]</code>.
			Override this in a sub-class to perform extra activities.
			@param elem {jQuery} The current jQuery element.
			@param inst {object} The instance settings.
			@param options {object} The new options.
			@example _optionsChanged: function(elem, inst, options) {
 	if (options.name != inst.options.name) {
 		elem.removeClass(inst.options.name).addClass(options.name);
 	}
 } */
        _optionsChanged: function (elem, inst, options) {
        },

        /** Remove all trace of the plugin.
			Override <code>_preDestroy</code> for plugin-specific processing.
			@param elem {Element} The source element.
			@example $(selector).plugin('destroy') */
        destroy: function (elem) {
            elem = $(elem);
            if (!elem.hasClass(this._getMarker())) {
                return;
            }
            this._preDestroy(elem, this._getInst(elem));
            elem.removeData(this.name).removeClass(this._getMarker());
        },

        /** Plugin specific pre destruction.
			Override this in a sub-class to perform extra activities and undo everything that was
			done in the <code>_postAttach</code> or <code>_optionsChanged</code> functions.
			@param elem {jQuery} The current jQuery element.
			@param inst {object} The instance settings.
			@example _preDestroy: function(elem, inst) {
 	elem.off('.' + this.name);
 } */
        _preDestroy: function (elem, inst) {
        }
    });

    /** Convert names from hyphenated to camel-case.
		@private
		@param value {string} The original hyphenated name.
		@return {string} The camel-case version. */
    function camelCase(name) {
        return name.replace(/-([a-z])/g, function (match, group) {
            return group.toUpperCase();
        });
    }

    /** Expose the plugin base.
		@namespace "$.JQPlugin" */
    $.JQPlugin = {

        /** Create a new collection plugin.
			@memberof "$.JQPlugin"
			@param [superClass='JQPlugin'] {string} The name of the parent class to inherit from.
			@param overrides {object} The property/function overrides for the new class.
			@example $.JQPlugin.createPlugin({
 	name: 'tabs',
 	defaultOptions: {selectedClass: 'selected'},
 	_initSettings: function(elem, options) { return {...}; },
 	_postAttach: function(elem, inst) { ... }
 }); */
        createPlugin: function (superClass, overrides) {
            if (typeof superClass === 'object') {
                overrides = superClass;
                superClass = 'JQPlugin';
            }
            superClass = camelCase(superClass);
            var className = camelCase(overrides.name);
            JQClass.classes[className] = JQClass.classes[superClass].extend(overrides);
            new JQClass.classes[className]();
        }
    };

})(jQuery);
/* http://keith-wood.name/countdown.html
   Countdown for jQuery v2.0.2.
   Written by Keith Wood (kbwood{at}iinet.com.au) January 2008.
   Available under the MIT (http://keith-wood.name/licence.html) license. 
   Please attribute the author if you use it. */

(function ($) { // Hide scope, no $ conflict

    var pluginName = 'countdown';

    var Y = 0; // Years
    var O = 1; // Months
    var W = 2; // Weeks
    var D = 3; // Days
    var H = 4; // Hours
    var M = 5; // Minutes
    var S = 6; // Seconds

    /** Create the countdown plugin.
		<p>Sets an element to show the time remaining until a given instant.</p>
		<p>Expects HTML like:</p>
		<pre>&lt;div>&lt;/div></pre>
		<p>Provide inline configuration like:</p>
		<pre>&lt;div data-countdown="name: 'value'">&lt;/div></pre>
	 	@module Countdown
		@augments JQPlugin
		@example $(selector).countdown({until: +300}) */
    $.JQPlugin.createPlugin({

        /** The name of the plugin. */
        name: pluginName,

        /** Countdown expiry callback.
			Triggered when the countdown expires.
			@callback expiryCallback */

        /** Countdown server synchronisation callback.
			Triggered when the countdown is initialised.
			@callback serverSyncCallback
			@return {Date} The current date/time on the server as expressed in the local timezone. */

        /** Countdown tick callback.
			Triggered on every <code>tickInterval</code> ticks of the countdown.
			@callback tickCallback
			@param periods {number[]} The breakdown by period (years, months, weeks, days,
					hours, minutes, seconds) of the time remaining/passed. */

        /** Countdown which labels callback.
			Triggered when the countdown is being display to determine which set of labels
			(<code>labels</code>, <code>labels1</code>, ...) are to be used for the current period value.
			@callback whichLabelsCallback
			@param num {number} The current period value.
			@return {number} The suffix for the label set to use. */

        /** Default settings for the plugin.
			@property until {Date|number|string} The date/time to count down to, or number of seconds
						offset from now, or string of amounts and units for offset(s) from now:
						'Y' years, 'O' months, 'W' weeks, 'D' days, 'H' hours, 'M' minutes, 'S' seconds.
			@example until: new Date(2013, 12-1, 25, 13, 30)
 until: +300
 until: '+1O -2D'
			@property [since] {Date|number|string} The date/time to count up from, or
						number of seconds offset from now, or string for unit offset(s):
						'Y' years, 'O' months, 'W' weeks, 'D' days, 'H' hours, 'M' minutes, 'S' seconds.
			@example since: new Date(2013, 1-1, 1)
 since: -300
 since: '-1O +2D'
			@property [timezone=null] {number} The timezone (hours or minutes from GMT) for the target times,
						or null for client local timezone.
			@example timezone: +10
 timezone: -60
			@property [serverSync=null] {serverSyncCallback} A function to retrieve the current server time
						for synchronisation.
			@property [format='dHMS'] {string} The format for display - upper case for always, lower case only if non-zero,
						'Y' years, 'O' months, 'W' weeks, 'D' days, 'H' hours, 'M' minutes, 'S' seconds.
			@property [layout=''] {string} Build your own layout for the countdown.
			@example layout: '{d<}{dn} {dl}{d>} {hnn}:{mnn}:{snn}'
			@property [compact=false] {boolean} True to display in a compact format, false for an expanded one.
			@property [padZeroes=false] {boolean} True to add leading zeroes
			@property [significant=0] {number} The number of periods with non-zero values to show, zero for all.
			@property [description=''] {string} The description displayed for the countdown.
			@property [expiryUrl=''] {string} A URL to load upon expiry, replacing the current page.
			@property [expiryText=''] {string} Text to display upon expiry, replacing the countdown. This may be HTML.
			@property [alwaysExpire=false] {boolean} True to trigger <code>onExpiry</code> even if target time has passed.
			@property [onExpiry=null] {expiryCallback} Callback when the countdown expires -
						receives no parameters and <code>this</code> is the containing division.
			@example onExpiry: function() {
	...
 }
			@property [onTick=null] {tickCallback} Callback when the countdown is updated -
						receives <code>number[7]</code> being the breakdown by period
						(years, months, weeks, days, hours, minutes, seconds - based on
						<code>format</code>) and <code>this</code> is the containing division.
			@example onTick: function(periods) {
 	var secs = $.countdown.periodsToSeconds(periods);
 	if (secs < 300) { // Last five minutes
		...
 	}
 }
			@property [tickInterval=1] {number} The interval (seconds) between <code>onTick</code> callbacks. */
        defaultOptions: {
            until: null,
            since: null,
            timezone: null,
            serverSync: null,
            format: 'dHMS',
            layout: '',
            compact: false,
            padZeroes: false,
            significant: 0,
            description: '',
            expiryUrl: '',
            expiryText: '',
            alwaysExpire: false,
            onExpiry: null,
            onTick: null,
            tickInterval: 1
        },

        /** Localisations for the plugin.
			Entries are objects indexed by the language code ('' being the default US/English).
			Each object has the following attributes.
			@property [labels=['Years','Months','Weeks','Days','Hours','Minutes','Seconds']] {string[]}
						The display texts for the counter periods.
			@property [labels1=['Year','Month','Week','Day','Hour','Minute','Second']] {string[]}
						The display texts for the counter periods if they have a value of 1.
						Add other <code>labels<em>n</em></code> attributes as necessary to
						cater for other numeric idiosyncrasies of the localisation.
			@property [compactLabels=['y','m','w','d']] {string[]} The compact texts for the counter periods.
			@property [whichLabels=null] {whichLabelsCallback} A function to determine which
						<code>labels<em>n</em></code> to use.
			@example whichLabels: function(num) {
	return (num > 1 ? 0 : 1);
 }
			@property [digits=['0','1',...,'9']] {number[]} The digits to display (0-9).
			@property [timeSeparator=':'] {string} Separator for time periods in the compact layout.
			@property [isRTL=false] {boolean} True for right-to-left languages, false for left-to-right. */
        regionalOptions: { // Available regional settings, indexed by language/country code
            '': { // Default regional settings - English/US
                labels: ['Years', 'Months', 'Weeks', 'Days', 'Hours', 'Minutes', 'Seconds'],
                labels1: ['Year', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second'],
                compactLabels: ['y', 'm', 'w', 'd'],
                whichLabels: null,
                digits: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
                timeSeparator: ':',
                isRTL: false
            }
        },

        /** Names of getter methods - those that can't be chained. */
        _getters: ['getTimes'],

        /* Class name for the right-to-left marker. */
        _rtlClass: pluginName + '-rtl',
        /* Class name for the countdown section marker. */
        _sectionClass: pluginName + '-section',
        /* Class name for the period amount marker. */
        _amountClass: pluginName + '-amount',
        /* Class name for the period name marker. */
        _periodClass: pluginName + '-period',
        /* Class name for the countdown row marker. */
        _rowClass: pluginName + '-row',
        /* Class name for the holding countdown marker. */
        _holdingClass: pluginName + '-holding',
        /* Class name for the showing countdown marker. */
        _showClass: pluginName + '-show',
        /* Class name for the description marker. */
        _descrClass: pluginName + '-descr',

        /* List of currently active countdown elements. */
        _timerElems: [],

        /** Additional setup for the countdown.
			Apply default localisations.
			Create the timer. */
        _init: function () {
            var self = this;
            this._super();
            this._serverSyncs = [];
            var now = (typeof Date.now == 'function' ? Date.now :
				function () { return new Date().getTime(); });
            var perfAvail = (window.performance && typeof window.performance.now == 'function');
            // Shared timer for all countdowns
            function timerCallBack(timestamp) {
                var drawStart = (timestamp < 1e12 ? // New HTML5 high resolution timer
					(perfAvail ? (performance.now() + performance.timing.navigationStart) : now()) :
					// Integer milliseconds since unix epoch
					timestamp || now());
                if (drawStart - animationStartTime >= 1000) {
                    self._updateElems();
                    animationStartTime = drawStart;
                }
                requestAnimationFrame(timerCallBack);
            }
            var requestAnimationFrame = window.requestAnimationFrame ||
				window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame ||
				window.oRequestAnimationFrame || window.msRequestAnimationFrame || null;
            // This is when we expect a fall-back to setInterval as it's much more fluid
            var animationStartTime = 0;
            if (!requestAnimationFrame || $.noRequestAnimationFrame) {
                $.noRequestAnimationFrame = null;
                setInterval(function () { self._updateElems(); }, 980); // Fall back to good old setInterval
            }
            else {
                animationStartTime = window.animationStartTime ||
					window.webkitAnimationStartTime || window.mozAnimationStartTime ||
					window.oAnimationStartTime || window.msAnimationStartTime || now();
                requestAnimationFrame(timerCallBack);
            }
        },

        /** Convert a date/time to UTC.
			@param tz {number} The hour or minute offset from GMT, e.g. +9, -360.
			@param year {Date|number} the date/time in that timezone or the year in that timezone.
			@param [month] {number} The month (0 - 11) (omit if <code>year</code> is a <code>Date</code>).
			@param [day] {number} The day (omit if <code>year</code> is a <code>Date</code>).
			@param [hours] {number} The hour (omit if <code>year</code> is a <code>Date</code>).
			@param [mins] {number} The minute (omit if <code>year</code> is a <code>Date</code>).
			@param [secs] {number} The second (omit if <code>year</code> is a <code>Date</code>).
			@param [ms] {number} The millisecond (omit if <code>year</code> is a <code>Date</code>).
			@return {Date} The equivalent UTC date/time.
			@example $.countdown.UTCDate(+10, 2013, 12-1, 25, 12, 0)
 $.countdown.UTCDate(-7, new Date(2013, 12-1, 25, 12, 0)) */
        UTCDate: function (tz, year, month, day, hours, mins, secs, ms) {
            if (typeof year == 'object' && year.constructor == Date) {
                ms = year.getMilliseconds();
                secs = year.getSeconds();
                mins = year.getMinutes();
                hours = year.getHours();
                day = year.getDate();
                month = year.getMonth();
                year = year.getFullYear();
            }
            var d = new Date();
            d.setUTCFullYear(year);
            d.setUTCDate(1);
            d.setUTCMonth(month || 0);
            d.setUTCDate(day || 1);
            d.setUTCHours(hours || 0);
            d.setUTCMinutes((mins || 0) - (Math.abs(tz) < 30 ? tz * 60 : tz));
            d.setUTCSeconds(secs || 0);
            d.setUTCMilliseconds(ms || 0);
            return d;
        },

        /** Convert a set of periods into seconds.
	   Averaged for months and years.
			@param periods {number[]} The periods per year/month/week/day/hour/minute/second.
			@return {number} The corresponding number of seconds.
			@example var secs = $.countdown.periodsToSeconds(periods) */
        periodsToSeconds: function (periods) {
            return periods[0] * 31557600 + periods[1] * 2629800 + periods[2] * 604800 +
				periods[3] * 86400 + periods[4] * 3600 + periods[5] * 60 + periods[6];
        },

        /** Resynchronise the countdowns with the server.
			@example $.countdown.resync() */
        resync: function () {
            var self = this;
            $('.' + this._getMarker()).each(function () { // Each countdown
                var inst = $.data(this, self.name);
                if (inst.options.serverSync) { // If synced
                    var serverSync = null;
                    for (var i = 0; i < self._serverSyncs.length; i++) {
                        if (self._serverSyncs[i][0] == inst.options.serverSync) { // Find sync details
                            serverSync = self._serverSyncs[i];
                            break;
                        }
                    }
                    if (serverSync[2] == null) { // Recalculate if missing
                        var serverResult = ($.isFunction(inst.options.serverSync) ?
							inst.options.serverSync.apply(this, []) : null);
                        serverSync[2] =
							(serverResult ? new Date().getTime() - serverResult.getTime() : 0) - serverSync[1];
                    }
                    if (inst._since) { // Apply difference
                        inst._since.setMilliseconds(inst._since.getMilliseconds() + serverSync[2]);
                    }
                    inst._until.setMilliseconds(inst._until.getMilliseconds() + serverSync[2]);
                }
            });
            for (var i = 0; i < self._serverSyncs.length; i++) { // Update sync details
                if (self._serverSyncs[i][2] != null) {
                    self._serverSyncs[i][1] += self._serverSyncs[i][2];
                    delete self._serverSyncs[i][2];
                }
            }
        },

        _instSettings: function (elem, options) {
            return { _periods: [0, 0, 0, 0, 0, 0, 0] };
        },

        /** Add an element to the list of active ones.
			@private
			@param elem {Element} The countdown element. */
        _addElem: function (elem) {
            if (!this._hasElem(elem)) {
                this._timerElems.push(elem);
            }
        },

        /** See if an element is in the list of active ones.
			@private
			@param elem {Element} The countdown element.
			@return {boolean} True if present, false if not. */
        _hasElem: function (elem) {
            return ($.inArray(elem, this._timerElems) > -1);
        },

        /** Remove an element from the list of active ones.
			@private
			@param elem {Element} The countdown element. */
        _removeElem: function (elem) {
            this._timerElems = $.map(this._timerElems,
				function (value) { return (value == elem ? null : value); }); // delete entry
        },

        /** Update each active timer element.
			@private */
        _updateElems: function () {
            for (var i = this._timerElems.length - 1; i >= 0; i--) {
                this._updateCountdown(this._timerElems[i]);
            }
        },

        _optionsChanged: function (elem, inst, options) {
            if (options.layout) {
                options.layout = options.layout.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
            }
            this._resetExtraLabels(inst.options, options);
            var timezoneChanged = (inst.options.timezone != options.timezone);
            $.extend(inst.options, options);
            this._adjustSettings(elem, inst,
				options.until != null || options.since != null || timezoneChanged);
            var now = new Date();
            if ((inst._since && inst._since < now) || (inst._until && inst._until > now)) {
                this._addElem(elem[0]);
            }
            this._updateCountdown(elem, inst);
        },

        /** Redisplay the countdown with an updated display.
			@private
			@param elem {Element|jQuery} The containing division.
			@param inst {object} The current settings for this instance. */
        _updateCountdown: function (elem, inst) {
            elem = elem.jquery ? elem : $(elem);
            inst = inst || this._getInst(elem);
            if (!inst) {
                return;
            }
            elem.html(this._generateHTML(inst)).toggleClass(this._rtlClass, inst.options.isRTL);
            if ($.isFunction(inst.options.onTick)) {
                var periods = inst._hold != 'lap' ? inst._periods :
					this._calculatePeriods(inst, inst._show, inst.options.significant, new Date());
                if (inst.options.tickInterval == 1 ||
						this.periodsToSeconds(periods) % inst.options.tickInterval == 0) {
                    inst.options.onTick.apply(elem[0], [periods]);
                }
            }
            var expired = inst._hold != 'pause' &&
				(inst._since ? inst._now.getTime() < inst._since.getTime() :
				inst._now.getTime() >= inst._until.getTime());
            if (expired && !inst._expiring) {
                inst._expiring = true;
                if (this._hasElem(elem[0]) || inst.options.alwaysExpire) {
                    this._removeElem(elem[0]);
                    if ($.isFunction(inst.options.onExpiry)) {
                        inst.options.onExpiry.apply(elem[0], []);
                    }
                    if (inst.options.expiryText) {
                        var layout = inst.options.layout;
                        inst.options.layout = inst.options.expiryText;
                        this._updateCountdown(elem[0], inst);
                        inst.options.layout = layout;
                    }
                    if (inst.options.expiryUrl) {
                        window.location = inst.options.expiryUrl;
                    }
                }
                inst._expiring = false;
            }
            else if (inst._hold == 'pause') {
                this._removeElem(elem[0]);
            }
        },

        /** Reset any extra labelsn and compactLabelsn entries if changing labels.
			@private
			@param base {object} The options to be updated.
			@param options {object} The new option values. */
        _resetExtraLabels: function (base, options) {
            for (var n in options) {
                if (n.match(/[Ll]abels[02-9]|compactLabels1/)) {
                    base[n] = options[n];
                }
            }
            for (var n in base) { // Remove custom numbered labels
                if (n.match(/[Ll]abels[02-9]|compactLabels1/) && typeof options[n] === 'undefined') {
                    base[n] = null;
                }
            }
        },

        /** Calculate internal settings for an instance.
			@private
			@param elem {jQuery} The containing division.
			@param inst {object} The current settings for this instance.
			@param recalc {boolean} True if until or since are set. */
        _adjustSettings: function (elem, inst, recalc) {
            var serverEntry = null;
            for (var i = 0; i < this._serverSyncs.length; i++) {
                if (this._serverSyncs[i][0] == inst.options.serverSync) {
                    serverEntry = this._serverSyncs[i][1];
                    break;
                }
            }
            if (serverEntry != null) {
                var serverOffset = (inst.options.serverSync ? serverEntry : 0);
                var now = new Date();
            }
            else {
                var serverResult = ($.isFunction(inst.options.serverSync) ?
                        inst.options.serverSync.apply(elem[0], []) : null);
                var now = new Date();
                var serverOffset = (serverResult ? now.getTime() - serverResult.getTime() : 0);
                this._serverSyncs.push([inst.options.serverSync, serverOffset]);
            }
            var timezone = inst.options.timezone;
            timezone = (timezone == null ? -now.getTimezoneOffset() : timezone);
            if (recalc || (!recalc && inst._until == null && inst._since == null)) {
                inst._since = inst.options.since;
                if (inst._since != null) {
                    inst._since = this.UTCDate(timezone, this._determineTime(inst._since, null));
                    if (inst._since && serverOffset) {
                        inst._since.setMilliseconds(inst._since.getMilliseconds() + serverOffset);
                    }
                }
                inst._until = this.UTCDate(timezone, this._determineTime(inst.options.until, now));
                if (serverOffset) {
                    inst._until.setMilliseconds(inst._until.getMilliseconds() + serverOffset);
                }
            }
            inst._show = this._determineShow(inst);
        },

        /** Remove the countdown widget from a div.
			@param elem {jQuery} The containing division.
			@param inst {object} The current instance object. */
        _preDestroy: function (elem, inst) {
            this._removeElem(elem[0]);
            elem.empty();
        },

        /** Pause a countdown widget at the current time.
	   Stop it running but remember and display the current time.
			@param elem {Element} The containing division.
			@example $(selector).countdown('pause') */
        pause: function (elem) {
            this._hold(elem, 'pause');
        },

        /** Pause a countdown widget at the current time.
	   Stop the display but keep the countdown running.
			@param elem {Element} The containing division.
			@example $(selector).countdown('lap') */
        lap: function (elem) {
            this._hold(elem, 'lap');
        },

        /** Resume a paused countdown widget.
			@param elem {Element} The containing division.
			@example $(selector).countdown('resume') */
        resume: function (elem) {
            this._hold(elem, null);
        },

        /** Toggle a paused countdown widget.
			@param elem {Element} The containing division.
			@example $(selector).countdown('toggle') */
        toggle: function (elem) {
            var inst = $.data(elem, this.name) || {};
            this[!inst._hold ? 'pause' : 'resume'](elem);
        },

        /** Toggle a lapped countdown widget.
			@param elem {Element} The containing division.
			@example $(selector).countdown('toggleLap') */
        toggleLap: function (elem) {
            var inst = $.data(elem, this.name) || {};
            this[!inst._hold ? 'lap' : 'resume'](elem);
        },

        /** Pause or resume a countdown widget.
			@private
			@param elem {Element} The containing division.
			@param hold {string} The new hold setting. */
        _hold: function (elem, hold) {
            var inst = $.data(elem, this.name);
            if (inst) {
                if (inst._hold == 'pause' && !hold) {
                    inst._periods = inst._savePeriods;
                    var sign = (inst._since ? '-' : '+');
                    inst[inst._since ? '_since' : '_until'] =
                        this._determineTime(sign + inst._periods[0] + 'y' +
                            sign + inst._periods[1] + 'o' + sign + inst._periods[2] + 'w' +
                            sign + inst._periods[3] + 'd' + sign + inst._periods[4] + 'h' +
                            sign + inst._periods[5] + 'm' + sign + inst._periods[6] + 's');
                    this._addElem(elem);
                }
                inst._hold = hold;
                inst._savePeriods = (hold == 'pause' ? inst._periods : null);
                $.data(elem, this.name, inst);
                this._updateCountdown(elem, inst);
            }
        },

        /** Return the current time periods.
			@param elem {Element} The containing division.
			@return {number[]} The current periods for the countdown.
			@example var periods = $(selector).countdown('getTimes') */
        getTimes: function (elem) {
            var inst = $.data(elem, this.name);
            return (!inst ? null : (inst._hold == 'pause' ? inst._savePeriods : (!inst._hold ? inst._periods :
                this._calculatePeriods(inst, inst._show, inst.options.significant, new Date()))));
        },

        /** A time may be specified as an exact value or a relative one.
			@private
			@param setting {string|number|Date} The date/time value as a relative or absolute value.
			@param defaultTime {Date} The date/time to use if no other is supplied.
			@return {Date} The corresponding date/time. */
        _determineTime: function (setting, defaultTime) {
            var self = this;
            var offsetNumeric = function (offset) { // e.g. +300, -2
                var time = new Date();
                time.setTime(time.getTime() + offset * 1000);
                return time;
            };
            var offsetString = function (offset) { // e.g. '+2d', '-4w', '+3h +30m'
                offset = offset.toLowerCase();
                var time = new Date();
                var year = time.getFullYear();
                var month = time.getMonth();
                var day = time.getDate();
                var hour = time.getHours();
                var minute = time.getMinutes();
                var second = time.getSeconds();
                var pattern = /([+-]?[0-9]+)\s*(s|m|h|d|w|o|y)?/g;
                var matches = pattern.exec(offset);
                while (matches) {
                    switch (matches[2] || 's') {
                        case 's': second += parseInt(matches[1], 10); break;
                        case 'm': minute += parseInt(matches[1], 10); break;
                        case 'h': hour += parseInt(matches[1], 10); break;
                        case 'd': day += parseInt(matches[1], 10); break;
                        case 'w': day += parseInt(matches[1], 10) * 7; break;
                        case 'o':
                            month += parseInt(matches[1], 10);
                            day = Math.min(day, self._getDaysInMonth(year, month));
                            break;
                        case 'y':
                            year += parseInt(matches[1], 10);
                            day = Math.min(day, self._getDaysInMonth(year, month));
                            break;
                    }
                    matches = pattern.exec(offset);
                }
                return new Date(year, month, day, hour, minute, second, 0);
            };
            var time = (setting == null ? defaultTime :
                (typeof setting == 'string' ? offsetString(setting) :
                (typeof setting == 'number' ? offsetNumeric(setting) : setting)));
            if (time) time.setMilliseconds(0);
            return time;
        },

        /** Determine the number of days in a month.
			@private
			@param year {number} The year.
			@param month {number} The month.
			@return {number} The days in that month. */
        _getDaysInMonth: function (year, month) {
            return 32 - new Date(year, month, 32).getDate();
        },

        /** Default implementation to determine which set of labels should be used for an amount.
			Use the <code>labels</code> attribute with the same numeric suffix (if it exists).
			@private
			@param num {number} The amount to be displayed.
			@return {number} The set of labels to be used for this amount. */
        _normalLabels: function (num) {
            return num;
        },

        /** Generate the HTML to display the countdown widget.
			@private
			@param inst {object} The current settings for this instance.
			@return {string} The new HTML for the countdown display. */
        _generateHTML: function (inst) {
            var self = this;
            // Determine what to show
            inst._periods = (inst._hold ? inst._periods :
                this._calculatePeriods(inst, inst._show, inst.options.significant, new Date()));
            // Show all 'asNeeded' after first non-zero value
            var shownNonZero = false;
            var showCount = 0;
            var sigCount = inst.options.significant;
            var show = $.extend({}, inst._show);
            for (var period = Y; period <= S; period++) {
                shownNonZero |= (inst._show[period] == '?' && inst._periods[period] > 0);
                show[period] = (inst._show[period] == '?' && !shownNonZero ? null : inst._show[period]);
                showCount += (show[period] ? 1 : 0);
                sigCount -= (inst._periods[period] > 0 ? 1 : 0);
            }
            var showSignificant = [false, false, false, false, false, false, false];
            for (var period = S; period >= Y; period--) { // Determine significant periods
                if (inst._show[period]) {
                    if (inst._periods[period]) {
                        showSignificant[period] = true;
                    }
                    else {
                        showSignificant[period] = sigCount > 0;
                        sigCount--;
                    }
                }
            }
            var labels = (inst.options.compact ? inst.options.compactLabels : inst.options.labels);
            var whichLabels = inst.options.whichLabels || this._normalLabels;
            var showCompact = function (period) {
                var labelsNum = inst.options['compactLabels' + whichLabels(inst._periods[period])];
                return (show[period] ? self._translateDigits(inst, inst._periods[period]) +
                    (labelsNum ? labelsNum[period] : labels[period]) + ' ' : '');
            };
            var minDigits = (inst.options.padZeroes ? 2 : 1);
            var showFull = function (period) {
                var labelsNum = inst.options['labels' + whichLabels(inst._periods[period])];
                return ((!inst.options.significant && show[period]) ||
                    (inst.options.significant && showSignificant[period]) ?
                        '<span class="' + self._sectionClass + '">' +
                        '<span class="' + self._amountClass + '">' +
                    self._minDigits(inst, inst._periods[period], minDigits) + '</span>' +
                    '<span class="' + self._periodClass + '">' +
                    (labelsNum ? labelsNum[period] : labels[period]) + '</span></span>' : '');
            };
            return (inst.options.layout ? this._buildLayout(inst, show, inst.options.layout,
                inst.options.compact, inst.options.significant, showSignificant) :
                ((inst.options.compact ? // Compact version
                '<span class="' + this._rowClass + ' ' + this._amountClass +
                (inst._hold ? ' ' + this._holdingClass : '') + '">' +
                showCompact(Y) + showCompact(O) + showCompact(W) + showCompact(D) +
                (show[H] ? this._minDigits(inst, inst._periods[H], 2) : '') +
                (show[M] ? (show[H] ? inst.options.timeSeparator : '') +
                this._minDigits(inst, inst._periods[M], 2) : '') +
                (show[S] ? (show[H] || show[M] ? inst.options.timeSeparator : '') +
                this._minDigits(inst, inst._periods[S], 2) : '') :
                // Full version
                '<span class="' + this._rowClass + ' ' + this._showClass + (inst.options.significant || showCount) +
                (inst._hold ? ' ' + this._holdingClass : '') + '">' +
                showFull(Y) + showFull(O) + showFull(W) + showFull(D) +
                showFull(H) + showFull(M) + showFull(S)) + '</span>' +
                (inst.options.description ? '<span class="' + this._rowClass + ' ' + this._descrClass + '">' +
                inst.options.description + '</span>' : '')));
        },

        /** Construct a custom layout.
			@private
			@param inst {object} The current settings for this instance.
			@param show {boolean[]} Flags indicating which periods are requested.
			@param layout {string} The customised layout.
			@param compact {boolean} True if using compact labels.
			@param significant {number} The number of periods with values to show, zero for all.
			@param showSignificant {boolean[]} Other periods to show for significance.
			@return {string} The custom HTML. */
        _buildLayout: function (inst, show, layout, compact, significant, showSignificant) {
            var labels = inst.options[compact ? 'compactLabels' : 'labels'];
            var whichLabels = inst.options.whichLabels || this._normalLabels;
            var labelFor = function (index) {
                return (inst.options[(compact ? 'compactLabels' : 'labels') +
                    whichLabels(inst._periods[index])] || labels)[index];
            };
            var digit = function (value, position) {
                return inst.options.digits[Math.floor(value / position) % 10];
            };
            var subs = {
                desc: inst.options.description, sep: inst.options.timeSeparator,
                yl: labelFor(Y), yn: this._minDigits(inst, inst._periods[Y], 1),
                ynn: this._minDigits(inst, inst._periods[Y], 2),
                ynnn: this._minDigits(inst, inst._periods[Y], 3), y1: digit(inst._periods[Y], 1),
                y10: digit(inst._periods[Y], 10), y100: digit(inst._periods[Y], 100),
                y1000: digit(inst._periods[Y], 1000),
                ol: labelFor(O), on: this._minDigits(inst, inst._periods[O], 1),
                onn: this._minDigits(inst, inst._periods[O], 2),
                onnn: this._minDigits(inst, inst._periods[O], 3), o1: digit(inst._periods[O], 1),
                o10: digit(inst._periods[O], 10), o100: digit(inst._periods[O], 100),
                o1000: digit(inst._periods[O], 1000),
                wl: labelFor(W), wn: this._minDigits(inst, inst._periods[W], 1),
                wnn: this._minDigits(inst, inst._periods[W], 2),
                wnnn: this._minDigits(inst, inst._periods[W], 3), w1: digit(inst._periods[W], 1),
                w10: digit(inst._periods[W], 10), w100: digit(inst._periods[W], 100),
                w1000: digit(inst._periods[W], 1000),
                dl: labelFor(D), dn: this._minDigits(inst, inst._periods[D], 1),
                dnn: this._minDigits(inst, inst._periods[D], 2),
                dnnn: this._minDigits(inst, inst._periods[D], 3), d1: digit(inst._periods[D], 1),
                d10: digit(inst._periods[D], 10), d100: digit(inst._periods[D], 100),
                d1000: digit(inst._periods[D], 1000),
                hl: labelFor(H), hn: this._minDigits(inst, inst._periods[H], 1),
                hnn: this._minDigits(inst, inst._periods[H], 2),
                hnnn: this._minDigits(inst, inst._periods[H], 3), h1: digit(inst._periods[H], 1),
                h10: digit(inst._periods[H], 10), h100: digit(inst._periods[H], 100),
                h1000: digit(inst._periods[H], 1000),
                ml: labelFor(M), mn: this._minDigits(inst, inst._periods[M], 1),
                mnn: this._minDigits(inst, inst._periods[M], 2),
                mnnn: this._minDigits(inst, inst._periods[M], 3), m1: digit(inst._periods[M], 1),
                m10: digit(inst._periods[M], 10), m100: digit(inst._periods[M], 100),
                m1000: digit(inst._periods[M], 1000),
                sl: labelFor(S), sn: this._minDigits(inst, inst._periods[S], 1),
                snn: this._minDigits(inst, inst._periods[S], 2),
                snnn: this._minDigits(inst, inst._periods[S], 3), s1: digit(inst._periods[S], 1),
                s10: digit(inst._periods[S], 10), s100: digit(inst._periods[S], 100),
                s1000: digit(inst._periods[S], 1000)
            };
            var html = layout;
            // Replace period containers: {p<}...{p>}
            for (var i = Y; i <= S; i++) {
                var period = 'yowdhms'.charAt(i);
                var re = new RegExp('\\{' + period + '<\\}([\\s\\S]*)\\{' + period + '>\\}', 'g');
                html = html.replace(re, ((!significant && show[i]) ||
                    (significant && showSignificant[i]) ? '$1' : ''));
            }
            // Replace period values: {pn}
            $.each(subs, function (n, v) {
                var re = new RegExp('\\{' + n + '\\}', 'g');
                html = html.replace(re, v);
            });
            return html;
        },

        /** Ensure a numeric value has at least n digits for display.
			@private
			@param inst {object} The current settings for this instance.
			@param value {number} The value to display.
			@param len {number} The minimum length.
			@return {string} The display text. */
        _minDigits: function (inst, value, len) {
            value = '' + value;
            if (value.length >= len) {
                return this._translateDigits(inst, value);
            }
            value = '0000000000' + value;
            return this._translateDigits(inst, value.substr(value.length - len));
        },

        /** Translate digits into other representations.
			@private
			@param inst {object} The current settings for this instance.
			@param value {string} The text to translate.
			@return {string} The translated text. */
        _translateDigits: function (inst, value) {
            return ('' + value).replace(/[0-9]/g, function (digit) {
                return inst.options.digits[digit];
            });
        },

        /** Translate the format into flags for each period.
			@private
			@param inst {object} The current settings for this instance.
			@return {string[]} Flags indicating which periods are requested (?) or
					required (!) by year, month, week, day, hour, minute, second. */
        _determineShow: function (inst) {
            var format = inst.options.format;
            var show = [];
            show[Y] = (format.match('y') ? '?' : (format.match('Y') ? '!' : null));
            show[O] = (format.match('o') ? '?' : (format.match('O') ? '!' : null));
            show[W] = (format.match('w') ? '?' : (format.match('W') ? '!' : null));
            show[D] = (format.match('d') ? '?' : (format.match('D') ? '!' : null));
            show[H] = (format.match('h') ? '?' : (format.match('H') ? '!' : null));
            show[M] = (format.match('m') ? '?' : (format.match('M') ? '!' : null));
            show[S] = (format.match('s') ? '?' : (format.match('S') ? '!' : null));
            return show;
        },

        /** Calculate the requested periods between now and the target time.
			@private
			@param inst {object} The current settings for this instance.
			@param show {string[]} Flags indicating which periods are requested/required.
			@param significant {number} The number of periods with values to show, zero for all.
			@param now {Date} The current date and time.
			@return {number[]} The current time periods (always positive)
					by year, month, week, day, hour, minute, second. */
        _calculatePeriods: function (inst, show, significant, now) {
            // Find endpoints
            inst._now = now;
            inst._now.setMilliseconds(0);
            var until = new Date(inst._now.getTime());
            if (inst._since) {
                if (now.getTime() < inst._since.getTime()) {
                    inst._now = now = until;
                }
                else {
                    now = inst._since;
                }
            }
            else {
                until.setTime(inst._until.getTime());
                if (now.getTime() > inst._until.getTime()) {
                    inst._now = now = until;
                }
            }
            // Calculate differences by period
            var periods = [0, 0, 0, 0, 0, 0, 0];
            if (show[Y] || show[O]) {
                // Treat end of months as the same
                var lastNow = this._getDaysInMonth(now.getFullYear(), now.getMonth());
                var lastUntil = this._getDaysInMonth(until.getFullYear(), until.getMonth());
                var sameDay = (until.getDate() == now.getDate() ||
                    (until.getDate() >= Math.min(lastNow, lastUntil) &&
                    now.getDate() >= Math.min(lastNow, lastUntil)));
                var getSecs = function (date) {
                    return (date.getHours() * 60 + date.getMinutes()) * 60 + date.getSeconds();
                };
                var months = Math.max(0,
                    (until.getFullYear() - now.getFullYear()) * 12 + until.getMonth() - now.getMonth() +
                    ((until.getDate() < now.getDate() && !sameDay) ||
                    (sameDay && getSecs(until) < getSecs(now)) ? -1 : 0));
                periods[Y] = (show[Y] ? Math.floor(months / 12) : 0);
                periods[O] = (show[O] ? months - periods[Y] * 12 : 0);
                // Adjust for months difference and end of month if necessary
                now = new Date(now.getTime());
                var wasLastDay = (now.getDate() == lastNow);
                var lastDay = this._getDaysInMonth(now.getFullYear() + periods[Y],
                    now.getMonth() + periods[O]);
                if (now.getDate() > lastDay) {
                    now.setDate(lastDay);
                }
                now.setFullYear(now.getFullYear() + periods[Y]);
                now.setMonth(now.getMonth() + periods[O]);
                if (wasLastDay) {
                    now.setDate(lastDay);
                }
            }
            var diff = Math.floor((until.getTime() - now.getTime()) / 1000);
            var extractPeriod = function (period, numSecs) {
                periods[period] = (show[period] ? Math.floor(diff / numSecs) : 0);
                diff -= periods[period] * numSecs;
            };
            extractPeriod(W, 604800);
            extractPeriod(D, 86400);
            extractPeriod(H, 3600);
            extractPeriod(M, 60);
            extractPeriod(S, 1);
            if (diff > 0 && !inst._since) { // Round up if left overs
                var multiplier = [1, 12, 4.3482, 7, 24, 60, 60];
                var lastShown = S;
                var max = 1;
                for (var period = S; period >= Y; period--) {
                    if (show[period]) {
                        if (periods[lastShown] >= max) {
                            periods[lastShown] = 0;
                            diff = 1;
                        }
                        if (diff > 0) {
                            periods[period]++;
                            diff = 0;
                            lastShown = period;
                            max = 1;
                        }
                    }
                    max *= multiplier[period];
                }
            }
            if (significant) { // Zero out insignificant periods
                for (var period = Y; period <= S; period++) {
                    if (significant && periods[period]) {
                        significant--;
                    }
                    else if (!significant) {
                        periods[period] = 0;
                    }
                }
            }
            return periods;
        }
    });

})(jQuery);

/**
 * jQuery Editable Select
 * by Indri Muska <indrimuska@gmail.com>
 *
 * Source on GitHub @ https://github.com/indrimuska/jquery-editable-select
 *
 * File: jquery.editable-select.js
 */
(function ($) {
    $.extend($.expr[':'], {
        nic: function (elem, i, match, array) {
            return !((elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0);
        }
    });
    $.fn.editableSelect = function (options) {
        var defaults = { filter: true, effect: 'default', duration: 'fast', onCreate: null, onShow: null, onHide: null, onSelect: null };
        var select = this.clone(), input = $('<input type="text">'), list = $('<ul class="es-list">');
        var listIndex = ""; //jjack
        var listCount = 0; //jjack
        var listArray = []; //jjack
        var filterPending = false; //jjack
        options = $.extend({}, defaults, options);
        switch (options.effects) {
            case 'default': case 'fade': case 'slide': break;
            default: options.effects = 'default';
        }
        if (isNaN(options.duration) && options.duration == 'fast' && options.duration == 'slow') options.duration = 'fast';
        this.replaceWith(input);
        var EditableSelect = {
            init: function () {
                var es = this;
                es.copyAttributes(select, input);
                input.addClass('es-input');
                $(document.body).append(list);
                select.find('option').each(function () {
                    var li = $('<li>');
                    li.html($(this).text());
                    es.copyAttributes(this, li);
                    var liId = "es-list-item-" + listCount; //jjack
                    listArray.push(liId);
                    listCount++; //jjack
                    li.attr("id", liId); //jjack
                    list.append(li);
                    listIndex += "[" + liId + "|" + $(this).text() + "]"; //jjack
                    if ($(this).attr('selected')) input.val($(this).text());
                });
                input.on('focus input click', es.show);
                $(document).click(function (event) {
                    if (!$(event.target).is(input) && !$(event.target).is(list)) es.hide();
                });
                es.initializeList();
                es.initializeEvents();
                if (options.onCreate) options.onCreate.call(this, input);
            },
            initializeList: function () {
                var es = this;
                list.find('li').each(function () {
                    $(this).on('mousemove', function () {
                        list.find('.selected').removeClass('selected');
                        $(this).addClass('selected');
                    });
                    $(this).click(function () { es.setField.call(this, es); });
                });
                list.mouseenter(function () {
                    list.find('li.selected').removeClass('selected');
                });
            },
            initializeEvents: function () {
                var es = this;
                input.bind('input keydown', function (event) {
                    switch (event.keyCode) {
                        case 40: // Down
                            es.show();
                            var visibles = list.find('li:visible'), selected = visibles.filter('li.selected');
                            list.find('.selected').removeClass('selected');
                            selected = visibles.eq(selected.size() > 0 ? visibles.index(selected) + 1 : 0);
                            selected = (selected.size() > 0 ? selected : list.find('li:visible:first')).addClass('selected');
                            es.scroll(selected, true);
                            break;
                        case 38: // Up
                            es.show();
                            var visibles = list.find('li:visible'), selected = visibles.filter('li.selected');
                            list.find('li.selected').removeClass('selected');
                            selected = visibles.eq(selected.size() > 0 ? visibles.index(selected) - 1 : -1);
                            (selected.size() > 0 ? selected : list.find('li:visible:last')).addClass('selected');
                            es.scroll(selected, false);
                            break;
                        case 13: // Enter
                            if (list.is(':visible')) {
                                es.setField.call(list.find('li.selected'), es);
                                event.preventDefault();
                            }
                        case 9:  // Tab
                        case 27: // Esc
                            es.hide();
                            break;
                        default:
                            es.show();
                            break;
                    }
                });
            },
            show: function () {
                //jjack
                if (!filterPending) {
                    filterPending = true;
                    setTimeout(function () {
                        filterPending = false;
                        var start = Date.now();

                        var term = input.val() || "";
                        var regex = new RegExp("es-list-item-[0-9]+(?=\\|[^\\]]*" + term + "[^\\]]*\\])", "gi");
                        var res = listIndex.match(regex);
                        var resCount = res ? res.length : 0;

                        if (resCount == listCount) {
                            for (var i in listArray) {
                                document.getElementById(listArray[i]).style.display = "block";
                            }
                        } else {
                            for (var i in listArray) {
                                document.getElementById(listArray[i]).style.display = "none";
                            }

                            for (var i in res) {
                                document.getElementById(res[i]).style.display = "block";
                            }
                        }

                        list.css({ top: input.offset().top + input.outerHeight() - 1, left: input.offset().left, width: input.innerWidth() });
                        var hidden = options.filter ? listCount - resCount : 0;
                        if (hidden == listCount) list.hide();
                        else
                            switch (options.effects) {
                                case 'fade': list.fadeIn(options.duration); break;
                                case 'slide': list.slideDown(options.duration); break;
                                default: list.show(options.duration); break;
                            }
                        if (options.onShow) options.onShow.call(this, input);
                    }, 200);
                }
                //jjack

                /*
                list.find('li').show();
                list.css({ top: input.offset().top + input.outerHeight() - 1, left: input.offset().left, width: input.innerWidth() });
                var hidden = options.filter ? list.find('li:nic(' + input.val() + ')').hide().size() : 0;
                if (hidden == list.find('li').size()) list.hide();
                else
                    switch (options.effects) {
                        case 'fade': list.fadeIn(options.duration); break;
                        case 'slide': list.slideDown(options.duration); break;
                        default: list.show(options.duration); break;
                    }
                if (options.onShow) options.onShow.call(this, input);
                */
            },
            hide: function () {
                switch (options.effects) {
                    case 'fade': list.fadeOut(options.duration); break;
                    case 'slide': list.slideUp(options.duration); break;
                    default: list.hide(options.duration); break;
                }
                if (options.onHide) options.onHide.call(this, input);
            },
            scroll: function (selected, up) {
                var height = 0, index = list.find('li:visible').index(selected);
                list.find('li:visible').each(function (i, element) { if (i < index) height += $(element).outerHeight(); });
                if (height + selected.outerHeight() >= list.scrollTop() + list.outerHeight() || height <= list.scrollTop()) {
                    if (up) list.scrollTop(height + selected.outerHeight() - list.outerHeight());
                    else list.scrollTop(height);
                }
            },
            copyAttributes: function (from, to) {
                var attrs = $(from)[0].attributes;
                for (var i in attrs) $(to).attr(attrs[i].nodeName, attrs[i].nodeValue);
            },
            setField: function (es) {
                if (!$(this).is('li:visible')) return false;
                input.val($(this).text());
                es.hide();
                if (options.onSelect) options.onSelect.call(input, $(this));
            }
        };
        EditableSelect.init();
        return input;
    }
})(jQuery);

var module;
(module || {}).exports = renderjson = (function () {
    var themetext = function (/* [class, text]+ */) {
        var spans = [];
        while (arguments.length)
            spans.push(append(span(Array.prototype.shift.call(arguments)),
                              text(Array.prototype.shift.call(arguments))));
        return spans;
    };
    var append = function (/* el, ... */) {
        var el = Array.prototype.shift.call(arguments);
        for (var a = 0; a < arguments.length; a++)
            if (arguments[a].constructor == Array)
                append.apply(this, [el].concat(arguments[a]));
            else
                el.appendChild(arguments[a]);
        return el;
    };
    var prepend = function (el, child) {
        el.insertBefore(child, el.firstChild);
        return el;
    }
    var isempty = function (obj) {
        for (var k in obj) if (obj.hasOwnProperty(k)) return false;
        return true;
    }
    var text = function (txt) { return document.createTextNode(txt) };
    var div = function () { return document.createElement("div") };
    var span = function (classname) {
        var s = document.createElement("span");
        if (classname) s.className = classname;
        return s;
    };
    var A = function A(txt, classname, callback) {
        var a = document.createElement("a");
        if (classname) a.className = classname;
        a.appendChild(text(txt));
        a.href = '#';
        a.onclick = function () { callback(); return false; };
        return a;
    };

    function _renderjson(json, indent, dont_indent, show_level, sort_objects) {
        var my_indent = dont_indent ? "" : indent;

        if (json === null) return themetext(null, my_indent, "keyword", "null");
        if (json === void 0) return themetext(null, my_indent, "keyword", "undefined");
        if (typeof (json) != "object") // Strings, numbers and bools
            return themetext(null, my_indent, typeof (json), JSON.stringify(json));

        var disclosure = function (open, close, type, builder) {
            var content;
            var empty = span(type);
            var show = function () {
                if (!content) append(empty.parentNode,
                                     content = prepend(builder(),
                                                       A(renderjson.hide, "disclosure",
                                                         function () {
                                                             content.style.display = "none";
                                                             empty.style.display = "inline";
                                                         })));
                content.style.display = "inline";
                empty.style.display = "none";
            };
            append(empty,
                   A(renderjson.show, "disclosure", show),
                   themetext(type + " syntax", open),
                   A(" ... ", null, show),
                   themetext(type + " syntax", close));

            var el = append(span(), text(my_indent.slice(0, -1)), empty);
            if (show_level > 0)
                show();
            return el;
        };

        if (json.constructor == Array) {
            if (json.length == 0) return themetext(null, my_indent, "array syntax", "[]");

            return disclosure("[", "]", "array", function () {
                var as = append(span("array"), themetext("array syntax", "[", null, "\n"));
                for (var i = 0; i < json.length; i++)
                    append(as,
                           _renderjson(json[i], indent + "    ", false, show_level - 1, sort_objects),
                           i != json.length - 1 ? themetext("syntax", ",") : [],
                           text("\n"));
                append(as, themetext(null, indent, "array syntax", "]"));
                return as;
            });
        }

        // object
        if (isempty(json))
            return themetext(null, my_indent, "object syntax", "{}");

        return disclosure("{", "}", "object", function () {
            var os = append(span("object"), themetext("object syntax", "{", null, "\n"));
            for (var k in json) var last = k;
            var keys = Object.keys(json);
            if (sort_objects)
                keys = keys.sort();
            for (var i in keys) {
                var k = keys[i];
                append(os, themetext(null, indent + "    ", "key", '"' + k + '"', "object syntax", ': '),
                       _renderjson(json[k], indent + "    ", true, show_level - 1, sort_objects),
                       k != last ? themetext("syntax", ",") : [],
                       text("\n"));
            }
            append(os, themetext(null, indent, "object syntax", "}"));
            return os;
        });
    }

    var renderjson = function renderjson(json) {
        var pre = append(document.createElement("pre"), _renderjson(json, "", false, renderjson.show_to_level, renderjson.sort_objects));
        pre.className = "renderjson";
        return pre;
    }
    renderjson.set_icons = function (show, hide) {
        renderjson.show = show;
        renderjson.hide = hide;
        return renderjson;
    };
    renderjson.set_show_to_level = function (level) {
        renderjson.show_to_level = typeof level == "string" &&
                                   level.toLowerCase() === "all" ? Number.MAX_VALUE
                                                                 : level;
        return renderjson;
    };
    renderjson.set_sort_objects = function (sort_bool) {
        renderjson.sort_objects = sort_bool;
        return renderjson;
    };
    // Backwards compatiblity. Use set_show_to_level() for new code.
    renderjson.set_show_by_default = function (show) {
        renderjson.show_to_level = show ? Number.MAX_VALUE : 0;
        return renderjson;
    };
    renderjson.set_icons('⊕', '⊖');
    renderjson.set_show_by_default(false);
    renderjson.set_sort_objects(false);
    return renderjson;
})();
!function (e) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = e(); else if ("function" == typeof define && define.amd) define([], e); else { var n; "undefined" != typeof window ? n = window : "undefined" != typeof global ? n = global : "undefined" != typeof self && (n = self), n.uuid = e() } }(function () { return function e(n, r, o) { function t(f, u) { if (!r[f]) { if (!n[f]) { var a = "function" == typeof require && require; if (!u && a) return a(f, !0); if (i) return i(f, !0); var d = new Error("Cannot find module '" + f + "'"); throw d.code = "MODULE_NOT_FOUND", d } var s = r[f] = { exports: {} }; n[f][0].call(s.exports, function (e) { var r = n[f][1][e]; return t(r ? r : e) }, s, s.exports, e, n, r, o) } return r[f].exports } for (var i = "function" == typeof require && require, f = 0; f < o.length; f++) t(o[f]); return t }({ 1: [function (e, n, r) { var o = e("./v1"), t = e("./v4"), i = t; i.v1 = o, i.v4 = t, n.exports = i }, { "./v1": 4, "./v4": 5 }], 2: [function (e, n, r) { function o(e, n) { var r = n || 0, o = t; return o[e[r++]] + o[e[r++]] + o[e[r++]] + o[e[r++]] + "-" + o[e[r++]] + o[e[r++]] + "-" + o[e[r++]] + o[e[r++]] + "-" + o[e[r++]] + o[e[r++]] + "-" + o[e[r++]] + o[e[r++]] + o[e[r++]] + o[e[r++]] + o[e[r++]] + o[e[r++]] } for (var t = [], i = 0; i < 256; ++i) t[i] = (i + 256).toString(16).substr(1); n.exports = o }, {}], 3: [function (e, n, r) { (function (e) { var r, o = e.crypto || e.msCrypto; if (o && o.getRandomValues) { var t = new Uint8Array(16); r = function () { return o.getRandomValues(t), t } } if (!r) { var i = new Array(16); r = function () { for (var e, n = 0; n < 16; n++) 0 === (3 & n) && (e = 4294967296 * Math.random()), i[n] = e >>> ((3 & n) << 3) & 255; return i } } n.exports = r }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}], 4: [function (e, n, r) { function o(e, n, r) { var o = n && r || 0, t = n || []; e = e || {}; var f = void 0 !== e.clockseq ? e.clockseq : a, l = void 0 !== e.msecs ? e.msecs : (new Date).getTime(), c = void 0 !== e.nsecs ? e.nsecs : s + 1, v = l - d + (c - s) / 1e4; if (v < 0 && void 0 === e.clockseq && (f = f + 1 & 16383), (v < 0 || l > d) && void 0 === e.nsecs && (c = 0), c >= 1e4) throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); d = l, s = c, a = f, l += 122192928e5; var p = (1e4 * (268435455 & l) + c) % 4294967296; t[o++] = p >>> 24 & 255, t[o++] = p >>> 16 & 255, t[o++] = p >>> 8 & 255, t[o++] = 255 & p; var y = l / 4294967296 * 1e4 & 268435455; t[o++] = y >>> 8 & 255, t[o++] = 255 & y, t[o++] = y >>> 24 & 15 | 16, t[o++] = y >>> 16 & 255, t[o++] = f >>> 8 | 128, t[o++] = 255 & f; for (var b = e.node || u, w = 0; w < 6; ++w) t[o + w] = b[w]; return n ? n : i(t) } var t = e("./lib/rng"), i = e("./lib/bytesToUuid"), f = t(), u = [1 | f[0], f[1], f[2], f[3], f[4], f[5]], a = 16383 & (f[6] << 8 | f[7]), d = 0, s = 0; n.exports = o }, { "./lib/bytesToUuid": 2, "./lib/rng": 3 }], 5: [function (e, n, r) { function o(e, n, r) { var o = n && r || 0; "string" == typeof e && (n = "binary" == e ? new Array(16) : null, e = null), e = e || {}; var f = e.random || (e.rng || t)(); if (f[6] = 15 & f[6] | 64, f[8] = 63 & f[8] | 128, n) for (var u = 0; u < 16; ++u) n[o + u] = f[u]; return n || i(f) } var t = e("./lib/rng"), i = e("./lib/bytesToUuid"); n.exports = o }, { "./lib/bytesToUuid": 2, "./lib/rng": 3 }] }, {}, [1])(1) });
//! moment.js
//! version : 2.18.2
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return rd.apply(null,arguments)}function b(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function c(a){return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function d(a){var b;for(b in a)return!1;return!0}function e(a){return void 0===a}function f(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function g(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function h(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function i(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function j(a,b){for(var c in b)i(b,c)&&(a[c]=b[c]);return i(b,"toString")&&(a.toString=b.toString),i(b,"valueOf")&&(a.valueOf=b.valueOf),a}function k(a,b,c,d){return rb(a,b,c,d,!0).utc()}function l(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function m(a){return null==a._pf&&(a._pf=l()),a._pf}function n(a){if(null==a._isValid){var b=m(a),c=sd.call(b.parsedDateParts,function(a){return null!=a}),d=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c);if(a._strict&&(d=d&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour),null!=Object.isFrozen&&Object.isFrozen(a))return d;a._isValid=d}return a._isValid}function o(a){var b=k(NaN);return null!=a?j(m(b),a):m(b).userInvalidated=!0,b}function p(a,b){var c,d,f;if(e(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),e(b._i)||(a._i=b._i),e(b._f)||(a._f=b._f),e(b._l)||(a._l=b._l),e(b._strict)||(a._strict=b._strict),e(b._tzm)||(a._tzm=b._tzm),e(b._isUTC)||(a._isUTC=b._isUTC),e(b._offset)||(a._offset=b._offset),e(b._pf)||(a._pf=m(b)),e(b._locale)||(a._locale=b._locale),td.length>0)for(c=0;c<td.length;c++)d=td[c],f=b[d],e(f)||(a[d]=f);return a}function q(b){p(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===ud&&(ud=!0,a.updateOffset(this),ud=!1)}function r(a){return a instanceof q||null!=a&&null!=a._isAMomentObject}function s(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function t(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=s(b)),c}function u(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;d<e;d++)(c&&a[d]!==b[d]||!c&&t(a[d])!==t(b[d]))&&g++;return g+f}function v(b){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function w(b,c){var d=!0;return j(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,b),d){for(var e,f=[],g=0;g<arguments.length;g++){if(e="","object"==typeof arguments[g]){e+="\n["+g+"] ";for(var h in arguments[0])e+=h+": "+arguments[0][h]+", ";e=e.slice(0,-2)}else e=arguments[g];f.push(e)}v(b+"\nArguments: "+Array.prototype.slice.call(f).join("")+"\n"+(new Error).stack),d=!1}return c.apply(this,arguments)},c)}function x(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),vd[b]||(v(c),vd[b]=!0)}function y(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function z(a){var b,c;for(c in a)b=a[c],y(b)?this[c]=b:this["_"+c]=b;this._config=a,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function A(a,b){var d,e=j({},a);for(d in b)i(b,d)&&(c(a[d])&&c(b[d])?(e[d]={},j(e[d],a[d]),j(e[d],b[d])):null!=b[d]?e[d]=b[d]:delete e[d]);for(d in a)i(a,d)&&!i(b,d)&&c(a[d])&&(e[d]=j({},e[d]));return e}function B(a){null!=a&&this.set(a)}function C(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return y(d)?d.call(b,c):d}function D(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function E(){return this._invalidDate}function F(a){return this._ordinal.replace("%d",a)}function G(a,b,c,d){var e=this._relativeTime[c];return y(e)?e(a,b,c,d):e.replace(/%d/i,a)}function H(a,b){var c=this._relativeTime[a>0?"future":"past"];return y(c)?c(b):c.replace(/%s/i,b)}function I(a,b){var c=a.toLowerCase();Bd[c]=Bd[c+"s"]=Bd[b]=a}function J(a){return"string"==typeof a?Bd[a]||Bd[a.toLowerCase()]:void 0}function K(a){var b,c,d={};for(c in a)i(a,c)&&(b=J(c))&&(d[b]=a[c]);return d}function L(a,b){Cd[a]=b}function M(a){var b=[];for(var c in a)b.push({unit:c,priority:Cd[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function N(b,c){return function(d){return null!=d?(P(this,b,d),a.updateOffset(this,c),this):O(this,b)}}function O(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function P(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function Q(a){return a=J(a),y(this[a])?this[a]():this}function R(a,b){if("object"==typeof a){a=K(a);for(var c=M(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=J(a),y(this[a]))return this[a](b);return this}function S(a,b,c){var d=""+Math.abs(a),e=b-d.length;return(a>=0?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function T(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Gd[a]=e),b&&(Gd[b[0]]=function(){return S(e.apply(this,arguments),b[1],b[2])}),c&&(Gd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function U(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function V(a){var b,c,d=a.match(Dd);for(b=0,c=d.length;b<c;b++)Gd[d[b]]?d[b]=Gd[d[b]]:d[b]=U(d[b]);return function(b){var e,f="";for(e=0;e<c;e++)f+=y(d[e])?d[e].call(b,a):d[e];return f}}function W(a,b){return a.isValid()?(b=X(b,a.localeData()),Fd[b]=Fd[b]||V(b),Fd[b](a)):a.localeData().invalidDate()}function X(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Ed.lastIndex=0;d>=0&&Ed.test(a);)a=a.replace(Ed,c),Ed.lastIndex=0,d-=1;return a}function Y(a,b,c){Ld[a]=y(b)?b:function(a,d){return a&&c?c:b}}function Z(a,b){return i(Ld,a)?Ld[a](b._strict,b._locale):new RegExp($(a))}function $(a){return _(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function _(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function aa(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),f(b)&&(d=function(a,c){c[b]=t(a)}),c=0;c<a.length;c++)Md[a[c]]=d}function ba(a,b){aa(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function ca(a,b,c){null!=b&&i(Md,a)&&Md[a](b,c._a,c,a)}function da(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function ea(a,c){return a?b(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||Wd).test(c)?"format":"standalone"][a.month()]:b(this._months)?this._months:this._months.standalone}function fa(a,c){return a?b(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[Wd.test(c)?"format":"standalone"][a.month()]:b(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function ga(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;d<12;++d)f=k([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=xd.call(this._shortMonthsParse,g),-1!==e?e:null):(e=xd.call(this._longMonthsParse,g),-1!==e?e:null):"MMM"===b?-1!==(e=xd.call(this._shortMonthsParse,g))?e:(e=xd.call(this._longMonthsParse,g),-1!==e?e:null):-1!==(e=xd.call(this._longMonthsParse,g))?e:(e=xd.call(this._shortMonthsParse,g),-1!==e?e:null)}function ha(a,b,c){var d,e,f;if(this._monthsParseExact)return ga.call(this,a,b,c);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;d<12;d++){if(e=k([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function ia(a,b){var c;if(!a.isValid())return a;if("string"==typeof b)if(/^\d+$/.test(b))b=t(b);else if(b=a.localeData().monthsParse(b),!f(b))return a;return c=Math.min(a.date(),da(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ja(b){return null!=b?(ia(this,b),a.updateOffset(this,!0),this):O(this,"Month")}function ka(){return da(this.year(),this.month())}function la(a){return this._monthsParseExact?(i(this,"_monthsRegex")||na.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(i(this,"_monthsShortRegex")||(this._monthsShortRegex=Zd),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function ma(a){return this._monthsParseExact?(i(this,"_monthsRegex")||na.call(this),a?this._monthsStrictRegex:this._monthsRegex):(i(this,"_monthsRegex")||(this._monthsRegex=$d),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function na(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;b<12;b++)c=k([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;b<12;b++)d[b]=_(d[b]),e[b]=_(e[b]);for(b=0;b<24;b++)f[b]=_(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}function oa(a){return pa(a)?366:365}function pa(a){return a%4==0&&a%100!=0||a%400==0}function qa(){return pa(this.year())}function ra(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return a<100&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function sa(a){var b=new Date(Date.UTC.apply(null,arguments));return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function ta(a,b,c){var d=7+b-c;return-(7+sa(a,0,d).getUTCDay()-b)%7+d-1}function ua(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ta(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=oa(f)+j):j>oa(a)?(f=a+1,g=j-oa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function va(a,b,c){var d,e,f=ta(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+wa(e,b,c)):g>wa(a.year(),b,c)?(d=g-wa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function wa(a,b,c){var d=ta(a,b,c),e=ta(a+1,b,c);return(oa(a)-d+e)/7}function xa(a){return va(a,this._week.dow,this._week.doy).week}function ya(){return this._week.dow}function za(){return this._week.doy}function Aa(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ba(a){var b=va(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function Ca(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Da(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Ea(a,c){return a?b(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(c)?"format":"standalone"][a.day()]:b(this._weekdays)?this._weekdays:this._weekdays.standalone}function Fa(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ga(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=k([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=xd.call(this._weekdaysParse,g),-1!==e?e:null):"ddd"===b?(e=xd.call(this._shortWeekdaysParse,g),-1!==e?e:null):(e=xd.call(this._minWeekdaysParse,g),-1!==e?e:null):"dddd"===b?-1!==(e=xd.call(this._weekdaysParse,g))?e:-1!==(e=xd.call(this._shortWeekdaysParse,g))?e:(e=xd.call(this._minWeekdaysParse,g),-1!==e?e:null):"ddd"===b?-1!==(e=xd.call(this._shortWeekdaysParse,g))?e:-1!==(e=xd.call(this._weekdaysParse,g))?e:(e=xd.call(this._minWeekdaysParse,g),-1!==e?e:null):-1!==(e=xd.call(this._minWeekdaysParse,g))?e:-1!==(e=xd.call(this._weekdaysParse,g))?e:(e=xd.call(this._shortWeekdaysParse,g),-1!==e?e:null)}function Ia(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ha.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){if(e=k([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function Ja(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Ca(a,this.localeData()),this.add(a-b,"d")):b}function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function La(a){if(!this.isValid())return null!=a?this:NaN;if(null!=a){var b=Da(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Ma(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(i(this,"_weekdaysRegex")||(this._weekdaysRegex=ee),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Na(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(i(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=fe),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Oa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Pa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(i(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ge),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Pa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)c=k([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=_(h[b]),i[b]=_(i[b]),j[b]=_(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function Qa(){return this.hours()%12||12}function Ra(){return this.hours()||24}function Sa(a,b){T(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Ta(a,b){return b._meridiemParse}function Ua(a){return"p"===(a+"").toLowerCase().charAt(0)}function Va(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Wa(a){return a?a.toLowerCase().replace("_","-"):a}function Xa(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Wa(a[f]).split("-"),b=e.length,c=Wa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Ya(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&u(e,c,!0)>=b-1)break;b--}f++}return null}function Ya(a){var b=null;if(!ke[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=he._abbr,require("./locale/"+a),Za(b)}catch(a){}return ke[a]}function Za(a,b){var c;return a&&(c=e(b)?ab(a):$a(a,b))&&(he=c),he._abbr}function $a(a,b){if(null!==b){var c=je;if(b.abbr=a,null!=ke[a])x("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=ke[a]._config;else if(null!=b.parentLocale){if(null==ke[b.parentLocale])return le[b.parentLocale]||(le[b.parentLocale]=[]),le[b.parentLocale].push({name:a,config:b}),null;c=ke[b.parentLocale]._config}return ke[a]=new B(A(c,b)),le[a]&&le[a].forEach(function(a){$a(a.name,a.config)}),Za(a),ke[a]}return delete ke[a],null}function _a(a,b){if(null!=b){var c,d=je;null!=ke[a]&&(d=ke[a]._config),b=A(d,b),c=new B(b),c.parentLocale=ke[a],ke[a]=c,Za(a)}else null!=ke[a]&&(null!=ke[a].parentLocale?ke[a]=ke[a].parentLocale:null!=ke[a]&&delete ke[a]);return ke[a]}function ab(a){var c;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return he;if(!b(a)){if(c=Ya(a))return c;a=[a]}return Xa(a)}function bb(){return wd(ke)}function cb(a){var b,c=a._a;return c&&-2===m(a).overflow&&(b=c[Od]<0||c[Od]>11?Od:c[Pd]<1||c[Pd]>da(c[Nd],c[Od])?Pd:c[Qd]<0||c[Qd]>24||24===c[Qd]&&(0!==c[Rd]||0!==c[Sd]||0!==c[Td])?Qd:c[Rd]<0||c[Rd]>59?Rd:c[Sd]<0||c[Sd]>59?Sd:c[Td]<0||c[Td]>999?Td:-1,m(a)._overflowDayOfYear&&(b<Nd||b>Pd)&&(b=Pd),m(a)._overflowWeeks&&-1===b&&(b=Ud),m(a)._overflowWeekday&&-1===b&&(b=Vd),m(a).overflow=b),a}function db(a){var b,c,d,e,f,g,h=a._i,i=me.exec(h)||ne.exec(h);if(i){for(m(a).iso=!0,b=0,c=pe.length;b<c;b++)if(pe[b][1].exec(i[1])){e=pe[b][0],d=!1!==pe[b][2];break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=qe.length;b<c;b++)if(qe[b][1].exec(i[3])){f=(i[2]||" ")+qe[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!oe.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),kb(a)}else a._isValid=!1}function eb(a){var b,c,d,e,f,g,h,i,j={" GMT":" +0000"," EDT":" -0400"," EST":" -0500"," CDT":" -0500"," CST":" -0600"," MDT":" -0600"," MST":" -0700"," PDT":" -0700"," PST":" -0800"},k="YXWVUTSRQPONZABCDEFGHIKLM";if(b=a._i.replace(/\([^\)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s|\s$/g,""),c=se.exec(b)){if(d=c[1]?"ddd"+(5===c[1].length?", ":" "):"",e="D MMM "+(c[2].length>10?"YYYY ":"YY "),f="HH:mm"+(c[4]?":ss":""),c[1]){var l=new Date(c[2]),n=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][l.getDay()];if(c[1].substr(0,3)!==n)return m(a).weekdayMismatch=!0,void(a._isValid=!1)}switch(c[5].length){case 2:0===i?h=" +0000":(i=k.indexOf(c[5][1].toUpperCase())-12,h=(i<0?" -":" +")+(""+i).replace(/^-?/,"0").match(/..$/)[0]+"00");break;case 4:h=j[c[5]];break;default:h=j[" GMT"]}c[5]=h,a._i=c.splice(1).join(""),g=" ZZ",a._f=d+e+f+g,kb(a),m(a).rfc2822=!0}else a._isValid=!1}function fb(b){var c=re.exec(b._i);if(null!==c)return void(b._d=new Date(+c[1]));db(b),!1===b._isValid&&(delete b._isValid,eb(b),!1===b._isValid&&(delete b._isValid,a.createFromInputFallback(b)))}function gb(a,b,c){return null!=a?a:null!=b?b:c}function hb(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function ib(a){var b,c,d,e,f=[];if(!a._d){for(d=hb(a),a._w&&null==a._a[Pd]&&null==a._a[Od]&&jb(a),null!=a._dayOfYear&&(e=gb(a._a[Nd],d[Nd]),(a._dayOfYear>oa(e)||0===a._dayOfYear)&&(m(a)._overflowDayOfYear=!0),c=sa(e,0,a._dayOfYear),a._a[Od]=c.getUTCMonth(),a._a[Pd]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[Qd]&&0===a._a[Rd]&&0===a._a[Sd]&&0===a._a[Td]&&(a._nextDay=!0,a._a[Qd]=0),a._d=(a._useUTC?sa:ra).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Qd]=24)}}function jb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,c=gb(b.GG,a._a[Nd],va(sb(),1,4).year),d=gb(b.W,1),((e=gb(b.E,1))<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=va(sb(),f,g);c=gb(b.gg,a._a[Nd],j.year),d=gb(b.w,j.week),null!=b.d?((e=b.d)<0||e>6)&&(i=!0):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f}d<1||d>wa(c,f,g)?m(a)._overflowWeeks=!0:null!=i?m(a)._overflowWeekday=!0:(h=ua(c,d,e,f,g),a._a[Nd]=h.year,a._dayOfYear=h.dayOfYear)}function kb(b){if(b._f===a.ISO_8601)return void db(b);if(b._f===a.RFC_2822)return void eb(b);b._a=[],m(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=X(b._f,b._locale).match(Dd)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(Z(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&m(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Gd[f]?(d?m(b).empty=!1:m(b).unusedTokens.push(f),ca(f,d,b)):b._strict&&!d&&m(b).unusedTokens.push(f);m(b).charsLeftOver=i-j,h.length>0&&m(b).unusedInput.push(h),b._a[Qd]<=12&&!0===m(b).bigHour&&b._a[Qd]>0&&(m(b).bigHour=void 0),m(b).parsedDateParts=b._a.slice(0),m(b).meridiem=b._meridiem,b._a[Qd]=lb(b._locale,b._a[Qd],b._meridiem),ib(b),cb(b)}function lb(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}function mb(a){var b,c,d,e,f;if(0===a._f.length)return m(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=p({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],kb(b),n(b)&&(f+=m(b).charsLeftOver,f+=10*m(b).unusedTokens.length,m(b).score=f,(null==d||f<d)&&(d=f,c=b));j(a,c||b)}function nb(a){if(!a._d){var b=K(a._i);a._a=h([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),ib(a)}}function ob(a){var b=new q(cb(pb(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function pb(a){var c=a._i,d=a._f;return a._locale=a._locale||ab(a._l),null===c||void 0===d&&""===c?o({nullInput:!0}):("string"==typeof c&&(a._i=c=a._locale.preparse(c)),r(c)?new q(cb(c)):(g(c)?a._d=c:b(d)?mb(a):d?kb(a):qb(a),n(a)||(a._d=null),a))}function qb(d){var i=d._i;e(i)?d._d=new Date(a.now()):g(i)?d._d=new Date(i.valueOf()):"string"==typeof i?fb(d):b(i)?(d._a=h(i.slice(0),function(a){return parseInt(a,10)}),ib(d)):c(i)?nb(d):f(i)?d._d=new Date(i):a.createFromInputFallback(d)}function rb(a,e,f,g,h){var i={};return!0!==f&&!1!==f||(g=f,f=void 0),(c(a)&&d(a)||b(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=e,i._strict=g,ob(i)}function sb(a,b,c,d){return rb(a,b,c,d,!1)}function tb(a,c){var d,e;if(1===c.length&&b(c[0])&&(c=c[0]),!c.length)return sb();for(d=c[0],e=1;e<c.length;++e)c[e].isValid()&&!c[e][a](d)||(d=c[e]);return d}function ub(){return tb("isBefore",[].slice.call(arguments,0))}function vb(){return tb("isAfter",[].slice.call(arguments,0))}function wb(a){for(var b in a)if(-1===we.indexOf(b)||null!=a[b]&&isNaN(a[b]))return!1;for(var c=!1,d=0;d<we.length;++d)if(a[we[d]]){if(c)return!1;parseFloat(a[we[d]])!==t(a[we[d]])&&(c=!0)}return!0}function xb(){return this._isValid}function yb(){return Rb(NaN)}function zb(a){var b=K(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._isValid=wb(b),this._milliseconds=+k+1e3*j+6e4*i+1e3*h*60*60,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=ab(),this._bubble()}function Ab(a){return a instanceof zb}function Bb(a){return a<0?-1*Math.round(-1*a):Math.round(a)}function Cb(a,b){T(a,0,0,function(){var a=this.utcOffset(),c="+";return a<0&&(a=-a,c="-"),c+S(~~(a/60),2)+b+S(~~a%60,2)})}function Db(a,b){var c=(b||"").match(a);if(null===c)return null;var d=c[c.length-1]||[],e=(d+"").match(xe)||["-",0,0],f=60*e[1]+t(e[2]);return 0===f?0:"+"===e[0]?f:-f}function Eb(b,c){var d,e;return c._isUTC?(d=c.clone(),e=(r(b)||g(b)?b.valueOf():sb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):sb(b).local()}function Fb(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Gb(b,c,d){var e,f=this._offset||0;if(!this.isValid())return null!=b?this:NaN;if(null!=b){if("string"==typeof b){if(null===(b=Db(Jd,b)))return this}else Math.abs(b)<16&&!d&&(b*=60);return!this._isUTC&&c&&(e=Fb(this)),this._offset=b,this._isUTC=!0,null!=e&&this.add(e,"m"),f!==b&&(!c||this._changeInProgress?Wb(this,Rb(b-f,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?f:Fb(this)}function Hb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Ib(a){return this.utcOffset(0,a)}function Jb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Fb(this),"m")),this}function Kb(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var a=Db(Id,this._i);null!=a?this.utcOffset(a):this.utcOffset(0,!0)}return this}function Lb(a){return!!this.isValid()&&(a=a?sb(a).utcOffset():0,(this.utcOffset()-a)%60==0)}function Mb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Nb(){if(!e(this._isDSTShifted))return this._isDSTShifted;var a={};if(p(a,this),a=pb(a),a._a){var b=a._isUTC?k(a._a):sb(a._a);this._isDSTShifted=this.isValid()&&u(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Ob(){return!!this.isValid()&&!this._isUTC}function Pb(){return!!this.isValid()&&this._isUTC}function Qb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Rb(a,b){var c,d,e,g=a,h=null;return Ab(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:f(a)?(g={},b?g[b]=a:g.milliseconds=a):(h=ye.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:t(h[Pd])*c,h:t(h[Qd])*c,m:t(h[Rd])*c,s:t(h[Sd])*c,ms:t(Bb(1e3*h[Td]))*c}):(h=ze.exec(a))?(c="-"===h[1]?-1:1,g={y:Sb(h[2],c),M:Sb(h[3],c),w:Sb(h[4],c),d:Sb(h[5],c),h:Sb(h[6],c),m:Sb(h[7],c),s:Sb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=Ub(sb(g.from),sb(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new zb(g),Ab(a)&&i(a,"_locale")&&(d._locale=a._locale),d}function Sb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Tb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Ub(a,b){var c;return a.isValid()&&b.isValid()?(b=Eb(b,a),a.isBefore(b)?c=Tb(a,b):(c=Tb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Vb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(x(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Rb(c,d),Wb(this,e,a),this}}function Wb(b,c,d,e){var f=c._milliseconds,g=Bb(c._days),h=Bb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&P(b,"Date",O(b,"Date")+g*d),h&&ia(b,O(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Xb(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Yb(b,c){var d=b||sb(),e=Eb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(y(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,sb(d)))}function Zb(){return new q(this)}function $b(a,b){var c=r(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=J(e(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf())}function _b(a,b){var c=r(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=J(e(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf())}function ac(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function bc(a,b){var c,d=r(a)?a:sb(a);return!(!this.isValid()||!d.isValid())&&(b=J(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf()))}function cc(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function dc(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function ec(a,b,c){var d,e,f,g;return this.isValid()?(d=Eb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=J(b),"year"===b||"month"===b||"quarter"===b?(g=fc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:s(g)):NaN):NaN}function fc(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return b-f<0?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function gc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function hc(){if(!this.isValid())return null;var a=this.clone().utc();return a.year()<0||a.year()>9999?W(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):y(Date.prototype.toISOString)?this.toDate().toISOString():W(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function ic(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e=b+'[")]';return this.format(c+d+"-MM-DD[T]HH:mm:ss.SSS"+e)}function jc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=W(this,b);return this.localeData().postformat(c)}function kc(a,b){return this.isValid()&&(r(a)&&a.isValid()||sb(a).isValid())?Rb({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function lc(a){return this.from(sb(),a)}function mc(a,b){return this.isValid()&&(r(a)&&a.isValid()||sb(a).isValid())?Rb({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function nc(a){return this.to(sb(),a)}function oc(a){var b;return void 0===a?this._locale._abbr:(b=ab(a),null!=b&&(this._locale=b),this)}function pc(){return this._locale}function qc(a){switch(a=J(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function rc(a){return void 0===(a=J(a))||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function sc(){return this._d.valueOf()-6e4*(this._offset||0)}function tc(){return Math.floor(this.valueOf()/1e3)}function uc(){return new Date(this.valueOf())}function vc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function wc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function xc(){return this.isValid()?this.toISOString():null}function yc(){return n(this)}function zc(){return j({},m(this))}function Ac(){return m(this).overflow}function Bc(){
return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Cc(a,b){T(0,[a,a.length],0,b)}function Dc(a){return Hc.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Ec(a){return Hc.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Fc(){return wa(this.year(),1,4)}function Gc(){var a=this.localeData()._week;return wa(this.year(),a.dow,a.doy)}function Hc(a,b,c,d,e){var f;return null==a?va(this,d,e).year:(f=wa(a,d,e),b>f&&(b=f),Ic.call(this,a,b,c,d,e))}function Ic(a,b,c,d,e){var f=ua(a,b,c,d,e),g=sa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Jc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Kc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Lc(a,b){b[Td]=t(1e3*("0."+a))}function Mc(){return this._isUTC?"UTC":""}function Nc(){return this._isUTC?"Coordinated Universal Time":""}function Oc(a){return sb(1e3*a)}function Pc(){return sb.apply(null,arguments).parseZone()}function Qc(a){return a}function Rc(a,b,c,d){var e=ab(),f=k().set(d,b);return e[c](f,a)}function Sc(a,b,c){if(f(a)&&(b=a,a=void 0),a=a||"",null!=b)return Rc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Rc(a,d,c,"month");return e}function Tc(a,b,c,d){"boolean"==typeof a?(f(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,f(b)&&(c=b,b=void 0),b=b||"");var e=ab(),g=a?e._week.dow:0;if(null!=c)return Rc(b,(c+g)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Rc(b,(h+g)%7,d,"day");return i}function Uc(a,b){return Sc(a,b,"months")}function Vc(a,b){return Sc(a,b,"monthsShort")}function Wc(a,b,c){return Tc(a,b,c,"weekdays")}function Xc(a,b,c){return Tc(a,b,c,"weekdaysShort")}function Yc(a,b,c){return Tc(a,b,c,"weekdaysMin")}function Zc(){var a=this._data;return this._milliseconds=Ke(this._milliseconds),this._days=Ke(this._days),this._months=Ke(this._months),a.milliseconds=Ke(a.milliseconds),a.seconds=Ke(a.seconds),a.minutes=Ke(a.minutes),a.hours=Ke(a.hours),a.months=Ke(a.months),a.years=Ke(a.years),this}function $c(a,b,c,d){var e=Rb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function _c(a,b){return $c(this,a,b,1)}function ad(a,b){return $c(this,a,b,-1)}function bd(a){return a<0?Math.floor(a):Math.ceil(a)}function cd(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*bd(ed(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=s(f/1e3),i.seconds=a%60,b=s(a/60),i.minutes=b%60,c=s(b/60),i.hours=c%24,g+=s(c/24),e=s(dd(g)),h+=e,g-=bd(ed(e)),d=s(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function dd(a){return 4800*a/146097}function ed(a){return 146097*a/4800}function fd(a){if(!this.isValid())return NaN;var b,c,d=this._milliseconds;if("month"===(a=J(a))||"year"===a)return b=this._days+d/864e5,c=this._months+dd(b),"month"===a?c:c/12;switch(b=this._days+Math.round(ed(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function gd(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*t(this._months/12):NaN}function hd(a){return function(){return this.as(a)}}function id(a){return a=J(a),this.isValid()?this[a+"s"]():NaN}function jd(a){return function(){return this.isValid()?this._data[a]:NaN}}function kd(){return s(this.days()/7)}function ld(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function md(a,b,c){var d=Rb(a).abs(),e=$e(d.as("s")),f=$e(d.as("m")),g=$e(d.as("h")),h=$e(d.as("d")),i=$e(d.as("M")),j=$e(d.as("y")),k=e<=_e.ss&&["s",e]||e<_e.s&&["ss",e]||f<=1&&["m"]||f<_e.m&&["mm",f]||g<=1&&["h"]||g<_e.h&&["hh",g]||h<=1&&["d"]||h<_e.d&&["dd",h]||i<=1&&["M"]||i<_e.M&&["MM",i]||j<=1&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,ld.apply(null,k)}function nd(a){return void 0===a?$e:"function"==typeof a&&($e=a,!0)}function od(a,b){return void 0!==_e[a]&&(void 0===b?_e[a]:(_e[a]=b,"s"===a&&(_e.ss=b-1),!0))}function pd(a){if(!this.isValid())return this.localeData().invalidDate();var b=this.localeData(),c=md(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function qd(){if(!this.isValid())return this.localeData().invalidDate();var a,b,c,d=af(this._milliseconds)/1e3,e=af(this._days),f=af(this._months);a=s(d/60),b=s(a/60),d%=60,a%=60,c=s(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var rd,sd;sd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d<c;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var td=a.momentProperties=[],ud=!1,vd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var wd;wd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)i(a,b)&&c.push(b);return c};var xd,yd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},zd={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ad={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Bd={},Cd={},Dd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Ed=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Fd={},Gd={},Hd=/[+-]?\d{6}/,Id=/Z|[+-]\d\d:?\d\d/gi,Jd=/Z|[+-]\d\d(?::?\d\d)?/gi,Kd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ld={},Md={},Nd=0,Od=1,Pd=2,Qd=3,Rd=4,Sd=5,Td=6,Ud=7,Vd=8;xd=Array.prototype.indexOf?Array.prototype.indexOf:function(a){var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1},T("M",["MM",2],"Mo",function(){return this.month()+1}),T("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),T("MMMM",0,0,function(a){return this.localeData().months(this,a)}),I("month","M"),L("month",8),Y("M",/\d\d?/),Y("MM",/\d\d?/,/\d\d/),Y("MMM",function(a,b){return b.monthsShortRegex(a)}),Y("MMMM",function(a,b){return b.monthsRegex(a)}),aa(["M","MM"],function(a,b){b[Od]=t(a)-1}),aa(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[Od]=e:m(c).invalidMonth=a});var Wd=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Xd="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Yd="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Zd=Kd,$d=Kd;T("Y",0,0,function(){var a=this.year();return a<=9999?""+a:"+"+a}),T(0,["YY",2],0,function(){return this.year()%100}),T(0,["YYYY",4],0,"year"),T(0,["YYYYY",5],0,"year"),T(0,["YYYYYY",6,!0],0,"year"),I("year","y"),L("year",1),Y("Y",/[+-]?\d+/),Y("YY",/\d\d?/,/\d\d/),Y("YYYY",/\d{1,4}/,/\d{4}/),Y("YYYYY",/[+-]?\d{1,6}/,Hd),Y("YYYYYY",/[+-]?\d{1,6}/,Hd),aa(["YYYYY","YYYYYY"],Nd),aa("YYYY",function(b,c){c[Nd]=2===b.length?a.parseTwoDigitYear(b):t(b)}),aa("YY",function(b,c){c[Nd]=a.parseTwoDigitYear(b)}),aa("Y",function(a,b){b[Nd]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return t(a)+(t(a)>68?1900:2e3)};var _d=N("FullYear",!0);T("w",["ww",2],"wo","week"),T("W",["WW",2],"Wo","isoWeek"),I("week","w"),I("isoWeek","W"),L("week",5),L("isoWeek",5),Y("w",/\d\d?/),Y("ww",/\d\d?/,/\d\d/),Y("W",/\d\d?/),Y("WW",/\d\d?/,/\d\d/),ba(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=t(a)});var ae={dow:0,doy:6};T("d",0,"do","day"),T("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),T("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),T("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),T("e",0,0,"weekday"),T("E",0,0,"isoWeekday"),I("day","d"),I("weekday","e"),I("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),Y("d",/\d\d?/),Y("e",/\d\d?/),Y("E",/\d\d?/),Y("dd",function(a,b){return b.weekdaysMinRegex(a)}),Y("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Y("dddd",function(a,b){return b.weekdaysRegex(a)}),ba(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:m(c).invalidWeekday=a}),ba(["d","e","E"],function(a,b,c,d){b[d]=t(a)});var be="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ce="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),de="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ee=Kd,fe=Kd,ge=Kd;T("H",["HH",2],0,"hour"),T("h",["hh",2],0,Qa),T("k",["kk",2],0,Ra),T("hmm",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)}),T("hmmss",0,0,function(){return""+Qa.apply(this)+S(this.minutes(),2)+S(this.seconds(),2)}),T("Hmm",0,0,function(){return""+this.hours()+S(this.minutes(),2)}),T("Hmmss",0,0,function(){return""+this.hours()+S(this.minutes(),2)+S(this.seconds(),2)}),Sa("a",!0),Sa("A",!1),I("hour","h"),L("hour",13),Y("a",Ta),Y("A",Ta),Y("H",/\d\d?/),Y("h",/\d\d?/),Y("k",/\d\d?/),Y("HH",/\d\d?/,/\d\d/),Y("hh",/\d\d?/,/\d\d/),Y("kk",/\d\d?/,/\d\d/),Y("hmm",/\d\d\d\d?/),Y("hmmss",/\d\d\d\d\d\d?/),Y("Hmm",/\d\d\d\d?/),Y("Hmmss",/\d\d\d\d\d\d?/),aa(["H","HH"],Qd),aa(["k","kk"],function(a,b,c){var d=t(a);b[Qd]=24===d?0:d}),aa(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),aa(["h","hh"],function(a,b,c){b[Qd]=t(a),m(c).bigHour=!0}),aa("hmm",function(a,b,c){var d=a.length-2;b[Qd]=t(a.substr(0,d)),b[Rd]=t(a.substr(d)),m(c).bigHour=!0}),aa("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Qd]=t(a.substr(0,d)),b[Rd]=t(a.substr(d,2)),b[Sd]=t(a.substr(e)),m(c).bigHour=!0}),aa("Hmm",function(a,b,c){var d=a.length-2;b[Qd]=t(a.substr(0,d)),b[Rd]=t(a.substr(d))}),aa("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Qd]=t(a.substr(0,d)),b[Rd]=t(a.substr(d,2)),b[Sd]=t(a.substr(e))});var he,ie=N("Hours",!0),je={calendar:yd,longDateFormat:zd,invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:Ad,months:Xd,monthsShort:Yd,week:ae,weekdays:be,weekdaysMin:de,weekdaysShort:ce,meridiemParse:/[ap]\.?m?\.?/i},ke={},le={},me=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ne=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,oe=/Z|[+-]\d\d(?::?\d\d)?/,pe=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],qe=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],re=/^\/?Date\((\-?\d+)/i,se=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;a.createFromInputFallback=w("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var te=w("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a<this?this:a:o()}),ue=w("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:o()}),ve=function(){return Date.now?Date.now():+new Date},we=["year","quarter","month","week","day","hour","minute","second","millisecond"];Cb("Z",":"),Cb("ZZ",""),Y("Z",Jd),Y("ZZ",Jd),aa(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Db(Jd,a)});var xe=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var ye=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,ze=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Rb.fn=zb.prototype,Rb.invalid=yb;var Ae=Vb(1,"add"),Be=Vb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ce=w("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});T(0,["gg",2],0,function(){return this.weekYear()%100}),T(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Cc("gggg","weekYear"),Cc("ggggg","weekYear"),Cc("GGGG","isoWeekYear"),Cc("GGGGG","isoWeekYear"),I("weekYear","gg"),I("isoWeekYear","GG"),L("weekYear",1),L("isoWeekYear",1),Y("G",/[+-]?\d+/),Y("g",/[+-]?\d+/),Y("GG",/\d\d?/,/\d\d/),Y("gg",/\d\d?/,/\d\d/),Y("GGGG",/\d{1,4}/,/\d{4}/),Y("gggg",/\d{1,4}/,/\d{4}/),Y("GGGGG",/[+-]?\d{1,6}/,Hd),Y("ggggg",/[+-]?\d{1,6}/,Hd),ba(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=t(a)}),ba(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),T("Q",0,"Qo","quarter"),I("quarter","Q"),L("quarter",7),Y("Q",/\d/),aa("Q",function(a,b){b[Od]=3*(t(a)-1)}),T("D",["DD",2],"Do","date"),I("date","D"),L("date",9),Y("D",/\d\d?/),Y("DD",/\d\d?/,/\d\d/),Y("Do",function(a,b){return a?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient}),aa(["D","DD"],Pd),aa("Do",function(a,b){b[Pd]=t(a.match(/\d\d?/)[0],10)});var De=N("Date",!0);T("DDD",["DDDD",3],"DDDo","dayOfYear"),I("dayOfYear","DDD"),L("dayOfYear",4),Y("DDD",/\d{1,3}/),Y("DDDD",/\d{3}/),aa(["DDD","DDDD"],function(a,b,c){c._dayOfYear=t(a)}),T("m",["mm",2],0,"minute"),I("minute","m"),L("minute",14),Y("m",/\d\d?/),Y("mm",/\d\d?/,/\d\d/),aa(["m","mm"],Rd);var Ee=N("Minutes",!1);T("s",["ss",2],0,"second"),I("second","s"),L("second",15),Y("s",/\d\d?/),Y("ss",/\d\d?/,/\d\d/),aa(["s","ss"],Sd);var Fe=N("Seconds",!1);T("S",0,0,function(){return~~(this.millisecond()/100)}),T(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),T(0,["SSS",3],0,"millisecond"),T(0,["SSSS",4],0,function(){return 10*this.millisecond()}),T(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),T(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),T(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),T(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),T(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),I("millisecond","ms"),L("millisecond",16),Y("S",/\d{1,3}/,/\d/),Y("SS",/\d{1,3}/,/\d\d/),Y("SSS",/\d{1,3}/,/\d{3}/);var Ge;for(Ge="SSSS";Ge.length<=9;Ge+="S")Y(Ge,/\d+/);for(Ge="S";Ge.length<=9;Ge+="S")aa(Ge,Lc);var He=N("Milliseconds",!1);T("z",0,0,"zoneAbbr"),T("zz",0,0,"zoneName");var Ie=q.prototype;Ie.add=Ae,Ie.calendar=Yb,Ie.clone=Zb,Ie.diff=ec,Ie.endOf=rc,Ie.format=jc,Ie.from=kc,Ie.fromNow=lc,Ie.to=mc,Ie.toNow=nc,Ie.get=Q,Ie.invalidAt=Ac,Ie.isAfter=$b,Ie.isBefore=_b,Ie.isBetween=ac,Ie.isSame=bc,Ie.isSameOrAfter=cc,Ie.isSameOrBefore=dc,Ie.isValid=yc,Ie.lang=Ce,Ie.locale=oc,Ie.localeData=pc,Ie.max=ue,Ie.min=te,Ie.parsingFlags=zc,Ie.set=R,Ie.startOf=qc,Ie.subtract=Be,Ie.toArray=vc,Ie.toObject=wc,Ie.toDate=uc,Ie.toISOString=hc,Ie.inspect=ic,Ie.toJSON=xc,Ie.toString=gc,Ie.unix=tc,Ie.valueOf=sc,Ie.creationData=Bc,Ie.year=_d,Ie.isLeapYear=qa,Ie.weekYear=Dc,Ie.isoWeekYear=Ec,Ie.quarter=Ie.quarters=Jc,Ie.month=ja,Ie.daysInMonth=ka,Ie.week=Ie.weeks=Aa,Ie.isoWeek=Ie.isoWeeks=Ba,Ie.weeksInYear=Gc,Ie.isoWeeksInYear=Fc,Ie.date=De,Ie.day=Ie.days=Ja,Ie.weekday=Ka,Ie.isoWeekday=La,Ie.dayOfYear=Kc,Ie.hour=Ie.hours=ie,Ie.minute=Ie.minutes=Ee,Ie.second=Ie.seconds=Fe,Ie.millisecond=Ie.milliseconds=He,Ie.utcOffset=Gb,Ie.utc=Ib,Ie.local=Jb,Ie.parseZone=Kb,Ie.hasAlignedHourOffset=Lb,Ie.isDST=Mb,Ie.isLocal=Ob,Ie.isUtcOffset=Pb,Ie.isUtc=Qb,Ie.isUTC=Qb,Ie.zoneAbbr=Mc,Ie.zoneName=Nc,Ie.dates=w("dates accessor is deprecated. Use date instead.",De),Ie.months=w("months accessor is deprecated. Use month instead",ja),Ie.years=w("years accessor is deprecated. Use year instead",_d),Ie.zone=w("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Hb),Ie.isDSTShifted=w("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Nb);var Je=B.prototype;Je.calendar=C,Je.longDateFormat=D,Je.invalidDate=E,Je.ordinal=F,Je.preparse=Qc,Je.postformat=Qc,Je.relativeTime=G,Je.pastFuture=H,Je.set=z,Je.months=ea,Je.monthsShort=fa,Je.monthsParse=ha,Je.monthsRegex=ma,Je.monthsShortRegex=la,Je.week=xa,Je.firstDayOfYear=za,Je.firstDayOfWeek=ya,Je.weekdays=Ea,Je.weekdaysMin=Ga,Je.weekdaysShort=Fa,Je.weekdaysParse=Ia,Je.weekdaysRegex=Ma,Je.weekdaysShortRegex=Na,Je.weekdaysMinRegex=Oa,Je.isPM=Ua,Je.meridiem=Va,Za("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10;return a+(1===t(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),a.lang=w("moment.lang is deprecated. Use moment.locale instead.",Za),a.langData=w("moment.langData is deprecated. Use moment.localeData instead.",ab);var Ke=Math.abs,Le=hd("ms"),Me=hd("s"),Ne=hd("m"),Oe=hd("h"),Pe=hd("d"),Qe=hd("w"),Re=hd("M"),Se=hd("y"),Te=jd("milliseconds"),Ue=jd("seconds"),Ve=jd("minutes"),We=jd("hours"),Xe=jd("days"),Ye=jd("months"),Ze=jd("years"),$e=Math.round,_e={ss:44,s:45,m:45,h:22,d:26,M:11},af=Math.abs,bf=zb.prototype;return bf.isValid=xb,bf.abs=Zc,bf.add=_c,bf.subtract=ad,bf.as=fd,bf.asMilliseconds=Le,bf.asSeconds=Me,bf.asMinutes=Ne,bf.asHours=Oe,bf.asDays=Pe,bf.asWeeks=Qe,bf.asMonths=Re,bf.asYears=Se,bf.valueOf=gd,bf._bubble=cd,bf.get=id,bf.milliseconds=Te,bf.seconds=Ue,bf.minutes=Ve,bf.hours=We,bf.days=Xe,bf.weeks=kd,bf.months=Ye,bf.years=Ze,bf.humanize=pd,bf.toISOString=qd,bf.toString=qd,bf.toJSON=qd,bf.locale=oc,bf.localeData=pc,bf.toIsoString=w("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",qd),bf.lang=Ce,T("X",0,0,"unix"),T("x",0,0,"valueOf"),Y("x",/[+-]?\d+/),Y("X",/[+-]?\d+(\.\d{1,3})?/),aa("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),aa("x",function(a,b,c){c._d=new Date(t(a))}),a.version="2.18.2",function(a){rd=a}(sb),a.fn=Ie,a.min=ub,a.max=vb,a.now=ve,a.utc=k,a.unix=Oc,a.months=Uc,a.isDate=g,a.locale=Za,a.invalid=o,a.duration=Rb,a.isMoment=r,a.weekdays=Wc,a.parseZone=Pc,a.localeData=ab,a.isDuration=Ab,a.monthsShort=Vc,a.weekdaysMin=Yc,a.defineLocale=$a,a.updateLocale=_a,a.locales=bb,a.weekdaysShort=Xc,a.normalizeUnits=J,a.relativeTimeRounding=nd,a.relativeTimeThreshold=od,a.calendarFormat=Xb,a.prototype=Ie,a});
