Issues (3936)

Resources/Public/JavaScript/moment.js (77 issues)

1
//! moment.js
2
//! version : 2.10.6
3
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
4
//! license : MIT
5
//! momentjs.com
6
7
(function (global, factory) {
8
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
9
    typeof define === 'function' && define.amd ? define(factory) :
0 ignored issues
show
The variable define seems to be never declared. If this is a global, consider adding a /** global: define */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
10
    global.moment = factory()
11
}(this, function () { 'use strict';
12
13
    var hookCallback;
14
15
    function utils_hooks__hooks () {
16
        return hookCallback.apply(null, arguments);
17
    }
18
19
    // This is done to register the method called with moment()
20
    // without creating circular dependencies.
21
    function setHookCallback (callback) {
22
        hookCallback = callback;
23
    }
24
25
    function isArray(input) {
26
        return Object.prototype.toString.call(input) === '[object Array]';
27
    }
28
29
    function isDate(input) {
30
        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
31
    }
32
33
    function map(arr, fn) {
34
        var res = [], i;
35
        for (i = 0; i < arr.length; ++i) {
36
            res.push(fn(arr[i], i));
37
        }
38
        return res;
39
    }
40
41
    function hasOwnProp(a, b) {
42
        return Object.prototype.hasOwnProperty.call(a, b);
43
    }
44
45
    function extend(a, b) {
46
        for (var i in b) {
0 ignored issues
show
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
47
            if (hasOwnProp(b, i)) {
48
                a[i] = b[i];
49
            }
50
        }
51
52
        if (hasOwnProp(b, 'toString')) {
53
            a.toString = b.toString;
54
        }
55
56
        if (hasOwnProp(b, 'valueOf')) {
57
            a.valueOf = b.valueOf;
58
        }
59
60
        return a;
61
    }
62
63
    function create_utc__createUTC (input, format, locale, strict) {
64
        return createLocalOrUTC(input, format, locale, strict, true).utc();
65
    }
66
67
    function defaultParsingFlags() {
68
        // We need to deep clone this object.
69
        return {
70
            empty           : false,
71
            unusedTokens    : [],
72
            unusedInput     : [],
73
            overflow        : -2,
74
            charsLeftOver   : 0,
75
            nullInput       : false,
76
            invalidMonth    : null,
77
            invalidFormat   : false,
78
            userInvalidated : false,
79
            iso             : false
80
        };
81
    }
82
83
    function getParsingFlags(m) {
84
        if (m._pf == null) {
0 ignored issues
show
Comparing m._pf to null using the == operator is not safe. Consider using === instead.
Loading history...
85
            m._pf = defaultParsingFlags();
86
        }
87
        return m._pf;
88
    }
89
90
    function valid__isValid(m) {
91
        if (m._isValid == null) {
0 ignored issues
show
Comparing m._isValid to null using the == operator is not safe. Consider using === instead.
Loading history...
92
            var flags = getParsingFlags(m);
93
            m._isValid = !isNaN(m._d.getTime()) &&
94
                flags.overflow < 0 &&
95
                !flags.empty &&
96
                !flags.invalidMonth &&
97
                !flags.invalidWeekday &&
98
                !flags.nullInput &&
99
                !flags.invalidFormat &&
100
                !flags.userInvalidated;
101
102
            if (m._strict) {
103
                m._isValid = m._isValid &&
104
                    flags.charsLeftOver === 0 &&
105
                    flags.unusedTokens.length === 0 &&
106
                    flags.bigHour === undefined;
107
            }
108
        }
109
        return m._isValid;
110
    }
111
112
    function valid__createInvalid (flags) {
113
        var m = create_utc__createUTC(NaN);
114
        if (flags != null) {
0 ignored issues
show
Comparing flags to null using the != operator is not safe. Consider using !== instead.
Loading history...
115
            extend(getParsingFlags(m), flags);
116
        }
117
        else {
118
            getParsingFlags(m).userInvalidated = true;
119
        }
120
121
        return m;
122
    }
123
124
    var momentProperties = utils_hooks__hooks.momentProperties = [];
125
126
    function copyConfig(to, from) {
127
        var i, prop, val;
128
129
        if (typeof from._isAMomentObject !== 'undefined') {
130
            to._isAMomentObject = from._isAMomentObject;
131
        }
132
        if (typeof from._i !== 'undefined') {
133
            to._i = from._i;
134
        }
135
        if (typeof from._f !== 'undefined') {
136
            to._f = from._f;
137
        }
138
        if (typeof from._l !== 'undefined') {
139
            to._l = from._l;
140
        }
141
        if (typeof from._strict !== 'undefined') {
142
            to._strict = from._strict;
143
        }
144
        if (typeof from._tzm !== 'undefined') {
145
            to._tzm = from._tzm;
146
        }
147
        if (typeof from._isUTC !== 'undefined') {
148
            to._isUTC = from._isUTC;
149
        }
150
        if (typeof from._offset !== 'undefined') {
151
            to._offset = from._offset;
152
        }
153
        if (typeof from._pf !== 'undefined') {
154
            to._pf = getParsingFlags(from);
155
        }
156
        if (typeof from._locale !== 'undefined') {
157
            to._locale = from._locale;
158
        }
159
160
        if (momentProperties.length > 0) {
161
            for (i in momentProperties) {
162
                prop = momentProperties[i];
163
                val = from[prop];
164
                if (typeof val !== 'undefined') {
165
                    to[prop] = val;
166
                }
167
            }
168
        }
169
170
        return to;
171
    }
172
173
    var updateInProgress = false;
174
175
    // Moment prototype object
176
    function Moment(config) {
177
        copyConfig(this, config);
178
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
0 ignored issues
show
Comparing config._d to null using the != operator is not safe. Consider using !== instead.
Loading history...
179
        // Prevent infinite loop in case updateOffset creates new moment
180
        // objects.
181
        if (updateInProgress === false) {
182
            updateInProgress = true;
183
            utils_hooks__hooks.updateOffset(this);
184
            updateInProgress = false;
185
        }
186
    }
187
188
    function isMoment (obj) {
189
        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
0 ignored issues
show
Comparing obj to null using the != operator is not safe. Consider using !== instead.
Loading history...
Comparing obj._isAMomentObject to null using the != operator is not safe. Consider using !== instead.
Loading history...
190
    }
191
192
    function absFloor (number) {
193
        if (number < 0) {
194
            return Math.ceil(number);
195
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
196
            return Math.floor(number);
197
        }
198
    }
199
200
    function toInt(argumentForCoercion) {
201
        var coercedNumber = +argumentForCoercion,
202
            value = 0;
203
204
        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
205
            value = absFloor(coercedNumber);
206
        }
207
208
        return value;
209
    }
210
211
    function compareArrays(array1, array2, dontConvert) {
212
        var len = Math.min(array1.length, array2.length),
213
            lengthDiff = Math.abs(array1.length - array2.length),
214
            diffs = 0,
215
            i;
216
        for (i = 0; i < len; i++) {
217
            if ((dontConvert && array1[i] !== array2[i]) ||
218
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
219
                diffs++;
220
            }
221
        }
222
        return diffs + lengthDiff;
223
    }
224
225
    function Locale() {
226
    }
227
228
    var locales = {};
229
    var globalLocale;
230
231
    function normalizeLocale(key) {
232
        return key ? key.toLowerCase().replace('_', '-') : key;
233
    }
234
235
    // pick the locale from the array
236
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
237
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
238
    function chooseLocale(names) {
239
        var i = 0, j, next, locale, split;
240
241
        while (i < names.length) {
242
            split = normalizeLocale(names[i]).split('-');
243
            j = split.length;
244
            next = normalizeLocale(names[i + 1]);
245
            next = next ? next.split('-') : null;
246
            while (j > 0) {
247
                locale = loadLocale(split.slice(0, j).join('-'));
248
                if (locale) {
249
                    return locale;
250
                }
251
                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
252
                    //the next array item is better than a shallower substring of this one
253
                    break;
254
                }
255
                j--;
256
            }
257
            i++;
258
        }
259
        return null;
260
    }
261
262
    function loadLocale(name) {
263
        var oldLocale = null;
0 ignored issues
show
The assignment to oldLocale seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
264
        // TODO: Find a better way to register and load all the locales in Node
265
        if (!locales[name] && typeof module !== 'undefined' &&
266
                module && module.exports) {
267
            try {
268
                oldLocale = globalLocale._abbr;
269
                require('./locale/' + name);
270
                // because defineLocale currently also sets the global locale, we
271
                // want to undo that for lazy loaded locales
272
                locale_locales__getSetGlobalLocale(oldLocale);
273
            } catch (e) { }
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
274
        }
275
        return locales[name];
276
    }
277
278
    // This function will load locale and then set the global locale.  If
279
    // no arguments are passed in, it will simply return the current global
280
    // locale key.
281
    function locale_locales__getSetGlobalLocale (key, values) {
282
        var data;
283
        if (key) {
284
            if (typeof values === 'undefined') {
285
                data = locale_locales__getLocale(key);
286
            }
287
            else {
288
                data = defineLocale(key, values);
289
            }
290
291
            if (data) {
292
                // moment.duration._locale = moment._locale = data;
293
                globalLocale = data;
294
            }
295
        }
296
297
        return globalLocale._abbr;
0 ignored issues
show
The variable globalLocale seems to not be initialized for all possible execution paths.
Loading history...
298
    }
299
300
    function defineLocale (name, values) {
301
        if (values !== null) {
302
            values.abbr = name;
303
            locales[name] = locales[name] || new Locale();
304
            locales[name].set(values);
305
306
            // backwards compat for now: also set the locale
307
            locale_locales__getSetGlobalLocale(name);
308
309
            return locales[name];
310
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
311
            // useful for testing
312
            delete locales[name];
313
            return null;
314
        }
315
    }
316
317
    // returns locale data
318
    function locale_locales__getLocale (key) {
319
        var locale;
320
321
        if (key && key._locale && key._locale._abbr) {
322
            key = key._locale._abbr;
323
        }
324
325
        if (!key) {
326
            return globalLocale;
327
        }
328
329
        if (!isArray(key)) {
330
            //short-circuit everything else
331
            locale = loadLocale(key);
332
            if (locale) {
333
                return locale;
334
            }
335
            key = [key];
336
        }
337
338
        return chooseLocale(key);
339
    }
340
341
    var aliases = {};
342
343
    function addUnitAlias (unit, shorthand) {
344
        var lowerCase = unit.toLowerCase();
345
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
346
    }
347
348
    function normalizeUnits(units) {
349
        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
350
    }
351
352
    function normalizeObjectUnits(inputObject) {
353
        var normalizedInput = {},
354
            normalizedProp,
355
            prop;
356
357
        for (prop in inputObject) {
358
            if (hasOwnProp(inputObject, prop)) {
359
                normalizedProp = normalizeUnits(prop);
360
                if (normalizedProp) {
361
                    normalizedInput[normalizedProp] = inputObject[prop];
362
                }
363
            }
364
        }
365
366
        return normalizedInput;
367
    }
368
369
    function makeGetSet (unit, keepTime) {
370
        return function (value) {
371
            if (value != null) {
0 ignored issues
show
Comparing value to null using the != operator is not safe. Consider using !== instead.
Loading history...
372
                get_set__set(this, unit, value);
373
                utils_hooks__hooks.updateOffset(this, keepTime);
374
                return this;
375
            } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
376
                return get_set__get(this, unit);
377
            }
378
        };
379
    }
380
381
    function get_set__get (mom, unit) {
382
        return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
383
    }
384
385
    function get_set__set (mom, unit, value) {
386
        return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
387
    }
388
389
    // MOMENTS
390
391
    function getSet (units, value) {
392
        var unit;
393
        if (typeof units === 'object') {
394
            for (unit in units) {
395
                this.set(unit, units[unit]);
396
            }
397
        } else {
398
            units = normalizeUnits(units);
399
            if (typeof this[units] === 'function') {
400
                return this[units](value);
401
            }
402
        }
403
        return this;
404
    }
405
406
    function zeroFill(number, targetLength, forceSign) {
407
        var absNumber = '' + Math.abs(number),
408
            zerosToFill = targetLength - absNumber.length,
409
            sign = number >= 0;
410
        return (sign ? (forceSign ? '+' : '') : '-') +
411
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
412
    }
413
414
    var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
415
416
    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
417
418
    var formatFunctions = {};
419
420
    var formatTokenFunctions = {};
421
422
    // token:    'M'
423
    // padded:   ['MM', 2]
424
    // ordinal:  'Mo'
425
    // callback: function () { this.month() + 1 }
426
    function addFormatToken (token, padded, ordinal, callback) {
427
        var func = callback;
428
        if (typeof callback === 'string') {
429
            func = function () {
430
                return this[callback]();
431
            };
432
        }
433
        if (token) {
434
            formatTokenFunctions[token] = func;
435
        }
436
        if (padded) {
437
            formatTokenFunctions[padded[0]] = function () {
438
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
439
            };
440
        }
441
        if (ordinal) {
442
            formatTokenFunctions[ordinal] = function () {
443
                return this.localeData().ordinal(func.apply(this, arguments), token);
444
            };
445
        }
446
    }
447
448
    function removeFormattingTokens(input) {
449
        if (input.match(/\[[\s\S]/)) {
450
            return input.replace(/^\[|\]$/g, '');
451
        }
452
        return input.replace(/\\/g, '');
453
    }
454
455
    function makeFormatFunction(format) {
456
        var array = format.match(formattingTokens), i, length;
457
458
        for (i = 0, length = array.length; i < length; i++) {
459
            if (formatTokenFunctions[array[i]]) {
460
                array[i] = formatTokenFunctions[array[i]];
461
            } else {
462
                array[i] = removeFormattingTokens(array[i]);
463
            }
464
        }
465
466
        return function (mom) {
467
            var output = '';
468
            for (i = 0; i < length; i++) {
0 ignored issues
show
The variable i is changed as part of the for loop for example by i++ on line 468. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
469
                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
470
            }
471
            return output;
472
        };
473
    }
474
475
    // format date using native date object
476
    function formatMoment(m, format) {
477
        if (!m.isValid()) {
478
            return m.localeData().invalidDate();
479
        }
480
481
        format = expandFormat(format, m.localeData());
482
        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
483
484
        return formatFunctions[format](m);
485
    }
486
487
    function expandFormat(format, locale) {
488
        var i = 5;
489
490
        function replaceLongDateFormatTokens(input) {
491
            return locale.longDateFormat(input) || input;
492
        }
493
494
        localFormattingTokens.lastIndex = 0;
495
        while (i >= 0 && localFormattingTokens.test(format)) {
496
            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
497
            localFormattingTokens.lastIndex = 0;
498
            i -= 1;
499
        }
500
501
        return format;
502
    }
503
504
    var match1         = /\d/;            //       0 - 9
505
    var match2         = /\d\d/;          //      00 - 99
506
    var match3         = /\d{3}/;         //     000 - 999
507
    var match4         = /\d{4}/;         //    0000 - 9999
508
    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
509
    var match1to2      = /\d\d?/;         //       0 - 99
510
    var match1to3      = /\d{1,3}/;       //       0 - 999
511
    var match1to4      = /\d{1,4}/;       //       0 - 9999
512
    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999
513
514
    var matchUnsigned  = /\d+/;           //       0 - inf
515
    var matchSigned    = /[+-]?\d+/;      //    -inf - inf
516
517
    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
518
519
    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
520
521
    // any word (or two) characters or numbers including two/three word month in arabic.
522
    var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
523
524
    var regexes = {};
525
526
    function isFunction (sth) {
527
        // https://github.com/moment/moment/issues/2325
528
        return typeof sth === 'function' &&
529
            Object.prototype.toString.call(sth) === '[object Function]';
530
    }
531
532
533
    function addRegexToken (token, regex, strictRegex) {
534
        regexes[token] = isFunction(regex) ? regex : function (isStrict) {
535
            return (isStrict && strictRegex) ? strictRegex : regex;
536
        };
537
    }
538
539
    function getParseRegexForToken (token, config) {
540
        if (!hasOwnProp(regexes, token)) {
541
            return new RegExp(unescapeFormat(token));
542
        }
543
544
        return regexes[token](config._strict, config._locale);
545
    }
546
547
    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
548
    function unescapeFormat(s) {
549
        return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
550
            return p1 || p2 || p3 || p4;
551
        }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
552
    }
553
554
    var tokens = {};
555
556
    function addParseToken (token, callback) {
557
        var i, func = callback;
558
        if (typeof token === 'string') {
559
            token = [token];
560
        }
561
        if (typeof callback === 'number') {
562
            func = function (input, array) {
563
                array[callback] = toInt(input);
564
            };
565
        }
566
        for (i = 0; i < token.length; i++) {
567
            tokens[token[i]] = func;
568
        }
569
    }
570
571
    function addWeekParseToken (token, callback) {
572
        addParseToken(token, function (input, array, config, token) {
573
            config._w = config._w || {};
574
            callback(input, config._w, config, token);
575
        });
576
    }
577
578
    function addTimeToArrayFromToken(token, input, config) {
579
        if (input != null && hasOwnProp(tokens, token)) {
0 ignored issues
show
Comparing input to null using the != operator is not safe. Consider using !== instead.
Loading history...
580
            tokens[token](input, config._a, config, token);
581
        }
582
    }
583
584
    var YEAR = 0;
585
    var MONTH = 1;
586
    var DATE = 2;
587
    var HOUR = 3;
588
    var MINUTE = 4;
589
    var SECOND = 5;
590
    var MILLISECOND = 6;
591
592
    function daysInMonth(year, month) {
593
        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
594
    }
595
596
    // FORMATTING
597
598
    addFormatToken('M', ['MM', 2], 'Mo', function () {
599
        return this.month() + 1;
600
    });
601
602
    addFormatToken('MMM', 0, 0, function (format) {
603
        return this.localeData().monthsShort(this, format);
604
    });
605
606
    addFormatToken('MMMM', 0, 0, function (format) {
607
        return this.localeData().months(this, format);
608
    });
609
610
    // ALIASES
611
612
    addUnitAlias('month', 'M');
613
614
    // PARSING
615
616
    addRegexToken('M',    match1to2);
617
    addRegexToken('MM',   match1to2, match2);
618
    addRegexToken('MMM',  matchWord);
619
    addRegexToken('MMMM', matchWord);
620
621
    addParseToken(['M', 'MM'], function (input, array) {
622
        array[MONTH] = toInt(input) - 1;
623
    });
624
625
    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
626
        var month = config._locale.monthsParse(input, token, config._strict);
627
        // if we didn't find a month name, mark the date as invalid.
628
        if (month != null) {
0 ignored issues
show
Comparing month to null using the != operator is not safe. Consider using !== instead.
Loading history...
629
            array[MONTH] = month;
630
        } else {
631
            getParsingFlags(config).invalidMonth = input;
632
        }
633
    });
634
635
    // LOCALES
636
637
    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
638
    function localeMonths (m) {
639
        return this._months[m.month()];
640
    }
641
642
    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
643
    function localeMonthsShort (m) {
644
        return this._monthsShort[m.month()];
645
    }
646
647
    function localeMonthsParse (monthName, format, strict) {
648
        var i, mom, regex;
649
650
        if (!this._monthsParse) {
651
            this._monthsParse = [];
652
            this._longMonthsParse = [];
653
            this._shortMonthsParse = [];
654
        }
655
656
        for (i = 0; i < 12; i++) {
657
            // make the regex if we don't have it already
658
            mom = create_utc__createUTC([2000, i]);
659
            if (strict && !this._longMonthsParse[i]) {
660
                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
661
                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
662
            }
663
            if (!strict && !this._monthsParse[i]) {
664
                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
665
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
666
            }
667
            // test the regex
668
            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
669
                return i;
670
            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
671
                return i;
672
            } else if (!strict && this._monthsParse[i].test(monthName)) {
673
                return i;
674
            }
675
        }
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
676
    }
677
678
    // MOMENTS
679
680
    function setMonth (mom, value) {
681
        var dayOfMonth;
682
683
        // TODO: Move this out of here!
684
        if (typeof value === 'string') {
685
            value = mom.localeData().monthsParse(value);
686
            // TODO: Another silent failure?
687
            if (typeof value !== 'number') {
688
                return mom;
689
            }
690
        }
691
692
        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
693
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
694
        return mom;
695
    }
696
697
    function getSetMonth (value) {
698
        if (value != null) {
0 ignored issues
show
Comparing value to null using the != operator is not safe. Consider using !== instead.
Loading history...
699
            setMonth(this, value);
700
            utils_hooks__hooks.updateOffset(this, true);
701
            return this;
702
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
703
            return get_set__get(this, 'Month');
704
        }
705
    }
706
707
    function getDaysInMonth () {
708
        return daysInMonth(this.year(), this.month());
709
    }
710
711
    function checkOverflow (m) {
712
        var overflow;
713
        var a = m._a;
714
715
        if (a && getParsingFlags(m).overflow === -2) {
716
            overflow =
717
                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
718
                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
719
                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
720
                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
721
                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
722
                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
723
                -1;
724
725
            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
726
                overflow = DATE;
727
            }
728
729
            getParsingFlags(m).overflow = overflow;
730
        }
731
732
        return m;
733
    }
734
735
    function warn(msg) {
736
        if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {
737
            console.warn('Deprecation warning: ' + msg);
738
        }
739
    }
740
741
    function deprecate(msg, fn) {
742
        var firstTime = true;
743
744
        return extend(function () {
745
            if (firstTime) {
746
                warn(msg + '\n' + (new Error()).stack);
747
                firstTime = false;
748
            }
749
            return fn.apply(this, arguments);
750
        }, fn);
751
    }
752
753
    var deprecations = {};
754
755
    function deprecateSimple(name, msg) {
756
        if (!deprecations[name]) {
757
            warn(msg);
758
            deprecations[name] = true;
759
        }
760
    }
761
762
    utils_hooks__hooks.suppressDeprecationWarnings = false;
763
764
    var from_string__isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
765
766
    var isoDates = [
767
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
768
        ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
769
        ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
770
        ['GGGG-[W]WW', /\d{4}-W\d{2}/],
771
        ['YYYY-DDD', /\d{4}-\d{3}/]
772
    ];
773
774
    // iso time formats and regexes
775
    var isoTimes = [
776
        ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
777
        ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
778
        ['HH:mm', /(T| )\d\d:\d\d/],
779
        ['HH', /(T| )\d\d/]
780
    ];
781
782
    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
783
784
    // date from iso format
785
    function configFromISO(config) {
786
        var i, l,
787
            string = config._i,
788
            match = from_string__isoRegex.exec(string);
789
790
        if (match) {
791
            getParsingFlags(config).iso = true;
792
            for (i = 0, l = isoDates.length; i < l; i++) {
793
                if (isoDates[i][1].exec(string)) {
794
                    config._f = isoDates[i][0];
795
                    break;
796
                }
797
            }
798
            for (i = 0, l = isoTimes.length; i < l; i++) {
799
                if (isoTimes[i][1].exec(string)) {
800
                    // match[6] should be 'T' or space
801
                    config._f += (match[6] || ' ') + isoTimes[i][0];
802
                    break;
803
                }
804
            }
805
            if (string.match(matchOffset)) {
806
                config._f += 'Z';
807
            }
808
            configFromStringAndFormat(config);
809
        } else {
810
            config._isValid = false;
811
        }
812
    }
813
814
    // date from iso format or fallback
815
    function configFromString(config) {
816
        var matched = aspNetJsonRegex.exec(config._i);
817
818
        if (matched !== null) {
819
            config._d = new Date(+matched[1]);
820
            return;
821
        }
822
823
        configFromISO(config);
824
        if (config._isValid === false) {
825
            delete config._isValid;
826
            utils_hooks__hooks.createFromInputFallback(config);
827
        }
828
    }
829
830
    utils_hooks__hooks.createFromInputFallback = deprecate(
831
        'moment construction falls back to js Date. This is ' +
832
        'discouraged and will be removed in upcoming major ' +
833
        'release. Please refer to ' +
834
        'https://github.com/moment/moment/issues/1407 for more info.',
835
        function (config) {
836
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
837
        }
838
    );
839
840
    function createDate (y, m, d, h, M, s, ms) {
841
        //can't just apply() to create a date:
842
        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
843
        var date = new Date(y, m, d, h, M, s, ms);
844
845
        //the date constructor doesn't accept years < 1970
846
        if (y < 1970) {
847
            date.setFullYear(y);
848
        }
849
        return date;
850
    }
851
852
    function createUTCDate (y) {
853
        var date = new Date(Date.UTC.apply(null, arguments));
854
        if (y < 1970) {
855
            date.setUTCFullYear(y);
856
        }
857
        return date;
858
    }
859
860
    addFormatToken(0, ['YY', 2], 0, function () {
861
        return this.year() % 100;
862
    });
863
864
    addFormatToken(0, ['YYYY',   4],       0, 'year');
865
    addFormatToken(0, ['YYYYY',  5],       0, 'year');
866
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
867
868
    // ALIASES
869
870
    addUnitAlias('year', 'y');
871
872
    // PARSING
873
874
    addRegexToken('Y',      matchSigned);
875
    addRegexToken('YY',     match1to2, match2);
876
    addRegexToken('YYYY',   match1to4, match4);
877
    addRegexToken('YYYYY',  match1to6, match6);
878
    addRegexToken('YYYYYY', match1to6, match6);
879
880
    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
881
    addParseToken('YYYY', function (input, array) {
882
        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);
883
    });
884
    addParseToken('YY', function (input, array) {
885
        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
886
    });
887
888
    // HELPERS
889
890
    function daysInYear(year) {
891
        return isLeapYear(year) ? 366 : 365;
892
    }
893
894
    function isLeapYear(year) {
895
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
896
    }
897
898
    // HOOKS
899
900
    utils_hooks__hooks.parseTwoDigitYear = function (input) {
901
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
902
    };
903
904
    // MOMENTS
905
906
    var getSetYear = makeGetSet('FullYear', false);
907
908
    function getIsLeapYear () {
909
        return isLeapYear(this.year());
910
    }
911
912
    addFormatToken('w', ['ww', 2], 'wo', 'week');
913
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
914
915
    // ALIASES
916
917
    addUnitAlias('week', 'w');
918
    addUnitAlias('isoWeek', 'W');
919
920
    // PARSING
921
922
    addRegexToken('w',  match1to2);
923
    addRegexToken('ww', match1to2, match2);
924
    addRegexToken('W',  match1to2);
925
    addRegexToken('WW', match1to2, match2);
926
927
    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
928
        week[token.substr(0, 1)] = toInt(input);
929
    });
930
931
    // HELPERS
932
933
    // firstDayOfWeek       0 = sun, 6 = sat
934
    //                      the day of the week that starts the week
935
    //                      (usually sunday or monday)
936
    // firstDayOfWeekOfYear 0 = sun, 6 = sat
937
    //                      the first week is the week that contains the first
938
    //                      of this day of the week
939
    //                      (eg. ISO weeks use thursday (4))
940
    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
941
        var end = firstDayOfWeekOfYear - firstDayOfWeek,
942
            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
943
            adjustedMoment;
944
945
946
        if (daysToDayOfWeek > end) {
947
            daysToDayOfWeek -= 7;
948
        }
949
950
        if (daysToDayOfWeek < end - 7) {
951
            daysToDayOfWeek += 7;
952
        }
953
954
        adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd');
955
        return {
956
            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
957
            year: adjustedMoment.year()
958
        };
959
    }
960
961
    // LOCALES
962
963
    function localeWeek (mom) {
964
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
965
    }
966
967
    var defaultLocaleWeek = {
968
        dow : 0, // Sunday is the first day of the week.
969
        doy : 6  // The week that contains Jan 1st is the first week of the year.
970
    };
971
972
    function localeFirstDayOfWeek () {
973
        return this._week.dow;
974
    }
975
976
    function localeFirstDayOfYear () {
977
        return this._week.doy;
978
    }
979
980
    // MOMENTS
981
982
    function getSetWeek (input) {
983
        var week = this.localeData().week(this);
984
        return input == null ? week : this.add((input - week) * 7, 'd');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
985
    }
986
987
    function getSetISOWeek (input) {
988
        var week = weekOfYear(this, 1, 4).week;
989
        return input == null ? week : this.add((input - week) * 7, 'd');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
990
    }
991
992
    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
993
994
    // ALIASES
995
996
    addUnitAlias('dayOfYear', 'DDD');
997
998
    // PARSING
999
1000
    addRegexToken('DDD',  match1to3);
1001
    addRegexToken('DDDD', match3);
1002
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
1003
        config._dayOfYear = toInt(input);
1004
    });
1005
1006
    // HELPERS
1007
1008
    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
1009
    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
1010
        var week1Jan = 6 + firstDayOfWeek - firstDayOfWeekOfYear, janX = createUTCDate(year, 0, 1 + week1Jan), d = janX.getUTCDay(), dayOfYear;
1011
        if (d < firstDayOfWeek) {
1012
            d += 7;
1013
        }
1014
1015
        weekday = weekday != null ? 1 * weekday : firstDayOfWeek;
0 ignored issues
show
Comparing weekday to null using the != operator is not safe. Consider using !== instead.
Loading history...
1016
1017
        dayOfYear = 1 + week1Jan + 7 * (week - 1) - d + weekday;
1018
1019
        return {
1020
            year: dayOfYear > 0 ? year : year - 1,
1021
            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
1022
        };
1023
    }
1024
1025
    // MOMENTS
1026
1027
    function getSetDayOfYear (input) {
1028
        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
1029
        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
1030
    }
1031
1032
    // Pick the first defined of two or three arguments.
1033
    function defaults(a, b, c) {
1034
        if (a != null) {
0 ignored issues
show
Comparing a to null using the != operator is not safe. Consider using !== instead.
Loading history...
1035
            return a;
1036
        }
1037
        if (b != null) {
0 ignored issues
show
Comparing b to null using the != operator is not safe. Consider using !== instead.
Loading history...
1038
            return b;
1039
        }
1040
        return c;
1041
    }
1042
1043
    function currentDateArray(config) {
1044
        var now = new Date();
1045
        if (config._useUTC) {
1046
            return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()];
1047
        }
1048
        return [now.getFullYear(), now.getMonth(), now.getDate()];
1049
    }
1050
1051
    // convert an array to a date.
1052
    // the array should mirror the parameters below
1053
    // note: all values past the year are optional and will default to the lowest possible value.
1054
    // [year, month, day , hour, minute, second, millisecond]
1055
    function configFromArray (config) {
1056
        var i, date, input = [], currentDate, yearToUse;
1057
1058
        if (config._d) {
1059
            return;
1060
        }
1061
1062
        currentDate = currentDateArray(config);
1063
1064
        //compute day of the year from weeks and weekdays
1065
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
0 ignored issues
show
Comparing config._a.MONTH to null using the == operator is not safe. Consider using === instead.
Loading history...
Comparing config._a.DATE to null using the == operator is not safe. Consider using === instead.
Loading history...
1066
            dayOfYearFromWeekInfo(config);
1067
        }
1068
1069
        //if the day of the year is set, figure out what it is
1070
        if (config._dayOfYear) {
1071
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
1072
1073
            if (config._dayOfYear > daysInYear(yearToUse)) {
1074
                getParsingFlags(config)._overflowDayOfYear = true;
1075
            }
1076
1077
            date = createUTCDate(yearToUse, 0, config._dayOfYear);
1078
            config._a[MONTH] = date.getUTCMonth();
1079
            config._a[DATE] = date.getUTCDate();
1080
        }
1081
1082
        // Default to current date.
1083
        // * if no year, month, day of month are given, default to today
1084
        // * if day of month is given, default month and year
1085
        // * if month is given, default only year
1086
        // * if year is given, don't default anything
1087
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
0 ignored issues
show
Comparing config._a.i to null using the == operator is not safe. Consider using === instead.
Loading history...
1088
            config._a[i] = input[i] = currentDate[i];
1089
        }
1090
1091
        // Zero out whatever was not defaulted, including time
1092
        for (; i < 7; i++) {
1093
            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
1094
        }
1095
1096
        // Check for 24:00:00.000
1097
        if (config._a[HOUR] === 24 &&
1098
                config._a[MINUTE] === 0 &&
1099
                config._a[SECOND] === 0 &&
1100
                config._a[MILLISECOND] === 0) {
1101
            config._nextDay = true;
1102
            config._a[HOUR] = 0;
1103
        }
1104
1105
        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
1106
        // Apply timezone offset from input. The actual utcOffset can be changed
1107
        // with parseZone.
1108
        if (config._tzm != null) {
0 ignored issues
show
Comparing config._tzm to null using the != operator is not safe. Consider using !== instead.
Loading history...
1109
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
1110
        }
1111
1112
        if (config._nextDay) {
1113
            config._a[HOUR] = 24;
1114
        }
1115
    }
1116
1117
    function dayOfYearFromWeekInfo(config) {
1118
        var w, weekYear, week, weekday, dow, doy, temp;
1119
1120
        w = config._w;
1121
        if (w.GG != null || w.W != null || w.E != null) {
0 ignored issues
show
Comparing w.E to null using the != operator is not safe. Consider using !== instead.
Loading history...
Comparing w.GG to null using the != operator is not safe. Consider using !== instead.
Loading history...
Comparing w.W to null using the != operator is not safe. Consider using !== instead.
Loading history...
1122
            dow = 1;
1123
            doy = 4;
1124
1125
            // TODO: We need to take the current isoWeekYear, but that depends on
1126
            // how we interpret now (local, utc, fixed offset). So create
1127
            // a now version of current config (take local/utc/offset flags, and
1128
            // create now).
1129
            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
1130
            week = defaults(w.W, 1);
1131
            weekday = defaults(w.E, 1);
1132
        } else {
1133
            dow = config._locale._week.dow;
1134
            doy = config._locale._week.doy;
1135
1136
            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
1137
            week = defaults(w.w, 1);
1138
1139
            if (w.d != null) {
0 ignored issues
show
Comparing w.d to null using the != operator is not safe. Consider using !== instead.
Loading history...
1140
                // weekday -- low day numbers are considered next week
1141
                weekday = w.d;
1142
                if (weekday < dow) {
1143
                    ++week;
1144
                }
1145
            } else if (w.e != null) {
0 ignored issues
show
Comparing w.e to null using the != operator is not safe. Consider using !== instead.
Loading history...
1146
                // local weekday -- counting starts from beginning of week
1147
                weekday = w.e + dow;
1148
            } else {
1149
                // default to beginning of week
1150
                weekday = dow;
1151
            }
1152
        }
1153
        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
1154
1155
        config._a[YEAR] = temp.year;
1156
        config._dayOfYear = temp.dayOfYear;
1157
    }
1158
1159
    utils_hooks__hooks.ISO_8601 = function () {};
1160
1161
    // date from string and format string
1162
    function configFromStringAndFormat(config) {
1163
        // TODO: Move this to another part of the creation flow to prevent circular deps
1164
        if (config._f === utils_hooks__hooks.ISO_8601) {
1165
            configFromISO(config);
1166
            return;
1167
        }
1168
1169
        config._a = [];
1170
        getParsingFlags(config).empty = true;
1171
1172
        // This array is used to make a Date, either with `new Date` or `Date.UTC`
1173
        var string = '' + config._i,
1174
            i, parsedInput, tokens, token, skipped,
1175
            stringLength = string.length,
1176
            totalParsedInputLength = 0;
1177
1178
        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
1179
1180
        for (i = 0; i < tokens.length; i++) {
1181
            token = tokens[i];
1182
            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
1183
            if (parsedInput) {
1184
                skipped = string.substr(0, string.indexOf(parsedInput));
1185
                if (skipped.length > 0) {
1186
                    getParsingFlags(config).unusedInput.push(skipped);
1187
                }
1188
                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
1189
                totalParsedInputLength += parsedInput.length;
1190
            }
1191
            // don't parse if it's not a known token
1192
            if (formatTokenFunctions[token]) {
1193
                if (parsedInput) {
1194
                    getParsingFlags(config).empty = false;
1195
                }
1196
                else {
1197
                    getParsingFlags(config).unusedTokens.push(token);
1198
                }
1199
                addTimeToArrayFromToken(token, parsedInput, config);
1200
            }
1201
            else if (config._strict && !parsedInput) {
1202
                getParsingFlags(config).unusedTokens.push(token);
1203
            }
1204
        }
1205
1206
        // add remaining unparsed input length to the string
1207
        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
1208
        if (string.length > 0) {
1209
            getParsingFlags(config).unusedInput.push(string);
1210
        }
1211
1212
        // clear _12h flag if hour is <= 12
1213
        if (getParsingFlags(config).bigHour === true &&
1214
                config._a[HOUR] <= 12 &&
1215
                config._a[HOUR] > 0) {
1216
            getParsingFlags(config).bigHour = undefined;
1217
        }
1218
        // handle meridiem
1219
        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
1220
1221
        configFromArray(config);
1222
        checkOverflow(config);
1223
    }
1224
1225
1226
    function meridiemFixWrap (locale, hour, meridiem) {
1227
        var isPm;
1228
1229
        if (meridiem == null) {
0 ignored issues
show
Comparing meridiem to null using the == operator is not safe. Consider using === instead.
Loading history...
1230
            // nothing to do
1231
            return hour;
1232
        }
1233
        if (locale.meridiemHour != null) {
0 ignored issues
show
Comparing locale.meridiemHour to null using the != operator is not safe. Consider using !== instead.
Loading history...
1234
            return locale.meridiemHour(hour, meridiem);
1235
        } else if (locale.isPM != null) {
0 ignored issues
show
Comparing locale.isPM to null using the != operator is not safe. Consider using !== instead.
Loading history...
1236
            // Fallback
1237
            isPm = locale.isPM(meridiem);
1238
            if (isPm && hour < 12) {
1239
                hour += 12;
1240
            }
1241
            if (!isPm && hour === 12) {
1242
                hour = 0;
1243
            }
1244
            return hour;
1245
        } else {
1246
            // this is not supposed to happen
1247
            return hour;
1248
        }
1249
    }
1250
1251
    function configFromStringAndArray(config) {
1252
        var tempConfig,
1253
            bestMoment,
1254
1255
            scoreToBeat,
1256
            i,
1257
            currentScore;
1258
1259
        if (config._f.length === 0) {
1260
            getParsingFlags(config).invalidFormat = true;
1261
            config._d = new Date(NaN);
1262
            return;
1263
        }
1264
1265
        for (i = 0; i < config._f.length; i++) {
1266
            currentScore = 0;
1267
            tempConfig = copyConfig({}, config);
1268
            if (config._useUTC != null) {
0 ignored issues
show
Comparing config._useUTC to null using the != operator is not safe. Consider using !== instead.
Loading history...
1269
                tempConfig._useUTC = config._useUTC;
1270
            }
1271
            tempConfig._f = config._f[i];
1272
            configFromStringAndFormat(tempConfig);
1273
1274
            if (!valid__isValid(tempConfig)) {
1275
                continue;
1276
            }
1277
1278
            // if there is any input that was not parsed add a penalty for that format
1279
            currentScore += getParsingFlags(tempConfig).charsLeftOver;
1280
1281
            //or tokens
1282
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
1283
1284
            getParsingFlags(tempConfig).score = currentScore;
1285
1286
            if (scoreToBeat == null || currentScore < scoreToBeat) {
0 ignored issues
show
The variable scoreToBeat seems to not be initialized for all possible execution paths.
Loading history...
Comparing scoreToBeat to null using the == operator is not safe. Consider using === instead.
Loading history...
1287
                scoreToBeat = currentScore;
1288
                bestMoment = tempConfig;
1289
            }
1290
        }
1291
1292
        extend(config, bestMoment || tempConfig);
1293
    }
1294
1295
    function configFromObject(config) {
1296
        if (config._d) {
1297
            return;
1298
        }
1299
1300
        var i = normalizeObjectUnits(config._i);
1301
        config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond];
1302
1303
        configFromArray(config);
1304
    }
1305
1306
    function createFromConfig (config) {
1307
        var res = new Moment(checkOverflow(prepareConfig(config)));
1308
        if (res._nextDay) {
1309
            // Adding is smart enough around DST
1310
            res.add(1, 'd');
1311
            res._nextDay = undefined;
1312
        }
1313
1314
        return res;
1315
    }
1316
1317
    function prepareConfig (config) {
1318
        var input = config._i,
1319
            format = config._f;
1320
1321
        config._locale = config._locale || locale_locales__getLocale(config._l);
1322
1323
        if (input === null || (format === undefined && input === '')) {
1324
            return valid__createInvalid({nullInput: true});
1325
        }
1326
1327
        if (typeof input === 'string') {
1328
            config._i = input = config._locale.preparse(input);
1329
        }
1330
1331
        if (isMoment(input)) {
1332
            return new Moment(checkOverflow(input));
1333
        } else if (isArray(format)) {
1334
            configFromStringAndArray(config);
1335
        } else if (format) {
1336
            configFromStringAndFormat(config);
1337
        } else if (isDate(input)) {
1338
            config._d = input;
1339
        } else {
1340
            configFromInput(config);
1341
        }
1342
1343
        return config;
1344
    }
1345
1346
    function configFromInput(config) {
1347
        var input = config._i;
1348
        if (input === undefined) {
1349
            config._d = new Date();
1350
        } else if (isDate(input)) {
1351
            config._d = new Date(+input);
1352
        } else if (typeof input === 'string') {
1353
            configFromString(config);
1354
        } else if (isArray(input)) {
1355
            config._a = map(input.slice(0), function (obj) {
1356
                return parseInt(obj, 10);
1357
            });
1358
            configFromArray(config);
1359
        } else if (typeof(input) === 'object') {
1360
            configFromObject(config);
1361
        } else if (typeof(input) === 'number') {
1362
            // from milliseconds
1363
            config._d = new Date(input);
1364
        } else {
1365
            utils_hooks__hooks.createFromInputFallback(config);
1366
        }
1367
    }
1368
1369
    function createLocalOrUTC (input, format, locale, strict, isUTC) {
1370
        var c = {};
1371
1372
        if (typeof(locale) === 'boolean') {
1373
            strict = locale;
1374
            locale = undefined;
1375
        }
1376
        // object construction must be done this way.
1377
        // https://github.com/moment/moment/issues/1423
1378
        c._isAMomentObject = true;
1379
        c._useUTC = c._isUTC = isUTC;
1380
        c._l = locale;
1381
        c._i = input;
1382
        c._f = format;
1383
        c._strict = strict;
1384
1385
        return createFromConfig(c);
1386
    }
1387
1388
    function local__createLocal (input, format, locale, strict) {
1389
        return createLocalOrUTC(input, format, locale, strict, false);
1390
    }
1391
1392
    var prototypeMin = deprecate(
1393
         'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
1394
         function () {
1395
             var other = local__createLocal.apply(null, arguments);
1396
             return other < this ? this : other;
1397
         }
1398
     );
1399
1400
    var prototypeMax = deprecate(
1401
        'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
1402
        function () {
1403
            var other = local__createLocal.apply(null, arguments);
1404
            return other > this ? this : other;
1405
        }
1406
    );
1407
1408
    // Pick a moment m from moments so that m[fn](other) is true for all
1409
    // other. This relies on the function fn to be transitive.
1410
    //
1411
    // moments should either be an array of moment objects or an array, whose
1412
    // first element is an array of moment objects.
1413
    function pickBy(fn, moments) {
1414
        var res, i;
1415
        if (moments.length === 1 && isArray(moments[0])) {
1416
            moments = moments[0];
1417
        }
1418
        if (!moments.length) {
1419
            return local__createLocal();
1420
        }
1421
        res = moments[0];
1422
        for (i = 1; i < moments.length; ++i) {
1423
            if (!moments[i].isValid() || moments[i][fn](res)) {
1424
                res = moments[i];
1425
            }
1426
        }
1427
        return res;
1428
    }
1429
1430
    // TODO: Use [].sort instead?
1431
    function min () {
1432
        var args = [].slice.call(arguments, 0);
1433
1434
        return pickBy('isBefore', args);
1435
    }
1436
1437
    function max () {
1438
        var args = [].slice.call(arguments, 0);
1439
1440
        return pickBy('isAfter', args);
1441
    }
1442
1443
    function Duration (duration) {
1444
        var normalizedInput = normalizeObjectUnits(duration),
1445
            years = normalizedInput.year || 0,
1446
            quarters = normalizedInput.quarter || 0,
1447
            months = normalizedInput.month || 0,
1448
            weeks = normalizedInput.week || 0,
1449
            days = normalizedInput.day || 0,
1450
            hours = normalizedInput.hour || 0,
1451
            minutes = normalizedInput.minute || 0,
1452
            seconds = normalizedInput.second || 0,
1453
            milliseconds = normalizedInput.millisecond || 0;
1454
1455
        // representation for dateAddRemove
1456
        this._milliseconds = +milliseconds +
1457
            seconds * 1e3 + // 1000
1458
            minutes * 6e4 + // 1000 * 60
1459
            hours * 36e5; // 1000 * 60 * 60
1460
        // Because of dateAddRemove treats 24 hours as different from a
1461
        // day when working around DST, we need to store them separately
1462
        this._days = +days +
1463
            weeks * 7;
1464
        // It is impossible translate months into days without knowing
1465
        // which months you are are talking about, so we have to store
1466
        // it separately.
1467
        this._months = +months +
1468
            quarters * 3 +
1469
            years * 12;
1470
1471
        this._data = {};
1472
1473
        this._locale = locale_locales__getLocale();
1474
1475
        this._bubble();
1476
    }
1477
1478
    function isDuration (obj) {
1479
        return obj instanceof Duration;
1480
    }
1481
1482
    function offset (token, separator) {
1483
        addFormatToken(token, 0, 0, function () {
1484
            var offset = this.utcOffset();
1485
            var sign = '+';
1486
            if (offset < 0) {
1487
                offset = -offset;
1488
                sign = '-';
1489
            }
1490
            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
1491
        });
1492
    }
1493
1494
    offset('Z', ':');
1495
    offset('ZZ', '');
1496
1497
    // PARSING
1498
1499
    addRegexToken('Z',  matchOffset);
1500
    addRegexToken('ZZ', matchOffset);
1501
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
1502
        config._useUTC = true;
1503
        config._tzm = offsetFromString(input);
1504
    });
1505
1506
    // HELPERS
1507
1508
    // timezone chunker
1509
    // '+10:00' > ['10',  '00']
1510
    // '-1530'  > ['-15', '30']
1511
    var chunkOffset = /([\+\-]|\d\d)/gi;
1512
1513
    function offsetFromString(string) {
1514
        var matches = ((string || '').match(matchOffset) || []);
1515
        var chunk   = matches[matches.length - 1] || [];
1516
        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
1517
        var minutes = +(parts[1] * 60) + toInt(parts[2]);
1518
1519
        return parts[0] === '+' ? minutes : -minutes;
1520
    }
1521
1522
    // Return a moment from input, that is local/utc/zone equivalent to model.
1523
    function cloneWithOffset(input, model) {
1524
        var res, diff;
1525
        if (model._isUTC) {
1526
            res = model.clone();
1527
            diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res);
1528
            // Use low-level api, because this fn is low-level api.
1529
            res._d.setTime(+res._d + diff);
1530
            utils_hooks__hooks.updateOffset(res, false);
1531
            return res;
1532
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1533
            return local__createLocal(input).local();
1534
        }
1535
    }
1536
1537
    function getDateOffset (m) {
1538
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
1539
        // https://github.com/moment/moment/pull/1871
1540
        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
1541
    }
1542
1543
    // HOOKS
1544
1545
    // This function will be called whenever a moment is mutated.
1546
    // It is intended to keep the offset in sync with the timezone.
1547
    utils_hooks__hooks.updateOffset = function () {};
1548
1549
    // MOMENTS
1550
1551
    // keepLocalTime = true means only change the timezone, without
1552
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
1553
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
1554
    // +0200, so we adjust the time as needed, to be valid.
1555
    //
1556
    // Keeping the time actually adds/subtracts (one hour)
1557
    // from the actual represented time. That is why we call updateOffset
1558
    // a second time. In case it wants us to change the offset again
1559
    // _changeInProgress == true case, then we have to adjust, because
1560
    // there is no such time in the given timezone.
1561
    function getSetOffset (input, keepLocalTime) {
1562
        var offset = this._offset || 0,
1563
            localAdjust;
1564
        if (input != null) {
0 ignored issues
show
Comparing input to null using the != operator is not safe. Consider using !== instead.
Loading history...
1565
            if (typeof input === 'string') {
1566
                input = offsetFromString(input);
1567
            }
1568
            if (Math.abs(input) < 16) {
1569
                input = input * 60;
1570
            }
1571
            if (!this._isUTC && keepLocalTime) {
1572
                localAdjust = getDateOffset(this);
1573
            }
1574
            this._offset = input;
1575
            this._isUTC = true;
1576
            if (localAdjust != null) {
0 ignored issues
show
The variable localAdjust does not seem to be initialized in case !this._isUTC && keepLocalTime on line 1571 is false. Are you sure this can never be the case?
Loading history...
Comparing localAdjust to null using the != operator is not safe. Consider using !== instead.
Loading history...
1577
                this.add(localAdjust, 'm');
1578
            }
1579
            if (offset !== input) {
1580
                if (!keepLocalTime || this._changeInProgress) {
1581
                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
1582
                } else if (!this._changeInProgress) {
1583
                    this._changeInProgress = true;
1584
                    utils_hooks__hooks.updateOffset(this, true);
1585
                    this._changeInProgress = null;
1586
                }
1587
            }
1588
            return this;
1589
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1590
            return this._isUTC ? offset : getDateOffset(this);
1591
        }
1592
    }
1593
1594
    function getSetZone (input, keepLocalTime) {
1595
        if (input != null) {
0 ignored issues
show
Comparing input to null using the != operator is not safe. Consider using !== instead.
Loading history...
1596
            if (typeof input !== 'string') {
1597
                input = -input;
1598
            }
1599
1600
            this.utcOffset(input, keepLocalTime);
1601
1602
            return this;
1603
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1604
            return -this.utcOffset();
1605
        }
1606
    }
1607
1608
    function setOffsetToUTC (keepLocalTime) {
1609
        return this.utcOffset(0, keepLocalTime);
1610
    }
1611
1612
    function setOffsetToLocal (keepLocalTime) {
1613
        if (this._isUTC) {
1614
            this.utcOffset(0, keepLocalTime);
1615
            this._isUTC = false;
1616
1617
            if (keepLocalTime) {
1618
                this.subtract(getDateOffset(this), 'm');
1619
            }
1620
        }
1621
        return this;
1622
    }
1623
1624
    function setOffsetToParsedOffset () {
1625
        if (this._tzm) {
1626
            this.utcOffset(this._tzm);
1627
        } else if (typeof this._i === 'string') {
1628
            this.utcOffset(offsetFromString(this._i));
1629
        }
1630
        return this;
1631
    }
1632
1633
    function hasAlignedHourOffset (input) {
1634
        input = input ? local__createLocal(input).utcOffset() : 0;
1635
1636
        return (this.utcOffset() - input) % 60 === 0;
1637
    }
1638
1639
    function isDaylightSavingTime () {
1640
        return (
1641
            this.utcOffset() > this.clone().month(0).utcOffset() ||
1642
            this.utcOffset() > this.clone().month(5).utcOffset()
1643
        );
1644
    }
1645
1646
    function isDaylightSavingTimeShifted () {
1647
        if (typeof this._isDSTShifted !== 'undefined') {
1648
            return this._isDSTShifted;
1649
        }
1650
1651
        var c = {};
1652
1653
        copyConfig(c, this);
1654
        c = prepareConfig(c);
1655
1656
        if (c._a) {
1657
            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);
1658
            this._isDSTShifted = this.isValid() &&
1659
                compareArrays(c._a, other.toArray()) > 0;
1660
        } else {
1661
            this._isDSTShifted = false;
1662
        }
1663
1664
        return this._isDSTShifted;
1665
    }
1666
1667
    function isLocal () {
1668
        return !this._isUTC;
1669
    }
1670
1671
    function isUtcOffset () {
1672
        return this._isUTC;
1673
    }
1674
1675
    function isUtc () {
1676
        return this._isUTC && this._offset === 0;
1677
    }
1678
1679
    var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/;
1680
1681
    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
1682
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
1683
    var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;
1684
1685
    function create__createDuration (input, key) {
1686
        var duration = input,
1687
            // matching against regexp is expensive, do it on demand
1688
            match = null,
0 ignored issues
show
The assignment to match seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
1689
            sign,
1690
            ret,
1691
            diffRes;
1692
1693
        if (isDuration(input)) {
1694
            duration = {
1695
                ms : input._milliseconds,
1696
                d  : input._days,
1697
                M  : input._months
1698
            };
1699
        } else if (typeof input === 'number') {
1700
            duration = {};
1701
            if (key) {
1702
                duration[key] = input;
1703
            } else {
1704
                duration.milliseconds = input;
1705
            }
1706
        } else if (!!(match = aspNetRegex.exec(input))) {
1707
            sign = (match[1] === '-') ? -1 : 1;
1708
            duration = {
1709
                y  : 0,
1710
                d  : toInt(match[DATE])        * sign,
1711
                h  : toInt(match[HOUR])        * sign,
1712
                m  : toInt(match[MINUTE])      * sign,
1713
                s  : toInt(match[SECOND])      * sign,
1714
                ms : toInt(match[MILLISECOND]) * sign
1715
            };
1716
        } else if (!!(match = create__isoRegex.exec(input))) {
1717
            sign = (match[1] === '-') ? -1 : 1;
1718
            duration = {
1719
                y : parseIso(match[2], sign),
1720
                M : parseIso(match[3], sign),
1721
                d : parseIso(match[4], sign),
1722
                h : parseIso(match[5], sign),
1723
                m : parseIso(match[6], sign),
1724
                s : parseIso(match[7], sign),
1725
                w : parseIso(match[8], sign)
1726
            };
1727
        } else if (duration == null) {// checks for null or undefined
0 ignored issues
show
Comparing duration to null using the == operator is not safe. Consider using === instead.
Loading history...
1728
            duration = {};
1729
        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
1730
            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));
1731
1732
            duration = {};
1733
            duration.ms = diffRes.milliseconds;
1734
            duration.M = diffRes.months;
1735
        }
1736
1737
        ret = new Duration(duration);
1738
1739
        if (isDuration(input) && hasOwnProp(input, '_locale')) {
1740
            ret._locale = input._locale;
1741
        }
1742
1743
        return ret;
1744
    }
1745
1746
    create__createDuration.fn = Duration.prototype;
1747
1748
    function parseIso (inp, sign) {
1749
        // We'd normally use ~~inp for this, but unfortunately it also
1750
        // converts floats to ints.
1751
        // inp may be undefined, so careful calling replace on it.
1752
        var res = inp && parseFloat(inp.replace(',', '.'));
1753
        // apply sign while we're at it
1754
        return (isNaN(res) ? 0 : res) * sign;
1755
    }
1756
1757
    function positiveMomentsDifference(base, other) {
1758
        var res = {milliseconds: 0, months: 0};
1759
1760
        res.months = other.month() - base.month() +
1761
            (other.year() - base.year()) * 12;
1762
        if (base.clone().add(res.months, 'M').isAfter(other)) {
1763
            --res.months;
1764
        }
1765
1766
        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
1767
1768
        return res;
1769
    }
1770
1771
    function momentsDifference(base, other) {
1772
        var res;
1773
        other = cloneWithOffset(other, base);
1774
        if (base.isBefore(other)) {
1775
            res = positiveMomentsDifference(base, other);
1776
        } else {
1777
            res = positiveMomentsDifference(other, base);
1778
            res.milliseconds = -res.milliseconds;
1779
            res.months = -res.months;
1780
        }
1781
1782
        return res;
1783
    }
1784
1785
    function createAdder(direction, name) {
1786
        return function (val, period) {
1787
            var dur, tmp;
1788
            //invert the arguments, but complain about it
1789
            if (period !== null && !isNaN(+period)) {
1790
                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
1791
                tmp = val; val = period; period = tmp;
1792
            }
1793
1794
            val = typeof val === 'string' ? +val : val;
1795
            dur = create__createDuration(val, period);
1796
            add_subtract__addSubtract(this, dur, direction);
1797
            return this;
1798
        };
1799
    }
1800
1801
    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
1802
        var milliseconds = duration._milliseconds,
1803
            days = duration._days,
1804
            months = duration._months;
1805
        updateOffset = updateOffset == null ? true : updateOffset;
0 ignored issues
show
Comparing updateOffset to null using the == operator is not safe. Consider using === instead.
Loading history...
1806
1807
        if (milliseconds) {
1808
            mom._d.setTime(+mom._d + milliseconds * isAdding);
1809
        }
1810
        if (days) {
1811
            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
1812
        }
1813
        if (months) {
1814
            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
1815
        }
1816
        if (updateOffset) {
1817
            utils_hooks__hooks.updateOffset(mom, days || months);
1818
        }
1819
    }
1820
1821
    var add_subtract__add      = createAdder(1, 'add');
1822
    var add_subtract__subtract = createAdder(-1, 'subtract');
1823
1824
    function moment_calendar__calendar (time, formats) {
1825
        // We want to compare the start of today, vs this.
1826
        // Getting start-of-today depends on whether we're local/utc/offset or not.
1827
        var now = time || local__createLocal(),
1828
            sod = cloneWithOffset(now, this).startOf('day'),
1829
            diff = this.diff(sod, 'days', true),
1830
            format = diff < -6 ? 'sameElse' :
1831
                diff < -1 ? 'lastWeek' :
1832
                diff < 0 ? 'lastDay' :
1833
                diff < 1 ? 'sameDay' :
1834
                diff < 2 ? 'nextDay' :
1835
                diff < 7 ? 'nextWeek' : 'sameElse';
1836
        return this.format(formats && formats[format] || this.localeData().calendar(format, this, local__createLocal(now)));
1837
    }
1838
1839
    function clone () {
1840
        return new Moment(this);
1841
    }
1842
1843
    function isAfter (input, units) {
1844
        var inputMs;
1845
        units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
1846
        if (units === 'millisecond') {
1847
            input = isMoment(input) ? input : local__createLocal(input);
1848
            return +this > +input;
1849
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1850
            inputMs = isMoment(input) ? +input : +local__createLocal(input);
1851
            return inputMs < +this.clone().startOf(units);
1852
        }
1853
    }
1854
1855
    function isBefore (input, units) {
1856
        var inputMs;
1857
        units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
1858
        if (units === 'millisecond') {
1859
            input = isMoment(input) ? input : local__createLocal(input);
1860
            return +this < +input;
1861
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1862
            inputMs = isMoment(input) ? +input : +local__createLocal(input);
1863
            return +this.clone().endOf(units) < inputMs;
1864
        }
1865
    }
1866
1867
    function isBetween (from, to, units) {
1868
        return this.isAfter(from, units) && this.isBefore(to, units);
1869
    }
1870
1871
    function isSame (input, units) {
1872
        var inputMs;
1873
        units = normalizeUnits(units || 'millisecond');
1874
        if (units === 'millisecond') {
1875
            input = isMoment(input) ? input : local__createLocal(input);
1876
            return +this === +input;
1877
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1878
            inputMs = +local__createLocal(input);
1879
            return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
1880
        }
1881
    }
1882
1883
    function diff (input, units, asFloat) {
1884
        var that = cloneWithOffset(input, this),
1885
            zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4,
1886
            delta, output;
1887
1888
        units = normalizeUnits(units);
1889
1890
        if (units === 'year' || units === 'month' || units === 'quarter') {
1891
            output = monthDiff(this, that);
1892
            if (units === 'quarter') {
1893
                output = output / 3;
1894
            } else if (units === 'year') {
1895
                output = output / 12;
1896
            }
1897
        } else {
1898
            delta = this - that;
1899
            output = units === 'second' ? delta / 1e3 : // 1000
1900
                units === 'minute' ? delta / 6e4 : // 1000 * 60
1901
                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
1902
                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
1903
                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
1904
                delta;
1905
        }
1906
        return asFloat ? output : absFloor(output);
1907
    }
1908
1909
    function monthDiff (a, b) {
1910
        // difference in months
1911
        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
1912
            // b is in (anchor - 1 month, anchor + 1 month)
1913
            anchor = a.clone().add(wholeMonthDiff, 'months'),
1914
            anchor2, adjust;
1915
1916
        if (b - anchor < 0) {
1917
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
1918
            // linear across the month
1919
            adjust = (b - anchor) / (anchor - anchor2);
1920
        } else {
1921
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
1922
            // linear across the month
1923
            adjust = (b - anchor) / (anchor2 - anchor);
1924
        }
1925
1926
        return -(wholeMonthDiff + adjust);
1927
    }
1928
1929
    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
1930
1931
    function toString () {
1932
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
1933
    }
1934
1935
    function moment_format__toISOString () {
1936
        var m = this.clone().utc();
1937
        if (0 < m.year() && m.year() <= 9999) {
1938
            if ('function' === typeof Date.prototype.toISOString) {
1939
                // native implementation is ~50x faster, use it when we can
1940
                return this.toDate().toISOString();
1941
            } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1942
                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
1943
            }
1944
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1945
            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
1946
        }
1947
    }
1948
1949
    function format (inputString) {
1950
        var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat);
1951
        return this.localeData().postformat(output);
1952
    }
1953
1954
    function from (time, withoutSuffix) {
1955
        if (!this.isValid()) {
1956
            return this.localeData().invalidDate();
1957
        }
1958
        return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
1959
    }
1960
1961
    function fromNow (withoutSuffix) {
1962
        return this.from(local__createLocal(), withoutSuffix);
1963
    }
1964
1965
    function to (time, withoutSuffix) {
1966
        if (!this.isValid()) {
1967
            return this.localeData().invalidDate();
1968
        }
1969
        return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
1970
    }
1971
1972
    function toNow (withoutSuffix) {
1973
        return this.to(local__createLocal(), withoutSuffix);
1974
    }
1975
1976
    function locale (key) {
1977
        var newLocaleData;
1978
1979
        if (key === undefined) {
1980
            return this._locale._abbr;
1981
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1982
            newLocaleData = locale_locales__getLocale(key);
1983
            if (newLocaleData != null) {
0 ignored issues
show
Comparing newLocaleData to null using the != operator is not safe. Consider using !== instead.
Loading history...
1984
                this._locale = newLocaleData;
1985
            }
1986
            return this;
1987
        }
1988
    }
1989
1990
    var lang = deprecate(
1991
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
1992
        function (key) {
1993
            if (key === undefined) {
1994
                return this.localeData();
1995
            } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1996
                return this.locale(key);
1997
            }
1998
        }
1999
    );
2000
2001
    function localeData () {
2002
        return this._locale;
2003
    }
2004
2005
    function startOf (units) {
2006
        units = normalizeUnits(units);
2007
        // the following switch intentionally omits break keywords
2008
        // to utilize falling through the cases.
2009
        switch (units) {
2010
        case 'year':
2011
            this.month(0);
2012
            /* falls through */
2013
        case 'quarter':
2014
        case 'month':
2015
            this.date(1);
2016
            /* falls through */
2017
        case 'week':
2018
        case 'isoWeek':
2019
        case 'day':
2020
            this.hours(0);
0 ignored issues
show
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
2021
            /* falls through */
2022
        case 'hour':
2023
            this.minutes(0);
0 ignored issues
show
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
2024
            /* falls through */
2025
        case 'minute':
2026
            this.seconds(0);
0 ignored issues
show
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
2027
            /* falls through */
2028
        case 'second':
2029
            this.milliseconds(0);
2030
        }
2031
2032
        // weeks are a special case
2033
        if (units === 'week') {
2034
            this.weekday(0);
2035
        }
2036
        if (units === 'isoWeek') {
2037
            this.isoWeekday(1);
2038
        }
2039
2040
        // quarters are also special
2041
        if (units === 'quarter') {
2042
            this.month(Math.floor(this.month() / 3) * 3);
2043
        }
2044
2045
        return this;
2046
    }
2047
2048
    function endOf (units) {
2049
        units = normalizeUnits(units);
2050
        if (units === undefined || units === 'millisecond') {
2051
            return this;
2052
        }
2053
        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
2054
    }
2055
2056
    function to_type__valueOf () {
2057
        return +this._d - ((this._offset || 0) * 60000);
2058
    }
2059
2060
    function unix () {
2061
        return Math.floor(+this / 1000);
2062
    }
2063
2064
    function toDate () {
2065
        return this._offset ? new Date(+this) : this._d;
2066
    }
2067
2068
    function toArray () {
2069
        var m = this;
2070
        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
2071
    }
2072
2073
    function toObject () {
2074
        var m = this;
2075
        return {
2076
            years: m.year(),
2077
            months: m.month(),
2078
            date: m.date(),
2079
            hours: m.hours(),
2080
            minutes: m.minutes(),
2081
            seconds: m.seconds(),
2082
            milliseconds: m.milliseconds()
2083
        };
2084
    }
2085
2086
    function moment_valid__isValid () {
2087
        return valid__isValid(this);
2088
    }
2089
2090
    function parsingFlags () {
2091
        return extend({}, getParsingFlags(this));
2092
    }
2093
2094
    function invalidAt () {
2095
        return getParsingFlags(this).overflow;
2096
    }
2097
2098
    addFormatToken(0, ['gg', 2], 0, function () {
2099
        return this.weekYear() % 100;
2100
    });
2101
2102
    addFormatToken(0, ['GG', 2], 0, function () {
2103
        return this.isoWeekYear() % 100;
2104
    });
2105
2106
    function addWeekYearFormatToken (token, getter) {
2107
        addFormatToken(0, [token, token.length], 0, getter);
2108
    }
2109
2110
    addWeekYearFormatToken('gggg',     'weekYear');
2111
    addWeekYearFormatToken('ggggg',    'weekYear');
2112
    addWeekYearFormatToken('GGGG',  'isoWeekYear');
2113
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');
2114
2115
    // ALIASES
2116
2117
    addUnitAlias('weekYear', 'gg');
2118
    addUnitAlias('isoWeekYear', 'GG');
2119
2120
    // PARSING
2121
2122
    addRegexToken('G',      matchSigned);
2123
    addRegexToken('g',      matchSigned);
2124
    addRegexToken('GG',     match1to2, match2);
2125
    addRegexToken('gg',     match1to2, match2);
2126
    addRegexToken('GGGG',   match1to4, match4);
2127
    addRegexToken('gggg',   match1to4, match4);
2128
    addRegexToken('GGGGG',  match1to6, match6);
2129
    addRegexToken('ggggg',  match1to6, match6);
2130
2131
    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
2132
        week[token.substr(0, 2)] = toInt(input);
2133
    });
2134
2135
    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
2136
        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
2137
    });
2138
2139
    // HELPERS
2140
2141
    function weeksInYear(year, dow, doy) {
2142
        return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week;
2143
    }
2144
2145
    // MOMENTS
2146
2147
    function getSetWeekYear (input) {
2148
        var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
2149
        return input == null ? year : this.add((input - year), 'y');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
2150
    }
2151
2152
    function getSetISOWeekYear (input) {
2153
        var year = weekOfYear(this, 1, 4).year;
2154
        return input == null ? year : this.add((input - year), 'y');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
2155
    }
2156
2157
    function getISOWeeksInYear () {
2158
        return weeksInYear(this.year(), 1, 4);
2159
    }
2160
2161
    function getWeeksInYear () {
2162
        var weekInfo = this.localeData()._week;
2163
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
2164
    }
2165
2166
    addFormatToken('Q', 0, 0, 'quarter');
2167
2168
    // ALIASES
2169
2170
    addUnitAlias('quarter', 'Q');
2171
2172
    // PARSING
2173
2174
    addRegexToken('Q', match1);
2175
    addParseToken('Q', function (input, array) {
2176
        array[MONTH] = (toInt(input) - 1) * 3;
2177
    });
2178
2179
    // MOMENTS
2180
2181
    function getSetQuarter (input) {
2182
        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
2183
    }
2184
2185
    addFormatToken('D', ['DD', 2], 'Do', 'date');
2186
2187
    // ALIASES
2188
2189
    addUnitAlias('date', 'D');
2190
2191
    // PARSING
2192
2193
    addRegexToken('D',  match1to2);
2194
    addRegexToken('DD', match1to2, match2);
2195
    addRegexToken('Do', function (isStrict, locale) {
2196
        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
2197
    });
2198
2199
    addParseToken(['D', 'DD'], DATE);
2200
    addParseToken('Do', function (input, array) {
2201
        array[DATE] = toInt(input.match(match1to2)[0], 10);
0 ignored issues
show
The call to toInt seems to have too many arguments starting with 10.
Loading history...
2202
    });
2203
2204
    // MOMENTS
2205
2206
    var getSetDayOfMonth = makeGetSet('Date', true);
2207
2208
    addFormatToken('d', 0, 'do', 'day');
2209
2210
    addFormatToken('dd', 0, 0, function (format) {
2211
        return this.localeData().weekdaysMin(this, format);
2212
    });
2213
2214
    addFormatToken('ddd', 0, 0, function (format) {
2215
        return this.localeData().weekdaysShort(this, format);
2216
    });
2217
2218
    addFormatToken('dddd', 0, 0, function (format) {
2219
        return this.localeData().weekdays(this, format);
2220
    });
2221
2222
    addFormatToken('e', 0, 0, 'weekday');
2223
    addFormatToken('E', 0, 0, 'isoWeekday');
2224
2225
    // ALIASES
2226
2227
    addUnitAlias('day', 'd');
2228
    addUnitAlias('weekday', 'e');
2229
    addUnitAlias('isoWeekday', 'E');
2230
2231
    // PARSING
2232
2233
    addRegexToken('d',    match1to2);
2234
    addRegexToken('e',    match1to2);
2235
    addRegexToken('E',    match1to2);
2236
    addRegexToken('dd',   matchWord);
2237
    addRegexToken('ddd',  matchWord);
2238
    addRegexToken('dddd', matchWord);
2239
2240
    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) {
2241
        var weekday = config._locale.weekdaysParse(input);
2242
        // if we didn't get a weekday name, mark the date as invalid
2243
        if (weekday != null) {
0 ignored issues
show
Comparing weekday to null using the != operator is not safe. Consider using !== instead.
Loading history...
2244
            week.d = weekday;
2245
        } else {
2246
            getParsingFlags(config).invalidWeekday = input;
2247
        }
2248
    });
2249
2250
    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
2251
        week[token] = toInt(input);
2252
    });
2253
2254
    // HELPERS
2255
2256
    function parseWeekday(input, locale) {
2257
        if (typeof input !== 'string') {
2258
            return input;
2259
        }
2260
2261
        if (!isNaN(input)) {
2262
            return parseInt(input, 10);
2263
        }
2264
2265
        input = locale.weekdaysParse(input);
2266
        if (typeof input === 'number') {
2267
            return input;
2268
        }
2269
2270
        return null;
2271
    }
2272
2273
    // LOCALES
2274
2275
    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
2276
    function localeWeekdays (m) {
2277
        return this._weekdays[m.day()];
2278
    }
2279
2280
    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
2281
    function localeWeekdaysShort (m) {
2282
        return this._weekdaysShort[m.day()];
2283
    }
2284
2285
    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
2286
    function localeWeekdaysMin (m) {
2287
        return this._weekdaysMin[m.day()];
2288
    }
2289
2290
    function localeWeekdaysParse (weekdayName) {
2291
        var i, mom, regex;
2292
2293
        this._weekdaysParse = this._weekdaysParse || [];
2294
2295
        for (i = 0; i < 7; i++) {
2296
            // make the regex if we don't have it already
2297
            if (!this._weekdaysParse[i]) {
2298
                mom = local__createLocal([2000, 1]).day(i);
2299
                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
2300
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
2301
            }
2302
            // test the regex
2303
            if (this._weekdaysParse[i].test(weekdayName)) {
2304
                return i;
2305
            }
2306
        }
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2307
    }
2308
2309
    // MOMENTS
2310
2311
    function getSetDayOfWeek (input) {
2312
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
2313
        if (input != null) {
0 ignored issues
show
Comparing input to null using the != operator is not safe. Consider using !== instead.
Loading history...
2314
            input = parseWeekday(input, this.localeData());
2315
            return this.add(input - day, 'd');
2316
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2317
            return day;
2318
        }
2319
    }
2320
2321
    function getSetLocaleDayOfWeek (input) {
2322
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
2323
        return input == null ? weekday : this.add(input - weekday, 'd');
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
2324
    }
2325
2326
    function getSetISODayOfWeek (input) {
2327
        // behaves the same as moment#day except
2328
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
2329
        // as a setter, sunday should belong to the previous week.
2330
        return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
0 ignored issues
show
Comparing input to null using the == operator is not safe. Consider using === instead.
Loading history...
2331
    }
2332
2333
    addFormatToken('H', ['HH', 2], 0, 'hour');
2334
    addFormatToken('h', ['hh', 2], 0, function () {
2335
        return this.hours() % 12 || 12;
2336
    });
2337
2338
    function meridiem (token, lowercase) {
2339
        addFormatToken(token, 0, 0, function () {
2340
            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
2341
        });
2342
    }
2343
2344
    meridiem('a', true);
2345
    meridiem('A', false);
2346
2347
    // ALIASES
2348
2349
    addUnitAlias('hour', 'h');
2350
2351
    // PARSING
2352
2353
    function matchMeridiem (isStrict, locale) {
2354
        return locale._meridiemParse;
2355
    }
2356
2357
    addRegexToken('a',  matchMeridiem);
2358
    addRegexToken('A',  matchMeridiem);
2359
    addRegexToken('H',  match1to2);
2360
    addRegexToken('h',  match1to2);
2361
    addRegexToken('HH', match1to2, match2);
2362
    addRegexToken('hh', match1to2, match2);
2363
2364
    addParseToken(['H', 'HH'], HOUR);
2365
    addParseToken(['a', 'A'], function (input, array, config) {
2366
        config._isPm = config._locale.isPM(input);
2367
        config._meridiem = input;
2368
    });
2369
    addParseToken(['h', 'hh'], function (input, array, config) {
2370
        array[HOUR] = toInt(input);
2371
        getParsingFlags(config).bigHour = true;
2372
    });
2373
2374
    // LOCALES
2375
2376
    function localeIsPM (input) {
2377
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
2378
        // Using charAt should be more compatible.
2379
        return ((input + '').toLowerCase().charAt(0) === 'p');
2380
    }
2381
2382
    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
2383
    function localeMeridiem (hours, minutes, isLower) {
2384
        if (hours > 11) {
2385
            return isLower ? 'pm' : 'PM';
2386
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2387
            return isLower ? 'am' : 'AM';
2388
        }
2389
    }
2390
2391
2392
    // MOMENTS
2393
2394
    // Setting the hour should keep the time, because the user explicitly
2395
    // specified which hour he wants. So trying to maintain the same hour (in
2396
    // a new timezone) makes sense. Adding/subtracting hours does not follow
2397
    // this rule.
2398
    var getSetHour = makeGetSet('Hours', true);
2399
2400
    addFormatToken('m', ['mm', 2], 0, 'minute');
2401
2402
    // ALIASES
2403
2404
    addUnitAlias('minute', 'm');
2405
2406
    // PARSING
2407
2408
    addRegexToken('m',  match1to2);
2409
    addRegexToken('mm', match1to2, match2);
2410
    addParseToken(['m', 'mm'], MINUTE);
2411
2412
    // MOMENTS
2413
2414
    var getSetMinute = makeGetSet('Minutes', false);
2415
2416
    addFormatToken('s', ['ss', 2], 0, 'second');
2417
2418
    // ALIASES
2419
2420
    addUnitAlias('second', 's');
2421
2422
    // PARSING
2423
2424
    addRegexToken('s',  match1to2);
2425
    addRegexToken('ss', match1to2, match2);
2426
    addParseToken(['s', 'ss'], SECOND);
2427
2428
    // MOMENTS
2429
2430
    var getSetSecond = makeGetSet('Seconds', false);
2431
2432
    addFormatToken('S', 0, 0, function () {
2433
        return ~~(this.millisecond() / 100);
2434
    });
2435
2436
    addFormatToken(0, ['SS', 2], 0, function () {
2437
        return ~~(this.millisecond() / 10);
2438
    });
2439
2440
    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
2441
    addFormatToken(0, ['SSSS', 4], 0, function () {
2442
        return this.millisecond() * 10;
2443
    });
2444
    addFormatToken(0, ['SSSSS', 5], 0, function () {
2445
        return this.millisecond() * 100;
2446
    });
2447
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
2448
        return this.millisecond() * 1000;
2449
    });
2450
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
2451
        return this.millisecond() * 10000;
2452
    });
2453
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
2454
        return this.millisecond() * 100000;
2455
    });
2456
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
2457
        return this.millisecond() * 1000000;
2458
    });
2459
2460
2461
    // ALIASES
2462
2463
    addUnitAlias('millisecond', 'ms');
2464
2465
    // PARSING
2466
2467
    addRegexToken('S',    match1to3, match1);
2468
    addRegexToken('SS',   match1to3, match2);
2469
    addRegexToken('SSS',  match1to3, match3);
2470
2471
    var token;
2472
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
2473
        addRegexToken(token, matchUnsigned);
2474
    }
2475
2476
    function parseMs(input, array) {
2477
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
2478
    }
2479
2480
    for (token = 'S'; token.length <= 9; token += 'S') {
2481
        addParseToken(token, parseMs);
2482
    }
2483
    // MOMENTS
2484
2485
    var getSetMillisecond = makeGetSet('Milliseconds', false);
2486
2487
    addFormatToken('z',  0, 0, 'zoneAbbr');
2488
    addFormatToken('zz', 0, 0, 'zoneName');
2489
2490
    // MOMENTS
2491
2492
    function getZoneAbbr () {
2493
        return this._isUTC ? 'UTC' : '';
2494
    }
2495
2496
    function getZoneName () {
2497
        return this._isUTC ? 'Coordinated Universal Time' : '';
2498
    }
2499
2500
    var momentPrototype__proto = Moment.prototype;
2501
2502
    momentPrototype__proto.add          = add_subtract__add;
2503
    momentPrototype__proto.calendar     = moment_calendar__calendar;
2504
    momentPrototype__proto.clone        = clone;
2505
    momentPrototype__proto.diff         = diff;
2506
    momentPrototype__proto.endOf        = endOf;
2507
    momentPrototype__proto.format       = format;
2508
    momentPrototype__proto.from         = from;
2509
    momentPrototype__proto.fromNow      = fromNow;
2510
    momentPrototype__proto.to           = to;
2511
    momentPrototype__proto.toNow        = toNow;
2512
    momentPrototype__proto.get          = getSet;
2513
    momentPrototype__proto.invalidAt    = invalidAt;
2514
    momentPrototype__proto.isAfter      = isAfter;
2515
    momentPrototype__proto.isBefore     = isBefore;
2516
    momentPrototype__proto.isBetween    = isBetween;
2517
    momentPrototype__proto.isSame       = isSame;
2518
    momentPrototype__proto.isValid      = moment_valid__isValid;
2519
    momentPrototype__proto.lang         = lang;
2520
    momentPrototype__proto.locale       = locale;
2521
    momentPrototype__proto.localeData   = localeData;
2522
    momentPrototype__proto.max          = prototypeMax;
2523
    momentPrototype__proto.min          = prototypeMin;
2524
    momentPrototype__proto.parsingFlags = parsingFlags;
2525
    momentPrototype__proto.set          = getSet;
2526
    momentPrototype__proto.startOf      = startOf;
2527
    momentPrototype__proto.subtract     = add_subtract__subtract;
2528
    momentPrototype__proto.toArray      = toArray;
2529
    momentPrototype__proto.toObject     = toObject;
2530
    momentPrototype__proto.toDate       = toDate;
2531
    momentPrototype__proto.toISOString  = moment_format__toISOString;
2532
    momentPrototype__proto.toJSON       = moment_format__toISOString;
2533
    momentPrototype__proto.toString     = toString;
2534
    momentPrototype__proto.unix         = unix;
2535
    momentPrototype__proto.valueOf      = to_type__valueOf;
2536
2537
    // Year
2538
    momentPrototype__proto.year       = getSetYear;
2539
    momentPrototype__proto.isLeapYear = getIsLeapYear;
2540
2541
    // Week Year
2542
    momentPrototype__proto.weekYear    = getSetWeekYear;
2543
    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;
2544
2545
    // Quarter
2546
    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;
2547
2548
    // Month
2549
    momentPrototype__proto.month       = getSetMonth;
2550
    momentPrototype__proto.daysInMonth = getDaysInMonth;
2551
2552
    // Week
2553
    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;
2554
    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;
2555
    momentPrototype__proto.weeksInYear    = getWeeksInYear;
2556
    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;
2557
2558
    // Day
2559
    momentPrototype__proto.date       = getSetDayOfMonth;
2560
    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;
2561
    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;
2562
    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
2563
    momentPrototype__proto.dayOfYear  = getSetDayOfYear;
2564
2565
    // Hour
2566
    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;
2567
2568
    // Minute
2569
    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;
2570
2571
    // Second
2572
    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;
2573
2574
    // Millisecond
2575
    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;
2576
2577
    // Offset
2578
    momentPrototype__proto.utcOffset            = getSetOffset;
2579
    momentPrototype__proto.utc                  = setOffsetToUTC;
2580
    momentPrototype__proto.local                = setOffsetToLocal;
2581
    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;
2582
    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
2583
    momentPrototype__proto.isDST                = isDaylightSavingTime;
2584
    momentPrototype__proto.isDSTShifted         = isDaylightSavingTimeShifted;
2585
    momentPrototype__proto.isLocal              = isLocal;
2586
    momentPrototype__proto.isUtcOffset          = isUtcOffset;
2587
    momentPrototype__proto.isUtc                = isUtc;
2588
    momentPrototype__proto.isUTC                = isUtc;
2589
2590
    // Timezone
2591
    momentPrototype__proto.zoneAbbr = getZoneAbbr;
2592
    momentPrototype__proto.zoneName = getZoneName;
2593
2594
    // Deprecations
2595
    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
2596
    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
2597
    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
2598
    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);
2599
2600
    var momentPrototype = momentPrototype__proto;
2601
2602
    function moment__createUnix (input) {
2603
        return local__createLocal(input * 1000);
2604
    }
2605
2606
    function moment__createInZone () {
2607
        return local__createLocal.apply(null, arguments).parseZone();
2608
    }
2609
2610
    var defaultCalendar = {
2611
        sameDay : '[Today at] LT',
2612
        nextDay : '[Tomorrow at] LT',
2613
        nextWeek : 'dddd [at] LT',
2614
        lastDay : '[Yesterday at] LT',
2615
        lastWeek : '[Last] dddd [at] LT',
2616
        sameElse : 'L'
2617
    };
2618
2619
    function locale_calendar__calendar (key, mom, now) {
2620
        var output = this._calendar[key];
2621
        return typeof output === 'function' ? output.call(mom, now) : output;
2622
    }
2623
2624
    var defaultLongDateFormat = {
2625
        LTS  : 'h:mm:ss A',
2626
        LT   : 'h:mm A',
2627
        L    : 'MM/DD/YYYY',
2628
        LL   : 'MMMM D, YYYY',
2629
        LLL  : 'MMMM D, YYYY h:mm A',
2630
        LLLL : 'dddd, MMMM D, YYYY h:mm A'
2631
    };
2632
2633
    function longDateFormat (key) {
2634
        var format = this._longDateFormat[key],
2635
            formatUpper = this._longDateFormat[key.toUpperCase()];
2636
2637
        if (format || !formatUpper) {
2638
            return format;
2639
        }
2640
2641
        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
2642
            return val.slice(1);
2643
        });
2644
2645
        return this._longDateFormat[key];
2646
    }
2647
2648
    var defaultInvalidDate = 'Invalid date';
2649
2650
    function invalidDate () {
2651
        return this._invalidDate;
2652
    }
2653
2654
    var defaultOrdinal = '%d';
2655
    var defaultOrdinalParse = /\d{1,2}/;
2656
2657
    function ordinal (number) {
2658
        return this._ordinal.replace('%d', number);
2659
    }
2660
2661
    function preParsePostFormat (string) {
2662
        return string;
2663
    }
2664
2665
    var defaultRelativeTime = {
2666
        future : 'in %s',
2667
        past   : '%s ago',
2668
        s  : 'a few seconds',
2669
        m  : 'a minute',
2670
        mm : '%d minutes',
2671
        h  : 'an hour',
2672
        hh : '%d hours',
2673
        d  : 'a day',
2674
        dd : '%d days',
2675
        M  : 'a month',
2676
        MM : '%d months',
2677
        y  : 'a year',
2678
        yy : '%d years'
2679
    };
2680
2681
    function relative__relativeTime (number, withoutSuffix, string, isFuture) {
2682
        var output = this._relativeTime[string];
2683
        return (typeof output === 'function') ?
2684
            output(number, withoutSuffix, string, isFuture) :
2685
            output.replace(/%d/i, number);
2686
    }
2687
2688
    function pastFuture (diff, output) {
2689
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
2690
        return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
2691
    }
2692
2693
    function locale_set__set (config) {
2694
        var prop, i;
2695
        for (i in config) {
2696
            prop = config[i];
2697
            if (typeof prop === 'function') {
2698
                this[i] = prop;
2699
            } else {
2700
                this['_' + i] = prop;
2701
            }
2702
        }
2703
        // Lenient ordinal parsing accepts just a number in addition to
2704
        // number + (possibly) stuff coming from _ordinalParseLenient.
2705
        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
2706
    }
2707
2708
    var prototype__proto = Locale.prototype;
2709
2710
    prototype__proto._calendar       = defaultCalendar;
2711
    prototype__proto.calendar        = locale_calendar__calendar;
2712
    prototype__proto._longDateFormat = defaultLongDateFormat;
2713
    prototype__proto.longDateFormat  = longDateFormat;
2714
    prototype__proto._invalidDate    = defaultInvalidDate;
2715
    prototype__proto.invalidDate     = invalidDate;
2716
    prototype__proto._ordinal        = defaultOrdinal;
2717
    prototype__proto.ordinal         = ordinal;
2718
    prototype__proto._ordinalParse   = defaultOrdinalParse;
2719
    prototype__proto.preparse        = preParsePostFormat;
2720
    prototype__proto.postformat      = preParsePostFormat;
2721
    prototype__proto._relativeTime   = defaultRelativeTime;
2722
    prototype__proto.relativeTime    = relative__relativeTime;
2723
    prototype__proto.pastFuture      = pastFuture;
2724
    prototype__proto.set             = locale_set__set;
2725
2726
    // Month
2727
    prototype__proto.months       =        localeMonths;
2728
    prototype__proto._months      = defaultLocaleMonths;
2729
    prototype__proto.monthsShort  =        localeMonthsShort;
2730
    prototype__proto._monthsShort = defaultLocaleMonthsShort;
2731
    prototype__proto.monthsParse  =        localeMonthsParse;
2732
2733
    // Week
2734
    prototype__proto.week = localeWeek;
2735
    prototype__proto._week = defaultLocaleWeek;
2736
    prototype__proto.firstDayOfYear = localeFirstDayOfYear;
2737
    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;
2738
2739
    // Day of Week
2740
    prototype__proto.weekdays       =        localeWeekdays;
2741
    prototype__proto._weekdays      = defaultLocaleWeekdays;
2742
    prototype__proto.weekdaysMin    =        localeWeekdaysMin;
2743
    prototype__proto._weekdaysMin   = defaultLocaleWeekdaysMin;
2744
    prototype__proto.weekdaysShort  =        localeWeekdaysShort;
2745
    prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;
2746
    prototype__proto.weekdaysParse  =        localeWeekdaysParse;
2747
2748
    // Hours
2749
    prototype__proto.isPM = localeIsPM;
2750
    prototype__proto._meridiemParse = defaultLocaleMeridiemParse;
2751
    prototype__proto.meridiem = localeMeridiem;
2752
2753
    function lists__get (format, index, field, setter) {
2754
        var locale = locale_locales__getLocale();
2755
        var utc = create_utc__createUTC().set(setter, index);
2756
        return locale[field](utc, format);
2757
    }
2758
2759
    function list (format, index, field, count, setter) {
2760
        if (typeof format === 'number') {
2761
            index = format;
2762
            format = undefined;
2763
        }
2764
2765
        format = format || '';
2766
2767
        if (index != null) {
0 ignored issues
show
Comparing index to null using the != operator is not safe. Consider using !== instead.
Loading history...
2768
            return lists__get(format, index, field, setter);
2769
        }
2770
2771
        var i;
2772
        var out = [];
2773
        for (i = 0; i < count; i++) {
2774
            out[i] = lists__get(format, i, field, setter);
2775
        }
2776
        return out;
2777
    }
2778
2779
    function lists__listMonths (format, index) {
2780
        return list(format, index, 'months', 12, 'month');
2781
    }
2782
2783
    function lists__listMonthsShort (format, index) {
2784
        return list(format, index, 'monthsShort', 12, 'month');
2785
    }
2786
2787
    function lists__listWeekdays (format, index) {
2788
        return list(format, index, 'weekdays', 7, 'day');
2789
    }
2790
2791
    function lists__listWeekdaysShort (format, index) {
2792
        return list(format, index, 'weekdaysShort', 7, 'day');
2793
    }
2794
2795
    function lists__listWeekdaysMin (format, index) {
2796
        return list(format, index, 'weekdaysMin', 7, 'day');
2797
    }
2798
2799
    locale_locales__getSetGlobalLocale('en', {
2800
        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
2801
        ordinal : function (number) {
2802
            var b = number % 10,
2803
                output = (toInt(number % 100 / 10) === 1) ? 'th' :
2804
                (b === 1) ? 'st' :
2805
                (b === 2) ? 'nd' :
2806
                (b === 3) ? 'rd' : 'th';
2807
            return number + output;
2808
        }
2809
    });
2810
2811
    // Side effect imports
2812
    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
2813
    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);
2814
2815
    var mathAbs = Math.abs;
2816
2817
    function duration_abs__abs () {
2818
        var data           = this._data;
2819
2820
        this._milliseconds = mathAbs(this._milliseconds);
2821
        this._days         = mathAbs(this._days);
2822
        this._months       = mathAbs(this._months);
2823
2824
        data.milliseconds  = mathAbs(data.milliseconds);
2825
        data.seconds       = mathAbs(data.seconds);
2826
        data.minutes       = mathAbs(data.minutes);
2827
        data.hours         = mathAbs(data.hours);
2828
        data.months        = mathAbs(data.months);
2829
        data.years         = mathAbs(data.years);
2830
2831
        return this;
2832
    }
2833
2834
    function duration_add_subtract__addSubtract (duration, input, value, direction) {
2835
        var other = create__createDuration(input, value);
2836
2837
        duration._milliseconds += direction * other._milliseconds;
2838
        duration._days         += direction * other._days;
2839
        duration._months       += direction * other._months;
2840
2841
        return duration._bubble();
2842
    }
2843
2844
    // supports only 2.0-style add(1, 's') or add(duration)
2845
    function duration_add_subtract__add (input, value) {
2846
        return duration_add_subtract__addSubtract(this, input, value, 1);
2847
    }
2848
2849
    // supports only 2.0-style subtract(1, 's') or subtract(duration)
2850
    function duration_add_subtract__subtract (input, value) {
2851
        return duration_add_subtract__addSubtract(this, input, value, -1);
2852
    }
2853
2854
    function absCeil (number) {
2855
        if (number < 0) {
2856
            return Math.floor(number);
2857
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2858
            return Math.ceil(number);
2859
        }
2860
    }
2861
2862
    function bubble () {
2863
        var milliseconds = this._milliseconds;
2864
        var days         = this._days;
2865
        var months       = this._months;
2866
        var data         = this._data;
2867
        var seconds, minutes, hours, years, monthsFromDays;
2868
2869
        // if we have a mix of positive and negative values, bubble down first
2870
        // check: https://github.com/moment/moment/issues/2166
2871
        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
2872
                (milliseconds <= 0 && days <= 0 && months <= 0))) {
2873
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
2874
            days = 0;
2875
            months = 0;
2876
        }
2877
2878
        // The following code bubbles up values, see the tests for
2879
        // examples of what that means.
2880
        data.milliseconds = milliseconds % 1000;
2881
2882
        seconds           = absFloor(milliseconds / 1000);
2883
        data.seconds      = seconds % 60;
2884
2885
        minutes           = absFloor(seconds / 60);
2886
        data.minutes      = minutes % 60;
2887
2888
        hours             = absFloor(minutes / 60);
2889
        data.hours        = hours % 24;
2890
2891
        days += absFloor(hours / 24);
2892
2893
        // convert days to months
2894
        monthsFromDays = absFloor(daysToMonths(days));
2895
        months += monthsFromDays;
2896
        days -= absCeil(monthsToDays(monthsFromDays));
2897
2898
        // 12 months -> 1 year
2899
        years = absFloor(months / 12);
2900
        months %= 12;
2901
2902
        data.days   = days;
2903
        data.months = months;
2904
        data.years  = years;
2905
2906
        return this;
2907
    }
2908
2909
    function daysToMonths (days) {
2910
        // 400 years have 146097 days (taking into account leap year rules)
2911
        // 400 years have 12 months === 4800
2912
        return days * 4800 / 146097;
2913
    }
2914
2915
    function monthsToDays (months) {
2916
        // the reverse of daysToMonths
2917
        return months * 146097 / 4800;
2918
    }
2919
2920
    function as (units) {
2921
        var days;
2922
        var months;
2923
        var milliseconds = this._milliseconds;
2924
2925
        units = normalizeUnits(units);
2926
2927
        if (units === 'month' || units === 'year') {
2928
            days   = this._days   + milliseconds / 864e5;
2929
            months = this._months + daysToMonths(days);
2930
            return units === 'month' ? months : months / 12;
2931
        } else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2932
            // handle milliseconds separately because of floating point math errors (issue #1867)
2933
            days = this._days + Math.round(monthsToDays(this._months));
2934
            switch (units) {
2935
                case 'week'   : return days / 7     + milliseconds / 6048e5;
2936
                case 'day'    : return days         + milliseconds / 864e5;
2937
                case 'hour'   : return days * 24    + milliseconds / 36e5;
2938
                case 'minute' : return days * 1440  + milliseconds / 6e4;
2939
                case 'second' : return days * 86400 + milliseconds / 1000;
2940
                // Math.floor prevents floating point math errors here
2941
                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
2942
                default: throw new Error('Unknown unit ' + units);
2943
            }
2944
        }
2945
    }
2946
2947
    // TODO: Use this.as('ms')?
2948
    function duration_as__valueOf () {
2949
        return (
2950
            this._milliseconds +
2951
            this._days * 864e5 +
2952
            (this._months % 12) * 2592e6 +
2953
            toInt(this._months / 12) * 31536e6
2954
        );
2955
    }
2956
2957
    function makeAs (alias) {
2958
        return function () {
2959
            return this.as(alias);
2960
        };
2961
    }
2962
2963
    var asMilliseconds = makeAs('ms');
2964
    var asSeconds      = makeAs('s');
2965
    var asMinutes      = makeAs('m');
2966
    var asHours        = makeAs('h');
2967
    var asDays         = makeAs('d');
2968
    var asWeeks        = makeAs('w');
2969
    var asMonths       = makeAs('M');
2970
    var asYears        = makeAs('y');
2971
2972
    function duration_get__get (units) {
2973
        units = normalizeUnits(units);
2974
        return this[units + 's']();
2975
    }
2976
2977
    function makeGetter(name) {
2978
        return function () {
2979
            return this._data[name];
2980
        };
2981
    }
2982
2983
    var milliseconds = makeGetter('milliseconds');
2984
    var seconds      = makeGetter('seconds');
2985
    var minutes      = makeGetter('minutes');
2986
    var hours        = makeGetter('hours');
2987
    var days         = makeGetter('days');
2988
    var months       = makeGetter('months');
2989
    var years        = makeGetter('years');
2990
2991
    function weeks () {
2992
        return absFloor(this.days() / 7);
2993
    }
2994
2995
    var round = Math.round;
2996
    var thresholds = {
2997
        s: 45,  // seconds to minute
2998
        m: 45,  // minutes to hour
2999
        h: 22,  // hours to day
3000
        d: 26,  // days to month
3001
        M: 11   // months to year
3002
    };
3003
3004
    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
3005
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
3006
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
3007
    }
3008
3009
    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
3010
        var duration = create__createDuration(posNegDuration).abs();
3011
        var seconds  = round(duration.as('s'));
3012
        var minutes  = round(duration.as('m'));
3013
        var hours    = round(duration.as('h'));
3014
        var days     = round(duration.as('d'));
3015
        var months   = round(duration.as('M'));
3016
        var years    = round(duration.as('y'));
3017
3018
        var a = seconds < thresholds.s && ['s', seconds]  ||
3019
                minutes === 1          && ['m']           ||
3020
                minutes < thresholds.m && ['mm', minutes] ||
3021
                hours   === 1          && ['h']           ||
3022
                hours   < thresholds.h && ['hh', hours]   ||
3023
                days    === 1          && ['d']           ||
3024
                days    < thresholds.d && ['dd', days]    ||
3025
                months  === 1          && ['M']           ||
3026
                months  < thresholds.M && ['MM', months]  ||
3027
                years   === 1          && ['y']           || ['yy', years];
3028
3029
        a[2] = withoutSuffix;
3030
        a[3] = +posNegDuration > 0;
3031
        a[4] = locale;
3032
        return substituteTimeAgo.apply(null, a);
3033
    }
3034
3035
    // This function allows you to set a threshold for relative time strings
3036
    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
3037
        if (thresholds[threshold] === undefined) {
3038
            return false;
3039
        }
3040
        if (limit === undefined) {
3041
            return thresholds[threshold];
3042
        }
3043
        thresholds[threshold] = limit;
3044
        return true;
3045
    }
3046
3047
    function humanize (withSuffix) {
3048
        var locale = this.localeData();
3049
        var output = duration_humanize__relativeTime(this, !withSuffix, locale);
3050
3051
        if (withSuffix) {
3052
            output = locale.pastFuture(+this, output);
3053
        }
3054
3055
        return locale.postformat(output);
3056
    }
3057
3058
    var iso_string__abs = Math.abs;
3059
3060
    function iso_string__toISOString() {
3061
        // for ISO strings we do not use the normal bubbling rules:
3062
        //  * milliseconds bubble up until they become hours
3063
        //  * days do not bubble at all
3064
        //  * months bubble up until they become years
3065
        // This is because there is no context-free conversion between hours and days
3066
        // (think of clock changes)
3067
        // and also not between days and months (28-31 days per month)
3068
        var seconds = iso_string__abs(this._milliseconds) / 1000;
3069
        var days         = iso_string__abs(this._days);
3070
        var months       = iso_string__abs(this._months);
3071
        var minutes, hours, years;
3072
3073
        // 3600 seconds -> 60 minutes -> 1 hour
3074
        minutes           = absFloor(seconds / 60);
3075
        hours             = absFloor(minutes / 60);
3076
        seconds %= 60;
3077
        minutes %= 60;
3078
3079
        // 12 months -> 1 year
3080
        years  = absFloor(months / 12);
3081
        months %= 12;
3082
3083
3084
        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
3085
        var Y = years;
3086
        var M = months;
3087
        var D = days;
3088
        var h = hours;
3089
        var m = minutes;
3090
        var s = seconds;
3091
        var total = this.asSeconds();
3092
3093
        if (!total) {
3094
            // this is the same as C#'s (Noda) and python (isodate)...
3095
            // but not other JS (goog.date)
3096
            return 'P0D';
3097
        }
3098
3099
        return (total < 0 ? '-' : '') +
3100
            'P' +
3101
            (Y ? Y + 'Y' : '') +
3102
            (M ? M + 'M' : '') +
3103
            (D ? D + 'D' : '') +
3104
            ((h || m || s) ? 'T' : '') +
3105
            (h ? h + 'H' : '') +
3106
            (m ? m + 'M' : '') +
3107
            (s ? s + 'S' : '');
3108
    }
3109
3110
    var duration_prototype__proto = Duration.prototype;
3111
3112
    duration_prototype__proto.abs            = duration_abs__abs;
3113
    duration_prototype__proto.add            = duration_add_subtract__add;
3114
    duration_prototype__proto.subtract       = duration_add_subtract__subtract;
3115
    duration_prototype__proto.as             = as;
3116
    duration_prototype__proto.asMilliseconds = asMilliseconds;
3117
    duration_prototype__proto.asSeconds      = asSeconds;
3118
    duration_prototype__proto.asMinutes      = asMinutes;
3119
    duration_prototype__proto.asHours        = asHours;
3120
    duration_prototype__proto.asDays         = asDays;
3121
    duration_prototype__proto.asWeeks        = asWeeks;
3122
    duration_prototype__proto.asMonths       = asMonths;
3123
    duration_prototype__proto.asYears        = asYears;
3124
    duration_prototype__proto.valueOf        = duration_as__valueOf;
3125
    duration_prototype__proto._bubble        = bubble;
3126
    duration_prototype__proto.get            = duration_get__get;
3127
    duration_prototype__proto.milliseconds   = milliseconds;
3128
    duration_prototype__proto.seconds        = seconds;
3129
    duration_prototype__proto.minutes        = minutes;
3130
    duration_prototype__proto.hours          = hours;
3131
    duration_prototype__proto.days           = days;
3132
    duration_prototype__proto.weeks          = weeks;
3133
    duration_prototype__proto.months         = months;
3134
    duration_prototype__proto.years          = years;
3135
    duration_prototype__proto.humanize       = humanize;
3136
    duration_prototype__proto.toISOString    = iso_string__toISOString;
3137
    duration_prototype__proto.toString       = iso_string__toISOString;
3138
    duration_prototype__proto.toJSON         = iso_string__toISOString;
3139
    duration_prototype__proto.locale         = locale;
3140
    duration_prototype__proto.localeData     = localeData;
3141
3142
    // Deprecations
3143
    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
3144
    duration_prototype__proto.lang = lang;
3145
3146
    // Side effect imports
3147
3148
    addFormatToken('X', 0, 0, 'unix');
3149
    addFormatToken('x', 0, 0, 'valueOf');
3150
3151
    // PARSING
3152
3153
    addRegexToken('x', matchSigned);
3154
    addRegexToken('X', matchTimestamp);
3155
    addParseToken('X', function (input, array, config) {
3156
        config._d = new Date(parseFloat(input, 10) * 1000);
3157
    });
3158
    addParseToken('x', function (input, array, config) {
3159
        config._d = new Date(toInt(input));
3160
    });
3161
3162
    // Side effect imports
3163
3164
3165
    utils_hooks__hooks.version = '2.10.6';
3166
3167
    setHookCallback(local__createLocal);
3168
3169
    utils_hooks__hooks.fn                    = momentPrototype;
3170
    utils_hooks__hooks.min                   = min;
3171
    utils_hooks__hooks.max                   = max;
3172
    utils_hooks__hooks.utc                   = create_utc__createUTC;
3173
    utils_hooks__hooks.unix                  = moment__createUnix;
3174
    utils_hooks__hooks.months                = lists__listMonths;
3175
    utils_hooks__hooks.isDate                = isDate;
3176
    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;
3177
    utils_hooks__hooks.invalid               = valid__createInvalid;
3178
    utils_hooks__hooks.duration              = create__createDuration;
3179
    utils_hooks__hooks.isMoment              = isMoment;
3180
    utils_hooks__hooks.weekdays              = lists__listWeekdays;
3181
    utils_hooks__hooks.parseZone             = moment__createInZone;
3182
    utils_hooks__hooks.localeData            = locale_locales__getLocale;
3183
    utils_hooks__hooks.isDuration            = isDuration;
3184
    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;
3185
    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;
3186
    utils_hooks__hooks.defineLocale          = defineLocale;
3187
    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;
3188
    utils_hooks__hooks.normalizeUnits        = normalizeUnits;
3189
    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
3190
3191
    var _moment = utils_hooks__hooks;
3192
3193
    return _moment;
3194
3195
}));